转载:大厂5G python自动化测试面试必会 | 迭代器与解析篇

1、什么是可迭代对象?

参考:《Python学习手册(第四版)》

答:

        “可迭代对象”的概念在Python中是相当新颖的,但它在语言的设计中很普遍。基本上,这就是序列观念的通用化:如果对象是实际保存的序列,或者可以在迭代工具环境中(例如,for循环)一次产生一个结果的对象,就看做是可迭代的。总之,可迭代对象包括实际序列和按照需求而计算的虚拟序列。

2、在Python中,可以用于从左至右的扫描对象的迭代工具主要有哪些?

参考:《Python学习手册(第四版)》

答:

      for循环、列表解析、in成员关系测试以及map内置函数等。

3、在遍历任意一个可迭代对象时,如何确认何时可以离开此次遍历?

参考:《Python学习手册(第四版)》

答:

        Python中有一个概念叫迭代协议,内容即为:有__next__方法的对象会前进到下一个结果,而在一系列结果的末尾时,则会引发StopIteration。在Python中,任何这类对象都认为是可迭代的。任何这类对象也能以for循环或其他迭代工具遍历,因为所有迭代工具内部工作起来都是在每次迭代中调用__next__,并且捕捉StopIteration异常来确定何时离开。

4、for循环和列表解析直接有什么关系?

参考:《Python学习手册(第四版)》

答:

        两者都是迭代工具。列表解析是执行常见for循环任务的简明并且高效的方法:对可迭代对象内所有元素应用一个表达式,并收集其结果。你可以把列表解析转换成for循环,而列表解析表达式的一部分的语法看起来就像是for循环的首行。

5、举出Python中的4种迭代环境。

参考:《Python学习手册(第四版)》

答:

        Python中的迭代环境包括for循环、列表解析、map内置函数、in成员关系测试表达式以及内置函数sorted、sum、any和all。这个分类也包括了内置函数list和tuple、字符串join方法以及序列赋值运算。所有这些都使用了迭代协议(next方法)来一次一个元素逐个遍历可迭代对象。

6、如今从一个文本文件逐行读取行的最好的方法是什么?

参考:《Python学习手册(第四版)》

答:

        如今从文本文件中读取文本行的最佳方式是不要刻意去读取:其替代方法是,在迭代环境中打开文件,诸如for循环或列表解析中,然后,让迭代工具在每次迭代中执行该文件的next方法,自动一次扫描一行。从代码编写的简易性、执行速度以及内存空间需求等方面来看,这种做法通常都是最佳方式。

7、列表解析放在方括号和圆括号中有什么区别?

参考:《Python学习手册(第四版)》

答:

        方括号中的列表解析会一次在内存中产生结果列表。当位于圆括号中时,实际上是生成器表达式:它们有类似的意义,但不会一次产生结果列表。与之相对比的是,生成器表达式会返回一个生成器对象,用在迭代环境中时,一次产生结果中的一个元素。

8、生成器和迭代器有什么关系?

参考:《Python学习手册(第四版)》

答:

        生成器是支持迭代协议的对象:它们有__next__方法,重复前进到系列结果中的下个元素,以及到系列尾端时引发例外事件。在Python中,我们可以用def、加圆括号的列表解析的生成器表达式以及以类定义特殊方法__iter__来创建生成器对象(本书稍后讨论),通过它们来编写生成器函数。

9、如何分辨函数是否为生成器函数?

参考:《Python学习手册(第四版)》

答:

        生成器函数在其代码中的某处会有一个yield语句。除此之外,生成器函数和普通函数语法上相同,但是,它们由Python特别编译,以便在调用的时候返回一个可迭代的对象。

10、yield语句是做什么的?

参考:《Python学习手册(第四版)》

答:

        当有了yield语句时,这个语句会让Python把函数特定的编译成生成器;当调用时,会返回生成器对象,支持迭代协议。当yield语句运行时,会把结果返回给调用者,让函数的状态挂起。然后,当调用者再调用__next__方法时,这个函数就可以重新在上次yield语句后继续运行。生成器也可以有return语句,用来终止生成器。

11、map调用和list comprehension有什么关系?比较并对比两者。

参考:《Python学习手册(第四版)》

答:

        map调用类似于列表解析,两者都会收集对序列或其他可迭代对象中每个元素应用运算后的结果(一次一个项目),从而创建新列表。其主要差异在于,map会对每个元素应用函数,而列表解析则是应用任意的表达式。因此,列表解析更通用一些,可以像map那样应用函数调用表达式,但是,map需要一个函数才能应用其他种类的表达式。列表解析也支持扩展语法,例如,嵌套for循环和if分句从而可以包含内置函数filter的功能。

12、生成器函数与常规函数有一个不同点在于生成器函数可以状态挂起,生成器函数是如何实现状态挂起的?

参考:《Python学习手册(第四版)》

答:

        生成器函数和常规函数之间的主要的代码不同之处在于,生成器yields一个值,而不是返回一个值。yield语句挂起该函数并向调用者发送回一个值,但是,保留足够的状态以使得函数能够从它离开的地方继续。当继续时,函数在上一个yield返回后立即继续执行。从函数的角度来看,这允许其代码随着时间产生一系列的值,而不是一次计算它们并在诸如列表的内容中送回它们。

13、生成器函数协议中的send方法有什么作用?

参考:《Python学习手册(第四版)》

答:

        send方法生成一系列结果的下一个元素,这一点就像__next__方法一样,但是它也提供了一种调用者与生成器之间进行通信的方法,从而能够影响它的操作。

        send方法使得值可以通过调用G.send(value)发送给一个生成器G。之后恢复生成器的代码,并且生成器中的yield表达式返回了为了发送而传入的值。如果提前调用了正常的G.__next__()方法(或者其对等的next(G)),yield返回None。

14、为什么说生成器是单迭代器对象?

参考:《Python学习手册(第四版)》

答:

        生产器函数和生成器表达式自身都是迭代器,并由此只支持一次活跃迭代——不像一些内置类型,我们无法有在结果集中位于不同位置的多个迭代器。一个生成器的迭代器是生成器自身(实际上,在一个生成器上调用iter没有任何效果)。

15、列表解析与手动的for循环语句有什么区别?

参考:《Python学习手册(第四版)》

答:

        列表解析比手动的for循环语句运行的更快(往往速度会快一倍),因为它们的迭代在解释器内部是以C语言的速度执行的,而不是以手动Python代码执行的,特别是对于较大的数据集合,这是使用列表解析的一个主要的性能优点。
————————————————
版权声明:本文为CSDN博主「yulanxuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41701820/article/details/121348995

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值