0
点赞
收藏
分享

微信扫一扫

object专栏 01.函数 04.迭代器与生成器 02.生成器

栖桐 2022-03-25 阅读 33
python
def func():
    yield 1
    yield 2
    # 可返回多次值


defined_iter = func()
# 返回一个生成器  生成器就是自定义的迭代器
print(defined_iter)
# <generator object func at 0x104fc3dd0>

# 返回第一个值
res01 = defined_iter.__next__()
print(res01)

# 返回第二个值  -->  没有值时则报错
res02 = defined_iter.__next__()
print(res02)
def func_01(name):
    food_list = []
    while True:
        # yield可以接收一个值,与后面的返回值无关
        # 此处不是将返回值传递给x,而是将接收到的值传递给了x
        x = yield food_list  # 光标会停留在此处
        print('%s正在吃%s' % (name, x))
        food_list.append(x)


# 得到一个生成器
my_iter = func_01('狗狗')


# 初始化
my_iter.send(None)
# 将值传递给光标停放处前方的yield
# 刚得到的生成器只能传入None
# 相当于next(my_iter)


my_iter.send('苹果')
my_iter.send('香蕉')
my_iter.send('桃子')


# 打印yield的返回值
print(my_iter.send('栗子'))
my_iter.close()  # 关闭
# 生成器生成式 不可生成元组
# 外侧加小括号为生成器
gene_exa = (i for i in range(8) if i > 3)
# 此时gene_exa内部并没有值
print(gene_exa, type(gene_exa))
print(next(gene_exa), next(gene_exa))
# next一次,循环一次,获得一个值,防止占用内存过大


# 列表生成式:
li = ['apple', 'banana', 'hello', 'world']
# 外侧加中括号为列表
li_01 = [i for i in li if i.find('l') > -1]
print(li_01)
# ['apple', 'hello', 'world']


# 集合生成式
li = ['name', 'age', 'height']
# 外侧加大括号为集合
set_exa_01 = {i for i in li}
print(set_exa_01)
# {'height', 'name', 'age'}


# 字典生成式
dic = {'name': '李白', 'age': 18, 'hobby': 'eating'}
dic_01 = {key: None for key in dic}
print(dic_01)
# {'name': None, 'age': None, 'hobby': None}

items = [('name', '李白'), ('age', 18), ('hobby', 'eating')]
dic_02 = {k: v for k, v in items if k != 'age'}
print(dic_02)
# {'name': '李白', 'hobby': 'eating'}


# 应用
with open('test.txt', mode='rt', encoding='utf-8') as file:
    # gene = (len(line) for line in file)
    res = sum(len(line) for line in file)
    # 省去生成器表达式的括号
    # 相当于将一个生成器gene传递给sum,sum会遍历并求和
    print(res)
举报

相关推荐

0 条评论