Python面试必知100例。收集整理了目前Python岗位常见的面试题,希望大家通过学习理解相关知识点。下面介绍的是1~5道题。

一、请说下Python有哪些特点

  1. Python是一种解释型语言,这意味着开发过程中没有了编译这个环节。
  2. 面向对象:Python支持面向对象的风格或代码封装在对象的编程技术。
  3. 动态类型语言:在Python中,你不需要预先声明变量的类型,当你赋值给变量时,解释器会自动知道其类型。
  4. 跨平台语言: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中都用于创建可以进行迭代的对象,但它们之间有一些主要区别:

  1. 定义方式:迭代器需要定义一个类,并在类中实现__iter__()__next__()方法。而生成器则可以直接使用一个函数,通过yield语句返回每个迭代的值。
  2. 简单性:相比之下,生成器的定义更简单。你只需要一个函数,就可以通过yield关键字生成值。而迭代器则需要更多的代码来定义类和方法。
  3. 资源使用:生成器和迭代器都是懒加载(lazy load)的,也就是说它们只有在需要返回值的时候才会生成值。但是生成器更进一步,它们在生成值后不会保存这些值。这意味着如果你需要迭代的数据集很大,或者如果你需要的值需要大量计算,那么生成器可能会比迭代器更节省资源。
  4. 使用场景:迭代器更适用于需要自定义复杂行为的情况,而生成器更适用于需要遍历大数据集或复杂数据流的情况。

总的来说,生成器是一种特殊的迭代器,它的定义更简单,也更容易使用,但同时也继承了迭代器的主要特性。


子午
24 声望7 粉丝