【0813 | Day 14】三元表达式/列表推导式/字典生成式/生成器及其表达式
三元表达式
{条件成立时的返回值 if条件 else返回值}
列表推导式
print(F"[i for i in range(10)]: {[i for i in range(10)]}")
字典生成式
一、字典生成式
print({i: i**2 for i in range(10)})
---> {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
二、zip()方法
keys = [ 'name', 'age', 'gender' ]
values = ['nick', 19, 'male' ]
res = zip (keys, values)
print (zip(keys,values))
info_dict = {k: v for k, v in res}*
print (info_dict)
---> <zip object at 0x11074c088>
---> {'name': 'nick', 'age': 19, 'sex': 'male'}
info_dict = {'name' : 'nick', 'age' : 19, 'gender' : 'male'}
print(info_dict.keys( ))
print(info_dict.values( ))
res = zip (info_dict.keys( ), info_dict.values( ))
print(zip(info_dict.keys( ), info_dict.values( )) )
info_dict = {k: v for k, v in res}
print(info_dict)
---> dict_keys(['name', 'age', 'gender'])
---> dict_values(['nick', 19, 'male'])
---> <zip object at 0x1105cefc8>
---> {'name': 'nick', 'age': 19, 'gender': 'male'}
生成器
生成器的本质就是迭代器,同时也并不仅仅是迭代器。
一、yield关键字
#主体
def func():
yield [1, 2, 3]
print('我出来了吗?')
yield 789
print('那我呢?')
yield 456
g = func()
# 第一种
for i in g:
print(i)
# 第二种
g_iter = g.__iter__()
print(g.__next__())
print(g.__next__()) #只打印两个yield
#第三种
g_iter = g.__iter__()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__()) #找不到值
---> [1, 2, 3]
我出来了吗?
789
那我呢?
456
---> [1, 2, 3]
我出来了吗?
789
---> Traceback (most recent call last):
[1, 2, 3]
File "D:/fxyadela/上课练习/生成器.py", line 20, in
print(g._next_( ))
我出来了吗?
StopIteration
789
那我呢?
456
def func():
print('from func 1')
yield 'a'
print('from func 2')
yield 'b'
g = func()
for i in g:
print(i)
#from func 1
#a
#from func 2
#b
res = list(func())
print(res)
#from func 1 #这只是打印的值
#from func 2 #这只是打印的值
#list(func()): ['a', 'b'] yield的值属于返回值,会存入列表中
-
yield + return
def i_wanna_return(): yield 'a' yield 'b' return None yield 'c' for i in i_wanna_return(): print(i)
---> a
b
-
迭代器嵌套
def sub_generator(): yield 1 yield 2 yield from range(3) for i in sub_generator(): print(i)
---> 1
2
0
1
2
二、自定义range()方法
def my_range(start, stop, step=1):
while start < stop:
yield start
start += 1
g = my_range(0, 3)
print(list(g))
---> [0, 1, 2]
def range(*args,step = 2):
args = list(args)
if len(args) == 1:
count = 0
while count < args[0]:
yield count
count += 1
elif len(args) >= 2:
while args[0] < args[1]:
yield args[0]
args[0] += step
for i in range(1,10,2):
print(i)
---> 1
3
5
7
9
三、总结
yield:
- 提供一种自定义迭代器的方式
- yield可以暂停住函数,并提供当前的返回值
yield & return:
- 相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制
- 不同点:return只能返回一次值;yield可以返回多次值
生成器表达式
- 把列表推导式的[]换成()就是生成器表达式,前者[ ]是个列表,后者( )是generator。
- list可以直接打印每一个元素,而generator只能通过next( )的方法。
- 优点:省内存,一次只产生一个值在内存中
#List[]
>>> L = [x * x for x in range(10)]
#generator()
>>> g = (x * x for x in range(10))
---> L[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
---> g<generator object
一、生成器表达式和列表推导式
列表推导式相当于直接给你一筐蛋,而生成器表达式相当于给你一只老母鸡。
# 列表表达式
with open('52.txt', 'r', encoding='utf8') as f:
nums = [len(line) for line in f]
print(max(nums))
1
# 生成器推导式
with open('52.txt','r',encoding='utf8') as f:
nums = (len(line) for line in f)
print(max(nums)) # ValueError: I/O operation on closed file.