學習python,從入門到放棄(16)
學習python,從入門到放棄(16)
常見內建函式
-
help()
檢視註釋資訊。
help(len) ''' Help on built-in function len in module builtins: len(obj, /) Return the number of items in a container. '''
-
id()
返回一串相當於記憶體地址的數字
print(id('hello world')) # 2593286755312
-
isinstance()
判斷資料型別
print(isinstance('hello world', str)) # True print(isinstance('hello world', int)) # False
-
pow()
冪指數
print(pow(2, 10)) # 1024
-
round()
四捨五入
print(round(11, 1)) # 第二個引數控制需要保留幾位小數部分 print(round(11.29, 1)) # 11.3 print(round(11.59, 1)) # 11.6
-
sum()
求和
print(sum([11, 2, 2, 3, 4, 3, 2])) # 27
可迭代物件
迭代其實就是更新換代,每一次迭代的過程都需要依賴於上一次的結果。
# 單純的迴圈 不是迭代 import time while True: print(123) time.sleep(0.1) # 屬於迭代 n = 1 while True: print(n) n += 1 # 迭代取值 l1 = [11, 22, 33, 44, 55] n = 0 while n < len(l1): print(l1[n]) n += 1
Python 中可迭代物件並不是指某種具體的資料型別,它是指儲存了元素的一個容器物件,且容器中的元素可以通過 __iter__
方法訪問。
屬於可迭代物件的有字串、列表、字典、元組、集合、檔案物件。
迭代器物件
可迭代物件呼叫 __iter__
方法之後生成的結果就是迭代器物件。迭代器物件的明顯的特徵就是可以呼叫__iter__
方法和__next__
方法.
迭代器物件能夠極大的節省儲存空間,用的時候可以從中取出很多資料。有了迭代器物件才出現了針對字典和集合的迭代取值操作。
迭代器物件取值時可以直接呼叫__next__
方法,但是如果取完了就會直接報錯。這就涉及到 for 迴圈的底層用法了,其實迭代器就是 for 迴圈的原理,for 迴圈就是它的簡便寫法。
s = '123'
res = s.__iter__()
n = 0
while n < len(s):
print(res.__next__())
n += 1
'''
for 變數名 in 可迭代物件:
迴圈體程式碼
1.會將in後面的資料呼叫__iter__()變成迭代器物件
為什麼檔案物件也可以for迴圈 因為本身就是迭代器物件 再次呼叫不變
2.針對產生的迭代器物件依次呼叫__next__()方法迭代取值
3.當值取完之後 會自動處理報錯並退出迴圈
'''
許多雙下劃線方法其實都有簡便寫法。
s = '123'
print(s.__iter__()) # <str_iterator object at 0x000001D341528400>
print(iter(s)) # <str_iterator object at 0x000001D341528400>
print(s.__len__()) # 3
print(len(s)) # 3
這兩個方法和它的簡便寫法的作用是一樣的。
有一些可迭代物件本身也是迭代器物件比如檔案物件,其他可迭代物件都要經過轉化。
可迭代物件的迭代器物件的迭代器物件,還是可迭代物件的迭代器物件。
s = '123'
res = s.__iter__()
res1 = s.__iter__().__iter__().__iter__()
print(res, res1) # <str_iterator object at 0x000002A61CE08390> <str_iterator object at 0x000002A61CE083C8>
迭代器物件取值時,要將可迭代物件先轉換成迭代器物件才能用__next__
方法迭代,否則直接使用可迭代物件,每次迭代都會是同一個值。
s = '123'
print(s.__iter__().__next__()) # 1
print(s.__iter__().__next__()) # 1
print(s.__iter__().__next__()) # 1
res = s.__iter__() # 變成迭代器物件
print(res.__iter__().__next__()) # 1
print(res.__iter__().__next__()) # 2
print(res.__iter__().__next__()) # 3
異常處理
-
簡介
當我們程式碼執行出錯之後會報異常,異常會導致程式立刻停止。
-
異常一般分為三個重要的部分
-
line關鍵字所在的一行
用於提示你程式碼哪一行出錯了。
-
NameError 錯誤的型別
告訴你錯誤的型別,可以分型別處理錯誤。
-
name 'name' is not defined 具體的報錯原因
一般就是解決錯誤的方法。
-
-
異常的分類
異常一般分為語法異常和邏輯異常。語法異常一般屬於比較低階的異常。處理邏輯異常時,其實就是在重新梳理你的思路。
-
丟擲異常
有時候針對可能會出錯的程式碼,也可以自己提前寫好處理措施。正常情況下程式碼出錯,肯定是直接導致程式停止,但是也可以自己通過程式碼來處理,從而避免程式的停止。
try: 可能會出錯的程式碼 except 錯誤的型別1 as e: # e指代的就是錯誤的提示資訊 針對性的處理措施 except 錯誤的型別2 as e: # e指代的就是錯誤的提示資訊 針對性的處理措施 except 錯誤的型別3 as e: # e指代的就是錯誤的提示資訊 針對性的處理措施 ...
很多時候可能自己都不知道會報什麼型別的錯誤,這時候就可以使用萬能異常,所有的異常都可以收納。
try: 可能會出錯的程式碼 except Exception as e: 統一的處理措施
當使用異常處理時,應當遵守兩條原則:被檢測的程式碼越少越好;能儘量少用就儘量少用。
-
結合 else 使用
當 try 檢測的程式碼沒有發生異常,正常執行完畢之後執行else的子程式碼。
try: 可能會出錯的程式碼 except Exception as e: 統一的處理措施 else: 子程式碼
-
結合 finally 使用
無論 try 檢測的程式碼是否有異常,最後都會執行 finally 子程式碼。
try: 可能會出錯的程式碼 except Exception as e: 統一的處理措施 finally: 子程式碼
也可以兩者結合一起使用
try: 可能會出錯的程式碼 except Exception as e: 統一的處理措施 else: 子程式碼 finally: 子程式碼
-
斷言
斷言可以在條件不滿足程式執行的情況下直接返回錯誤,而不必等待程式執行後出現崩潰的情況
name = '123' assert isinstance(name, int)
-
主動報錯
raise 可以在程式的指定位置手動丟擲一個異常,可以捕獲異常並進行處理。
raise NameError('hello world')
迭代取值與索引取值的對比
-
索引取值
索引取值可以反覆獲取相同的元素,並且沒有固定的方向,但是索引取值只能支援有序的容器型別,無序的無法取值,相容性沒有迭代取值高。
-
迭代取值
迭代取值可以相容所有的容器型別,但是取值的順序永遠都是從左往右,並且無法重複獲取。
總結
正式學習了迭代的相關知識,並且還學習了處理 bug 的方法。