激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

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

服務(wù)器之家 - 腳本之家 - Python - 詳解Python的函數(shù)與異常

詳解Python的函數(shù)與異常

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

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

1. 函數(shù)

抽象是程序能夠被人理解的關(guān)鍵所在。程序應(yīng)非常抽象,如獲取用戶輸入構(gòu)造列表,查找列表中最大的值,并進(jìn)行打印:

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

看到這些代碼,可以很容易這個(gè)程序是做什么的,至于這些操作的具體細(xì)節(jié),將在獨(dú)立的函數(shù)中給出。

雖然我們并沒(méi)有具體講解過(guò)函數(shù)定義,但是我們已經(jīng)使用過(guò)Python 的內(nèi)置函數(shù) print,input 等。函數(shù)可用于減少代碼重復(fù),并使程序更易于理解和維護(hù)。可以將函數(shù)理解為一個(gè)“子程序”:函數(shù)本質(zhì)上是一個(gè)命名語(yǔ)句序列,可以通過(guò)引用函數(shù)名稱,在程序中的任何位置執(zhí)行這些指令。創(chuàng)建函數(shù)的代碼稱為“函數(shù)定義”,當(dāng)函數(shù)在程序中使用時(shí),稱為函數(shù)被“調(diào)用”。

1.1 自定義函數(shù)

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

def name_of_function(paramters):
  body_of_function

例如編寫一個(gè)求圓面積的函數(shù):

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

在這個(gè)函數(shù)定義中,def 是告訴 Python 要定義一個(gè)函數(shù),函數(shù)名(這里為 area_of_circle )用于函數(shù)后續(xù)的調(diào)用,函數(shù)名后的括號(hào)里是函數(shù)的形式參數(shù)列表。在這個(gè)函數(shù)中,radius 是唯一的形式參數(shù),函數(shù)體可以是任何一段 Python 代碼,return 語(yǔ)句用于調(diào)用函數(shù)時(shí)返回一個(gè)值,只能用于函數(shù)體中,執(zhí)行 return 語(yǔ)句會(huì)結(jié)束對(duì)函數(shù)的調(diào)用。如果要調(diào)用 area_of_circle 函數(shù),需要為其提供一個(gè)實(shí)際參數(shù)值,函數(shù)調(diào)用是一個(gè)表達(dá)式,表達(dá)式的值就是調(diào)用函數(shù)返回的值:

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

函數(shù)被調(diào)用時(shí),將執(zhí)行以下過(guò)程:

1.調(diào)用程序在函數(shù)調(diào)用點(diǎn)暫停執(zhí)行

2.函數(shù)形參獲得實(shí)參提供的值

3.執(zhí)行函數(shù)體中的代碼,直至遇到 return 語(yǔ)句,return 后面的表達(dá)式的值作為函數(shù)調(diào)用的值;或者直到函數(shù)體中沒(méi)有語(yǔ)句可以繼續(xù)執(zhí)行,這時(shí)函數(shù)返回的值為 None;

4.如果 return 后面沒(méi)有表達(dá)式,返回的值也為 None返回到函數(shù)被調(diào)用的點(diǎn)執(zhí)行之后的代碼

詳解Python的函數(shù)與異常

我們已經(jīng)知道,函數(shù)也可以不包含參數(shù)或返回值,例如以下簡(jiǎn)單的函數(shù)示例:

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

調(diào)用此函數(shù),將打印三行 ‘Hello World!',且函數(shù)的返回值為 None:

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

1.2 函數(shù)與參數(shù)

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

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

以下幾種函數(shù)調(diào)用方式是等價(jià)的,其中第一種方式為位置參數(shù),其他方法為關(guān)鍵字參數(shù)

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

關(guān)鍵字參數(shù)可以放在位置參數(shù)后,但位置參數(shù)不能放在關(guān)鍵字參數(shù)后:

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

