Python全棧工程師(迭代器、字節串)

ParisGabriel
 
 
 
         天天堅持手寫  一天一篇  決定堅持幾年 爲了夢想爲了信仰
 
   

                      Python人工智能從入門到精通python

 

 


迭代器 Iterator:
    用<>括號表示的必定是對象數組

什麼是迭代器?
  迭代器是訪問可迭代對象的工具
  迭代器是指用iter(obj) 函數返回對象(實例)
  迭代器能夠用next(it) 函數獲取可迭代對象的數據app

迭代器函數iter和next
  iter(iterable) 從可迭代對象中返回一個迭代器,iterable 必須是能提供一個迭代器的對象
  next(iterator) 從迭代器iterator中獲取下一個記錄,若是沒法獲取下一條記錄,則觸發StopIteration異常

說明:
  迭代器只能向前取值,不會後退
  用iter函數能夠返回一個可迭代對象的迭代器
做用:
  迭代器對象能用next函數獲取下一個元素.函數

示例:
  L = [2, 3, 5, 7]
  it = iter(L) # 用L對象返回能訪問L的迭代器, it綁定迭代器
  next(it) # 2
  next(it) # 3
  next(it) # 5
  next(it) # 7
  next(it) # StopIteration 通知(沒有數據)工具

  it = iter(range(1, 10, 30))
  next(it) # 1
  next(it) # 4
  next(it) # 7
  next(it) # StopIteration編碼

用迭代器訪問可迭代對象:人工智能

L = [2, 3, 5, 7]
for x in L:
    print(x)
else:
    print('循環結束')

it = iter(L)  # 從L中獲取一個迭代器
while True:
    try:
        x = next(it)
        print(x)
    except StopIteration:
        print("循環結束")
        break


生成器 Generator (python 2.5及以後)
什麼是生成器?
  生成器是可以動態提供數據的對象,生成器對象也是可迭代對象(實例)
  動態就是現用現生成數據spa

生成器有兩種:
  1. 生成器函數
  2. 生成器表達式翻譯

生成器函數的定義
  含有yield語句的函數是生成器函數,此函數被調用將返回一個生成器對象
  yield 翻譯爲(產生或生成)3d

yield  語句
  語法:
    yield 表達式
  說明:
    yield 用於 def 函數中,目的是將此函數做用生成器函數使用
    yield 用來生成數據,供迭代器的next(it) 函數使用
    yield 單步生成數據 在函數內能夠一個或多少

實例:

# 此示例示意用生成器函數生成必定範圍內的天然數
def myinteger(n):
    i = 0  # 天然數從0開始
    while i < n:
        yield i
        i += 1

for x in myinteger(3):
    print(x)

生成器函數說明:
  生成器函數的調用將返回一個生成器對象,生成器對象一個可迭代對象
  在生成器函數調用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]) 生成帶索引的枚舉對象,返回迭代類型爲索引-值對(index-value對),默認索引從零開始,也能夠用start指定

示例:
  numbers = [10086, 10000, 10010, 9558]
  names = ['中國移動', '中國電信', '中國聯通']

  for t in zip(numbers, names):
      print(t)

  for x, y in zip(numbers, names):
      print(y, '的客服電話是:', x)

  x, y = (10086, '中國移動') # 序列賦值 
zip函數的實現示例2:
  def myzip(iter1, iter2):
      it1 = iter(iter1)  # 拿出一個迭代器
      it2 = iter(iter2)
      while True:
          a = next(it1)
          b = next(it2)
          yield (a, b)
  for t in myzip(numbers, names): #能實現與zip一樣的功能
      print(t)
enumerate 示例:
    names = ['中國移動', '中國電信', '中國聯通']
    for t in enumerate(names):
        print(t)

enumerate 實現方法示意:
    def myenum(iterable):
        it = iter(iterable)
        i = 0
        while True:
            a = next(it)
            yield (i, a)
            i += 1

 

字節串和字節數組
  字節串bytes (也叫字節序列)
  做用:
    存儲字節單位數據
    字節串是不可變的字節序列

  字節:
    字節是由8個位(bit)組成的數據單位,是計算機進行數據管理的單位
    字節是 0 ~ 255 範圍內的整數表示

建立空字節串的字面值
  B = b''
  B = b""
  B = b''''''
  B = b""""""

建立非空字節串的字面值
  B = b'ABCD'
  B = b"ABCD"
  B = b'\x41\x42'

字節串的構造函數 bytes
  bytes() 生成一個空的字節串 等同於 b''
  bytes(整數可迭代對象) # 用可迭代對象初始化一個字節串
  bytes(整數n) 生成n個值爲0的字節串
  bytes(字符串, encoding='utf-8') 用字符串轉爲編碼生成一個字節串

  示例:
    b = bytes() # b = b''
    b = bytes(range(65, 69)) # b = b'ABCD'
    b = bytes(5) # b = b'\x00\x00\x00\x00\x00'
    b = bytes('abc中文') # b=b'ABC\xe4\xb8\xad\xe6\x96\x87'

bytes 的運算:
  + += * *=
  < <= > >= == !=
  in / not in
  索引和切片

  len(x)
  max(x)
  min(x)
  sum(x)
  any(x)
  all(x)


