Swift51.com
麦子学院 头像
麦子学院  2017-03-09 12:25

python之yield和Generator

回复:0  查看:2716  
本文和大家分享的主要是python yield Generator相关内容,一起来看看吧,希望对大家 学习python有所帮助。
  首先我们从一个小程序导入,各定一个list ,找出其中的素数,我们会这样写
   import math def  is_Prims(number):
   if number == 2:
   return  True
  // 2 以外的所有偶数都不是素数
   elif number % 2 == 0:
   return  False
  // 如果一个数能被除 1 和本身之外的数整除,则为合数。其实我们的判定范围到根号 n 就可以
   for cur  in range(2,int(math.sqrt(number))+1,2):
   if number % cur == 0:
   return  False
   else:
   return  True
   def  get_Prims(input_list):
  result_list = list()
   for element  in input_list:
   if is_Prims(element):
  result_list.append(element)
   return result_list
  aa = get_Prims([1,2,3,4,5,6,7,8,9]) print (aa)
  但如果我们想给定一个数,然后列出比这个数大的所有素数呢?我们可能这样写:
   def  get_Prims(number):
   if is_Prims(number):
   return number
  但是一旦return 函数将控制权交给调用者后彻底结束,任何局部变量和函数工作都被丢弃,下一次调用又会从头开始。因此我们就可以用一下写法:
   def  get_Prims(number):
   while( True):
   if is_Prims(number):
   yield number
  number += 1
   def  get_numbers():
  total = list()
   for next_prim  in get_Prims(2):
   if next_prim < 100:
  total.append(next_prim)
   else:
  print(total)
   return
  get_numbers()
  下面解释一下generator 函数,一个函数的 def 代码里包含了 yield, 函数就自动成为了一个 generator 函数(及时仍包含有 return ), generator 函数创建 generator (一种特殊形式的迭代器,这个迭代器有一个内置 __next__() 方法),当需要一个值的时候通过 yield 来产生而不是直接 return ,因此与一般函数不同的是,此时控制权并未交出。
  for 循环会隐式的调用 next() 函数, next() 函数负责调用 generator 中的 __next__() 方法,此时 generator 负责返回一个值给任何调用 next() 的方法,利用 yield 将此值传回去,相当于 return 语句。
来源: 博客园