迭代与生成器与推导式
迭代
我们用for循环把元素从容器里面取出来的过程叫做迭代
迭代是访问集合的一种方式,迭代器是一个可以记住遍历的位置的对象,迭代器对象从集合的第一个元素开始访问,知道所有元素被访问完结束,迭代器只能前进不能后退
list\tuple\str\dict\set等元素类型可以使用for...in...来取出里面的元素,这些称为可迭代对象。所有能够通过迭代来取出元素的都是可迭代对象
可以使用isinstance来判断是否可迭代
from collections import Iterable
l = [1,2,3,4]
print(isinstance(l,Iterable))
可迭代对象内部都有__iter__方法
l = [1,2,3,4]
print(dir(l))
迭代器必须有iter和next方法
l = [1,2,3,4]
l_iter = l.__iter__()
print(dir(l_iter))
item = l_iter.__next__()
print(item)#输出1
可以用Iterable来判断是否是迭代器
from collections import Iterator
l = [1,2,3,4]
l_iter = l.__iter__()
print(isinstance(l_iter,Iterator))
迭代是访问集合的一种方式,迭代器是一个可以记住遍历的位置的对象,迭代器对象从集合的第一个元素开始访问,知道所有元素被访问完结束,迭代器只能前进不能后退
list\tuple\str\dict\set等元素类型可以使用for...in...来取出里面的元素,这些称为可迭代对象。所有能够通过迭代来取出元素的都是可迭代对象
可以使用isinstance来判断是否可迭代
from collections import Iterable
l = [1,2,3,4]
print(isinstance(l,Iterable))
可迭代对象内部都有__iter__方法
l = [1,2,3,4]
print(dir(l))
迭代器必须有iter和next方法
l = [1,2,3,4]
l_iter = l.__iter__()
print(dir(l_iter))
item = l_iter.__next__()
print(item)#输出1
可以用Iterable来判断是否是迭代器
from collections import Iterator
l = [1,2,3,4]
l_iter = l.__iter__()
print(isinstance(l_iter,Iterator))
生成器
我们有时候想要获取函数的一些处理结果,但是如果用return,那么函数就结束了,如果用print,则可用性会变差,这里我们可以使用yield,生成器
def generator():
a = 1
print('给a赋值')
yield a #k1
b = 2
print('给b赋值')
yield b
g = generator() #生成器,不执行内部代码
print(g,next(g)) #触发运行,跑到k1停住
print(next(g)) #执行到b
# 给a赋值
# <generator object generator at 0x0000023AEB9F4BA0> 1
# 给b赋值
# 2
def generator():
a = '米饭'
for i in range(1000000):
a = yield f'吃了第{i}个{a}陷的包子'#先执行yield返回,然后再执行a的赋值语句
pro = generator()
print(pro.__next__())
print(pro.send('三鲜肉'))#send=赋值+next
print(pro.send('粉丝'))
print(pro.send('咖喱牛肉'))
print(pro.send('雪菜'))
print(pro.send('牛肉'))
# 吃了第0个米饭陷的包子
# 吃了第1个三鲜肉陷的包子
# 吃了第2个粉丝陷的包子
# 吃了第3个咖喱牛肉陷的包子
# 吃了第4个雪菜陷的包子
# 吃了第5个牛肉陷的包子
# Process finished with exit code 0
列表推导式
a = [i for i in range(100)]
print(sum([i for i in range(1,101)]))
num = [i*i for i in range(100) if i % 3 is 0]
name = [['zhangsan','lisi','lixiuli','wangwu'],['tokugawa','ono','yochida','lilisu']]
print([namel for lst in name for namel in lst if 'li' in namel])#先取列表再取元素
name = ['zhangsan','lisi','lixiuli','wangwu','yochida']
print([namel for namel in name if 'li' in namel])
print('\n'.join('\t'.join([f'{i} x {j} = {i * j}' for i in range(1,j+1)])for j in range(1,10)))#99乘法表
把字母转小写并合并值
dic1 = {'a':1,'b':2,'y':1, 'A':4,'Y':9}
dict2 = {k.lower():dic1.get(k.lower(),0)+dic1.get(k.upper(),0) for k in dic1}
print(dict2)
字典推导式
k1 = {'a':1,'b':2,'c':3}
k2 = {k1[k]:k for k in k1}
print(k2)