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
生成器是動態的現用現去 跟着數據變化所變化