Python——生成器

一、生成器与yield

# 如何得到自定义的迭代器:
# 在函数内一旦存在yield关键字,调用函数并不会执行函数体代码
# 会返回一个生成器对象,生成器
def func():
    print('第一次')
    yield 1
    print('第二次')
    yield 2
    print('第三次')
g = func()
print(g) # generator
# 生成器就是迭代器
g.__iter__()
g.__next__()

# 会触发函数体代码的运行,然后遇到yield停下来,将yield后的值当作本次调用的结果返回
res1 = g.__next__()
print(res1)


# 应用案例
# 需求:造一个能够产生无穷个值的数据类型
def my_range(start, stop, step=1):
    # print('start...')
    while start < stop:
        start += step
        yield start
    # print('end...')

for n in my_range(1, 7, 2):
    print(n)
    
# yield与return对比总结说明:
'''
函数调用函数体代码执行到yield时会返回yield后的值并将函数运行状态暂停在yield的位置
而return,当函数被调用时函数体代码运行到return时返回return后的值但是函数直接被结束掉了。
因此,return只能返回一次值,而yield可以返回多次值
'''

二、yield表达式应用

# x=yield 返回值
def eat(name):
    food_list = []
    with open('db.txt', 'at', encoding='utf-8') as f:
        print('%s饿了。。。' % name)
        while True:
            # x拿到的是yield接收到的值
            food = yield food_list  # x = '小笼包'
            print('%s吃了%s' % (name, food))
            food_list.append(food)
            if food is not None:
                f.write('%s\n' % food)

g = eat('润羽露西娅')
res = g.send(None)  # 必须要给一个初始的None值否则会报错
print('露西娅的胃:', res)
res = g.send('粽子')
print('露西娅的胃:', res)
res = g.send('汉堡')
print('露西娅的胃:', res)
# g.close()
res = g.send('小笼包')  # 关闭之后无法传值
print('露西娅的胃:', res)
print('露西娅吃饱了。。。')

三、三元表达式、列表生成式、生成器表达式

3.1 三元表达式

def func(x, y):
    if x > y:
        return x
    else:
        return y
res func(1,2)
print(res)

# 三元表达式: 条件成立时的返回值 if 条件 else 条件不成立时的返回值
def func(x,y):
    return x if x > y else y

res = func(1,2)
print(res)

3.2 列表生成式

# 列表生成式语法:l=[表达式 for x in 可迭代对象 if 条件] [表达式 for x in 可迭代对象]
l = ['rem_dlp', 'rushia_dlp', 'megumi_dlp']
harem = []
for girl in l:
    if girl.endswith('dlp')
    harem.append(girl)
    
    
# 列表生成式
'''
harem = [name for name in l if name..endswith('dlp')]
harem = [name for name in l]
'''
l = ['rem_dlp', 'rushia_dlp', 'megumi_dlp']
harem = [name.replace('_dlp', '').upper() for name in l if name.endswith('dlp')]
print(harem)

# 集合生成式
# 语法:dic={元素 for k in 可迭代对象 if 条件}
keys=['name','age','gender']
set1={key for key in keys}
print(set1,type(set1))

# 字典生成式
# 语法:dic={键:值 for k in 可迭代对象 if 条件}
keys=['name','age','gender']
dic = {key:None for key in keys}
print(dic)

items=[('name', 'rem'), ('age', 16), ('gender', 'female')]
dic = {k: v for k, v in items if k != 'gender'}
print(dic)

3.3 生成器表达式

# 语法:g=(表达式 for x in 可迭代对象 if 条件)
g=(i for i in range(10) if i > 3)
'''
强调:此时g内部没有值,g是一个生成器
print(g, type(g))
'''
# print(next(g))
# print(next(g))
# print(next(g))

with open('db.txt', mode='rt', encoding='utf-8') as f:
    # 方式一:
    # res=0
    # for line in f:
    #     res+=len(line)
    # print(res)

    # 方式二:
    # res=sum([len(line) for line in f])
    # print(res)

    # 方式三 :效率最高
    # res = sum((len(line) for line in f))
    # 上述可以简写为如下形式
    res = sum(len(line) for line in f)
    print(res)
posted @ 2020-03-24 15:12  群青-Xi  阅读(258)  评论(0编辑  收藏  举报