python 生成器原理(重点)

'''
使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,
返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。
'''

'''方法1'''
import sys
# 这种方式占据内存空间,返回的是一个数列
nums01 = [x * 2 for x in range(10000000) if x < 10000]
print(nums01)  # 这种方式占据内存空间,返回的是一个数列
print sys.getsizeof(nums01)  # 此处输出的内存大小为 87624
for i in nums01:
    print(i)
print ('-' * 50)

# 生成器不占据内存空间,返回的是一个对象
nums02 = (x * 2 for x in xrange(10000000) if x < 10000)
print(nums02)  # 生成器不占据内存空间,返回的是一个对象
print sys.getsizeof(nums02)  # 此处输出的内存大小为 72
for i in nums02:
    print(i)
print ('-' * 50)


'''方法2'''
def create_num(all_num):
    print('---1---')
    a,b = 0,1
    current_num = 0
    # 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,
    # 返回 yield 的值到for循环中, 并在下一次执行 next() 方法时从当前位置继续运行。
    while current_num < all_num:
        print('---2---')
        yield a
        print('---3---')
        a,b = b,a+b
        current_num += 1
        print('---4---')

# 如果在调用create_num的时候,发现这个函数中有yield那么此时,不是调用函数,
# 而是创建一个生成器对象
obj = create_num(10)
for num in obj:
    print(num)

print('-'*50)


'''函数例子'''
def create_num(all_num):
    a,b = 0,1
    current_num = 0

    while current_num < all_num:
        yield a
        a,b = b, a+b
        current_num += 1
    return 'OK'

obj02 = create_num(50)
while True:
    try:
        result = next(obj02)
        print(result)
    except Exception as result:
        print(result)  # 获取return 的值
        break

print('-'*50)

'''send能传递参数入生成器 改变yield的值'''
def create_num01(all_num):
    a,b = 0,1
    current_num = 0

    while current_num < all_num:
        result = yield a
        print('>>> result <<<',result)
        # 可以根据传入的值做处理
        if result == 'hahaha':
            print(True)
        a,b = b, a+b
        current_num += 1
    return 'OK'

obj03 = create_num01(20)

result03 = next(obj03)
print('result03:',result03)

result04 = obj03.send('hahaha')
print('result04:',result04)

# 如果第一次就要执行send就使用如下方式
result05 = obj03.send(None)
print('result05:',result05)

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值