1. 程式人生 > 其它 >python迭代器與異常處理

python迭代器與異常處理

python迭代器與異常處理

昨日內容回顧

1. 三元表示式

	值1 if 條件(函式) else 值2
條件成立使用前面的值1,不成立使用值2

ps:if分支的罕見寫法
    子程式碼只有一行時,可以並列書寫
    if name == 'eason':print('123')
    else:print('321')

2.列表生成式(必會)

res = [i**2 for i in range(10) if i != 4]
變數名 = [條件滿足後執行 for 值 in range(10) if 值 條件]

3.字典生成式

res = {i:i**2 for i in range(10) if i!=4}
變數名 = {k:滿足條件的值 for 值 in range(10) if  條件}

4.集合生產式

res = {i for i in range(10) if i!=4}
變數名 = {條件滿足新增值 for 值 in range(10) if 條件}

5.匿名函式

沒有函式名的函式,使用方法簡單,不使用def定義,而是使用lambda 定義函式
只會獲得一個返回值使用
lambda()
匿名函式與內建函式的結合使用:
'''
max()  
min()
sorted()
map(): 
reduce()
filter()  

# 匿名函式作為引數
def func(x, y, func):
    print(x, y)
    print(func)
    s = func(x, y)
    print(s)
 
 
# 呼叫func
func(1, 2, lambda a, b: a + b)

常見重要的內建函式

1.map函式
	對映:將資料集基於相同的情況轉換
2.zip函式
	拉鍊:將多個數據集按照位置對應整合
3.filter函式
	過濾:依據條件篩選資料
4.reduce函式
	歸總:將元素根據條件進行歸總成一個

忘記某個函式的使用方法時,靈活使用ctrl+?檢視函式內部提示

常見內建函式補充

1.abs() 絕對值
2.all() 所有元素必須是True結果才為True
3.any() 所有元素必須是False結果才為False
4.bin() 二進位制 oct() 八進位制 hex() 十六進位制
5.callable() 判斷當前當前物件是否可以加括號呼叫
6.chr() 數字轉換英語 ord() 英語轉換數字
7.dir() 獲取當前物件內部可以呼叫的屬性(方法)
8.divmod() 先整除,後取餘,適合做分頁器
9.enumerate() 列舉,給元素加上編號start控制起始
10.eval()低配識別程式碼,exec()高配識別程式碼.

今日學習內容

常見內建函式補充

1.help() 檢視內部註釋資訊
2.id() 返回記憶體地址
3.int() 轉換整形
4.isinstance() 判斷資料型別
print(isinstance('eason', str))  True
print(isinstance('eason', int))  False
5.pow() 冪指數
6.round() 四捨五入,第一個引數留需要被執行的數字,第二位數寫需要保留的小數部分
7.sum() 求和

可迭代物件

迭代概念:每一次改變都根據上一次的結果,更新換代

遊戲的更新就是版本的迭代,需要根據版本修改下次版本

迭代取值
a = 0  # 設定計數器
list = [1,2,3,4,5]
while a > len(list):  
	print(l1[a])  # 根據當前計數器值列印
    a += 1  # 每次列印完,計數器加1
每次列印都會根據上一次的結果,完成下一步的操作

資料型別的內建方式中有__iter__方法的都可以稱為可迭代物件

可迭代物件有字元,列表,字典,元組,集合,檔案,特殊函式。
可迭代物件其實就是為了後續迭代取值做準備
    提供了不依賴於索引取值的方式

迭代器物件

可迭代物件:
(字元,列表,字典,元組,集合,檔案,特殊函式)進行__iter__方法後生成的結果,就是迭代器物件

特徵:
內建方法有__iter__和__next__方法
檔案本身就是迭代器物件

迭代器概念:
內部含有多個數據的資料集,你需要時按照要求取出來給你,主要為了節約資源

迭代器取值:
呼叫__next__方法即可,但是該方法呼叫完資料會報錯
所以有了for。

迭代器補充說明:
常見簡便寫法
__iter__    iter()
__next__    next()
print(變數名.iter())
print(變數名.next())

可迭代物件呼叫一次__iter__方法程式設計迭代器物件,如果繼續呼叫 結果還是迭代器物件本身

如果需要繼續取值,需要在__iter__後使用__next__

for迴圈內部原理

for迴圈底層原理
    for 變數名 in 可迭代物件:
        迴圈體程式碼
        
1.會將in後面的資料呼叫__iter__()變成迭代器物件
    為什麼檔案物件也可以for迴圈 因為本身就是迭代器物件 再次呼叫不變
2.針對產生的迭代器物件依次呼叫__next__()方法迭代取值
3.當值取完之後 會自動處理報錯並退出迴圈

這就需要我們瞭解,怎麼手動處理報錯

異常處理

概念:
	程式碼執行出錯然後報錯就是異常,異常會導致程式立刻停止。
    
異常報錯資訊組成:
	錯誤的地址
	Traceback (most recent call last):
  File 
"檔案地址和報錯的句子", line 行數, in <module>
    name
報錯的型別:報錯的原因(解決方法)
NameError: name 'name' is not defined
    
異常的分類
	1.語法異常,嚴重錯誤,必須立刻改正
    
    2.邏輯異常,一般錯誤,儘快修改即可,程式碼獲取到資料型別不相匹配等······
    
    改bug十分消耗腦力,請勿打擾正在改bug的同學,否則會捱揍。
    
 常見的異常型別
	1.NameError		名字錯誤(變數名未定義)
    2.IndexError     索引錯誤(超出索引值)
    3.KeyError		 鍵錯誤
    4.ValueError	 值錯誤
    5.TypeError		 型別錯誤(不滿足某些特定型別的要求)

異常處理操作與措施

未對異常進行處理操作或應對措施,正常情況下,程式會直接停止執行。

應對措施關鍵詞:try
語法結構:
	try:
    可能會出錯的程式碼
except 錯誤的型別 as e: e會打印出錯誤的提升資訊
   可新增多行,多種錯誤型別,類似if else分支

萬能異常:常見的報錯都可以照單全收
  try:
    可能會出錯的程式碼
  except Exception as e:  
    統一的處理措施

異常處理使用準則:目標越少越好,用的越少越好

異常處理擴充套件

1.結合else使用
	當try檢測的程式碼沒有發生異常 正常執行完畢之後執行else的子程式碼
  try:
    可能會出錯的程式碼
  except Exception as e:  
    統一的處理措施
  else:
    可能會出錯的程式碼沒有出錯 最後走else子程式碼
   
2.結合finally使用
	無論try檢測的程式碼是否有異常 最後都會執行finally子程式碼
  try:
    name
	except Exception as e:
    print(e)
	finally:
    無論try檢測的程式碼是否有異常 最後都會執行finally子程式碼
 
3.全部整合到一起使用
  try:
      name
  except Exception as e:
      print(e)
  else:
      print('沒報錯執行')
  finally:
      print('不管報錯與否,正常執行')
    
4.斷言(瞭解中的瞭解)
	name = 'eason'
	assert isinstance(name,str)
 
5.主動報錯(需要掌握)
	raise NameError('錯誤')
  '''由於是主動報錯 所以可以非常明確的知道錯誤的型別'''

for迴圈的本質

利用while迴圈取值完後,利用異常處理措施,完成完整的for迴圈的功能

# 1.先轉換成迭代器物件
# res  = info.__iter__()
res = iter(info)
# 2.迭代取值
while True:
    # print(res.__next__())
    try:
        print(next(res))
    except StopIteration as e:
        # 結束while迴圈
        break

迭代取值與索引取值的對比

索引取值

​ 優勢:可以反覆獲取相同元素,沒有固定方向

​ 劣勢:只支援有序的容器,無序不行(字典等)

迭代取值

​ 優勢:容易資料型別都可以使用

​ 劣勢:取值順序擁有是從左往右,並且無法重複獲取資料,獲取一個少一個

for迴圈還是比底層迭代取值更加好用

今日小結

聰明分兩種,學得快和記得多。不將學的快的知識記住,往往是記得多的後來居上。