2020-04-09

2020-04-09  本文已影响0人  captainluck

类型和对象

1 迭代器

自己不会写迭代器,只用

任务:请展示列表中所有的数据

2可迭代对象

3 生成器(函数的变异)

def func():
    return 123
func()
#生成器函数(内部是否包含yield)
def func():
    print('F1')
    yield 1
    print('F2')
    yield 2
    print('F3')
    yield 100
    print('F4')
v1 = func()
for item in v1:
    print(item)
 #打印结果:
F1
1
F2
2
F3
100
F4
#函数内部代码不会执行,返回一个生成器对象
v1 = func()
#生成器可以被for循环,一旦开始循环那么函数内部代码就会开始执行
for item in v1:
    print(item)
def func():
   count = 1
   while True:
       yield count
       count += 1
       if count == 100:
            return
v1 = func()
for item in v1:
    print(item)

总结

函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数会返回一个生成器,生成器只有被for循环时,生成器函数内部代码才会执行。每次循环都会获取yield的返回值。

示例【面试会遇到】:

def func():
    """
    分批去读取文件中的内容,将文件的内容返回给函数
    :return:
    """
    cursor = 0
    while True:
        f = open('db', 'x', encoding-'utf-8') #通过网络连接上redis
        #代指 redis[0:10]
        f.seek(cursor)
        data_list = []
        for i in range(10):
            line = f.readline()
            if not line:
                return
            data_list.append(line)
        cursor = f.tell()
        f.close() #关闭与redis的连接
for item in func():
    print(item)

生成器还是一个特殊的迭代器

def func():
    yield 1
    yield 2
    yield 3
v = func()
result = v.__next__()
print(result)
result = v.__next__()
print(result)
result = v.__next__()
print(result)
result = v.__next__()
print(result)

生成器也是一个特殊的可迭代对象

def func():
    yield 1

v = func()
result = v.__iter__()
print(result)

其他知识

上一篇 下一篇

猜你喜欢

热点阅读