类型和对象
1 迭代器
自己不会写迭代器,只用
任务:请展示列表中所有的数据
while + 索引 + 计数器
-
迭代器,帮助你对某类对象(str/dirt/list/set/tuple)--可迭代对象中的与元素逐一获取。
列表转换成迭代器:v1 = iter([11,22,33,44])
迭代器想要获取每个值,反复调用 val = v1._ _ next _ _()
-
直到报错:Stopiteration错误,表示已经迭代完毕
v1 = [11, 22, 33, 44] # 列表转换成迭代器,元组,集合(无序),字典(只有键被循环出来),字符串等容器都可以 v2 = iter(v1) v2=v1.__iter__() while True: try: val = v2.__next__() print(val) except Exception as e: break 如何判别一个对象是否是迭代器:内部是否有_ _ next _ _方法
-
for循环
v1 = [11,22,33,44] #1.内部会将v1转换成迭代器 #2.内部反复执行 迭代器.__next__() #3.取完不报错 for item in v1: print(item)
2可迭代对象
- 内部具有_ _ iter _ _()方法且返回一个迭代器。
- 可以被for循环
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)
其他知识
- yield from关键字
- 生成器推到式