day 12、13、14 :summary、homework、面试题

一、summary 总结

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

二、homework

3.处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕
def check_file(fliename,aim):
    with open(fliename,'r',encoding='utf-8') as f:
        for i in f:
            if aim in i:
                yield i

g = check_file('1.复习.py','生成器')
for i in g:
    print(i.strip())
4.写生成器,从文件中读取内容,在每一次读取到的内容之前加上‘***’之后再返回给用户。
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]
[]
[]

同一个生成器的取值是:下一次取值的位置是接着上一次取值的位置

栗子:读程序,写输出:

def add(n,i):
    return n+i

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

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

print(list(g))

看到for嵌套生成器时,就把for的情况写出来

这个程序在执行到print(list(g))之前,生成器都没有激活。只有执行到print(list(g))时,才会返回上一步n=10时,寻找g

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

就可以写成:

n = 1
g=(add(n,i) for i in g)
n = 10
g=(add(n,i) for i in (add(n,i) for i in g))
print(list(g))
n = 10
g=(add(10,i) for i in (add(10,[0,1,2,3]) )
n = 10
g=(add(10,i) for i in [10,11,12,13] )
n = 10
g=([20, 21, 22, 23] )

改编题:

def add(n,i):
    return n+i

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

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

print(list(g))




[15, 16, 17, 18]

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=(add(5,i) for i in (add(5,i) for i in (add(5,i) for i in [0,1,2,3])))
 =(15,16,17,18)

猜你喜欢

转载自blog.csdn.net/qq_35883464/article/details/83050134