Python面试必知100例。收集整理了目前Python岗位常见的面试题,希望大家通过学习理解相关知识点。下面介绍的是1~5道题。
一、请说下Python有哪些特点
- Python是一种解释型语言,这意味着开发过程中没有了编译这个环节。
- 面向对象:Python支持面向对象的风格或代码封装在对象的编程技术。
- 动态类型语言:在Python中,你不需要预先声明变量的类型,当你赋值给变量时,解释器会自动知道其类型。
跨平台语言:Python可以在大多数的操作系统上运行,包括但不限于Windows、Linux、Unix等。
二、什么是可变数据类型和不可变数据类型
在Python中,数据类型可以分为两种:可变数据类型和不可变数据类型。
不可变数据类型:这种数据类型的值一旦定义,就不能更改。如果尝试更改其值,实际上会创建一个新的对象。不可变数据类型的例子包括整数、浮点数、字符串、元组。
例如,如果你有一个字符串变量,你不能更改这个字符串中的某个字符。试图这样做的话,Python会创建一个新的字符串。
可变数据类型:与不可变数据类型相反,可变数据类型的值是可以更改的。也就是说,你可以在不创建新对象的情况下更改对象的值。可变数据类型的例子包括列表、字典以及集合。
例如,如果你有一个列表,你可以更改列表中的元素,增加元素,或者删除元素,而不需要创建一个新的列表。三、什么是生成器
在Python中,生成器(Generator)是一种特殊的迭代器。与列表不同,生成器在存储数据时可以节省大量内存。这是因为生成器并不真正存储所有的值在内存中,而是在迭代到某个值时才会生成该值。
生成器的创建通常使用两种方式:一种是通过在函数中使用yield关键字,另一种是使用生成器表达式(generator expression)。
使用yield关键字创建生成器:
当Python执行到yield关键字时,它会将结果返回给调用者,并记住这个位置。下次调用生成器的时候,它将从上次离开的位置继续执行。def count_up_to(n): count = 1 while count <= n: yield count count += 1 for number in count_up_to(5): print(number) # 输出 1 2 3 4 5
上面的代码定义了一个生成器函数count_up_to,它会生成从1到n的数字。然后,我们可以像迭代其他迭代器一样迭代这个生成器。
使用生成器表达式创建生成器:
生成器表达式类似于列表解析式,但是它创建的是一个生成器,而不是一个列表。这意味着它可以节省内存。生成器表达式的语法是将列表解析式的方括号改为圆括号。numbers = (x for x in range(1, 6)) for number in numbers: print(number)
上面的代码创建了一个生成器,它会生成从1到5的数字。然后,我们可以像迭代其他迭代器一样迭代这个生成器。
四、什么是迭代器?
在Python中,迭代器(Iterator)是一个可以记住遍历的位置的对象。迭代器对象必须实现两个特殊方法,即__iter__()和__next__(),它们共同构成了迭代器协议。迭代器可以是有限的也可以是无限的。
- __iter__()方法返回迭代器对象本身。这用在for和in语句中。
- __next__()方法返回迭代器的下一个值。如果没有更多的项可以返回,则应该抛出StopIteration异常。
举个例子,我们可以创建一个返回数字序列的迭代器:
class Counter:
def __init__(self, limit):
self.limit = limit
self.count = 0
def __iter__(self):
return self
def __next__(self):
if self.count < self.limit:
self.count += 1
return self.count
else:
raise StopIteration
counter = Counter(5)
for number in counter:
print(number)
在这个例子中,Counter类是一个迭代器,可以产生从1到5的数字。首先,我们创建一个Counter对象,并将其上限设为5。然后,我们使用for循环来迭代这个迭代器。
值得注意的是,生成器是一种特殊的迭代器,它更简单,但功能也更强大。你可以使用yield关键字来定义一个生成器,或者使用圆括号的列表解析式来创建一个生成器表达式。
五、生成器和迭代器有什么区别?
生成器和迭代器在Python中都用于创建可以进行迭代的对象,但它们之间有一些主要区别:
- 定义方式:迭代器需要定义一个类,并在类中实现__iter__()和__next__()方法。而生成器则可以直接使用一个函数,通过yield语句返回每个迭代的值。
- 简单性:相比之下,生成器的定义更简单。你只需要一个函数,就可以通过yield关键字生成值。而迭代器则需要更多的代码来定义类和方法。
- 资源使用:生成器和迭代器都是懒加载(lazy load)的,也就是说它们只有在需要返回值的时候才会生成值。但是生成器更进一步,它们在生成值后不会保存这些值。这意味着如果你需要迭代的数据集很大,或者如果你需要的值需要大量计算,那么生成器可能会比迭代器更节省资源。
- 使用场景:迭代器更适用于需要自定义复杂行为的情况,而生成器更适用于需要遍历大数据集或复杂数据流的情况。
总的来说,生成器是一种特殊的迭代器,它的定义更简单,也更容易使用,但同时也继承了迭代器的主要特性。