一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 詳解Python的函數與異常

詳解Python的函數與異常

2022-03-10 00:26盼小輝丶 Python

這篇文章主要為大家介紹了Python的函數與異常,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1. 函數

抽象是程序能夠被人理解的關鍵所在。程序應非常抽象,如獲取用戶輸入構造列表,查找列表中最大的值,并進行打印:

list_a = get_input()
max_value = max(list_a)
print(max_value)

看到這些代碼,可以很容易這個程序是做什么的,至于這些操作的具體細節,將在獨立的函數中給出。

雖然我們并沒有具體講解過函數定義,但是我們已經使用過Python 的內置函數 print,input 等。函數可用于減少代碼重復,并使程序更易于理解和維護。可以將函數理解為一個“子程序”:函數本質上是一個命名語句序列,可以通過引用函數名稱,在程序中的任何位置執行這些指令。創建函數的代碼稱為“函數定義”,當函數在程序中使用時,稱為函數被“調用”。

1.1 自定義函數

通過定義函數可以隱藏計算細節,函數定義需要一個函數名、一系列參數(也可以不使用參數)以及一個函數體,函數也可以顯式地返回一個值,函數定義的一般形式如下所示:

def name_of_function(paramters):
  body_of_function

例如編寫一個求圓面積的函數:

def area_of_circle(radius):
  area = 3.14 * radius ** 2
  return area

在這個函數定義中,def 是告訴 Python 要定義一個函數,函數名(這里為 area_of_circle )用于函數后續的調用,函數名后的括號里是函數的形式參數列表。在這個函數中,radius 是唯一的形式參數,函數體可以是任何一段 Python 代碼,return 語句用于調用函數時返回一個值,只能用于函數體中,執行 return 語句會結束對函數的調用。如果要調用 area_of_circle 函數,需要為其提供一個實際參數值,函數調用是一個表達式,表達式的值就是調用函數返回的值:

>>> area_of_circle(10)
314.0
>>> area = area_of_circle(10)
>>> print(area)
314.0

函數被調用時,將執行以下過程:

1.調用程序在函數調用點暫停執行

2.函數形參獲得實參提供的值

3.執行函數體中的代碼,直至遇到 return 語句,return 后面的表達式的值作為函數調用的值;或者直到函數體中沒有語句可以繼續執行,這時函數返回的值為 None;

4.如果 return 后面沒有表達式,返回的值也為 None返回到函數被調用的點執行之后的代碼

詳解Python的函數與異常

我們已經知道,函數也可以不包含參數或返回值,例如以下簡單的函數示例:

def hello_world():
  for i in range(3):
      print('Hello World!')

調用此函數,將打印三行 ‘Hello World!',且函數的返回值為 None:

>>> value = hello_world()
Hello World!
Hello World!
Hello World!
>>> print(value)
None

1.2 函數與參數

編寫函數時,常常需要多個參數,那么不同參數是如何賦值的呢?在 Python 中,有兩種方法可以將形參綁定到實參。最常用的方法是使用位置參數,即第一個形參綁定到第一個實參,第二個形參綁定到第二個實參,以此類推;第二種方法是關鍵字參數,即形參根據名稱綁定到實參:

def inforname(name, sex, address):
  print("My name is {}, my gender is {}, and my home address is {}.".format(name, sex, address))

以下幾種函數調用方式是等價的,其中第一種方式為位置參數,其他方法為關鍵字參數

inforname('panxiaohui', 'male', 'henan')
inforname('panxiaohui', address = 'henan', sex = 'male')
inforname('panxiaohui', 'male', address = 'henan')
inforname(address = 'henan', sex = 'male', name = 'panxiaohui')

關鍵字參數可以放在位置參數后,但位置參數不能放在關鍵字參數后:

>>> inforname('panxiaohui', sex = 'male', 'henan')
File "<stdin>", line 1
  inforname('panxiaohui', sex = 'male', 'henan')
                                               ^
SyntaxError: positional argument follows keyword argument

前面我們在介紹 print 函數時,提到過可以使用可選參數 end 來改變 print 函數默認換行的行為,可選參數是帶有默認值的參數,通常和關鍵字參數結合使用,在函數調用時可以不為其賦值(此時將使用默認值),而不帶有默認值的參數,在函數調用時則必須為其指定參數值。

