python 生成器和各种推导式
##################################总结###############################
什么是迭代器?
可迭代对象通过__iter__()可以转换成迭代器,满足迭代器协议。
内部含有__iter__且__next__方法的就是迭代器。
# l = [1, 2, 3]
# l_obj = l.__iter__()
# print(l_obj)
迭代器的取值两种方法:
l = [1, 2, 3] l_obj = l.__iter__() print(l_obj)------------------<list_iterator object at 0x000002B84DE73748> 方法一:__next__() print(l_obj.__next__())-------------1 print(l_obj.__next__())-------------2 print(l_obj.__next__())-------------3 方法二 for循环 for i in l_obj: print(i) print('__next__' in dir(l_obj)) -------------1 2 3 True
第二种判断方法:
from collections import Iterable
from collections import Iterator
print(isinstance('123', Iterable))
print(isinstance('123', Iterator))
迭代器:
1,节省内存
2,满足惰性机制
3,取值过程单向不可逆(一条路走到黑)
生成器
生成器函数中包含 yield , 返回数据和return差不多. return 会立即结束这个函数的执行 yield 可以分段的执行一个函数 生成器函数在执行的时候返回生成器. 而不是直接执行此函数 能向下执行的两个条件: __next__(), 执行到下一个yield send(), 执行到下一个yield, 给上一个yield位置传值 所有的生成器都是迭代器都可以直接使用for循环 都可以使用list()函数来获取到生成器内所有的数据 生成器中记录的是代码而不是函数的运行 def func(): print("我的天哪 ") yield "宝宝" gen = func() # 创建生成器. 此时运行会把生成器函数中的代码记录在内存 当执行到__next__(), 运行此空间中的代码, 运行到yield结束.
def func(): print("1111") yield "林志颖" print('22222') yield "周润发" print('33333') ret=func() print("返回值是",ret)#返回值是 <generator object func at 0x00000000021B1F48> print(ret.__next__())#1111 林志颖 print(ret.__next__())#22222 周润发 # print(ret.__next__())
##################################作业#############################
(1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
lst=['qwe1','ert','oo'] lse2=[i.upper() for i in lst if len(i) >3] print(lse2)
(2)求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
li=[(x,y) for x in range(6) for y in range(6) if x %2==0 and if y%2==1] print(li) for x in range(0,6): print('111111111111')#0次 包含了 0 1 2 3 4 5 #1次 包含了 0 1 2 3 4 5 print(x) for y in range(0, 6): print('22222222222') print(y) if x % 2 == 0: print(x) print('=========') if y % 2 == 1: print(y)
(3)求M中3,6,9组成的列表
lst = [3, 6, 9]
result = [[n-2, n-1, n] for n in lst]
print(result)
##############[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
M = [[1,2,3],[4,5,6],[7,8,9]]
result = [lst[2] for lst in M]
print(result)
#############打印出 3 6 9
(4)求出50以内能被3整除的数的平方,并放入到一个列表中。
li=[i*i for i in range(1,51) if i %3 ==0] print(li)
(5)构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
li=['python%s期' %i for i in range(1,11)] print(li)
(6)构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
li =[(x,y)for x in range(6) for y in range(7) if x==y-1] print(li)
print([ (n, n + 1) for n in range(6) ])
# for x in range(6):
# for y in range(7):#0 0123456 1 0123456 2 0123456
# # 1-1=0 #2-1=1 #3-1=2
# if x == y - 1:
# print(x)
for i in range(2):
for j in range(3):
print(i, j)
if i == j - 1:
print('====',i,j)
(7)构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
li = [i for i in range(19) if i % 2 == 0] print(li)
(8)有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
l1 = ['alex', 'WuSir', '老男孩', '太白'] li=[l1[i]+str(i) for i in range(len(l1))] print(li)
#####思路
# l1 = ['alex', 'WuSir', '老男孩', '太白']
# for i in range(len(l1)):
# a=l1[i]+str(i)
# print(a)
(9)有以下数据类型:
x = {
'name':'alex',
'Values':[{'timestamp':1517991992.94,
'values':100,},
{'timestamp': 1517992000.94,
'values': 200,},
{'timestamp': 1517992014.94,
'values': 300,},
{'timestamp': 1517992744.94,
'values': 350},
{'timestamp': 1517992800.94,
'values': 280}
],}
将上面的数据通过列表推导式转换成下面的类型:
[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
# for i in x['Values']: # print([i['timestamp'],i['values']]) li=[[i['timestamp'],i['values']] for i in x['Values']] print(li)
不怕大牛比自己牛,就怕大牛比自己更努力