24 生成器和迭代器复习和作业

Posted on 2018-09-16 21:50  白色雪狐  阅读(137)  评论(0编辑  收藏  举报

# 迭代器和生成器
# 迭代器
# 可迭代协议 —— 含有iter方法的都是可迭代的
# 迭代器协议 —— 含有next和iter的都是迭代器
# 特点
# 节省内存空间
# 方便逐个取值,一个迭代器只能取一次。
# 生成器 —— 迭代器
# 生成器函数
# 含有yield关键字的函数都是生成器函数
# 生成器函数的特点
#调用之后函数内的代码不执行,返回生成器
#每从生成器中取一个值就会执行一段代码,遇见yield就停止。
#如何从生成器中取值:
# for :如果没有break会一直取直到取完
# next :每次只取一个
# send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
# 数据类型强制转换 :会一次性把所有数据都读到内存里


# 生成器表达式
# (条件成立想放在生成器中的值 for i in 可迭代的 if 条件

#处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕

def check_file(filename,aim):
    with open(filename,encoding='utf-8') as f:   #句柄 : handler,文件操作符,文件句柄
        for i in f:
            if aim in i:
                yield i

g = check_file('1.复习.py','生成器')
for i in g:
    print(i.strip())
#写生成器,从文件中读取内容,在每一次读取到的内容之前加上‘***’之后再返回给用户。
def check_file(filename):
    with open(filename,encoding='utf-8') as f:   #句柄 : handler,文件操作符,文件句柄
        for i in f:
            yield '***'+i

for i in check_file('1.复习.py'):
    print(i.strip())

 #面试题

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

g=demo()            #生成器

g1=(i for i in g)
g2=(i for i in g1)

#第一种情况
print(list(g))
print(list(g1))
print(list(g2))
# [0, 1, 2, 3]
# []
# []

#第二种情况
#print(list(g))
print(list(g1))
print(list(g2))
# [0, 1, 2, 3]
# # []

#第三种情况
#print(list(g))
#print(list(g1))
print(list(g2))
#[0, 1, 2, 3]
#第二题
def add(n,i):
    return n+i

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

g=test()
for n in [1,10,5]:              #For 循环套生成器表达式
    g=(add(n,i) for i in g)
# n = 1
# g=(add(n,i) for i in test())
# n = 10
# g=(add(n,i) for i in (add(n,i) for i in test()))
# n = 5
# g=(15,16,17,18)

print(list(g))      #[15, 16, 17, 18]

 

Copyright © 2024 白色雪狐
Powered by .NET 8.0 on Kubernetes