首先編寫以下函數:

def special_number(start, end, step=1):
  list_value = []
  for i in range(start, end, step):
      list_value.append(i)
  return list_value

執行函數調用:

>>> special_number(2,10)
[2, 3, 4, 5, 6, 7, 8, 9]
>>> special_number(2,10, step=2)
[2, 4, 6, 8]
>>> special_number(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: special_number() missing 1 required positional argument: 'end'

1.3 函數與返回值

返回值是從函數發送信息到調用函數的程序部分的主要方式,函數還可以通過更改函數參數來與調用程序通信,這需要理解函數調用中使用的實參和形參之間的關系。

在函數中,盡管實參和形參的名稱是一樣的,但它們并不是同一個變量。每個函數都定義了一個命名空間,也稱為作用域,每次函數調用都將創建一個新的作用域:

def exponentiation(number, power):
  power = power * 2
  result = number ** power
  number = result
def test_exponentiation():
  n = 2
  power = 5
  exponentiation(n, power)
  print(n, power)

調用函數,可以直觀的看出作用域的含義:

>>> test_exponentiation()
2 5

在函數內使用的變量稱為局部變量(與之相對的是全局變量)。test_exponentiation() 函數的前兩行創建了名為 original 和 power 的兩個局部變量,它們的值分別為 2 和 5。 然后調用了 exponentiation() 函數。形參 number 和 power 被賦值為來自實參 original 和 power 的值。需要牢記一點,即使實參和形參的名稱都為 power,它們也是兩個獨立的變量,參數的賦值使 test_exponentiation() 函數中的變量 original 和 power 引用了實參的“值”:

詳解Python的函數與異常

執行 exponentiation() 首先為其局部變量 power 賦一個新值,并創建一個新變量 result。然后,exponentiation() 為 number 賦值,讓它具有與 result 相同的值。雖然,現在 number 與 result 指向相同的值、并且修改了 exponentiation()函數中 power 變量,但這對 test_exponentiation() 函數中的變量 original 和 power 沒有影響:

詳解Python的函數與異常

exponentiation() 執行完成后,控制返回到 test_exponentiation(),exponentiation() 中的局部變量被回收,test_exponentiation() 函數中的 original 和 power 仍分別指初始值。

綜上,Python 中函數的形參只接收實參的“值”,函數不能訪問保存實參的變量。因此,為形參分配新值對實參變量沒有影響,這是由于 Python “按值”傳遞所有參數。一些編程語言(如 C++ )允許變量本身作為參數傳遞給函數,這種機制稱為“按引用”傳遞參數。當變量按引用傳遞時,向形參分配新值實際上會更改調用程序中的參數變量的值。

由于 Python 不允許按引用傳遞參數,因此需要使用 return 語句返回修改后的值:

def exponentiation(number, power):
  power = power * 2
  result = number ** power
  number = result
  return number, power
def test_exponentiation():
  original = 2
  power = 5
  original, power = exponentiation(original, power)
  print(original, power)

執行函數,查看輸出:

>>> test_exponentiation()
1024 10

 

2. 異常處理

程序編寫過程中,有兩種常見的錯誤:第一種時語法錯誤,例如編寫程序時縮進出現問題、第二種問題是算法的邏輯錯誤,例如訪問不存在的變量、列表越界訪問等。后者通常稱為異常,為了處理這種情況,Python 提供了異常處理機制:

>>> x = []
>>> x[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

在 Python 中,異常狀態使用異常對象來表示,在遇到錯誤時引發異常。如果未處理異常對象,程序將會終止并顯示錯誤消息 (Traceback)。每種異常也都是不同異常類的實例(上一示例中異常是類 IndexError 的實例),可以使用不同方式引發并捕獲這些實例,而不至于導致整個程序運行失敗。

2.1 raise 語句

可以使用 raise 語句來引發異常,并將類或實例作為參數。將類作為參數時,將自動創建一個實例,同時也可以添加錯誤消息提示:

>>> raise OSError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError
>>> raise OSError("can't open this file")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: can't open this file

2.2 異常捕獲

當程序發生異常時,也稱程序“拋出”異常。對異常進行處理,通常稱為異常捕獲。為此,可使用 try/except 語句。例如,進行除法運算時,如果用戶輸入了一個非零的除數,那么運算結果就會被打印出來。但是,如果用戶輸入了一個零作為除數,那么就會引發 ZeroDivisionError 異常:

>>> number_a = float(input('Please enter a number: '))
Please enter a number: 10.2
>>> number_b = float(input('Please enter another number: '))
Please enter another number: 0
>>> print(number_a / number_b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero

使用 except 語句塊則可以“捕捉”這個異常,并且打印提示消息,然后通過對除數加一個很小的值確保其不為零,這意味著程序并不會終止,而是繼續執行后續語句:

>>> try:
...     print(number_a / number_b)
... except:
...     print('Divisor cannot be zero!')
...     print('Add a small number to the divisor.')
...     print(number_a / (number_b + 1e-8))
Divisor cannot be zero
Add a small number to the divisor
1019999999.9999999

如果需要捕獲多個異常,可以使用多個 except 子句,或者在一個元組中指定這些異常:

# 使用多個 except 子句
try:
  number_a = input('Please enter a number:')
  number_b = input('Please enter another number:')
  print(float(number_a) / float(number_b))
except TypeError:
  print("That wasn't a number!")
except ZeroDivisionError:
  print('Divisor cannot be zero!')
# 使用元組指定異常
try:
  number_a = input('Please enter a number:')
  number_b = input('Please enter another number:')
  print(float(number_a) / float(number_b))
except (ZeroDivisionError, TypeError):
  print("You entered the wrong number!")

try/except 語句還有一個可選的 else 子句,如果使用這個子句,那么必須放在所有的 except 子句之后,else 子句在 try 子句沒有發生任何異常時執行,例如在 try 語句中執行除法運算,如果正確運算沒有發生異常,則執行 else 部分,打印結果:

try:
  number_a = input('Please enter a number:')
  number_b = input('Please enter another number:')
  result = float(number_a) / float(number_b)
except (ZeroDivisionError, TypeError):
  print("You entered the wrong number!")
else:
  print(result)

不把所有語句都放在 try 子句,而使用 else 子句,可以避免一些意料之外,而 except 又無法捕獲的異常。

2.3 finally 子句

finally 子句可以與 try 語句配套使用,可以在發生異常時執行清理工作,不管 try 子句中是否發生異常,都將執行 finally 子句:

result = None
try:
  number_a = input('Please enter a number:')
  number_b = input('Please enter another number:')
  result = float(number_a) / float(number_b)
except (ZeroDivisionError, TypeError):
  print("You entered the wrong number!")
else:
  print(result)
finally:
  del result

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/LOVEmy134611/article/details/121602192

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日日操日日舔 | 欧美午夜精品 | 国产精品久热 | 91小视频在线观看免费版高清 | 蜜桃视频在线观看www | 视频免费视频观看网站 | 粉嫩极品国产在线观看免费 | 亚洲精品久久玖玖玖玖 | 国产在线观看a | chinese高中生gay男同 | 九九在线精品视频 | 国产特黄一级一片免费 | 哇嘎在线精品视频在线观看 | 91制片厂果冻星空传媒3xg | 欧美xingai | 成年人网站免费在线观看 | 亚洲热在线视频 | 成年人在线视频观看 | 欧美特黄aaaaaa | 国产拍拍 | 天天操网 | 99人中文字幕亚洲区 | 四虎影视网站 | 亚洲精品无码不卡 | ange venus与黑人 | 清纯漂亮女友初尝性过程 | 女女性恋爱视频入口 | 狠狠五月天中文字幕 | 日韩免费在线观看 | 国产99久久精品一区二区 | 日韩精选在线 | 男gay网站视频免费观看 | 国产亚洲精品福利在线 | 青青色在线 | 俄罗斯一级在线播放 | 777午夜精品免费播放 | 日本高清色视频www 日本高清免费观看 | 亚洲视频男人的天堂 | 精品国产品香蕉在线观看 | 高清在线一区二区 | 国产成人精选免费视频 |