今日學習內容總結1.6
今日學習內容總結
常見內建函式
help()
檢視註釋資訊
# help()的使用方法 help(input) ''' Help on built-in function input in module builtins: input(prompt=None, /) Read a string from standard input. The trailing newline is stripped. The prompt string, if given, is printed to standard output without a trailing newline before reading input. If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError. On *nix systems, readline is used if available. '''
id()
返回一串相當於記憶體地址的數字
# id()的使用方法
print(id('jason')) # 2184106725816
int()
型別轉換、機制轉換
# 型別轉換
a = '18'
print(type(int(a))) # <class 'int'>
# 進位制轉換
a = 0b10010 # 二進位制
print(int(a)) # 18
isinstance()
判斷資料型別
# 原本的判斷方式 print(type('jason') is str) # True 型別判斷,很彆扭所以不推薦 # isinstance()方法 print(isinstance('jason', str)) # True print(isinstance('jason', list)) # False
pow()
冪指數
print(pow(2, 2)) # 4
round()
四捨五入,其中第二個引數控制需要保留幾位小數
print(round(10, 1)) # 10
print(round(10.22, 1)) # 10.2
print(round(10.66, 1)) # 10.7
sum()
求和
print(sum([1, 2, 3])) # 6
可迭代物件
迭代:我們知道,在Python世界裡,一切皆物件。物件根據定義的維度,又可以分為各種不同的型別,比如:檔案物件,字串物件,列表物件。。。等等。迭代其實就是更新換代,每一次迭代的過程都需要依賴於上一次的結果。程式碼示例:
# 迴圈不是迭代,因為迴圈並不依賴上一次的結果。但是依賴上一次結果的迴圈,也是迭代
n = 1
while True:
print(n)
n += 1
# 迭代取值
a= [1, 2, 3, 4, 5]
n = 0
while n < len(l1):
print(a[n])
n += 1
可迭代物件與迭代器兩者並不是相同的:1.可迭代物件包含迭代器。2.如果一個物件擁有__iter__方法,其是可迭代物件;如果一個物件擁有next方法,其是迭代器。3.定義可迭代物件,必須實現__iter__方法;定義迭代器,必須實現__iter__和next方法。
哪些資料可以是可迭代物件
依次列舉並嘗試呼叫__iter__方法即可判斷是否為可迭代物件。而屬於可迭代物件的有:字串、列表、字典、元組、集合、檔案物件。可迭代物件其實就是為了後續迭代取值做準備,提供了不依賴於索引取值的方式。
iter()與next(),對於可迭代物件,可以使用iter()函式得到這些可迭代物件的迭代器,然後對迭代器使用next()函式來獲取下一條資料。(iter()函式呼叫了可迭代物件的__iter__方法)。程式碼示例:
a = [1, 2, 3] # 可迭代物件
b= iter(a) # list1使用__iter__方法,形成迭代器list1_iter
print(next(b)) # 1
print(next(b)) # 2
print(next(b)) # 3
next(b) # StopIteration
# 在使用next()迭代完最後一個元素後,再次呼叫next就會丟擲StopIteration異常,以此來告訴我們所
有元素均迭代完成。
迭代器物件
迭代器物件,可迭代物件呼叫__iter__方法之後生成的結果就是迭代器物件。迭代器物件的特徵,含有__iter__方法和__next__方法。
迭代器物件能夠極大的節省儲存空間。因為迭代器物件相當於是,你需要什麼,我給你什麼,你不需要我就不給。而迭代器的取值方法,呼叫__next__方法即可,如果取完了則會直接報錯!!!程式碼示例:
s = 'jason'
res = s.__iter__() # 將res定義成迭代器物件了,所以接下來使用不會產生新的迭代器物件然後取值
print(res.__iter__().__next__()) # j
print(res.__iter__().__next__()) # a
print(res.__iter__().__next__()) # s
print(res.__iter__().__next__()) # o
print(res.__iter__().__next__()) # n
print(res.__iter__().__next__())
'''
Traceback (most recent call last):
File "C:/Users/Administrator/Desktop/Typora/day15/day15/teset.py", line 8, in <module>
print(res.__iter__().__next__())
StopIteration
'''
# 這就是如果取完了再取會報錯。
for迴圈內部原理
1.會將in後面的資料呼叫__iter__()變成迭代器物件。(檔案物件也可以for迴圈 因為本身就是迭代器物件 再次呼叫不變)2.針對產生的迭代器物件依次呼叫__next__()方法迭代取值。3.當值取完之後 會自動處理報錯並退出迴圈。程式碼示例:
# 不依賴於for迴圈,完成對列表元素的取值
a = [1, 2, 4, 3, 5, 6]
res = a.__iter__()
n = 0
while n < len(a):
print(res.__next__())
n += 1
# 當值取完之後 會自動處理報錯並退出迴圈
res = a.__iter__()
while True:
print(res.__next__()) # StopIteration
異常處理
異常簡介
異常,就是程式碼執行出現錯誤。異常會導致程式立刻停止。是我們以後在程式設計過程中需要極力避免的情況(異常的外號:bug)
異常資訊的組成部分
'''
Traceback (most recent call last):
# 報錯
File "/Users/jiboyuan/PycharmProjects/day16/05 異常處理.py", line 3, in <module>
name
NameError: name 'name' is not defined
'''
1.line關鍵字所在的一行
用於提示你程式碼哪一行出錯了 點選前面的藍色字型可以直接定位。如果報錯的資訊很長 一般最後一個才是
2.NameError錯誤的型別
程式碼的報錯也可以分為很多型別
3.name 'name' is not defined
具體的報錯原因(就是解決報錯的答案)
異常的分類
異常的分類分別是:1.語法異常。這是不被允許出現的,如果出現了必須立刻改正。2.邏輯異常。可以允許出現的,如果出現了儘快修改即可。
異常的型別
錯誤型別 | 詳情 |
---|---|
AttributeError | 試圖訪問一個物件沒有的樹形,比如foo.x,但是foo沒有屬性x |
IOError | 輸入/輸出異常;基本上是無法開啟檔案 |
ImportError | 無法引入模組或包;基本上是路徑問題或名稱錯誤 |
IndentationError | 語法錯誤(的子類) ;程式碼沒有正確對齊 |
IndexError | 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5] |
KeyError | 試圖訪問字典裡不存在的鍵 |
KeyboardInterrupt | Ctrl+C被按下 |
TypeError | 傳入物件型別與要求的不符合 |
ValueError | 傳入一個呼叫者不期望的值,即使值的型別是正確的 |
異常處理實操
異常處理可以使用try和except來解決。基本語法結構:
try:
可能出錯的語句
except 錯誤型別 as e: (錯誤型別必須具體例如:IndexError等也可以寫Exception出錯時執行語句,e代表錯誤提示資訊,Exception代表統一錯誤型別)
else:
沒出錯時執行的語句
異常處理使用尊則:1.被檢測的程式碼越少越好。2.能儘量少用就儘量少用
異常處理了解
1.結合else使用:
# 當try檢測的程式碼沒有發生異常,正常執行完畢之後執行else的子程式碼
try:
可能會出錯的程式碼
except Exception as e: # 檢測異常走except子程式碼
統一的處理措施
else: # # 檢測無異常走else子程式碼
可能會出錯的程式碼沒有出錯 最後走else子程式碼
2.結合finally使用:
# 無論try檢測的程式碼是否有異常,最後都會執行finally子程式碼
try:
可能會出錯的程式碼
except Exception as e: # 檢測異常走except子程式碼
統一的處理措施
else: # # 檢測無異常走else子程式碼
可能會出錯的程式碼沒有出錯 最後走else子程式碼
finally:
無論try檢測的程式碼是否有異常 最後都會執行finally子程式碼
# 這也是else與finally的整合使用
3.斷言(瞭解中的瞭解):
name = 'jason'
assert isinstance(name,str)
4.主動報錯(需要掌握):
raise NameError('不爽 就要作!!!')
# 由於是主動報錯,所以可以非常明確的知道錯誤的型別
for迴圈本質
利用while與異常捕獲 實現for迴圈的功能
a = [1, 2, 3, 4]
# 1.先轉換成迭代器物件
# res = info.__iter__()
res = iter(a)
# 2.迭代取值
while True:
# print(res.__next__())
try:
print(next(res))
except StopIteration as e:
# 結束while迴圈
break
# 這樣在我們知道報錯的型別就可以加以相應的處理措施,就不會報錯了。
迭代取值與索引取值的對比
1.索引取值:優勢,可以反覆獲取相同的元素 並且沒有固定的方向。劣勢,只能支援有序的容器型別 無序的無法取值相容性沒有迭代取值高。
2.迭代取值:優勢:相容所有的容器型別。劣勢,取值的順序永遠都是從左往右,並且無法重複獲取,去完就完了。