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)的,也就是说它们只有在须要返回值的时候才会生成值。然而生成器更进一步,它们在生成值后不会保留这些值。这意味着如果你须要迭代的数据集很大,或者如果你须要的值须要大量计算,那么生成器可能会比迭代器更节俭资源。
- 应用场景:迭代器更实用于须要自定义简单行为的状况,而生成器更实用于须要遍历大数据集或简单数据流的状况。
总的来说,生成器是一种非凡的迭代器,它的定义更简略,也更容易应用,但同时也继承了迭代器的次要个性。