Python_day13_2018.7.18(生成器和生成器表达式)
本节主要内容:
1.生成器和生成器函数
2.列表推导式
一.生成器
什么是生成器,生成器实质是迭代器
三个获取生成器的方法:
1.通过生成器函数
2.通过各种推导式来实现生成器
3.通过数据的转换可以获生成器
def func():
print("111")
return 222
ret = func()
print(ret)
结果: 111 222
------------把return换成yield --------------
def func():
print("111")
yield 222
ret = func()
print(ret) #ret没有执行函数,只是获取到生成器的内存地址.
由于函数中存在了了yield. 那么这个函数就是一个生成器 函数. 这个时候. 我们再执行这个函数的时候. 就不再是函数的执行了.
而是获取这个生成器. 如何使用呢? 想想迭代器. ⽣生成器的本质是迭代器. 所以. 我们可以直接执行__next__()来执行.
def func():
print("111")
yield 222
gener = func() # 这个时候函数不不会执行. 而是获取到生成器器
ret = gener.__next__() # 这个时候函数才会执⾏行行. yield的作⽤用和return⼀一样. 也是返回 数据
print(ret)
结果: 111 222
send和__next__()区别:
1. send和next()都是让⽣生成器向下走一次
2. send可以给上一个yield的位置传递值, 不能给后一个yield发送值. 在第一次执行生成器代码的时候不能使⽤用send()
二.列表推导式,生成器表达式以及其他推导式.
lst = [ ]
for i int rang(1,15)
lst.append(i)
print(lst)
替换成列表推导式:
lst = [i for i in rang(1,15)]
proint(lst)
列表推导式的常见写法:
[结果 for 变量 in 可迭代对象]
帅选模式:
[结果 for 变量 in 可迭代对象 if 条件 ]
#获取1-100内所有的偶数
lst = [i for i in rang(1,101) if i % 2 == 0]
print(lst)
生成器表达式和列表推导式的语法基本上是一样的. 只是把[ ]替换成( )
gen = (i for i in rang(10))
print(gen)
结果:打印出来的是生成器gen的内存地址.
gen = (i for i in rang(10))
for i in gen
print(i) #我们可以使用for循环来循环这个生成器:
生成器表达式也可以进行筛选:
gen = (i for i in rang(1,100) if i % 3 == 0 )
for num in gen:
print( num )
⽣生成器表达式和列列表推导式的区别:
1. 列列表推导式比较耗内存. ⼀一次性加载. ⽣生成器表达式⼏几乎不占⽤用内存. 使⽤用的时候才分 配和使⽤用内存
2. 得到的值不⼀一样. 列列表推导式得到的是⼀一个列列表. ⽣生成器表达式获取的是⼀一个⽣生成器.
def func()
print(111)
yield 222
g = func( ) #生成器
g1 = (i for i in g)
g2 = (o for i in g1) #生成器g1中的数据, g1的数据来源是g 但是g 已近取完了,g1 也就没有数据了
print(list(g))
print(list(g1)) #生成器g1 ,但是g1 的数据来源与g
print(list(g2)) #生成器g1中的数据, g1的数据来源是g 但是g 已近取完了,g1 也就没有数据了.
# day14作业默写
# 1,整理今天的博客,写课上代码,整理流程图。
# 2,用列表推导式做下列小题
# (1) 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
# lis = ["abc","zc","ahdd","a","df","jshdh"]
# new_list = [i.upper() for i in lis if len(i) >= 3]
# print(new_list)
# (2) 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
# lis = [(x,y) for x in range(0,6) for y in range(1,6) if x % 2 == 0 and y % 2 != 0]
# print(lis)
# (3) 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
# M = [[1,2,3],[4,5,6],[7,8,9]]
# lis = [ i[2] for i in M ]
# print(lis)
# # (4) 求出50以内能被3整除的数的平方,并放入到一个列表中。
# lis = [i**2 for i in range(1,51) if i % 3 == 0]
# print(lis)
# (5) 构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
# lis = ["python%s" % i for i in range(1,11)]
# print(lis)
# (6) 构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
# lis = [(i,i+1) for i in range(6)]
# print(lis)
# (7) 构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# lis = [i for i in range(0,19) if i % 2 == 0]
# print(lis)
# (8) 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
# l1 = ['alex', 'WuSir', '老男孩', '太白']
# lis = [i+str(l1.index(i)) for i in l1]
# print(lis)
# (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]]
#
# lis = [[el.get("timestamp"),el.get('values')] for el in x.get("Values") ]
# print(lis)