0. python面试常见问题

知乎:python面试170题
知乎:30道python自动化测试面试题与答案汇总

1.python迭代器和生成器

1.1 迭代器

迭代器(Iterator)和生成器(Generator)在python中都是处理**序列数据**时非常重要的概念

csdn:python迭代器和生成器

迭代器提供了一种标准的方法来访问一个容器对象中的元素序列,而无需暴露容器的底层实现细节。
迭代器是一个实现了迭代协议的对象,它可以让我们遍历一个容器中的所有元素,而不需要知道容器的内部结构,迭代器可以被用于遍历列表、元组、字典、集合等容器类型。

python的for循环就是通过迭代器来实现的,当我们使用for循环遍历一个容器时,python会自动创建一个迭代对象,并调用__next__()方法来获取容器中的下一个元素,知道容器中的所有元素都被遍历完毕。除了使用for循环,还可以使用iter()函数来手动创建一个迭代器对象,并使用next()函数来获取容器中的下一个元素,这种方式可以让我们更灵活地控制迭代的过程。迭代器可以让我们更加方便的遍历容器中的元素,提高代码可读性和可维护性。

小结: 1.凡是可作用于for循环的对象都是Iterable类型; 2.凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列; 3.集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

再举个生活例子来解释一下迭代器:
迭代器这个概念,其实可以把它比喻成一个在图书馆里帮你找书的图书管理员。想象一下:
在图书馆中,图书按照一定的规则排列在不同的书架上。我们想要读遍整个图书馆的所有书籍,但不需要一次性把所有书都搬出来堆在一起。
这时,图书管理员(迭代器)就出场了。你只需要告诉管理员:“我想一本接一本地看所有的书。”管理员就会从第一个书架的第一个位置开始,每次给你取出一本书,并告诉你书的名字和内容(即访问集合中的每个元素)。当你看完一本后,只需说一声“下一本”,管理员就会找到下一个书的位置并递给你(调用next()方法获取下一个元素)。
如果图书馆很大,图书很多,而你的书包很小(内存有限),那么这个图书管理员服务就显得非常实用且高效,因为它只在你需要的时候才取出下一本书,而不是一次性拿出所有书占用大量空间。
当图书馆里的书都被你看完了(容器中所有元素都被访问过),管理员会告诉你没有更多的书可看了(抛出StopIteration异常),这意味着遍历过程结束。
这样,通过迭代器,你可以方便地按照一定顺序逐个访问一组数据,无需关心这些数据是如何存储或组织的,就像你不用了解图书馆的内部布局一样,只需要和图书管理员打交道即可。

1.2 生成器

什么是生成器:是Python中一种特殊的迭代器, 与一次性创建所有元素的数据结构(如列表或元组)不同,生成器在每次迭代时只生成下一个值,从而节省内存并支持无限序列或其他大量数据流的操作。

使用了 yield 的函数被称为生成器(generator)

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。
然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。
调用一个生成器函数,返回的是一个迭代器对象。

1.3 总结一下迭代器和生成器的应用场景

  • 迭代器(Iterator)
  1. 遍历大型数据集:当处理无法一次性加载到内存中的大文件、数据库记录或大规模数据结构时,迭代器可以逐条读取数据,无需全部加载,从而节省内存
  2. 循环遍历任何可迭代对象:包括列表、元组、字典、集合、字符串以及自定义的可迭代类型。for 循环等语句会自动调用迭代器来访问容器内的元素。
  3. 无限序列:用于生成斐波那契数列、阶乘序列或其他无限序列,每次仅计算下一个值。
  • 生成器(Generator)
  1. 延迟计算/惰性求值:生成器允许按需生成结果,适合处理大量计算密集型或IO密集型任务,比如大数据流处理,只在需要时才执行计算并产出结果。
  2. 资源管理:在需要有限资源的情况下,例如打开文件并逐行读取内容,生成器可以在读取完一行后,释放相关资源,然后在下一次请求时重新获取资源。
  3. 节省内存空间:类似于迭代器,但更加灵活。在函数中使用 yield 关键字暂停函数的执行,并在下次调用时从上次停止的地方恢复,这样在生成复杂数据结构时避免了同时存储所有中间结果的开销。

综上所述,迭代器和生成器是Python中用来简化代码、优化性能和管理资源的重要工具,在处理大规模数据、编写高效算法及构建复杂程序逻辑时发挥着重要作用。

什么是装饰器(decorator)

装饰器允许通过将现有函数传递给装饰器,从而向现有函数添加一些额外的功能,该装饰器将执行现有函数的功能和添加的额外功能。

csdn:必读!53个Python经典面试题详解

Python中如何实现多线程-GIL(全局解释器锁)

Python是多线程语言,其内置有多线程工具包。多线程能让我们一次执行多个线程。Python中的GIL(全局解释器锁)确保一次执行单个线程。一个线程保存GIL并在将其传递给下个线程之前执行一些操作,看上去像并行运行的错觉。事实上是线程在CPU上轮流运行。所有的传递会增加程序执行的内存压力。

相关推荐

  1. 0. python面试常见问题

    2024-07-09 22:48:06       23 阅读
  2. kafka面试常见问题

    2024-07-09 22:48:06       34 阅读
  3. 前端面试常见问题

    2024-07-09 22:48:06       34 阅读
  4. Linux面试常见问题

    2024-07-09 22:48:06       22 阅读
  5. 数据结构面试常见问题

    2024-07-09 22:48:06       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 22:48:06       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 22:48:06       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 22:48:06       57 阅读
  4. Python语言-面向对象

    2024-07-09 22:48:06       68 阅读

热门阅读

  1. 配置linux的yum镜像为阿里镜像源

    2024-07-09 22:48:06       19 阅读
  2. Docker一键部署PostGIS

    2024-07-09 22:48:06       20 阅读
  3. C语言编程2:常用的数据类型

    2024-07-09 22:48:06       22 阅读
  4. 秒验 iOS端授权页添加自定义按钮

    2024-07-09 22:48:06       21 阅读
  5. 代码随想录算法训练营:23/60

    2024-07-09 22:48:06       23 阅读
  6. Android Camera API发展历程

    2024-07-09 22:48:06       19 阅读
  7. 工作日常学习记录

    2024-07-09 22:48:06       24 阅读
  8. ELK的储存、分析功能介绍!

    2024-07-09 22:48:06       23 阅读
  9. Linux实战记录

    2024-07-09 22:48:06       23 阅读
  10. 价值投资者什么时候卖出股票?

    2024-07-09 22:48:06       23 阅读