Python 生成器

# 生成器的本质就是迭代器

"""
构建生成器的方式:
    1生成器函数
    2生成器表达式
    3Python提供的一些内置函数,返回一个生成器
"""
def func():
    print('hello world')
    yield 'good'

ret = func()   # 生成器对象,函数不执行
print(ret)    # <generator object func at 0x0000027A22F72890>

# 只要函数中出现了yield那么它就不是普通函数了,它是生成器函数。
# 生成器本质是迭代器,所以通过next方法对其进行取值
print(next(ret))  # hello world  good


# 一个yield对应一个next
def func1():
    yield 'what'
    yield 'who'
res = func1()
print(next(res))   # what
print(next(res))   # who

"""
return and  yield
return: 结束函数,给函数的执行者返回值
yield: 不结束函数,对应着给next返回值
"""

# yield from:将一个可迭代对象的每一个元素返回给next;节省代码,提升效率(代替了for循环)
def func2():
    l = [9, 8, 7]
    yield from l

res2 = func2()
print(next(res2))  # 9
print(next(res2))  # 8
print(next(res2))  # 7

def func3(*args):
    for i in args:
        for j in i:
            yield j
res3 = func3('hello', [1,2,3,6,7])
print(list(res3))  # ['h', 'e', 'l', 'l', 'o', 1, 2, 3, 6, 7]

def func4(*args):
    for i in args:
    	# 代替了一个for循环
        yield from i
res4 = func4('hello', [1,2,3,6,7])
print(list(res4))  # ['h', 'e', 'l', 'l', 'o', 1, 2, 3, 6, 7]

# 生成器表达式
obj = (i for i in range(10))
print(obj)    # <generator object <genexpr> at 0x000002ECD2AC9C10>
print(next(obj))    # 0
print(next(obj))    # 1

"""
如何触发一个生成器(迭代器)取值:
1、next方法
2、for循环
3、将其转化为列表
"""

# 面试题
def add(n, i):
    return n+i

def func5():
    for i in range(4):
        yield i

g = func5()

for n in [1, 10]:
    g = (add(n, i) for i in g)

print(list(g))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值