yield函数

  1. 通常的for…in…循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist
    = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。 它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。
  2. 生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成。比如 mygenerator = (x*x for x in
    range(3)),注意这里用到了(),它就不是数组,而上面的例子是[]。
  3. 我理解的生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。可以用上面的mygenerator测试。
  4. 带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,工作原理同上。
  5. yield 是一个类似 return的关键字,迭代一次遇到yield时就返回yield后面的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码开始执行。
  6. 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始。
  7. 带有yield的函数不仅仅只用于for循环中,而且可用于某个函数的参数,只要这个函数的参数允许迭代参数。比如array.extend函数,它的原型是array.extend(iterable)。
  8. send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。——换句话说,就是send可以强行修改上一个yield表达式值。比如函数中有一个yield赋值,a
    = yield 5,第一次迭代到这里会返回5,a还没有赋值。第二次迭代时,使用.send(10),那么,就是强行修改yield 5表达式的值为10,本来是5的,那么a=10
  9. send(msg)与next()都有返回值,它们的返回值是当前迭代遇到yield时,yield后面表达式的值,其实就是当前迭代中yield后面的参数。
  10. 第一次调用时必须先next()或send(None),否则会报错,send后之所以为None是因为这时候没有上一个yield(根据第8条)。可以认为,next()等同于send(None)。
  11. 代码示例1:
  12. #encoding:UTF-8  
    def yield_test(n):  
        for i in range(n):  
            yield call(i)  
            print("i=",i)  
        #做一些其它的事情      
        print("do something.")      
        print("end.")  
    
    def call(i):  
        return i*2  
    
    #使用for循环  
    for i in yield_test(5):  
        print(i,",")
  13. 结果是:

    >>>   
    0 ,  
    i= 0  
    2 ,  
    i= 1  
    4 ,  
    i= 2  
    6 ,  
    i= 3  
    8 ,  
    i= 4  
    do something.  
    end.  
    >>>
  14. 理解的关键在于:下次迭代时,代码从yield的下一跳语句开始执行。
    for循环就用到了next(),所以到yield能再执行

 

yield函数是Python中的一个关键字,用于定义生成器函数。生成器是一种特殊的迭代器,它可以通过yield语句来暂停和恢复函数的执行,从而实现按需生成数据的功能。 通过yield函数,我们可以将一个函数转化为生成器函数函数中包含yield语句的地方会被暂停执行,并返回一个值给调用者。当生成器函数再次被调用时,会从上次暂停的位置继续执行,直到再次遇到yield语句或函数结束。这种实现方式可以有效地节省内存,并提高性能。 下面以一个实例来详细说明yield函数的使用。 ``` def generate_numbers(n): i = 0 while i < n: yield i i += 1 numbers = generate_numbers(5) print(next(numbers)) # 输出:0 print(next(numbers)) # 输出:1 print(next(numbers)) # 输出:2 print(next(numbers)) # 输出:3 print(next(numbers)) # 输出:4 ``` 在这个例子中,generate_numbers是一个生成器函数。当调用它时,它会返回一个生成器对象。我们通过调用next()函数来获取生成器对象中的下一个值。每次调用next()函数时,函数会从yield语句处恢复执行,并返回yield关键字后的值。当生成器函数执行完毕时,通过调用next()函数会触发StopIteration异常。 通过这个例子,我们可以看到yield函数的实际应用:按需生成数据。在这个例子中,我们可以在使用generate_numbers函数时,只生成需要的数据,而不是一次性生成所有的数字。这样可以极大地节省内存,并提高程序的性能。 总的来说,yield函数的实例分析可以帮助我们更好地理解和使用生成器函数,从而在需要按需生成数据的场景下提供更加高效的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值