1.三元运算
a,b,c =1,2,3 a,b,c =0,2,3
d=c if a else b d=c if a else b
>>>d >>>d
3 2
##if a:
## d=c
##else:
## d=b
a,b = 1,2 a,b = b,a # 相当于 a,b = (1,2) a,b = b,a # (2,1)
2.#列表推导式 iterator,迭代器
1】列表推导式
l0=[i for i in range(1,3)] >>>l0 = [1,2]
l1={ for i in range(1,3)} >>>l1 = {1,2} #集合推导式
l2={i:'gg' for i in range(1,3)} >>>l2 = {1:'gg',2:'gg'}
n=iter(l1) #__iter__()
next(n) >>>1 #n.__next__()
next(n) >>>2
# 元素全部取出后,next会报错
# 只能按照顺序取 可以使用for 循环全部取出
# next(n) 等效于 n.__next__()
2】:迭代器
'迭代器协议就是实现对象的 __iter__() 和__next__()方法。
#for 循环到底发生了什么
for i in l1: #l1--> i=iter(l1)-->i=next(i)
print(i)
3】:生成器 生成器都是迭代器的对象
迭代器的元素是确定的,生成器不是确定的
- li = [i for i in range(1,11)] n=iter(li) n是迭代器 他的值是固定的(1,11)
- 例子2里面 g是生成器 一边生成值,还要一边运行算法
#如何去创建生成器generator? 改为括号
1.li = (i for i in range(1,11)) 生成器 [i for i in range(1,11)] 列表推导式
2.使用yield
def fib(cishu): fib() 是一个函数,
n,a,b=0,0,1
while n<cishu:
yield b yield 返回的是生成器 ,而 g 接收的是返回值,所以 g= fib(cishu), g 是生成器
a,b = ,b a+b
n+=1
g= fib(3) >>> next(g) >>> next(g) >>> next(g) #运行到yield会停止。所以next(g)一次取出一个值
1 1 2
#yield 返回生成器 ,运行到yield会停止
# 生成器保存的是算法,一边生成,一边运行