1. 程式人生 > >python筆記4 - 函數

python筆記4 - 函數

position 文檔 cor [] 用戶 表達 pac ace 默認參數

函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。

函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可以自己創建函數,這被叫做用戶自定義函數。

定義一個函數

你可以定義一個由自己想要功能的函數,以下是簡單的規則:

  • 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號()
  • 任何傳入參數和自變量必須放在圓括號中間。圓括號之間可以用於定義參數。
  • 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
  • 函數內容以冒號起始,並且縮進。
  • return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。

語法

def functionname( parameters ):   #定義一個函數,functionname是函數名,函數名不能重復
   "函數_文檔字符串"
   function_suite                 #函數體
   return [expression]            #return返回值,若無return,則該函數返回為None

參數

以下是調用函數時可使用的正式參數類型:

  • 位置參數
  • 默認參數
  • 關鍵字參數
  • 不定長參數(可變參數)

位置參數

位置參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣,位置參數為必填項。

調用plus函數,需要傳入2個參數,否則報語法錯誤,如下:

def plus(x,y):   #函數名plus,形參:x,y,簡單來說就是函數接收的參數
    print(x+y)    #函數體,打印x+y的值
plus(3, 4)       #函數調用,3和4就是實參,就是傳入的參數,執行結果是:7

傳入錯誤的參數個數,如下:

def plus(x,y):
    print(x+y)
plus(3, 4, 5)
報錯信息如下:
  File "E:/python_workspace/base-code/day4/函數my.py", line 69, in <module>
    plus(3, 4, 5)
TypeError: plus() takes 
2 positional arguments but 3 were given

不按照正確的順序傳入參數,打印的結果如下:

def plus(name, age):
    print(name, age)
plus(12, lhl)       #name=12,age=lhl,明顯輸入不合法

位置參數 - 關鍵字傳參

使用位置參數調用函數時,如果有多個位置參數的話,記不住哪個位置傳哪個了怎麽辦,可以使用位置參數的名字來指定調用,如下:

#有多個位置參數,可能會越來越多,使用固定的位置參數時,記不住或者傳錯了位置,可以使用位置參數的名字來指定調用,叫關鍵字傳參
def plus(name, age, sex, city, phone, money, color, time):
    print(name, age, sex, city, phone, money, color, time)
plus(zhangsan,18,  man, color=black, money=44444, time=time.time(),phone=13400000000,city=beijing)

執行結果顯示與函數參數位置對應: zhangsan
18 man beijing 13400000000 44444 black 1497020260.7982826

默認參數

調用函數時,默認參數的值如果沒有傳入,則被認為是默認值。這樣就算你在調用的時候沒傳入這個參數,它也是有值的,默認參數不是必填項,如下:

def plus(name, sex, age=18):  #age位默認參數,默認值是18
    print(name, sex, age)
plus(zhangsan,man)       #調用函數時,未輸入age的值,則默認age值為18
執行結果:
zhangsan man 18

調用函數時,給默認參數傳值,且默認參數在位置參數後面,如下:

def plus(name, sex, age=18):  #age位默認參數,默認值是18,age必須位於位置參數後面
    print(name, sex, age)
plus(zhangsan, man, age=28)       #調用函數時,輸入age的值,則默認age為輸入的值
執行結果:
zhangsan man 28

調用函數時,默認參數位於 位置參數前面,則報語法錯誤,信息如下:

def plus(name, age=18, sex):  #age位默認參數,默認值是18,age必須位於位置參數sex 前面,則語法錯誤
    print(name, sex, age)
plus(zhangsan, man)       #調用函數時,未輸入age的值,則默認age的值
報錯信息如下:
  File "E:/python_workspace/base-code/day4/函數my.py", line 67
    def plus(name, age=18, sex):  #age位默認參數,默認值是18,age必須位於位置參數sex 前面,則語法錯誤            ^
SyntaxError: non-default argument follows default argument

非固定參數:

