Python基礎入門(5)- 函式的定義與使用

葛老頭發表於2021-12-13

定義函式

  • 函式的定義
  • 函式的分類
  • 函式的建立方法
  • 函式的返回return

函式的定義

  • 將一件事情的步驟封裝在一起並得到最終結果
  • 函式名代表了這個函式要做的事情
  • 函式體是實現函式功能的流程
  • 函式可以幫助我們重複使用功能,通過函式名我們可以知道函式的作用

函式的分類

  • 內建函式:print、id、int、max、min、type....等
  • 自定義函式:def 建立函式

函式的建立方法

通過關鍵字def來建立函式,def的作用是實現python中函式的建立

函式定義過程:

def 函式名(引數列表):
    函式體
# coding:utf-8

def say_Hello():
    print("Hello Python")

函式的呼叫

函式名+()小括號執行函式

# coding:utf-8

# 定義函式
def say_Hello():
    print("Hello Python")

# 執行函式
say_Hello()

# 執行結果:Hello Python

函式的返回return

  • return-將函式結果返回的關鍵字
  • return只能在函式體內使用
  • return支援返回所有的python型別
  • 有返回值的函式可以賦值給一個變數
  • return也有退出函式的作用
# coding:utf-8

def add(a,b):
    c=a+b
    return c
result=add(1,2)
print(result)
# 輸出結果:3

 

函式的引數

  • 必傳引數
  • 預設引數
  • 不確定引數
  • 引數規則

必傳引數

  • 函式中定義的引數沒有預設值,在呼叫函式時如果不傳入則會報錯
  • 在定義函式的時候,引數後邊沒有等號與預設值
  • 在定義函式的時候,沒有預設值且必須在函式執行的時候傳遞進去的引數,且順序與引數的順序相同,就是必傳引數
# coding:utf-8

def add(a,b):
    c=a+b
    return c
result=add(1,2)
print(result)
# 輸出結果:3

預設引數

  • 在定義函式的時候,定義的引數含有預設值,通過賦值語句給他是一個預設值
  • 如果預設引數在呼叫函式的時候傳遞了新的值,函式將會優先使用後傳入的值進行工作
# coding:utf-8

def add(a,b=1):
    c=a+b
    return c

print(add(1))
# 輸出結果:2

print(add(1,3))
# 輸出結果:4

不確定引數-可變引數

  • 沒有固定的引數名和數量(不知道要傳的引數名具體是什麼)

  • *args代表:將無引數的值合併成元組
  • **kwargs代表:將有引數與預設值的賦值語句合併成字典
# coding:utf-8

def test_args(*args,**kwargs):
    print(args,type(args))
    print(kwargs,type(kwargs))
test_args(1,2,3,4,5,6,name="zhangsan",age=22,top=175)
# 輸出結果:
# (1, 2, 3, 4, 5, 6) <class 'tuple'>
# {'name': 'zhangsan', 'age': 22, 'top': 175} <class 'dict'>
# coding:utf-8

#引數是變數傳遞時,需要在變數前面加上*和**來區分傳遞的是元組還是字典,否則一律按元組*args處理
def test_args(*args,**kwargs):
    print(args,type(args))
    print(kwargs,type(kwargs))

a=('python','java')
b={"name":"zhangsan","age":22,"top":175}

test_args(a,b)
# 輸出結果:
# (('python', 'java'), {'name': 'zhangsan', 'age': 22, 'top': 175}) <class 'tuple'>
# {} <class 'dict'>

test_args(*a,**b)
# 輸出結果:
# ('python', 'java') <class 'tuple'>
# {'name': 'zhangsan', 'age': 22, 'top': 175} <class 'dict'>

引數規則

  • 引數的定義從左到右依次是:必傳引數、預設引數、可變元組引數、可變字典引數
  • 函式的引數傳遞非常靈活
  • 必傳引數與預設引數的傳參多樣化
  • 傳遞的引數與函式定義時的引數順序不一致時,使用賦值語句的方式傳參
# coding:utf-8

def test(a,b=1,*args):
    print(a,b,args)

s=(1,2)
test(1,2,*s)  #1 2 (1, 2)

