三元运算 ,列表推导式,迭代器,生成器

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会停止

# 生成器保存的是算法,一边生成,一边运行

原文地址:https://www.cnblogs.com/tangpg/p/7993253.html