迭代器 生成器 字節 yield

迭代器 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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章