# test(a=1,b=2,*s)
'''
Traceback (most recent call last):
  File "D:/WorkSpace/Python_Study/test01.py", line 8, in <module>
    test(a=1,b=2,*s)
TypeError: test() got multiple values for argument 'a'
'''
# 報錯原因:當我們必選引數、預設引數與可選的元組型別引數在一起的時候,如果需要採取賦值的形式傳參,則在定義函式的時候需要將可變的元組引數放在第一位,之後是必傳、預設引數;這是一個特例!!!
def test2(*args,a,b=1):
    print(a,b,args)
test2(a=1,b=2,*s)   #1 2 (1, 2)
# coding:utf-8

def test(a,b=1,**kwargs):
    print(a,b,kwargs)
test(1,2,name="zhangsan")   # 1 2 {'name': 'zhangsan'}
test(a=1,b=2,name="zhangsan")   # 1 2 {'name': 'zhangsan'}
test(name="zhangsan",age=33,b=2,a=1)    # 1 2 {'name': 'zhangsan', 'age': 33}

 

函式的引數型別

  • 引數型別的定義在python3.7之後可用
  • 函式不會對引數型別進行驗證,只是看的作用
  • 函式的引數型別具體是什麼,還得看方法中對引數的操作
# coding:utf-8

def test(a:int,b:int=3,*args:int,**kwargs:str):
    print(a,b,args,kwargs)
test(1,2,3,'4',name='zhangsan')     # 1 2 (3, '4') {'name': 'zhangsan'}

 

全域性變數與區域性變數

  • 全域性變數
  • 區域性變數
  • global

全域性變數

函式體內對全域性變數只能讀取,不能修改

# coding:utf-8

name="張三"
age=22
def test():
    name="李四"
    print(name)
    print(age)
test()          #李四 22
print(name)     #張三

 


區域性變數

區域性變數,無法在函式體外使用

# coding:utf-8


def test():
    name="李四"

print(name)     #報錯

 


global

  • 將全域性變數可以在函式體內進行修改
  • global只支援str,int,float,tuple,bool,None型別。
  • 對於list,dict不需要global宣告即可應用自帶方法在函式體內修改。
  • 不建議使用global對全域性變數進行修改
# coding:utf-8

name="張三"
age=22
source={"數學":"100","英語":99,"語文":80}
like=["足球","籃球","乒乓球"]
drink=("雪碧","可樂")
eat={"漢堡","薯條"}

def test():
    global name,age

    name="zhangsan"
    age=18
    source["英語"]=60
    like[2]="羽毛球"
    # drink[0]="百事" 元組不可變,報錯
    eat.update("雞翅")

test()
print("%s,%s,%s,%s,%s,%s"%(name,age,source,like,drink,eat))
# 輸出結果:zhangsan,18,{'數學': '100', '英語': 60, '語文': 80},['足球', '籃球', '羽毛球'],('雪碧', '可樂'),{'薯條', '翅', '漢堡', '雞'}

 

遞迴函式

  • 遞迴是一種常見的數學和程式設計概念。它意味著函式呼叫自身。這樣做的好處是可以迴圈訪問資料以達成結果,類似while和for迴圈
  • 通過return返回def()自身,即可實現遞迴效果
# coding:utf-8

count=0

def test():
    global count
    if count<=5:
        count +=1
        return test()
    else:
        print("當前計數為:{}".format(count))
test()
# 輸出結果為:當前計數為:6

 

匿名函式

python 使用 lambda 來建立匿名函式。

所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函式。

  • lambda 只是一個表示式,函式體比 def 簡單很多。
  • 自帶return
  • lambda的主體是一個表示式,而不是一個程式碼塊。僅僅能在lambda表示式中封裝有限的邏輯進去。
  • lambda 函式擁有自己的名稱空間,且不能訪問自己引數列表之外或全域性名稱空間裡的引數。
  • 雖然lambda函式看起來只能寫一行,卻不等同於C或C++的行內函數,後者的目的是呼叫小函式時不佔用棧記憶體從而增加執行效率。
# coding:utf-8

f=lambda x,y:x+y
print(f(1,2))     #3

user=[{"name":"zhangsan"},
      {"name":"lisi"},
      {"name":"wangwu"}]

user.sort(key=lambda x:x["name"])
print(user)       #[{'name': 'lisi'}, {'name': 'wangwu'}, {'name': 'zhangsan'}]

 

相關文章