前面我們?cè)诮榻B print 函數(shù)時(shí),提到過(guò)可以使用可選參數(shù) end 來(lái)改變 print 函數(shù)默認(rèn)換行的行為,可選參數(shù)是帶有默認(rèn)值的參數(shù),通常和關(guān)鍵字參數(shù)結(jié)合使用,在函數(shù)調(diào)用時(shí)可以不為其賦值(此時(shí)將使用默認(rèn)值),而不帶有默認(rèn)值的參數(shù),在函數(shù)調(diào)用時(shí)則必須為其指定參數(shù)值。

首先編寫以下函數(shù):

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

執(zhí)行函數(shù)調(diào)用:

>>> 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 函數(shù)與返回值

返回值是從函數(shù)發(fā)送信息到調(diào)用函數(shù)的程序部分的主要方式,函數(shù)還可以通過(guò)更改函數(shù)參數(shù)來(lái)與調(diào)用程序通信,這需要理解函數(shù)調(diào)用中使用的實(shí)參和形參之間的關(guān)系。

在函數(shù)中,盡管實(shí)參和形參的名稱是一樣的,但它們并不是同一個(gè)變量。每個(gè)函數(shù)都定義了一個(gè)命名空間,也稱為作用域,每次函數(shù)調(diào)用都將創(chuàng)建一個(gè)新的作用域:

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)

調(diào)用函數(shù),可以直觀的看出作用域的含義:

>>> test_exponentiation()
2 5

在函數(shù)內(nèi)使用的變量稱為局部變量(與之相對(duì)的是全局變量)。test_exponentiation() 函數(shù)的前兩行創(chuàng)建了名為 original 和 power 的兩個(gè)局部變量,它們的值分別為 2 和 5。 然后調(diào)用了 exponentiation() 函數(shù)。形參 number 和 power 被賦值為來(lái)自實(shí)參 original 和 power 的值。需要牢記一點(diǎn),即使實(shí)參和形參的名稱都為 power,它們也是兩個(gè)獨(dú)立的變量,參數(shù)的賦值使 test_exponentiation() 函數(shù)中的變量 original 和 power 引用了實(shí)參的“值”:

詳解Python的函數(shù)與異常

執(zhí)行 exponentiation() 首先為其局部變量 power 賦一個(gè)新值,并創(chuàng)建一個(gè)新變量 result。然后,exponentiation() 為 number 賦值,讓它具有與 result 相同的值。雖然,現(xiàn)在 number 與 result 指向相同的值、并且修改了 exponentiation()函數(shù)中 power 變量,但這對(duì) test_exponentiation() 函數(shù)中的變量 original 和 power 沒(méi)有影響:

詳解Python的函數(shù)與異常

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

綜上,Python 中函數(shù)的形參只接收實(shí)參的“值”,函數(shù)不能訪問(wèn)保存實(shí)參的變量。因此,為形參分配新值對(duì)實(shí)參變量沒(méi)有影響,這是由于 Python “按值”傳遞所有參數(shù)。一些編程語(yǔ)言(如 C++ )允許變量本身作為參數(shù)傳遞給函數(shù),這種機(jī)制稱為“按引用”傳遞參數(shù)。當(dāng)變量按引用傳遞時(shí),向形參分配新值實(shí)際上會(huì)更改調(diào)用程序中的參數(shù)變量的值。

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

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)

執(zhí)行函數(shù),查看輸出:

>>> test_exponentiation()
1024 10

 

2. 異常處理

程序編寫過(guò)程中,有兩種常見的錯(cuò)誤:第一種時(shí)語(yǔ)法錯(cuò)誤,例如編寫程序時(shí)縮進(jìn)出現(xiàn)問(wèn)題、第二種問(wèn)題是算法的邏輯錯(cuò)誤,例如訪問(wèn)不存在的變量、列表越界訪問(wèn)等。后者通常稱為異常,為了處理這種情況,Python 提供了異常處理機(jī)制:

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

