1. 程式人生 > >Python:生成器,yield,位元組

Python:生成器,yield,位元組

生成器 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 
索引/切片
(位元組陣列可以索引和切片賦值,規則同列表的索引和切
片賦值規則)