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

python3 列表生成式、生成器、迭代器

列表生成式和生成器、迭代器

列表生成式

Python內建的一種極其強大的生成列表 list 的表示式。返回結果必須是列表。

基本語法:

[ 變量表達式 for 變數 in 表示式 ]

示例

a = [x ** 2 for x in range(1, 10)]
b = [x * x for x in range(1, 11) if x % 2 == 0]
c = [m + n for m in 'ABC' for n in '123']

d = {'Java': "99", 'C': "99", 'C++': "99"}
L = [k + '=' + v for k, v in
d.items()] print(a) print(b) print(c) print(L)

通過列表生成式,可以直接建立一個列表,但是,受到記憶體的限制,列表容量是有限的,當列表元素很大的時候,會很浪費記憶體空間。所以可以通過生成器 Generator 生成。

生成器 Generator

Generator 是一種一邊迴圈一邊計算的機制。

應用場景:只需要獲得 list 中的前幾個元素,節省儲存空間。

使用 () 建立列表生成器

把列表生成式的中括號 [] 修改為圓括號即可 ()

a = (x ** 2 for x in range(1, 10
)) b = (x * x for x in range(1, 11) if x % 2 == 0) c = (m + n for m in 'ABC' for n in '123') d = {'Java': "99", 'C': "99", 'C++': "99"} L = (k + '=' + v for k, v in d.items()) print(a) print(b) print(c) print(L)

列印結果如下

<generator object <genexpr> at 0x1052ec2b0>
<generator object <genexpr
> at 0x1052ec468>
<generator object <genexpr> at 0x1052ec4c0> <generator object <genexpr> at 0x1052ec518>

使用 next 呼叫元素:

print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())

next 方法會一個個的返回元素值,呼叫一次,返回一次下一個位置的元素。

該方法在沒有元素可以呼叫的時候,會返回 StopIteration 的錯誤

使用迴圈呼叫元素

for i in a:
    print(i)

該方法的好處,是不會返回 StopIteration 的錯誤

yield 關鍵字 建立 Generator

如果一個函式包含了yield 關鍵字,那麼該函式就不再是普通的函式,而是一個生成器 Generatior。

將 print(sum) 修改為 yield(sum),即將原來的函式,修改為了生成器。

def fib(n):
    sum = 0
    i = 0
    while (i<n):
        sum = sum + i
        i += 1
        yield(sum)

print(type(fib(10)))
for x in fib(10):
    print(x)

包含 yield 語句的函式會被特定的編譯成生成器。可以吧生成器理解為迭代器。

在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回yield的值。並在下一次執行 next()方法時從當前位置繼續執行。

Generator 的工作原理,是在for迴圈的過程中不斷計算出下一個元素,並在適當的條件結束for迴圈。

對於函式改成的generator來說,遇到return語句或者執行到函式體最後一行語句,就是結束generator的指令,for迴圈隨之結束。

以下例項使用 yield 實現斐波那契數列

#!/usr/bin/python3

import sys

def fibonacci(n): # 生成器函式 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一個迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

迭代器 iterator

  • 迭代器是訪問集合元素的一種方式
  • 迭代器有兩個方法,生成迭代器 iter(),返回迭代器的下一個專案 next()
  • 迭代器物件從集合的第一個元素開始訪問,知道所有元素被訪問結束。迭代器只能往前,不能回退。
  • 字串、列表、元組 都可以用於建立迭代器

迭代器 iterator 和可迭代物件 iterable 的區別在於:

可以直接作用於for迴圈的物件統稱為可迭代物件:Iterable,list、tuple、dict、set、str、Generator 等等

可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator

使用 iter 建立迭代器

list、dict、str等資料型別不是Iterator,但是可以通過 iter() 來建立迭代器

list=[1,2,3,4]
it = iter(list)    # 建立迭代器物件
print (next(it))   # 輸出迭代器的下一個元素
    1
print (next(it))
    2

相關推薦

