1. 程式人生 > >列表生成式,叠代器&生成器

列表生成式,叠代器&生成器

函數 logs bsp fibonacci aec 生成式 more code 元素

一、列表生成式

  用例--使列表數值都加上1

1 li = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2 li_tmp = [i+1 for i in li] 
3 li = li_tmp
4 print("new list:"+str(li))
  #[1, 2, 3, 4, 5, 6, 7, 8, 9,10]
li_dic =  [{1:3+i,2:4+i} for i in range(5)]
  #[{1: 3, 2: 4}, {1: 4, 2: 5}, {1: 5, 2: 6}, {1: 6, 2: 7}, {1: 7, 2: 8}]

總結:在列表中使用for循環來生成列表,循環的次數就是列表元素的個數

用例--替代方法1

li = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for index,i in enumerate(li): 
    li[index]+=1
 print(li)

總結:使用enumerate函數,其中index賦值列表的索引,i賦值列表的值,i雖然沒用到,但必須寫上

  用例-替代方法2

li = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
li_tmp =  []  
for i in li: 
    li_tmp.append(i+1)                                                              
li 
= li_tmp print("new list:"+str(li))

總結:需先定義這個空列表li_tmp,,且空列表默認沒有索引,不能直接賦值,如li_tm [0] =1,提示(index out of range)

二、生成器

一邊循環一邊計算的機制,就是生成器。

特點:不必生成完整的List,從而節省了大量空間

核心:generator保存的是算法

  創建方法:把列表的[ ] -->()

g =  (x*x for x in range(5))
print(g:%s:% g) #g:<generator object <genexpr> at 0x7fb0aecbcbe0>:

  打印generator的元素:a,b兩種方法

  a:使用next()函數,當打印到最後一個繼續打印,拋出(StopIteration) 

for i in range(6):
    try:
         print(next(g))
    except StopIteration:
         print("not more")

  b:使用for,generator也是可叠代對象

for i in g:
    print("print g use for:%s" % i)

總結:打印generator基本使用for,不用關心拋出異常,next()基本不會使用。

  斐波拉契數列(Fibonacci)

  除前兩個數,其他數都是其前兩個數的和:1, 1, 2, 3, 5, 8, 13, 21, 34, ...

def fib(max):
    n, a, b = 0, 0, 1
    li = []
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
        li.append(b)
        print(li)        
fib(10)#打印出這個數列的前10位
  #[1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

  

  

  

列表生成式,叠代器&生成器