Python的函數(shù)參數(shù)總結(jié)

import math

a = abs
print(a(-1))
n1 = 255
print(str(hex(n1)))

def my_abs(x):
# 增加了參數(shù)的檢查
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x

print(my_abs(-3))

print(my_abs('0'))

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

def nop():
pass

if n1 >= 255:
pass

返回多個值

def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny

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

原來返回值是一個tuple,在語法上,返回一個tuple可以省略括號

tup = move(100, 100, 60, math.pi / 6)
print(tup)
print(isinstance(tup, tuple))

請定義一個函數(shù)quadratic(a, b, c)造垛,接收3個參數(shù)瓤帚,返回一元二次方程:

ax2 + bx + c = 0的兩個解。

def quadratic(a, b, c):
k = b * b - 4 * a * c
# print(k)
# print(math.sqrt(k))
if k < 0:
print('This is no result!')
return None
elif k == 0:
x1 = -(b / 2 * a)
x2 = x1
return x1, x2
else:
x1 = (-b + math.sqrt(k)) / (2 * a)
x2 = (-b - math.sqrt(k)) / (2 * a)
return x1, x2

print(quadratic(2, 3, 1))

默認參數(shù)仿粹。由于我們經(jīng)常計算x2瘟檩,所以俐填,完全可以把第二個參數(shù)n的默認值設(shè)定為2:

def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s

print(power(2))
print(power(2, 3))

一是必選參數(shù)在前终佛,默認參數(shù)在后俊嗽,否則Python的解釋器會報錯

有多個默認參數(shù)時,調(diào)用的時候铃彰,既可以按順序提供默認參數(shù)绍豁,

比如調(diào)用enroll('Bob', 'M', 7),意思是牙捉,除了name竹揍,gender這兩個參數(shù)外敬飒,

最后1個參數(shù)應(yīng)用在參數(shù)age上,city參數(shù)由于沒有提供芬位,仍然使用默認值无拗。

也可以不按順序提供部分默認參數(shù)。當(dāng)不按順序提供部分默認參數(shù)時昧碉,需要把參數(shù)名寫上蓝纲。

比如調(diào)用enroll('Adam', 'M', city='Tianjin'),意思是晌纫,city參數(shù)用傳進去的值,

其他默認參數(shù)繼續(xù)使用默認值永丝。

def enroll(name, gender, age=8, city='BeiJing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)

enroll('elder', 'F')
enroll('android', 'B', 9)
enroll('pythone', '6', city='AnShan')

def add_end(L=[]):
L.append('end')
return L

print(add_end())
print(add_end())
print(add_end())

因為默認參數(shù)L是可變參數(shù)所以在調(diào)用函數(shù)時每次都會先初始化L,

所以默認參數(shù)必須指向不變對象锹漱!

def add_end_none(L=None):
if L is None:
L = []
L.append('END')
return L

print(add_end_none())
print(add_end_none())
print(add_end_none())

可變參數(shù)

關(guān)鍵字 *參數(shù)名 即為可變參數(shù)

def calc(*nums):
sum = 0
for n in nums:
sum = sum + n * n
return sum

print(calc(1, 2, 3))
print(calc())

*nums表示把nums這個list的所有元素作為可變參數(shù)傳進去。這種寫法相當(dāng)有用慕嚷,而且很常見哥牍。

l = [1, 2, 3, 4]
print(calc(*l))

關(guān)鍵字參數(shù)

def foo(x, y):
print('x is %s' % x)
print('y is %s' % y)

foo(1, 2)

關(guān)鍵字參數(shù)的調(diào)用

foo(y=1, x=2)

關(guān)鍵字可變長參數(shù)(字典):“關(guān)鍵字”“可變長”顧名思義是允許在調(diào)用時傳入多個“關(guān)鍵字”參數(shù),

python會將這些多出來的<參數(shù)名, 參數(shù)值>放入一個字典中喝检。

需要注意的是嗅辣,關(guān)鍵字變量參數(shù)應(yīng)該為函數(shù)定義的最后一個參數(shù),帶**挠说。例:

def person(name, age, **kv):
print('name:', name, 'age:', age, 'other:', kv)

person('Elder', '8')
person('Android', '9', city='BeiJing', Edu='人民大學(xué)')

extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)

如果要限制關(guān)鍵字參數(shù)的名字澡谭,就可以用命名關(guān)鍵字參數(shù),

例如损俭,只接收city和job作為關(guān)鍵字參數(shù)蛙奖。這種方式定義的函數(shù)如下:

和關(guān)鍵字參數(shù)kw不同,命名關(guān)鍵字參數(shù)需要一個特殊分隔符杆兵,后面的參數(shù)被視為命名關(guān)鍵字參數(shù)雁仲。

def person2(name, age, *, city, job):
print(name, age, city, job)

person2('Pthon', 8, city='BeiJing', job='Android Engineer')

person2('Test',0) TypeError: person2() missing 2 required keyword-only

arguments: 'city' and 'job'

如果函數(shù)定義中已經(jīng)有了一個可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個特殊分隔符*了:

def person3(name, age, *other, city='BeiJing', job='Android Engineer'):
print(name, age, other, city, job)

