最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

5.2 定義函數(shù)

2021-08-24 16:37 作者:海鷗之道  | 我要投稿

在Python中,定義一個(gè)函數(shù)要使用def語句,依次寫出函數(shù)名、括號(hào)、括號(hào)中的參數(shù)和冒號(hào):,然后,在縮進(jìn)塊中編寫函數(shù)體,函數(shù)的返回值用return語句返回。

我們以自定義一個(gè)求絕對(duì)值的my_abs函數(shù)為例:

def my_abs(x):

? ? if x >= 0:

? ? ? ? return x

? ? else:

? ? ? ? return -x

print(my_abs(-99))

請(qǐng)自行測(cè)試并調(diào)用my_abs看看返回結(jié)果是否正確。

請(qǐng)注意,函數(shù)體內(nèi)部的語句在執(zhí)行時(shí),一旦執(zhí)行到return時(shí),函數(shù)就執(zhí)行完畢,并將結(jié)果返回。因此,函數(shù)內(nèi)部通過條件判斷和循環(huán)可以實(shí)現(xiàn)非常復(fù)雜的邏輯。

如果沒有return語句,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果,只是結(jié)果為None。return None可以簡(jiǎn)寫為return。

在Python交互環(huán)境中定義函數(shù)時(shí),注意Python會(huì)出現(xiàn)...的提示。函數(shù)定義結(jié)束后需要按兩次回車重新回到>>>提示符下:


如果你已經(jīng)把my_abs()的函數(shù)定義保存為abstest.py文件了,那么,可以在該文件的當(dāng)前目錄下啟動(dòng)Python解釋器,用from abstest import my_abs來導(dǎo)入my_abs()函數(shù),注意abstest是文件名(不含.py擴(kuò)展名):

import的用法在后續(xù)模塊一節(jié)中會(huì)詳細(xì)介紹。

空函數(shù)

如果想定義一個(gè)什么事也不做的空函數(shù),可以用pass語句:

def nop():

? ?pass

pass語句什么都不做,那有什么用?實(shí)際上pass可以用來作為占位符,比如現(xiàn)在還沒想好怎么寫函數(shù)的代碼,就可以先放一個(gè)pass,讓代碼能運(yùn)行起來。

pass還可以用在其他語句里,比如:

if age >= 18:

? ?pass

缺少了pass,代碼運(yùn)行就會(huì)有語法錯(cuò)誤。

參數(shù)檢查

調(diào)用函數(shù)時(shí),如果參數(shù)個(gè)數(shù)不對(duì),Python解釋器會(huì)自動(dòng)檢查出來,并拋出TypeError

>>> my_abs(1, 2)?

Traceback (most recent call last): ?File "<stdin>", line 1, in <module>

TypeError: my_abs() takes 1 positional argument but 2 were given

但是如果參數(shù)類型不對(duì),Python解釋器就無法幫我們檢查。試試my_abs和內(nèi)置函數(shù)abs的差別:

>>> my_abs('A')?

Traceback (most recent call last): ?File "<stdin>", line 1, in <module> ?File "<stdin>", line 2, in my_abs?

TypeError: unorderable types: str() >= int()?

>>> abs('A')?

Traceback (most recent call last): ?File "<stdin>", line 1, in <module>

TypeError: bad operand type for abs(): 'str'

當(dāng)傳入了不恰當(dāng)?shù)膮?shù)時(shí),內(nèi)置函數(shù)abs會(huì)檢查出參數(shù)錯(cuò)誤,而我們定義的my_abs沒有參數(shù)檢查,會(huì)導(dǎo)致if語句出錯(cuò),出錯(cuò)信息和abs不一樣。所以,這個(gè)函數(shù)定義不夠完善。

讓我們修改一下my_abs的定義,對(duì)參數(shù)類型做檢查,只允許整數(shù)和浮點(diǎn)數(shù)類型的參數(shù)。數(shù)據(jù)類型檢查可以用內(nèi)置函數(shù)isinstance()實(shí)現(xiàn):

def my_abs(x):

? ?if not isinstance(x, (int, float)):

? ? ? ?raise TypeError('bad operand type')

? ?if x >= 0:

? ? ? ?return x

? ?else:

?? ? ? return -x

添加了參數(shù)檢查后,如果傳入錯(cuò)誤的參數(shù)類型,函數(shù)就可以拋出一個(gè)錯(cuò)誤:

>>> my_abs('A') Traceback (most recent call last): ?File "<stdin>", line 1, in <module> ?File "<stdin>", line 3, in my_abs?

TypeError: bad operand type

錯(cuò)誤和異常處理將在后續(xù)講到。

返回多個(gè)值

函數(shù)可以返回多個(gè)值嗎?答案是肯定的。

比如在游戲中經(jīng)常需要從一個(gè)點(diǎn)移動(dòng)到另一個(gè)點(diǎn),給出坐標(biāo)、位移和角度,就可以計(jì)算出新的坐標(biāo):

import mathdef move(x, y, step, angle=0):

? ?nx = x + step * math.cos(angle)

? ?ny = y - step * math.sin(angle)

? ?return nx, ny

import math語句表示導(dǎo)入math包,并允許后續(xù)代碼引用math包里的sin、cos等函數(shù)。

然后,我們就可以同時(shí)獲得返回值:

>>> x, y = move(100, 100, 60, math.pi / 6)

>>> print(x, y)151.96152422706632 70.0

但其實(shí)這只是一種假象,Python函數(shù)返回的仍然是單一值:

>>> r = move(100, 100, 60, math.pi / 6)

>>> print(r) (151.96152422706632, 70.0)

原來返回值是一個(gè)tuple!但是,在語法上,返回一個(gè)tuple可以省略括號(hào),而多個(gè)變量可以同時(shí)接收一個(gè)tuple,按位置賦給對(duì)應(yīng)的值,所以,Python的函數(shù)返回多值其實(shí)就是返回一個(gè)tuple,但寫起來更方便。

小結(jié)

定義函數(shù)時(shí),需要確定函數(shù)名和參數(shù)個(gè)數(shù);

如果有必要,可以先對(duì)參數(shù)的數(shù)據(jù)類型做檢查;

函數(shù)體內(nèi)部可以用return隨時(shí)返回函數(shù)結(jié)果;

函數(shù)執(zhí)行完畢也沒有return語句時(shí),自動(dòng)return None。

函數(shù)可以同時(shí)返回多個(gè)值,但其實(shí)就是一個(gè)tuple。


5.2 定義函數(shù)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
许昌市| 乌兰浩特市| 鹤岗市| 惠安县| 沈阳市| 镇江市| 新余市| 灵石县| 东城区| 丽水市| 佳木斯市| 乌海市| 兴国县| 苏尼特左旗| 扶风县| 麟游县| 祁门县| 裕民县| 澄城县| 贺兰县| 阿拉尔市| 兰溪市| 上高县| 绥德县| 成都市| 金山区| 临沧市| 红安县| 定安县| 贡嘎县| 绥化市| 西藏| 新津县| 康定县| 云霄县| 兖州市| 舟山市| 屏山县| 武陟县| 富川| 察雅县|