软件测试之python面试题,python试卷生成器

  软件测试之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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: