Python:生成器,yield,位元組
阿新 • • 發佈:2018-12-19
生成器 Generator
什麼是生成器:
生成器是能夠動態提供資料的可迭代物件
生成器在程式執行時生成資料,與容器類不同,它通常不會在
記憶體中儲存大量的資料,而是現用現生成
好處:
不佔用計算機的記憶體
生成器有兩種:
生成器函式
生成器表示式
生成器函式的定義
含有yield語句的函式是生成器函式,此函式被呼叫將返回
一個生成器物件
yield 翻譯為(產生或生成)
yield 語句
語法: yield 表示式 說明: yield 只能用於def 函式中,目地是將此函式作為生成器函式使用 yield 用來生成資料,供迭代器的next(it) 函式使用 說明: 1. 生成器函式的呼叫將返回一個生成器物件,生成器物件是 一個可迭代物件 2. 生成器函式用return會觸發一個StopIteration異常 (即生成結束)
生成器表示式
語法:
(表示式 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
next(it) # StopIteration
迭代工具函式
迭代工具函式的作用是生成一個符合條件的可迭代物件 zip(iter1[,iter2[, ...]]) 返回一個zip生成器物件 此物件用於生成一個元組,此元組的資料分別來自於 引數中的每個可迭代物件,生成元組的個數由最小的 一個可迭代物件決定 enumerate(iterable, start=0) 返回一個enumerate 生成器物件,此物件生成型別為(索引,值對) 的元組 預設索引從零開始,也可以用start指定
zip示例: numbers = [10086, 10000, 10010, 95588] names = ['中國移動', '中國電信', '中國聯通'] for t in zip(numbers, names): print(t) # 結果 # (10086, '中國移動') # (10000, '中國電信') # (10010, '中國聯通') for t in zip(numbers, names, range(1, 10000)): print(t) enumerate 示例: names = ['中國移動', '中國電信', '中國聯通'] # for t in zip(range(100000000), names): # print(t) for t in enumerate(names): print(t) # 列印 (0, '中國移動') (1, '中國電信') (2, '中國聯通') for t in enumerate(names, 101): print(t) # 列印 (101, '中國移動') (102, '中國電信') (103, '中國聯通')
容器
列表,字串,元組(序列), 位元組串,位元組陣列
字典,集合,固定集合
位元組串和位元組陣列
位元組串(位元組序列) bytes
儲存以位元組為單位的資料
位元組串是不可變的位元組序列
說明:
位元組是0~255之間的整數,用來表示一個位元組的取值
建立空位元組串的字面值方式:
b''
b""
b''''''
b""""""
建立非空位元組串的字面值
b'ABCD'
b"ABC"
b'''aaaa'''
b"""BBBB"""
位元組串的建構函式 bytes
bytes() 生成一個空的位元組串,等同於b''
bytes(整數可迭代物件) 用可迭代物件始化一個位元組串
bytes(整數n) 生成n個值為0的位元組串
bytes(字串, encoding='utf-8') 用位元組串轉換編
碼生成一個位元組串
示例:
B = bytes()
B = bytes(range(0x41, 0x61))
B = bytes([65, 66, 67, 68])
B = bytes(10)
B = bytes("Hello", 'utf-8')
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~0x10FFFF) 的字元
bytes 與 str 的轉換
編碼(encode)
str --------------> bytes
b = s.encode(encoding='utf-8')
解碼(decode)
bytes ---------------> str
s = b.decode(encoding='utf-8')
示例:
s = "ABC中文"
b = s.encode('utf-8')
s2 = b.decode('utf-8')
print(s, b, s2)
位元組陣列 bytearray
可變的位元組串
位元組陣列的建構函式 bytearray
bytearray()
bytearray(整型可迭代物件)
bytearray(整數n)
bytearray(字串, encoding='utf-8')
運算:
同位元組串
+ += * *=
比較: < <= > >= == !=
in / not in
索引/切片
(位元組陣列可以索引和切片賦值,規則同列表的索引和切
片賦值規則)