1. 程式人生 > 其它 >今日學習內容總結1.6

今日學習內容總結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.迭代取值:優勢:相容所有的容器型別。劣勢,取值的順序永遠都是從左往右,並且無法重複獲取,去完就完了。