bytes 和 str 的區別:
  bytes 存儲字節( 一般值在 range(0, 256))
  str 存儲unicode字符( 一般值在0~65535)


bytes 與 str 的轉換
  編碼(encode)
  str ------------> bytes
  b = s.encode(encoding='utf-8')

解碼(decode)
  bytes ----------> str
  s = b.decode(encoding='utf-8')


字節數組 bytearray
可變的字節序列

字節數組的構造函數: bytearray
  bytearray() 建立空的字節數組
  bytearray(整數) 用可迭代對象初始化一個字節數組
  bytearray(整型可迭代對象) 生成n個值爲0的字節數組
  bytearray(字符串, encoding='utf-8') 用字符串的轉換編碼生成一個字節數組

bytearray 的運算:
  + += * *=
  < <= > >= == !=
  in / not in
  索引和切片
  (字節數組支持索引和切片的賦值操做,規則同列表的索引和切片賦值規則)

例:
  ba = bytearray(b'aBCDEfG')
  ba[0] = 65
  ba[-2] = 70

bytearray的方法:
BA.clear() 清空
BA.append(n) 追加一個字節(n爲0~255的整數)
BA.remove(value) 刪除第一個出現的字節,若是沒有出現,則觸發ValueError錯誤
BA.reverse() 字節順序反轉
BA.decode(encoding='utf-8') # 解碼爲字符串
BA.find(sub[, start[,end]]) # 查找 sub

 

練習:
有一個集合:
s = {'唐僧', '悟空', '八戒', '沙僧'}
用 for語句來遍歷全部元素以下:
for x in s:
print(x)
else:
print('遍歷結束')
請將上面的for語句改寫爲 用while語句和迭代器實現

練習:
寫一個生成器函數 myeven(start, stop)
此函數用來生成從 start開始到stop結束(不包含)區間內的一系列偶數
def myeven(start, stop):
....

evens = list(myeven(10, 20))
print(evens) # [10, 12, 14, 16, 18]
for x in myeven(21, 30):
print(x) # 22, 24, 26, 28

L = [x**2 for x in myeven(3, 10)]
print(L) # 16 36 64

練習:
已知有一個列表L
L = [2, 3, 5, 7]
用生成器表達式今後列表中拿到數,生成 列表中數據的平方

gen = ...... # 此處用生成器表達式實現
L2 = list(gen) # L2 = [4, 9, 25, 49]

練習:
寫一個程序,讀入任意行的文字,當輸入空行時結束輸入
打印帶有行號的輸入結果:
如:
請輸入: hello<回車>
請輸入: world<回車>
請輸入: tarena<回車>
請輸入: <回車> # 直接回車結束輸入
輸出以下:
第1行: hello
第2行: world
第3行: tarena


練習:
寫一個程序,從鍵盤輸入一段字符串存入s變量
1. 將此字符串轉爲字節串用變量b綁定,並打印出b
2. 打印字符串s的長度和字節串b的長度
3. 將b字節串再轉換爲字符串用變量s2 綁定,判斷 s2 和 s是否相同?

s = input("please input string:")
b = s.encode("utf-8")
print(s)
print(b)
print(len(s))
print(len(b))
s2 = b.decode("utf-8")
if s2 == s:
    print("相等")

 

 

 

練習:
1. 寫一個生成器函數primes生成素數,
今生成器函數爲 primes(begin, end)
如: [x for x in primes(10, 20)] 將獲得列表
[11, 13, 17, 19]

答案:

def get_ss(x):
    if x <= 0:
        return False
    for i in range(2, x):
        if x % i == 0:
            return False
    return True

def primes(begin, end):
    if begin <= 2or end <= 2:
        pass
    for x in range(begin, end):
        if get_ss(x):
            yield x
L = [x for x in primes(10, 20)]

print(L)

 

 

2. 寫一個生成器函數,生成斐波那契數列的前n個數
1 1 2 3 5 8 13
def fibonacci(n):
...
yield...
1) 輸出前20個數:
for x in fibonacci(20):
print(x)
2) 打印前40個數的和:
print(sum(fibonacci(40)))

答案:

def fibonacci(n):
    L = [1, 1]
    for x in range(n):
        s = L[x] + L[x + 1]
        L.append(s)
    return L
print(fibonacci(20))
print(sum(fibonacci(40)))

 

 

 


3. 寫  程序打印楊輝三角(只打印6層)
                       1
                  1       1
             1       2     1
         1      3  3       1
   1       4    6      4      1
1     5    10    10     5     1

 

答案:

def yh_sj():
    L = [1]
    while True:
        yield L
        L.append(0)
        L = [L[x - 1] + L[x] for x in range(len(L))]


def lst():
    i = 0
    for x in yh_sj():
        print(str(x).center(50))
        if i == 10:
            break
        i += 1

 

 

 


思考:
L = [2, 3, 5, 7]
L2 = [x ** 2 for x in L] # 列表推導式
it = iter(L2)
print(next(it)) # 4
L[1] = 10
print(next(it)) # 9

L = [2, 3, 5, 7]
G3 = (x ** 2 for x in L) # 生成器表達式
it = iter(G3)
print(next(it)) # 4
L[1] = 10
print(next(it)) # 100

 

生成器是動態的現用現去   跟着數據變化所變化 

相關文章
相關標籤/搜索