学习笔记之二十六
集合推导式
#类似于列表推导式,就是表示符号不同,外加多了一个去重功能,因为集合中的元素不能重复存在
list1=[1,2.3,4,5,4,4,5,8,9]
set={i+4 for i in list1 if i>5}
print(set)
字典推导式
dict={‘a’:‘A’,‘b’:‘B’,‘c’:‘C’,‘d’:‘C’}
#dict1={value:key for value in dict.items()} 此句代码错误,因为键值对不能只以一个value去遍历
dict1={value:key for key,value in dict.items()}
print(dict1)
生成器
‘’’
通过列表生成式,我们可创建一个新的列表,但是收到内容限制,
列表的容量是有限的,而且创建一个容量包含100万个元素的列表,其占用的空间是
很大的,若果我么仅需要前边的几个元素,那么后边的元素占用的空间就白白浪费了,
所以列表的元素可以通过某种固定的方法推导出来,我们就可以不用创建完整的列表,而是在需要的过程中不断推导出我们
所需要的元素,从而节省大量的空间,这种方法在Python中称为 生成器-generator
‘’’
#生成器的得到方法有: 通过列表推导式,例如
list1=[x*3 for x in range(10)]
print(list1)
对应的生成器为
g=(x*3 for x in range(10))
#但生成器只是一种方法,调用的时候才会产生具体的值,而且调用一次产生一个值,以此类推
调用生成器的方法有两种 next() next()
print(type(g))
print(g.next())
print(g.next())
print(g.next())
print(g.next())
调用方法二
print(next(g)) #next() 为内置函数 builtin
#两种调用方法的次数可以累加
print(g.next())
print(g.next())
print(g.next())
print(g.next())
print(g.next())
print(g.next()) #调用次数超限时报错 StopIteration
print(g.next())
while True:
try:
e=next(g)
print(e)
except:
print(‘调用次数超限了!’)
break
生成器之 方法三
send:向每次调用中传递值,但是第一次必须send(none)
def gen():
i=0
while i<5:
temp=yield i # 其作用是return i 和暂停
print(‘temp’,temp)
i+=1
return “没有更多元素了!”
#注;第一次调用(send(none))时接收yield 1,即返回i=0,没有传送值(因为none),第二次调用时(send(‘哈哈’)),
从暂停yield处开始运行,首先将哈哈传递给temp,因为此时的temp再运行下一句1+=1,至返回i=1时返回值i=1及暂停,
此时的temp=‘哈哈’,但不胡返回出去(因为此时已经暂停了),第三次调用时才返回第二次传送的值‘哈哈’
生成器之函数:
利用函数做一个生成器,利用关键字yield (返回一个值和暂停的功能)
def func():
i=1
while True:
i+=1
print(i)
上述执行之电脑卡死,无线循环
def func():
i=1
while True:
i+=1
yield i
#print(i) 这一句不需要
g=func() #这时还没调用,只是表明这是生成器函数
#调用
print(next(g))
print(next(g))
print(next(g))
利用生成器写 ## 斐波那契 数列:
def fib(length):
a,b=0,1 #同时赋值简化
n=0
while True:
# print(b) 下一句中有返回作用,这句输出语句就不需要
yield b
a,b=b,a+b
n+=1
return ‘没有更多元素了!’
g=fib(9)
print(next(g))
print(next(g))
print(next(g))