2018-01-30Python二、函數(shù)筆記

!/usr/bin/env python3

-*- coding:utf-8 -*-

二、函數(shù)

1.調(diào)用函數(shù)

'''
print(abs(-2))
函數(shù)名其實(shí)就是指向一個(gè)函數(shù)對(duì)象的引用,完全可以把函數(shù)名賦給一個(gè)變量,相當(dāng)于給這個(gè)函數(shù)起了一個(gè)“別名”:

a = abs # 變量a指向abs函數(shù)
a(-1) # 所以也可以通過(guò)a調(diào)用abs函數(shù)

小結(jié)
調(diào)用Python的函數(shù),需要根據(jù)函數(shù)定義,傳入正確的參數(shù)。
如果函數(shù)調(diào)用出錯(cuò),一定要學(xué)會(huì)看錯(cuò)誤信息,所以英文很重要
'''

2.定義函數(shù)

2.1.定義

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

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

2.2.空函數(shù)

'''
如果想定義一個(gè)什么事也不做的空函數(shù),可以用pass語(yǔ)句:
def nop():
pass
pass語(yǔ)句什么都不做,那有什么用?實(shí)際上pass可以用來(lái)作為占位符,比如現(xiàn)在還沒(méi)想好怎么寫(xiě)函數(shù)的代碼,就可以先放一個(gè)pass,讓代碼能運(yùn)行起來(lái)。
pass還可以用在其他語(yǔ)句里,比如:
if age >= 18:
pass
缺少了pass,代碼運(yùn)行就會(huì)有語(yǔ)法錯(cuò)誤。
'''

2.3.參數(shù)檢查

'''
數(shù)據(jù)類(lèi)型檢查可以用內(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
'''

2.4.返回多個(gè)值

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

import math

def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
import math語(yǔ)句表示導(dǎo)入math包,并允許后續(xù)代碼引用math包里的sin、cos等函數(shù)。
'''
'''
import math
def move(x,y,step,angle=0):
nx=x+stepmath.cos(angle)
ny=y+step
math.sin(angle)
return nx,ny

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

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

小結(jié)
定義函數(shù)時(shí),需要確定函數(shù)名和參數(shù)個(gè)數(shù);
如果有必要,可以先對(duì)參數(shù)的數(shù)據(jù)類(lèi)型做檢查;
函數(shù)體內(nèi)部可以用return隨時(shí)返回函數(shù)結(jié)果;
函數(shù)執(zhí)行完畢也沒(méi)有return語(yǔ)句時(shí),自動(dòng)return None。
函數(shù)可以同時(shí)返回多個(gè)值,但其實(shí)就是一個(gè)tuple。
'''

3.函數(shù)的參數(shù)

3.1.位置參數(shù)

'''
我們先寫(xiě)一個(gè)計(jì)算x^2的函數(shù):
def power(x):
return x * x
對(duì)于power(x),參數(shù)x就是一個(gè)位置參數(shù)。
'''
'''
def power(x,n=2):
s=1
while n>0:
s=s*x
n=n-1
return s

rslt=power(5)
print(rslt)
'''

3.2.默認(rèn)參數(shù)

'''

定義默認(rèn)參數(shù)要牢記一點(diǎn):默認(rèn)參數(shù)必須指向不變對(duì)象!

'''

3.3.可變參數(shù)

'''

定義可變參數(shù)和定義一個(gè)list或tuple參數(shù)相比,僅僅在參數(shù)前面加了一個(gè)*號(hào)

def calc(*numbers):

'''

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

'''
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
person('Adam', 45, gender='M', job='Engineer')

結(jié)果為:

name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

和可變參數(shù)類(lèi)似,也可以先組裝出一個(gè)dict,然后,把該dict轉(zhuǎn)換為關(guān)鍵字參數(shù)傳進(jìn)去:

extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing'
'''

小結(jié)

'''
小結(jié)

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

默認(rèn)參數(shù)一定要用不可變對(duì)象,如果是可變對(duì)象,程序運(yùn)行時(shí)會(huì)有邏輯錯(cuò)誤!

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

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

**kw是關(guān)鍵字參數(shù),kw接收的是一個(gè)dict。

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

可變參數(shù)既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過(guò)args傳入:func((1, 2, 3));

關(guān)鍵字參數(shù)既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過(guò)kw傳入:func({'a': 1, 'b': 2})。

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

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

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

4.遞歸函數(shù)

'''
def fact(n):
if n==1:
return 1
return n * fact(n - 1)

小結(jié)

使用遞歸函數(shù)的優(yōu)點(diǎn)是邏輯簡(jiǎn)單清晰,缺點(diǎn)是過(guò)深的調(diào)用會(huì)導(dǎo)致棧溢出。

針對(duì)尾遞歸優(yōu)化的語(yǔ)言可以通過(guò)尾遞歸防止棧溢出。尾遞歸事實(shí)上和循環(huán)是等價(jià)的,沒(méi)有循環(huán)語(yǔ)句的編程語(yǔ)言只能通過(guò)尾遞歸實(shí)現(xiàn)循環(huán)。

Python標(biāo)準(zhǔn)的解釋器沒(méi)有針對(duì)尾遞歸做優(yōu)化,任何遞歸函數(shù)都存在棧溢出的問(wèn)題。
'''

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容