Python基礎(8):python中的特性進階篇(列表生成生成器

python中還包括一些高階特性,以下簡單介紹。 迭代 定義:用for迴圈來遍歷物件的過程,叫做迭代。 作用物件:可迭代物件 如何判斷是否為可迭代物件:isinstance(xxx,Iterable),Iterable型別來源於collections模組。 應用場景: 1

python列表生成生成器

列表生成式:也叫推導,使程式碼更簡潔1.列表推導式:      a= [x for x in range(100) if x % 3 == 0]2.字典推導式     #快速更換key和value  字典推導和列表推導的使用方法是類似的,中括號該改成大括號。      y =

列表生成生成器和叠

number for 下一個 enum 繼續 調用函數 之前 順序執行 後拋 1.列表生成式 語法:[條件表達式 for i in iterable] a=list(range(10)) b=[i+1 for i in a] #這種形式就是列表生成式 print(b

python3自學筆記4-切片列表生成生成器

目錄切片迭代列表生成式生成器迭代器 切片 1、Python提供了切片(Slice)操作符:; 2、list可以進行切片操作: # 生成列表 >>> L = list(range(100)) >>> L [0, 1, 2, 3,

17. Python 生成   生成器   叠

python 生成器 叠代器 1. 生成式和生成器列表生成式是python受歡迎的一種語法之一,通過一句簡潔的語法,就能對元組元素進行過濾,還可以對得到的元素進行轉換處理。語法格式: [exp for val in collection if condition]相當於result

python3 列表生成生成器

列表生成式和生成器、迭代器 列表生成式 Python內建的一種極其強大的生成列表 list 的表示式。返回結果必須是列表。 基本語法: [ 變量表達式 for 變數 in 表示式 ] 示例 a = [x ** 2 for x in range

Python3匿名函數字典排序生成生成器裝飾簡介

ner 快速 別人 人的 pro 切面 gen 高階函數 表現 1. 參數匿名函數字典排序 函數的參數: 參數類型:我們經常在看別人的代碼中,經常出現def(*args,**kwargs)這樣的表現形式; *args tuple(1,) **kwargs

python—day14內置函數2列表生成生成器表達模塊

left with open 列表生成式 表達式 兩件 style pytho per 數據 內置函數2、列表生成式與生成器表達式、模塊 內置函數2: 1 # pow(x,y,z) x,y,z x的y次方除於z 得出的結果是除數和余數 2 print(pow

初學Python——列表生成生成器和叠

過程 100萬 import 通過 str __next__ 出現 tor 創建 一、列表生成式 假如現在有這樣一個需求:快速生成一個列表[1,2,3,4,5,6,7,8,9,10],該如何實現? 在不知道列表生成式的情況下,可能會這樣寫: a=[1,2,3,4,5,6,

參數匿名函數字典排序生成生成器裝飾的作用

args turn generator 方式 小括號 一個 中括號 ecb bject 參數匿名函數字典排序 *args就是一個元組**dict就是字典 生成式和生成器 [x*x for x in range(0,10)] //列表生成式,這裏是中括號//結果 [0,

Python學習筆記(四) 列表生成_生成器

rec triangle 小寫 ont 無限 end clas 普通 執行過程 筆記摘抄來自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431

列表生成生成器

調用 next image logs http nbsp img png blog 可叠代對象(iterable):凡是可以用for循環遍歷的都是iterable(可叠代對象),例如字符串、元組、列表、字典和生成器 叠代器(iterator):凡是需要調用ne

7.5-7.6 列表生成生成器以及區別

生成式 生成器一、列表生成式是 python 受歡迎的語法之一通過一句簡潔的語法就可以對一組元素進行過濾還可以對得到的元素進行轉換處理。li = [x + x for x in range(1, 101) if x % 2 == 0] print(li) def funa(x): a=[]

列表生成&生成器表達

列表生成式 表達 bsp pan 列表 range for pri style 一、列表生成式 def func(): return [lambda x:i*x for i in range(4)] print([j(2) for j in func()]

初學python隨筆——列表生成器生成器和叠

expr 是把 UNC val clas 叠代器 () 判斷 iterator 列表生成器 # 常見的是range()創建一個數字的列表 >>>[ x*x for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49,

Python高階特性——列表生成生成器

列表生成式:   1)、    L=[x*x for x in range(1,11) if x%2==0]  等價於    L = []    for x in range(1, 11):       if x%2==0:         L.append(x * x)  2)、    a=[m

生成器,列表推導

迭代器 可迭代協議 : 某個變數中含有__iter__方法,這個變數可迭代 迭代器協議 : 某個變數中含有__iter__和__next__方 迭代器和可迭代的關係: 迭代器一定可迭代\反之不成立 迭代器的特點 : 節省記憶體 惰性運算

筆記十七:列表生成_生成器

列表生成式:是一個快速生成列表的公式,直接生成列表,資料就存入記憶體。這樣如果資料多的話,就會比較佔用記憶體。 list1 = [i for i in range(1, 101)] print(list1) list2 = [i for i in range(1, 101)

python&生成器使用技巧(1):遍歷代理生成器建立反向

1. 手動遍歷迭代器 next() 遍歷一個可迭代物件中的所有元素,但是卻不想使用for迴圈。為了手動的遍歷可迭代物件,使用 next() 函式並在程式碼中捕獲 StopIteration 異常。 通常來講, StopIteration 用來指示迭代的結尾。 然而,如果手動

【python學習筆記】列表生成生成器

一、列表生成式 列表生成式即List Comprehensions,是Python內建的非常簡單卻強大的可以用來建立list的生成式。 列表生成式由包含一個表示式的括號組成,表示式後面跟隨一個for子句,之後可以有零或多個for或if子句。結果是一個列表,由表示