函數

調用函數
  • 調用函數
# 求絕對值的函數abs()
>>> abs(100)
100
>>> abs(-20)
20
>>> abs(12.34)
12.34
# max函數max()可以接收任意多個參數,并返回最大的那個:
>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3
  • 數據類型轉換
# Python內置的常用函數還包括數據類型轉換函數,比如int()函數可以把其他數據類型轉換為整數
>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> str(100)
'100'
>>> bool(1)
True
>>> bool('')
False
  • 函數名其實就是指向一個函數對象的引用,完全可以把函數名賦給一個變量,相當于給這個函數起了一個“別名”:
>>> a = abs # 變量a指向abs函數
>>> a(-1) # 所以也可以通過a調用abs函數
1
定義函數
  • 定義函數
# 自定義一個求絕對值的my_abs函數
# 如果沒有return語句,函數執行完畢后也會返回結果,只是結果為None。
# return None可以簡寫為return。
def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

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

  • 空函數
# 如果想定義一個什么事也不做的空函數,可以用pass語句
def nop():
    pass
# pass還可以用在其他語句里,比如:
if age >= 18:
    pass

注:缺少了pass,代碼運行就會有語法錯誤。

  • 參數檢測
# 對參數類型做檢查,只允許整數和浮點數類型的參數。數據類型檢查可以用內置函數isinstance()實現
def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x
  • 返回多個值
# import math語句表示導入math包,并允許后續代碼引用math包里的sin、cos等函數
import math
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)
151.96152422706632 70.0
# 但其實這只是一種假象,Python函數返回的是一個 tuple 有序不可變的列表
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
函數的參數
  • 默認參數(默認參數必須指向不變對象)
# 由于我們經常計算x^2,所以,完全可以把第二個參數n的默認值設定為2,
# 這樣,當我們調用power(5)時,相當于調用power(5, 2)
def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
# 當不按順序提供部分默認參數時,需要把參數名寫上
enroll('Adam', 'M', city='Tianjin')
# Python函數在定義的時候,默認參數L的值就被計算出來了,即[],因為默認參數L也是一個變量,
# 它指向對象[],每次調用該函數,如果改變了L的內容,則下次調用時,默認參數的內容就變了,
# 不再是函數定義時的[]了。 
def add_end(L=None):
    if L is None:
        L = []
    L.append('END')
    return L
  • 可變參數(可變參數在函數調用時自動組裝為一個tuple
# 計算a2 + b2 + c2 + …
def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
# 普通方法,組裝出一個list或tuple:
>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84
# 如果利用可變參數,調用函數的方式可以簡化成這樣: 
>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84
# 且把函數的參數改為可變參數:
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
# Python允許在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
  • 關鍵字參數
    關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict。
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
# 傳入任意個數的關鍵字參數:
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
# 可以先組裝出一個dict,然后,把該dict轉換為關鍵字參數傳進去
# kw獲得的dict是extra的一份拷貝,對kw的改動不會影響到函數外的extra。
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
  • 命名關鍵字參數
# 如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,
# 例如,只接收city和job作為關鍵字參數。這種方式定義的函數如下:
def person(name, age, *, city, job):
    print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
# 如果函數定義中已經有了一個可變參數,后面跟著的命名關鍵字參數就不再需要一個特殊分隔符*了
def person(name, age, *args, city, job):
    print(name, age, args, city, job)
# 命名關鍵字參數可以有缺省值,從而簡化調用:
def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
  • 參數組合
    在Python中定義函數,上面5種參數都可以組合使用。但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
    對于任意函數,都可以通過類似func(*args, **kw)的形式調用它,無論它的參數是如何定義的。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • 函數名其實就是指向一個函數對象的引用,完全可以把函數名賦給一個變量,相當于給這個函數起了一個“別名”:a = ab...
    bjchenli閱讀 629評論 0 0
  • 函數### 函數名其實就是指向一個函數對象的引用,完全可以把函數名賦給一個變量,相當于給這個函數起了一個“別名”:...
    MJXH閱讀 1,109評論 0 0
  • import math a = absprint(a(-1))n1 = 255print(str(hex(n1))...
    Elder閱讀 1,470評論 0 1
  • 位置參數 power(x, n)函數有兩個參數:x和n,這兩個參數都是位置參數,調用函數時,傳入的兩個值按照位置順...
    牛崽兒酷閱讀 234評論 0 0
  • 函數 調用函數要調用一個函數,需要知道函數的名稱和參數,比如求絕對值的函數abs,只有一個參數 如果對要調用的函數...
    朔野閱讀 376評論 0 0