person3('Php', 18, 'test', 1, 2, 3)
person3('Php2', 28, 'test', 1, 2, 3, city='ShangHai', job='Pyhton Engineer')

參數(shù)組合

在Python中定義函數(shù)琐脏,可以用必選參數(shù)攒砖、默認參數(shù)、可變參數(shù)日裙、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)吹艇,

這5種參數(shù)都可以組合使用。但是請注意阅签,

參數(shù)定義的順序必須是:必選參數(shù)掐暮、默認參數(shù)、可變參數(shù)政钟、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)路克。

def test2(a, b, c=0, *args, key=None, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'key=', key, 'kw =', kw)

test2(1, 2, 3, 'a', 'b', 'c', key='key', other='extra')

args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}

對于任意函數(shù)樟结,都可以通過類似func(*args, **kw)的形式調(diào)用它,無論它的參數(shù)是如何定義的精算。

test2(*args, **kw)

Python的函數(shù)具有非常靈活的參數(shù)形態(tài)瓢宦,既可以實現(xiàn)簡單的調(diào)用,又可以傳入非常復(fù)雜的參數(shù)灰羽。

默認參數(shù)一定要用不可變對象驮履,如果是可變對象,程序運行時會有邏輯錯誤廉嚼!

要注意定義可變參數(shù)和關(guān)鍵字參數(shù)的語法:

*args是可變參數(shù)玫镐,args接收的是一個tuple;

**kw是關(guān)鍵字參數(shù)怠噪,kw接收的是一個dict恐似。

以及調(diào)用函數(shù)時如何傳入可變參數(shù)和關(guān)鍵字參數(shù)的語法:

可變參數(shù)既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple傍念,

再通過args傳入:func((1, 2, 3))矫夷;

關(guān)鍵字參數(shù)既可以直接傳入:func(a=1, b=2),又可以先組裝dict憋槐,

再通過kw傳入:func({'a': 1, 'b': 2})双藕。

使用args和*kw是Python的習(xí)慣寫法,當(dāng)然也可以用其他參數(shù)名阳仔,但最好使用習(xí)慣用法忧陪。

命名的關(guān)鍵字參數(shù)是為了限制調(diào)用者可以傳入的參數(shù)名,同時可以提供默認值近范。

定義命名的關(guān)鍵字參數(shù)在沒有可變參數(shù)的情況下不要忘了寫分隔符*赤嚼,否則定義的將是位置參數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顺又,一起剝皮案震驚了整個濱河市更卒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稚照,老刑警劉巖蹂空,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異果录,居然都是意外死亡上枕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門弱恒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辨萍,“玉大人,你說我怎么就攤上這事⌒庥瘢” “怎么了爪飘?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拉背。 經(jīng)常有香客問我师崎,道長,這世上最難降的妖魔是什么椅棺? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任犁罩,我火速辦了婚禮,結(jié)果婚禮上两疚,老公的妹妹穿的比我還像新娘床估。我一直安慰自己,他們只是感情好诱渤,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布顷窒。 她就那樣靜靜地躺著,像睡著了一般源哩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸦做,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天励烦,我揣著相機與錄音,去河邊找鬼泼诱。 笑死坛掠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的治筒。 我是一名探鬼主播屉栓,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耸袜!你這毒婦竟也來了友多?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤堤框,失蹤者是張志新(化名)和其女友劉穎域滥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜈抓,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡启绰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沟使。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片委可。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腊嗡,靈堂內(nèi)的尸體忽然破棺而出着倾,到底是詐尸還是另有隱情拾酝,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布屈呕,位于F島的核電站微宝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虎眨。R本人自食惡果不足惜蟋软,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗽桩。 院中可真熱鬧岳守,春花似錦、人聲如沸碌冶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扑庞。三九已至譬重,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罐氨,已是汗流浹背臀规。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栅隐,地道東北人塔嬉。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像租悄,于是被迫代替她去往敵國和親谨究。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Python 是一種相當(dāng)高級的語言泣棋,通過 Python 解釋器把符合語法的程序代碼轉(zhuǎn)換成 CPU 能夠執(zhí)行的機器碼...
    Python程序媛閱讀 1,911評論 0 3
  • 基礎(chǔ)1.r''表示''內(nèi)部的字符串默認不轉(zhuǎn)義2.'''...'''表示多行內(nèi)容3. 布爾值:True胶哲、False(...
    neo已經(jīng)被使用閱讀 1,689評論 0 5
  • Python Learning 2017-6-15 函數(shù)的參數(shù) 位置參數(shù) 調(diào)用函數(shù)時,參數(shù)有且只有一個潭辈。 默認參數(shù)...
    Babelbuilder閱讀 763評論 0 0
  • 位置參數(shù) power(x, n)函數(shù)有兩個參數(shù):x和n纪吮,這兩個參數(shù)都是位置參數(shù),調(diào)用函數(shù)時萎胰,傳入的兩個值按照位置順...
    牛崽兒酷閱讀 230評論 0 0
  • 人生最重要也在最基礎(chǔ)的能力是——學(xué)習(xí)能力碾盟。 與學(xué)習(xí)能力相關(guān)的概念有: 元認知能力是每一個人提升認知必須要啟動的一個...
    輝高閱讀 933評論 0 5