在 Python 中,異常狀態(tài)使用異常對(duì)象來(lái)表示,在遇到錯(cuò)誤時(shí)引發(fā)異常。如果未處理異常對(duì)象,程序?qū)?huì)終止并顯示錯(cuò)誤消息 (Traceback)。每種異常也都是不同異常類的實(shí)例(上一示例中異常是類 IndexError 的實(shí)例),可以使用不同方式引發(fā)并捕獲這些實(shí)例,而不至于導(dǎo)致整個(gè)程序運(yùn)行失敗。

2.1 raise 語(yǔ)句

可以使用 raise 語(yǔ)句來(lái)引發(fā)異常,并將類或?qū)嵗鳛閰?shù)。將類作為參數(shù)時(shí),將自動(dòng)創(chuàng)建一個(gè)實(shí)例,同時(shí)也可以添加錯(cuò)誤消息提示:

>>> 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 異常捕獲

當(dāng)程序發(fā)生異常時(shí),也稱程序“拋出”異常。對(duì)異常進(jìn)行處理,通常稱為異常捕獲。為此,可使用 try/except 語(yǔ)句。例如,進(jìn)行除法運(yùn)算時(shí),如果用戶輸入了一個(gè)非零的除數(shù),那么運(yùn)算結(jié)果就會(huì)被打印出來(lái)。但是,如果用戶輸入了一個(gè)零作為除數(shù),那么就會(huì)引發(fā) 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 語(yǔ)句塊則可以“捕捉”這個(gè)異常,并且打印提示消息,然后通過(guò)對(duì)除數(shù)加一個(gè)很小的值確保其不為零,這意味著程序并不會(huì)終止,而是繼續(xù)執(zhí)行后續(xù)語(yǔ)句:

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

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

# 使用多個(gè) 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 語(yǔ)句還有一個(gè)可選的 else 子句,如果使用這個(gè)子句,那么必須放在所有的 except 子句之后,else 子句在 try 子句沒(méi)有發(fā)生任何異常時(shí)執(zhí)行,例如在 try 語(yǔ)句中執(zhí)行除法運(yùn)算,如果正確運(yùn)算沒(méi)有發(fā)生異常,則執(zhí)行 else 部分,打印結(jié)果:

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)

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

2.3 finally 子句

finally 子句可以與 try 語(yǔ)句配套使用,可以在發(fā)生異常時(shí)執(zhí)行清理工作,不管 try 子句中是否發(fā)生異常,都將執(zhí)行 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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人免费毛片网站 | 久久久久国产一区二区三区不卡 | 国产欧美亚洲精品a | 日本高清电影在线播放 | 懂色粉嫩av久婷啪 | 欧美国产二区 | 精品国产视频一区二区三区 | 精品亚洲va在线va天堂资源站 | 日韩精品一区二区在线播放 | 日韩一级片毛片 | 国产亚洲欧美在线视频 | 久久草在线视频国产 | 欧美一区二区三区免费电影 | 羞羞视频免费入口网站 | 国产成年人小视频 | 7777奇米成人四色影视 | 精品国产欧美一区二区 | 婷婷久久青草热一区二区 | 成人羞羞在线观看网站 | 久久恋| h色视频在线观看 | 亚洲男人的天堂在线视频 | 欧产日产国产精品99 | 激情综合网俺也去 | 日韩区在线| 国产精品资源手机在线播放 | 日本欧美一区二区三区在线播 | 日韩视频在线一区二区三区 | 欧美高清在线精品一区二区不卡 | av影院在线 | 欧美性生交大片 | 国产精品一区二区三区99 | 国产亚洲精品久久久久5区 日韩一级片一区二区三区 国产精品久久久久av | 国产精品久久久久久238 | 视频在线色 | 伦理三区| 国产免费看片 | 九一成人 | 激情小说激情图片激情电影 | 日韩精品久久久久久久电影99爱 | 免费特黄 |