生成器,迭代器,列表推导式
列表推导式
迭代器和生成器
可迭代对象:
内部含有__iter__方法的就是可迭代对象.
可迭代对象不能取值,因为内部不含有__next__方法.
可迭代对象==>迭代器
obj. __iter__()
iter(obj)
迭代器:
内部含有__iter__,__naxt__方法的对象.
迭代器:
1.节省内存.
2.惰性机制.
3.单向,不可逆.
如何判断可迭代对象,迭代器.
__iter__ in dir(obj)
生成器:
自己用python代码写得迭代器就是生成器
生成器的本身就是迭代器
可迭代对象:str,list,dict,tuple,set,range
文件句柄:是迭代器
# l1 = []
# for i in range(1,14):
# l1.append(i)
# print(l1)
下面是经过列表推导式推导出来的代码,看到没有,只需要简短的一句话就可是实现几行代码的功能,但是需要注意的一点是,当思维达不到或者思路不够的时候不建议这么用,
会害了你自己,还有当for在一行代码里出现三次的时候就不要继续用这个了,当然你要是能实现功能的话那都好说,就是怕把自己到时候坑了
# l3 = [i for i in range(1,14)]
# print(l3)
列表推导式
优点:
1.节省代码,一行搞定
2.看着高大上
缺点:
不好排错
整体:
凡是用列表推导式构造的列表对象,用其他方法都可以构建,非常复杂的列表,列表推导式构建不出来
列表推导式比较有魔性
[变量(加工后的变量) for 变量 in iterable] 循环模式
[变量(加工后的变量) for 变量 in iterable if 条件] 筛选模式
'''
多写几个例子练习一下
l5 = [i for i in range(1,31) if i % 3 == 0]
print(l5)
print([i**2 for i in range(11)]) #10以内能被3整除的数的平方
print([i**2 for i in range(31) if i % 2 == 1]) #30以内能被3整除的数的平方
print([i for i in range(1,101,2)]) #100以内所有的奇数
print([i for i in range(101) if i % 2 == 1])
li = ['python %s 期'% i for i in range(1,14)]
print(li)
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
l6 = [name for i in names for name in i if name.count('e') == 2]
l7 = []
for i in names:
for name in i:
if name.count('e') == 2:
l7.append(name)
print(l7)
print(l6)
mcase = {'a':10,'b':34}
print({mcase[i]:i for i in mcase})
'''