一、迭代器
for 变量 in 可迭代:
pass
iterable :可迭代的东西,比如str,list,tuple,set,dict,open()
iterator:迭代器
可迭代的数据类型都会提供一个叫迭代器的东西,这个迭代器可以帮我们把数据类型中的所有数据逐一的拿到
获取迭代器的两种方案:
1.iter()内置函数可以直接拿到迭代器
2.__iter__(): 特殊方法 迭代.__iter__()
从迭代器中拿到数据:
1.next()
2.__next__() 特殊方法,迭代.__next__()
for里面一定是要拿迭代器的,所以所有不可迭代的东西不能用for循环
for循环里面一定有__next__出现
总结:迭代器统一了所有不同数据类型的遍历工作
迭代器本身也是可迭代的
迭代器本身的特性:
1.只能向前不能反复
2.特别节省内存
3.惰性机制
iter()内置函数可以直接拿到迭代器
next()
# for i in 123:# 'int' object is not iterable
# pass
it = iter("你好啊,我叫甄嬛")
print(it)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
# StopIteration,迭代已经停止,不能再从迭代器里面拿东西了
# print(next(it))
__ iter__(): 特殊方法 迭代.__ iter__()
__ next__() 特殊方法,迭代.__ next__()
it = "好困呀啊啊啊啊啊".__iter__()
print(it)
print(it.__next__())
print(it.__next__())
print(next(it))
print(next(it))
模拟for循环的工作原理
# 模拟for循环的工作原理
s = "我是数据"
it = s.__iter__()
while 1:
try:
print(next(it))
except StopIteration:
break
print(1223456)
# #上面的迭代完成后it已经是一个空的迭代器了,所以要重新给数据,否则for循环没有结果
s = "我是数据"
it = s.__iter__()
for i in it:
print(i)
二、生成器
生成器:(generator)
生成器的本质就是迭代器
创建生成器的两种方案:
1.生成器函数
2.生成器表达式
生成器函数
生成器函数中有一个关键字yield
生成器函数执行的时候得到的是生成器,并不会执行函数
yield:只要函数中出现了yield,他就是一个生成器函数
作用:
1.可以返回数据
2.可以分段执行函数的内容,通过__next__()可以执行到下一个yield内容
优势:用好了特别节省内容
def func():
print(1111)
return 999
ret = func()
print(ret)
print("---分隔线----")
def func():
print(1111)
print(333)
yield 999# yield也有返回的意思
print(333333)
yield
ret = func()
# print(ret)
# yield会执行上面所有的函数(如果他上面有yield就停止),并且返回yield后面跟的内容
print(ret.__next__())# yield只有执行next的时候才会返回数据,以及执行函数
# ret.__next__()
print(ret.__next__())
举例:去工厂定制10000件衣服,但是不想库存一下子放10000件,于是分批分批的拿
def order():
for i in range(1, 10001):
if i % 50 == 0:
print(f"这是这批的最后一件,第{i}件")
yield
else:
print(f"这是第{i}件",end=' ')
ret = order()
ret.__next__()
ret.__next__()
def order2():
lst = []
for i in range(10000):
lst.append(f"衣服{i}")
if len(lst) == 50:
yield lst
lst = []
print(order2().__next__())
三、推导式
推导式:
简化代码
语法:
列表推导式:[数据 for循环 if判断]
集合推导式:{数据 for循环 if判断}
字典推导式:{key: value for循环 if判断}
不要把推导式妖魔化
(数据 for循环 if判断) ->不是元组推导式,根本没有,他是生成器表达式
生成器表达式:-->一次性的
语法: (数据 for循环 if判断)
列表推导式
lst = []
for i in range(10):
lst.append(i)
print(lst)
lst = [i for i in range(10)]
print(lst)
举例3:
# 请创建一个列表【1,3,5,7,9】
lst = [i for i in range(10) if i % 2 != 0]
print(lst)
# 生成50件衣服
lst = [f"衣服{i}" for i in range(50) ]
print(lst)
# 将如下列表中所有的英文字母修改成大写
lst = ["allen", "tony", "kevin"]
lst1 = [i.upper() for i in lst]
print(lst1)
集合推导式
s = {i for i in range(10)}
print(s)
字典推导式
lst = ["甄嬛", "沈眉庄", "年世兰", "叶澜依"]
dic = {i: lst[i] for i in range(len(lst)) }
print(dic
生成器表达式
gen = (i**2 for i in range(10))
for item in gen:
print(item)
lst = list(gen)
print(lst)
print(gen)
# list()里有for循环,有for循环就有迭代器和next,把里面的值一个个拿出来
s = list({1:333, 7:444, 3:555, 4:666})
print(s)