迭代器 Iterator
迭代器是訪問可迭代對象的工具(對象)
什麼是迭代器
迭代器是指用iter(obj) 函數返回的對象(實例)
迭代器可以用next(it) 函數獲取可迭代對象的數據
迭代器相關函數
iter(iterable) 從可迭代對象中返回一個迭代器, iterable 必須是一個能提供一個迭代器的對象
next(iterator) 從迭代器iterator中獲取下一個記錄,如果無法獲取下一條記錄,則觸發StopIteration異常通知
說明:
迭代器只能往前取值,不能後退
用iter 函數可以返回一個可迭代對象的迭代器
作用:
可迭代對象可用於
for 語句
列表推導式
示例:
L = [2, 3, 5, 7]
it = iter(L) # 讓可迭代對象L 提供一個迭代器
next(it) # 2
next(it) # 3
next(it) # 5
next(it) # 7
next(it) # StopIteration 異常通知
it = iter(range(1, 10, 3))
next(it) # 1
next(it) # 4
next(it) # 7
next(it) # StopIteration
示列:
用while 語句遍歷列表L中的全部元素
L = [2, 3, 5, 7]
見iterator.py
練習:
有一個集合:
xiyou = {'唐僧', '悟空', '八戒','沙僧'}
用for 語句來遍歷所有元素如下:
for x in xiyou:
print(x)
else:
print("遍歷結束")
請將上面的for語句改寫爲while語句及迭代器實現
生成器 Generator (python 2.5 及之後)
什麼是生成器
生成器是能夠動態提供數據的對象,生成器對象也是可迭代對象
生成器有兩種:
1. 生成器函數
2. 生成器表達式
生成器函數定義:
含有語句的函數是生成器函數,此函數被調用將返回一個生成器對象
注: yield 翻譯爲(產生或生成)
yield 語句
語法:
yield 表達式
說明:
yield 用於def 函數中,目的是將此函數作爲生成器函數使用
yield 用來生成數據,供迭代器的next(it) 函數使用
示例見:
yield.py
生成器函數說明:
1. 生成器函數的調用將返回一個生成器對象,生成器對象是可迭代對象
2. 生成器函數調用 return 會觸發一個StopIteration異常
# 用生成函數生成一系列從0開始的整數, 示例見:
myinteger.py
練習:
寫一個生成器函數myeven(start, stop),用來生成從start開始,到stop結束區間內的一系列偶數
def myeven(start, stop): # 不包含stop
.... 此處自己實現
it = iter(myeven(5, 10))
print(next(it)) # 6
print(next(it)) # 8
evens = list(myeven(10, 20))
print(evens) # [10, 12, 14, 16, 18]
for x in myeven(21, 30):
print(x) # 22 24 26 28
生成器表達式:
語法:
(表達式 for 變量 in 可迭代對象 if 真值表達式)
說明:
if 子句可以省略
作用:
用推導式的形式生成一個新的生成器
示例:
gen = (x ** 2 for x in range(1, 5))
it = iter(gen)
next(it) # 1
next(it) # 4
next(it) # 9
next(it) # 16
看程序執行結果有什麼不同:
1) 程序1
L = [2, 3, 5, 7]
lst = [x + 1 for x in L]
it = iter(lst)
print(next(it)) # 3
L[1] = 30
print(next(it)) # 4
2) 程序2
L = [2, 3, 5, 7]
lst = (x + 1 for x in L)
it = iter(lst)
print(next(it)) # 3
L[1] = 30
print(next(it)) # 31
迭代工具函數:
作用:
生成一個個性化的可迭代對象
函數名 函數說明
zip(iter1, iter2, iter3, ....) 返回一個zip對象,此對象用於生成一個元組,此元組的中的元素分別由iter1,iter2可迭代對象中的元素構成(元組個數由最小的可迭代對象決定)
enumerate(iterable, start=0) 生成帶索引的枚舉對象,返回的迭代類型爲索引-值對 (index-value) 對, 默認索引從零開始,也可用start指定
示例:
numbers = [10086, 10000, 10010, 95588]
names = ['中國移動', '中國電信', '中國聯通']
for t in zip(numbers, names):
print(t)
for n, a in zip(numbers, names): # 等同於序列賦值
print(a, '的客服號碼是:', n)
for t in zip(range(2), numbers, names):
print(t)
d = dict(zip(numbers, names)) # ???
for t in enumerate(names):
print(t) # (0, '中國移動') ....
for t in enumerate(names, 20000):
print(t) # (20000, '中國移動') ....
練習:
寫一個程序,讀入任意行文字,當輸入空行時結束輸入
打印帶有行號的輸入結果
如:
請輸入:hello
請輸入:world
請輸入:python
請輸入:<回車>
輸入如下:
第1行: hello
第2行: world
第3行: python
問題:
序列:
list, str, tuple, bytes, bytearray
1k=1024bytes 1m=1024k
字節串 bytes (也叫字節序列)
作用:
存儲以字節爲單位的數據
說明:
字節串是不可變的字節序列
字節是0~255的整數
字節:
字節是由8個位組成的數據單位,是計算機進行數據管理的單位
字節使用0-255範圍內的整數表示
創建空字節串的字面值
b = b'' b 綁定空字節串
b = b"" b 綁定空字節串
b = b'''''' b 綁定空字節串
b = b"""""" b 綁定空字節串
創建非空字節串的字面值
b = b'ABCD'
b = b'\x41\x42'
字節串的構造函數bytes
bytes() 生成一個字的字節串,等同於b''
bytes(整型可迭代對象) 用可迭代對象初始化一個字節串
bytes(整數n) 生成n個值爲0的字節串
bytes(字符串, encoding='utf-8') 用字符串的轉換編碼生成一個字節串
例:
b = bytes()
b = bytes(range(0, 255))
b = bytes(10)
b = bytes('你好', 'utf-8')
字符串的運算:
+ += * *=
<<= >>= == !=
in / not in
索引和切片
函數:
len(x)
max(x)
min(x)
sum(x)
any(x)
all(x)
bytes 與 str 的區別:
bytes 存儲字節(0~255)
str 存儲 unicode 字符(0~65535或更大)
str 與 bytes轉換
編碼(encode)
str ----------> bytes
b = s.encode(encoding='utf-8')
解碼(decode)
bytes -------------> str
s = b.decode(encoding='utf-8')
str tuple dict frozenset set bytes bytearray
字節數組 bytearray
可變的字節序列
創建函數bytearray
bytearray() 創建字節數組
bytearray(可迭代對象) 同bytes(可迭代對象)
bytearray(整數n) ...
bytearray(字符串, encoding='utf-8')
運算操作:
+ += * *=
比較運算: <<= >>= == !=
in / not in
索引 index / 切片 slice
(字節數組支持索引和切片賦值,規則同列表的索引和切片賦值規則)
字節數組的方法:
詳見:
help(bytearray)
ba.clear()
ba.append(n) 追加一個字節(n爲0-255的整數)
ba.remove()
ba.reverse() 字節順序反轉
ba.decode(encoding=’utf-8’) #解碼爲字符串
ba.find(sub[,start]) 查找sub