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

定義函數

  • 函數的定義
  • 函數的分類
  • 函數的創建方法
  • 函數的返回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'}]