python-生成器物件-常見內建函式
阿新 • • 發佈:2021-11-23
目錄
異常捕獲(二)
try:
name
except Exception as e:
print("程式碼錯誤")
else:
print('程式碼正常才會執行了')
finally:
print('程式碼不管是否異常都會執行')
# 斷言
name = 'jason'
assert isinstance(name, str)
# 主動丟擲異常
raise ZeroDivisionError('除數不能為0')
for迴圈本質
d = {'name': 'jason', 'age': 18}
res = d.__iter__() # StopIteration的異常,該異常是在迴圈物件窮盡所有元素時的報錯
# while實現迴圈列印
while True:
try:
print(res.__next__())
except StopIteration as e:
break
# for迴圈列印
for i in d:
print(i)
迭代取值與索引取值對比
-
迭代取值
- 不依賴索引進行取值
- 取值的順序都是固定的從左到右,無法重複獲取
-
索引取值
- 可以重複取值
- 需要提供有序容器型別才可取值(不是通用方式)
生成器物件
生成器其實就是自定義迭代器 # 定義階段就是一個普通函式 def my_generator(): print('first') yield 11 print('second') yield 22 """ 當函式體內含有yield關鍵字 那麼在第一次呼叫函式的時候 並不會執行函式體程式碼 而是將函式變成了生成器(迭代器) """ res = my_generator() # 呼叫函式不執行函式體程式碼,而是將函式變成生成器(迭代器) print(res) # <generator object my_generator at 0x7fcc5f7d3888> ret = res.__next__() # 每執行一個__next__程式碼往下執行到yield停止 返回後面的資料 print(ret) # first \n 11 ret = res.__next__() # 再次執行__next__接著上次停止的地方繼續往後 遇到yield再停止 print(ret) # second \n 22
自定義range功能
def my_range(start, stop=None, step=1):
if not stop:
stop, start = start, 0
while start < stop:
yield start
start += step
for i in my_range(2, 10, 2):
print(i)
yield傳值
def generator_func1(age):
print('age is %s ' % age)
while True:
name = yield
print('%s NB' % name)
res = generator_func1(18) # 不會執行函式體程式碼,而是轉換成生成器
res.__next__()
res.send('json') # 給yield傳值
res.send('xxx') # 再次給yield傳值
yeild與return對比
相同點:可以返回值,支援多個並且組織成元組
不同點:
yield:
1. 函式體程式碼遇到yield不會結束,會'停住'
2. yield可以將函式變成生成器,並且支援外界傳值
return:
1. 函式體程式碼遇到return直接結束
生成器表示式
# 列表生成式
l1 = [11, 22, 33, 44, 55, 66]
res = [i + 1 for i in l1 if i != 44]
print(res) # [12, 23, 34, 56, 67]
# 生成器表示式
'''生成器表示式內部的程式碼只有在迭代取值的時候才會執行'''
res1 = (i + 1 for i in l1 if i != 44)
print(res1) # <generator object <genexpr> at 0x7fbbb7e96ca8>
print(res1.__next__()) # 12
print(res1.__next__()) # 23
print(res1.__next__()) # 24
-
筆試題
# 求和 def add(n, i): return n + i # 呼叫之前是函式 呼叫之後是生成器 def test(): for i in range(4): yield i g = test() # 初始化生成器物件 for n in [1, 10]: g = (add(n, i) for i in g) """ 第一次for迴圈 g = (add(n, i) for i in g) 第二次for迴圈 g = (add(10, i) for i in (add(10, i) for i in g)) """ res = list(g) print(res) #A. res=[10,11,12,13] #B. res=[11,12,13,14] C. res=[20,21,22,23] #D. res=[21,22,23,24]
常見內建函式
1. abs() # 取絕對值
print(abs(-10)) # 10
2. all() any()
l = [11, 22, 0]
print(all(l)) # 所有元素為True才是True
print(any(l)) # 所有元素有一個為True就是True
3. bin() oct() hex()
print(bin(12)) # 0b1100 二進位制
print(oct(12)) # 0o14 八進位制
print(hex(12)) # 0xc 十六進位制
4. bytes() str()
res = '測試'
ret1 = bytes(res, 'utf8')
print(ret1) # b'\xe6\xb5\x8b\xe8\xaf\x95'
ret2 = str(ret1, 'utf8')
print(ret2) # 測試
5. callable() # 是否看呼叫(看是否能加括號執行)
i = 1
def f():
pass
print(callable(i), callable(f)) # Flse True
6. chr() ord()
print(chr(65)) # A 按照ASICC碼錶的數字列印字元
print(ord('A')) # 65 按照ASICC碼錶的字元列印數字
7. complex() 複數
print(complex(123)) # (123+0j)
8. dir() # 檢視當前物件可以呼叫的名字
def f():
pass
print(dir(f))
9. divmode() # 接收兩個數字型別引數,返回一個包含商和餘數的元組(a // b, a % b)
print(divmode(101, 10)) # (10 1)
應用:
# 生成頁數
num, more = divmod(201, 10)
if more:
num += 1
print('總共需要%s頁' % num)
10. eval() exec() # 將字串內的內容載入執行
s1 = "print('hello')"
s2 = '''
for i in range(10):
print(i)
'''
eval(s1) # 只能執行簡單的內容
exec(s2) # 可以執行復雜的內容
11. isinstance() # 判斷是否屬於某個資料型別
i = 1
print(isinstance(i, int)) # True
12. pow()
print(pow(4, 3)) # 64 4**3
13. round()
print(round(4.5)) # 4
print(round(4.6)) # 5
14. sum() # 求和
l = [11, 22, 33, 44]
print(sum(l)) # 110 將列表 l 中的元素求和