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

列表生成式、生成器、叠代

如果 執行 叠代 楊輝三角 gen sin 列表 一個 while

一、列表生成式

1、range()可以生成整數序列

range(a,b)生成a-b的整數序列,包括a,但不包括b

range(n)生成0-n的整數序列,包括0,但不包括n

將整數序列轉成list,可以使用list(range(n))

2、可以在列表中加計算式生成特定規律的列表

[x*x for x in range(1,11)]就生成了[1x1,2x2,3x3,...,10x10]的列表

3、還可以使用多層循環生成列表

[m+n for m in ‘ABC‘ for n in ‘XYZ‘]

[變量的計算式 變量1的for循環 變量2的for循環 變量n的for循環]

4、dict的items()可以同時叠代key和value

>>> d = {‘x‘: ‘A‘, ‘y‘: ‘B‘, ‘z‘: ‘C‘ }
>>> [k + ‘=‘ + v for k, v in d.items()]
[‘y=B‘, ‘x=A‘, ‘z=C‘]

5、計算式還可以使用變量的方法

例如[s.lower() for s in L]

二、生成器

1、第一種生成器的創建方式

列表生成式一旦賦值,那麽所使用的存儲空間就確定下來了,如果只訪問前部的部分元素,那麽後面的空間就浪費了,因此提出了生成器的概念,給生成器賦予某種算法規律,不需要創建完整的list,而只需要創建一個生成器,一邊循環一邊計算,值在未被計算出來前不占用存儲,節省存儲空間。

生成器創建如下:

g = (x * x for x in range(10))

一般使用for循環叠代生成器

for n in g:
    print(n)

2、第二種生成器的創建方式

用函數定義推算規則,如果一個函數定義中包含yield關鍵字,那麽這個函數就是一個generator

例如斐波那契數列的generator創建如下:

def fib(n):
a,b=0,1
for i in range(n):
yield b
a,b=b,a+b

調用時如下:

for k in fib(6):

  print(k)  

調用時,當函數中遇到yield時,返回打印yield 後面的值,然後繼續執行yield之後的語句

generator到結束時有StopIteration錯誤,如果捕獲到該錯誤就知道到結尾了

3、楊輝三角的打印list

1

        1   1
      1   2   1
    1   3   3   1
  1   4   6   4   1
1   5   10  10  5   1
def YH():
L=[1]
while True:
yield L
L=[L[i]+L[i+1] for i in range(len(L)-1)]
L.insert(0,1)
L.append(1)
n=0
for i in YH():
print(i)
n+=1
if n>=10:
break

三、叠代器

1、凡是可作用於for循環的對象都是Iterable類型;

凡是可作用於next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列;

集合數據類型如listdictstr等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。

2、可以通過isinstance(a,Iterator)和isinstance(a,Iterable)來判斷類型

列表生成式、生成器、叠代