050 三元表达式,列表推导,字典生成器’生成器
一、三元表达式
-
条件成立时的返回值 if 条件 else 条件不成立时的返回值
-
三元表达式只支持双分支结构
x = 10
y = 20
if x > y:
print(x)
else:
print(y)
# 三元表达式
x = 10
y = 20
print(f"x if x > y else y: {x if x > y else y}")
# x if x > y else y: 20
二、列表推导式
ls = []
for i in range(10)
ls.append(i)
print(ls)
# 推导式
ls = [ i for i in range(10)]
print(ls)
ls = [ i**2 for i in range(10)]
print(ls)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
三、字典生成式
- 字典生成器一般与zip(拉链函数---列表里面包了元组)连用
dic = {'a':1,'b':2}
dic_new = {k**2,v**2 for k,v in dic.items()}
print(new_dic)
z = zip(['a','b','c'],[1,2,3])
for k,v in z:
print(k,v)
# 结果
a 1
b 2
c 3
d 4
dic = {k: v ** 2 for k, v in zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4])} # 不能写这种代码
print(dic)
# {'a': 1, 'b': 4, 'c': 9, 'd': 16}
四、生成器
- 生成器:就是在自定义迭代,生成器就是迭代器(自己造出来的)
- 迭代器对象就是同时具有——iter——,和——next——这两个方法
def func():
return 123
f = func()
print(f)
- 生成器用到了一个关键字yield
1.yield有三个特性:
- yield会使一个函数变成生成器对象(自定义的生成器对象),因此函数就具有了__iter__和___next__方法
- 在函数里面遇到yield可以停止函数的运行,需要在用一次___next___方法运行yield下面的代码
- 函数里面有几个yield就有几个人元素 就可以用几个next方法,如果多了一次next就会报错,也就是说一个yield对应一个next
def func():
yield 123
print(456)
f = func()
print(f)
f__iter__ = f.__next__()
f__iter__ = f.__next__()
2.总结
-
yield:
-
提供一种自定义迭代器的方式
-
yield可以暂停住函数,并提供当前的返回值
-
-
yield和return:
-
相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制
-
不同点:return只能返回一次之;yield可以返回多次值
-
五、生成器表达式
列题:
1.用生成器实现range方法
def range(n):
i = 0
while i < n:
yield
i += 1
for i in range(10)
print(i)
2.用生成器实现一个带有步长的range方法
def range(*args):
ls = list(args)
if len(ls) == 3:
while ls[0]<ls[1]:
yield ls[0]
ls[0] += ls[2]
elif len(ls) == 1:
i = 0
while i < ls[0]:
yield i
i += 1
for i in range(10):
print(i)