软件测试之python面试题,python试卷生成器
首先说明生成器也是迭代器,也有迭代器的优点。
那为什么是发电机?因为到目前为止,你没有写迭代器,但是别人定义了。如何自己构建一个迭代器?下面的内容会给你答案。
自己创建迭代器,我们可以根据迭代器的特性定义一个类(只要一个对象有__iter__和__next__方法,然后定义一个__iter__()和__next_(),然后这个类实例化的对象就是迭代器。
但是这样写太麻烦了!更何况,我们还没有学到上课的知识。我们做什么呢给你一根魔杖,快速、优雅、高效地构建一个迭代器。
Yield关键字创建迭代器的第一种方法是使用yield关键字。具体怎么实现?
很简单,如下:
def g():
打印(嘿~发电机)
Yield 1写的很像函数的定义,相当于用Yield代替return(当然没那么简单)。
此时,我在执行g()时返回的是一个生成器。就这么简单。
ret=g()
print(ret)# output generator object g at0x 101 fef 6d 0但是这里有一个特别需要注意的点,也是和函数最明显的区别:
当我们执行g()时,并不打印嘿~生成器,就像函数没有执行一样。
这也是生成器的一个很重要的特性,就是你执行g()的时候返回的是一个生成器。同时,它只在迭代的时候才开始执行内部代码(调用它的__next__()时),在yield后返回值,遇到yield关键字就停止。
打印(ret。_ _ next _ _()$ print(next(ret))输出:
嘿~发电机
当然,1 for循环也有可能:
因为我在ret:
打印(I)输出:
嘿~发电机
Yields也可以多次执行,这与return不同。
def g2():
打印(嘿~生成器1 )
产量1
打印(嘿~发电机2 )
产量2
Ret=g2()此时,当你执行next(ret)时,它会打印‘嘿!1 ,然后返回一个1,然后再次执行next(ret),它会打印出嘿!Generator ,然后返回一个2。
打印(下一页(返回))
#输出
嘿~ 1号发电机
一个
打印(下一页(返回))
#输出
嘿~ 2号发电机
2
yield和return的区别在于,return在一个函数中只能执行一次,之后该函数就完全结束了:
定义test_return():
返回1
2 #从不执行
3 #从不执行yield后,可以保存函数的运行状态,下次继续执行:
def test_yield()。
产量1
Yield 2 #将在next()之后执行
Yeild 3 #在next()之后执行以下示例。使用return时,只能返回0。
定义test_return2():
对于范围(10)内的I:
Return i #只能返回0,函数结束。可以用yield依次返回0 ~ 9。
def test_yield2()。
对于范围(10)内的I:
Yield i #每次调用next()都会弹出0~9。
yield yield函数把函数变成生成器(生成器就是迭代器)。为函数封装了__iter__和__next__方法,将函数的执行结果做成迭代器。跟随迭代器的值obj。_ _ next _ _(),它触发函数的执行。功能暂停和恢复执行的状态由yield保存。倒计时示例:
定义倒计时(n):
打印(“倒计时开始”)
而n 0:
产量
n -=1
Print (launch )分析以下语句的执行过程:
g=倒计时(5)
Print(g.__next__()) # print 倒计时开始,返回5(此时n=5)
Print(g.__next__()) #返回4(在本例中,n=4)
Print(g.__next__()) #返回3(在本例中,n=3)
Print(g.__next__()) #返回2(在本例中,n=2)
Print(g.__next__()) #返回1(在本例中,n=1)
Print(g . _ _ next _ _())# Print launch 抛出StopIteration异常(此时n=0)。调用__next__()时,函数执行内部代码,并在到达yield关键字时暂停:
g=倒计时(5)
打印(g.__next__())输出:
倒计时开始
5发电机也不能倒退:
g=倒计时(5)
打印(g.__next__())
打印(g.__next__())
对于i in g:
打印(I)输出:
倒计时开始
五
四
-为了-
三
2
一个
每次调用countdown(5),都会得到一个不同的生成器。
为我倒数(5):
打印(一)
对于copuntdown(5)中的I:
打印(I)输出:
五
下面5的例子也是一样。倒计时(5)在每次打印中都是一个全新的生成器,所以打印出来的值是5。
打印(倒计时(5)。__next())
打印(倒计时(5)。__next())
打印(倒计时(5)。__next())输出:
五
五
五
生成器我们之前学过列表推导,是这样写的:
[i for i in range(10)]
[0,1,2,3,4,5,6,7,8,9]得到一个元素数量很少的列表非常方便,但是创建一个元素数量巨大的列表就不那么友好了。
[i代表范围内的I(1000000000)]
.这时候只要把[]改成(),把列表推导变成生成器表达式,就得到一个生成器对象,就是这么神奇。
这是自创建迭代器的第二种方法。
(i for i in range(10))
生成器对象gen expr at0x101feF6D0我们可以直接使用for循环来遍历上面获得的生成器:
对于i in (i for i in range(10)):
.打印(一)
.
0
一个
2
三
四
五
六
七
八
9这样,我们就可以理直气壮地创建一个有1000000000个元素的生成器,而不用担心内存会爆。
(I代表范围内的I(1000000000))
0x101fef728处的生成器对象genexpr
最后总结:
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。