用函数实现generator的意义在哪里

如题,请教一下各位高手。既然一般函数可以实现需求,为什么还要用generator函数实现,意义在哪里(generator函数只是将一般函数的return改成yield)

阅读 3.8k
5 个回答

小丽30岁了,想找一个男朋友,现在她有两个办法

  • 下个月有一场相亲会,一次可以连续相亲100人(一次性return一组对象)
  • 找一个媒婆,媒婆会连续得给小丽介绍对象,小丽一个一个去相亲,明天就可以开始(yield一个一个返回结果)

两种方法对于循环来说,都是一个一个的去相亲(遍历),但是第一种方法要等所有的相亲对象(元素)都就位之后才能开始,需要更多的时间宣传召集参加者(生成元素),更大的会场(内存空间),第二种生成器方法,小丽和媒婆说我要一个相亲对象(元素),媒婆找到一个交给小丽,小丽完成相亲,叫了第二个对象(可迭代对象的next()方法),继续相亲.
这样操作减少了等待的时间,同时不需要那么大的房子.节省的资源很可观.

一般函数是一次性生成所有数据返回,
若想按需取每一个数据,那么使用for来迭代,但是数据太多了怎么办?
就需要一种生成数据的规则,每次按规则生成数据返回一项数据,这就是yield的

>>> def gen(n):
        i = 0
        while i < n:
            i += 1
            yield i

        
>>> for s in gen(10):
        print(s)

gen(10)不会一次性先计算好10个值,而是迭代的时候一个一个生成。

生成器的主要意义之一就是避免占用更多的内存。

需要求多值的时候,可以一次返回一个,慢慢算

class fib():
  def __init__(self):
    self.a = 0
    self.b = 1
  def __iter__(self):
    while(1):
      yield self.b
      self.a, self.b = self.b, self.a+self.b

b = iter(fib())
b.next()
计算斐波那契数列,想多少个多少个。

貌似下面这个更能体现:
def process_dir(dir):
if is file

yield process_file(file)

if is dir

process_dir()

突然灵光一闪:generator返回的是一个迭代类(不知道是不是叫这个),是可迭代的,虽然在for、while等语句中generator和一般函数的使用没什么区别,但是在有些地方,一般函数就不能胜任了,比如map等高阶函数中,要求参数是可迭代的,这时就只能用generator了。
不知道说的对不对,欢迎来喷~~

可以減小每次產生的數據量 你用的時候它就在那

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题