1. 程式人生 > >Python學習筆記——高階特性3

Python學習筆記——高階特性3

迭代器

我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種:

一類是集合資料型別,如list、tuple、dict、set、str等;

一類是generator,包括生成器和帶yield的generator function。

這些可以直接作用於for迴圈的物件統稱為可迭代物件:Iterable。

可以使用isinstance()判斷一個物件是否是Iterable物件:

>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

而生成器不但可以作用於for迴圈,還可以被next()函式不斷呼叫並返回下一個值,直到最後丟擲StopIteration錯誤表示無法繼續返回下一個值了。

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

可以使用isinstance()判斷一個物件是否是Iterator物件:

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

生成器都是Iterator物件,但list、dict、str雖然是Iterable,卻不是Iterator。

把list、dict、str等Iterable變成Iterator可以使用iter()函式:

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

Python的Iterator物件表示的是一個數據流,Iterator物件可以被next()函式呼叫並不斷返回下一個資料,直到沒有資料時丟擲StopIteration錯誤。可以把這個資料流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下一個資料,所以Iterator的計算是惰性的,只有在需要返回下一個資料時它才會計算。

Iterator甚至可以表示一個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。

小結

凡是可作用於for迴圈的物件都是Iterable型別;

凡是可作用於next()函式的物件都是Iterator型別,它們表示一個惰性計算的序列;

集合資料型別如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函式獲得一個Iterator物件。

Python的for迴圈本質上就是通過不斷呼叫next()函式實現的,例如:

for x in [1, 2, 3, 4, 5]:
    pass

實際上完全等價於:

# 首先獲得Iterator物件:
it = iter([1, 2, 3, 4, 5])
# 迴圈:
while True:
    try:
        # 獲得下一個值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出迴圈
        break

相關推薦

Python學習筆記——高階特性3

迭代器 我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種: 一類是集合資料型別,如list、tuple、dict、set、str等; 一類是generator,包括生成器和帶yield的generator function。 這些可以直接作用於for迴

Python學習筆記——高階特性1

1行程式碼能實現的功能,決不寫5行程式碼。請始終牢記,程式碼越少,開發效率越高。 分片slice L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] L[1:3] L[-3:-1] L[::2] 用法支援li

Python學習筆記——高階特性

繼續之前的學習,下面是一些高階特性。 1. 切片 取指定索引範圍的操作,可以通過切片(slice)來實現。 如L[0:3]表示從列表索引0開始,到索引3(但不包含)的子集。 如果第一個索引是0,可以省略,如L[:3]。 Python也支援倒數切片,如L[-2:],L[-

Python學習筆記--高階特性

1. 切片(Slice) 從list, tuple或string中擷取一段出來。 [i : j : k]表示在列表中i <= index < j的開區間中以步長為k取出部分元素,步長預設為1,如果k < 0,表示逆序切片。

python學習-基礎-高階特性

高階特性 print(list(range(1, 100, 2))) 切片 #切片 字串,物件,陣列都可以使用 print(list(range(1, 100, 2))) list1 = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jac

Python學習三——高階特性

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317568446245b3e1c8837414168bcd2d485e553779e000Pyth

Python學習筆記3---PYTHON函式與高階特性

第三天---PYTHON函式與高階特性 在python中,定義一個函式使用def語句在縮排塊裡編寫函式語句。返回值則使用return語句。感覺縮排塊是個神奇的東西,既把程式碼的格式規範看起來更容易,比起其他語言還少了花括號的困擾,每個迴圈、分支、函式的作用域就是他們的縮排塊。

Python學習筆記--3高階特性-切片、迭代、列表生成式、生成器、迭代器

廖老師在這個地方提到了,在Python 中,並不是寫的程式碼越多越好,而是寫的程式碼越少越好,月簡單越好。 1、切片  什麼是切片,簡單來說就是對list或者tuple中的部分元素進行取出操作。例子如下: 應注意的是,python的首位的元素的編號是0,所以,要確定好[

Python學習筆記(三) Python高階特性

1.切片 對於list和tuple,經常要取其中一部分元素,如果用迴圈取,太麻煩,可以用切片簡化操作 myList = [1, 2, 3, 4, 5] #表示,從索引0開始取,直到索引3為止,但不包括索引3, 輸出 myList[0:3] = [1, 2, 3] print("m

Python 學習筆記高階特性

【關於切片】 #例如一個列表如下: L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] print('L=', L) #在沒有使用切片之前,取列表前三項的方法可能會是: _list = [] for i in range(3): _list.

Python學習筆記Python高階特性

Python學習筆記:Python高階特性 學自廖雪峰巨佬的Python3教程:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317568446245b3e1c883

python學習筆記(二)---高階特性

#!/usr/bin/env python3 # -*- coding: utf-8 -*- r''' 高階知識 lrn_higher_list: 切片、迭代、列表生成式、生成器、迭代器 lrn_higher_func: 函數語言程

Python學習筆記二(高階特性)

     1. 切片 #取一個list或tuple的部分元素是非常常見的操作,即輸出第0,1,2三個元素 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] # 方法一: print([L[0], L[1], L[2]])

Python學習筆記之【高階特性

切片 選取list或str的一部分 >>> L[0:3] >>> L[:3] >>> L[1:3] >>> L[-2:] >>> L[-2:-1] 前10個數 >>&g

Python學習筆記高階特性

前言 最近在學習深度學習,已經跑出了幾個模型,但Pyhton的基礎不夠紮實,因此,開始補習Python了,大家都推薦廖雪峰的課程,因此,開始了學習,但光學有沒有用,還要和大家討論一下,因此,寫下這些帖子,廖雪峰的課程連線在這裡:廖雪峰 Python的相關介紹

python學習筆記(三)--python高階特性

python的高階特性有切片、迭代、列表生成式、生成器、迭代器等,下面來介紹這幾種高階特性:1、切片:切片特別簡單,用中括號表示範圍,包前不包後。就是中括號裡邊的範圍前面的數值被包括在內,後面的數值不被包括在內。L = ['a','b','c','d']L[0:3] 索

Python學習筆記(一) —— 高階特性

寫學習筆記之前對python的基礎語法已經有了基本的瞭解,在此不冗餘的敘述。直接從其高階特性開始。python的學習材料或網站:高階特性切片切片是對list和tuple的常見操作。以list來舉例,先建立一個0-99的數列:L = list(range(100))前十個數:L

Python學習筆記(四)——高階特性

1, 1, 2, 3, 5, 8, 13, 21, 34, ... 斐波拉契數列用列表生成式寫不出來,但是,用函式把它打印出來卻很容易: def fib(max): n, a, b = 0, 0, 1 while n < max: print(b)

python學習筆記之函式及其高階特性

一.定義函式 • def關鍵字,依次寫出函式名、括號、括號中的引數和冒號 : • 在縮排塊中編寫函式體,函式的返回值用 return 語句返回。      def 函式名():          函式體         return 返回值1,返回值2 二.呼叫函式 Py

python學習筆記(7)-高階特性(三)-列表生成式與生成器

 [d for d in os.listdir('.')] ['.bash_logout', '.bash_profile', '.bashrc', '.cshrc', '.tcshrc', 'anaconda-ks.cfg', '.cache', '.config', 'perl5', '.bash_hi