上面的兩種位置參數和默認參數都是參數個數是固定的,如果說我一個函數,參數不是固定的,我也不知道以後這個函數會擴展成啥樣,可能參數越來越多,這個時候如果再用固定的參數,那後面程序就不好擴展了,這時候就可以用非固定參數了,非固定參數有兩種,一種是可變參數,一種是關鍵字參數。

可變參數:

可變參數用*來接收,後面想傳多少個參數就傳多少個,如果位置參數、默認值參數、可變參數一起使用的的話,可變參數必須在位置參數和默認值參數後面。可變參數也是非必傳的。

def post(*args):     #參數個數不固定時,使用*args可變參數,參數組,返回結果是元組,也為非必填參數
    print(args)      #打印結果是元組:(‘001‘, ‘login‘, ‘post‘),該函數沒有返回值,返回值為None
post()               #調用函數,不傳參數,打印結果為空的元組
print(post(001, login, post))

執行結果:
()
(001, login, post)
None

可變參數與位置參數、默認參數一起使用,如下:

#可變參數使用*來接收,*可變參數名, 必須放在位置參數、默認參數後面,默認參數必須放在位置參數後面
def plus(name, sex, age=18, *args):
    print(name)
    print(sex)
    print(age)
    print(args)
plus(zhangsan, man, black, 44444, 13400000000, beijing)  #默認參數可以不傳

執行結果:
zhangsan
man
black
(44444, 13400000000, beijing)

關鍵字參數:

關鍵字參數使用**來接收,後面的參數也是不固定的,不限長度,也可以和位置參數、默認參數、可變參數一起使用,關鍵字參數必須在最後面。

使用關鍵字參數的話,調用的時候必須使用關鍵字傳參。關鍵字參數也是非必傳的。如下:

def other(**kwargs):  #關鍵字參數,傳入值通過key=value方式傳入,返回結果是字典類型,也為非必填參數
    print(kwargs)
other(name=byz, age=18)

執行結果:
{name: byz, age: 18}

與位置參數、默認參數、可變參數一起使用,如下:

def other(name, age, sex=, *args, **kwargs):  #關鍵字參數,傳入值通過key=value方式傳入,返回結果是字典類型,也為非必填參數
    print(name)
    print(age)
    print(sex)
    print(args)
    print(kwargs)
other(zhangsan, 24, red, sun, 110, city=beijing, score=99)

執行結果:
zhangsan
24
red
(sun, 110)
{city: beijing, score: 99}

return 語句

return語句[表達式]退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None。之前的例子都沒有示範如何返回數值,下例便告訴你怎麽做:

def sum(args1, args2):
    total = args1 + args2
    print(total :, total)  #函數內打印出total的值
    return total            #函數返回total,若輸入的args1、args2位int類型, 則該函數返回int;若輸入的位int+float,則返回結果為float
print(sum(12, 13.1))

執行結果:
total : 25.1
25.1

全局變量和局部變量

定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域。

局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序範圍內訪問。全局變量如果要在函數中修改的話,需要加global關鍵字聲明,如果是list、字典和集合的話,則不需要加global關鍵字,直接就可以修改,如下:

name = marry  #字符串全局變量
names = []      #list全局變量
print(name)
print(names)
def test():
    global name        #修改全局變量-name的值就需要用global關鍵字聲明下name為全部變量
    name = Sriba      #修改全局變量name的值
    names.append(name)  #修改全局變量names的值
    return names
test()
print(修改後, name)
print(修改後names, names)

執行結果:
marry
[]
修改後 Sriba
修改後names [Sriba]

修改全局變量List類型的值,如下:

names = [1, 2, 3, 4]     #list全局變量
print(names)
def test():
    names = [a, b, c, d]     #修改全局變量names的值不需要用global關鍵字聲明, 直接進行修改
    return names
print(修改後names:, test())

執行結果:
[1, 2, 3, 4]
修改後names: [a, b, c, d]

後續有遞歸調用~~~

python筆記4 - 函數