1. 程式人生 > 其它 >學習python,從入門到放棄(16)

學習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

異常處理

  • 簡介

    當我們程式碼執行出錯之後會報異常,異常會導致程式立刻停止。

  • 異常一般分為三個重要的部分

    1. line關鍵字所在的一行

      用於提示你程式碼哪一行出錯了。

    2. NameError 錯誤的型別

      告訴你錯誤的型別,可以分型別處理錯誤。

    3. 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 的方法。