python基礎之函式

Roc Huang發表於2020-10-04

函式

1.函式的概述

1.1 認識函式

函式:在一個完整的專案中,某些功能會反覆的使用,那麼會將功能會反覆的使用,那麼會將功能封裝成函式,當我們要使用此功能的時候呼叫即可。

優點:

1.簡化程式碼結構,增加了程式碼的複用性(重複使用的程度)

2.增加程式碼的可維護性,如果想修改某個BUG,只需要對應的函式即可。

1.2 定義函式

格式:

def 函式名(引數列表):

語句

​ return 表示式

解釋:

def : 函式程式碼塊以def關鍵字開始

函式名:遵循識別符號規則

引數列表:任何傳入函式的引數和變數,必須放在小括號之間,使用逗號分隔,函式從函式的呼叫者那裡獲取資訊【呼叫者給函式傳遞的資訊】

():是引數列表的開始以及結束

冒號:函式內容【封裝的功能】以冒號開始,並且縮排

語句:函式封裝的功能

return:一般用於結束函式,並且返回資訊給函式的呼叫者

表示式:要返回給函式呼叫者的資訊

注意:最後的return表示式可以不寫,若不寫的情況下預設return None

引數列表 = 引數1,引數2,…,引數n

1.3函式的呼叫

語法: 函式名(引數列表)

函式名:是要使用的功能的函式的函式名字

引數列表:函式的呼叫者給函式傳遞的資訊

函式呼叫的本質:實參給形參賦值的過程

>>> int(1.3)
1
>>> abs(-10)
10
1.4 最簡單的函式

說明:最簡單的函式,無引數,無返回值的函式

#定義函式
def myPrint():
	print("you are a good man")
#呼叫函式
myPrint()
1.5 函式的引數

引數列表:如果函式所實現的需求中涉及到未知項參與運算,就可以將未知項設定為引數。

格式:引數1,引數2,引數3,…

形式引數:在方法中定義的,用於接收中間引數的值

實際引數:在函式外面定義,實際參與運算的值,就是為了給形式引數賦值

#函式的定義
#name是形參
def myPrint(name):
	print("%s is a good man !"%name)

#"lili" 是實參
myPrint("lili")
#結果
lili is a good man !
#形參 引數一:name  引數二:age
def myPrint(name, age):
	print("%s is %d year old"%(name, age))
#函式呼叫,傳遞兩個引數	
myPrint("lili", 18)
#結果
lili is 18 year old
1.6函式的返回值

函式的返回值表示一個函式執行完成之後得到的結果

使用return返回函式的返回值,用於結束函式,得到最終運算的結果。

需求:編寫函式實現功能,給函式傳遞兩個整數,獲取這兩個整數的之和

def add(num1, num2):
	sum = num1 + num2
	#將結果返回函式的呼叫者
	return sum
	#注意:return的作用是結束整個函式,因此return後面的語句不會被執行
	print("hello")

#呼叫函式
res = add(10, 20)
print(res)
1.7 引數傳遞

引數傳遞的本質:實參給形參賦值的過程

1.7.1 位置引數之值傳遞

值傳遞指傳遞不可變型別,一般指string、tuple和number型別

def func1(a):
	print(a)
	a = 10
	print(a)
temp = 20
#將temp作為實參傳遞給func1函式,將賦值給形參a
#相當於 a = temp
func1(temp)
print(temp)

列印地址,如下

def func1(a):
	print(id(a))
	a = 10
	print(id(a))
	
temp = 20
#將temp作為實參傳遞給func1函式,將賦值給形參a
#相當於 a = temp
print(id(temp))
func1(temp)
print(temp)

1.7.2 位置引數之引用傳遞

引用傳遞一般傳遞的是可變型別,一般指list,dict和set

def func1(c):
	c[0] = 100
	
d =[1, 2, 3, 4]
#將引用傳遞過去
func2(d)
print(d[0])

說明:引用傳遞的本質上還是值傳遞,只不過傳遞的是地址

位置引數又稱必選引數

1.7.3 關鍵字引數

概念:用於函式呼叫時,通過“鍵-值”的形式加以指定,可以讓函式更加清晰、容易使用,同時也清除了引數的順序需求

def func(name, age):
	print("I am %s, and I am %d year old"%(name, age))
#一般呼叫
func("lili", 18)
#使用關鍵字引數
func(age = 18, name = "lili")

注意:有位置引數時,位置引數必須在關鍵字引數的前面,但是關鍵字引數之間是不存在先後順序的。

1.7.4 預設引數

概念:用於定義函式,為引數提供預設值,呼叫函式時可傳可不傳該預設引數的值。

呼叫函式時,如果沒有傳遞引數則會使用預設引數

比如:在使用sort()排序的時候,不更改其引數的時候我們一般情況下預設會升序排列

def func(name, age=18)
	print("I am %s, and I am %d year old"%(name, age))

#一般的函式呼叫
func('lilei', 19)
#關鍵字引數呼叫
func(name = 'leilei')
#使用預設引數呼叫
func('lili')

使用預設引數可以簡化函式的呼叫。

使用預設引數的時候需注意:

1.必選引數在前,預設引數在後,否則python直譯器會報錯

2.預設引數必須指向不變物件

如何設定預設引數

當函式有多個引數時,把變化大的引數放在前面,變化小的放在後面,變化小的可以作為預設引數。

1.7.5 不定長引數【可變引數】

概念:定義函式時,有時候我們不確定呼叫的時候會傳遞多少個引數(或者傳遞引數的個數為0),此時我們可以使用包裹位置引數或者包裹關鍵字引數來進行引數傳遞。

特點:能處理比當初宣告時更多的引數,換句話說,就是傳遞多少引數,我就處理多少引數,不傳遞則不處理

*1.包裹位置傳遞–args

#與之前形參不同的是在hoby的變數名之前新增了“*”
#新增了星號(*)的變數名會存放所有未命名的變數引數
#如果在函式呼叫時沒有指定引數,它就是一個空的元組
#一般情況下使用*args
def func(name, *hoby):
	print("I am ",name,"I like",hoby)
	
func('lili','flower','money')

注意:我們傳進去的所有引數都會被args變數收集,他會根據傳進引數的位置合併成一個元組(tupe),args是元組型別,這就是包裹位置傳遞。

2.包裹關鍵字引數–**kwargs
#若是兩個*,則當做dict處理
# 注意:在使用**kwargs的時候,傳遞引數必須使用關鍵字傳參
def func(**kwargs):
	print(kwargs)
	print(type(kwargs))
func(x = 1, y = 2)
#能處理任意長度的引數
def func(*args, **kwargs):
	#代表一個空語句
	pass

kwargs是一個字典(dict),收集所有的關鍵字引數。

注意:在python中定義函式,可以用必選引數、預設引數、可變引數和關鍵字引數,這4中引數可以一起使用,或者是隻用其中的某些,但是注意,引數定義與呼叫的順序必須是:必選引數【位置引數】、預設引數、可變引數【包裹位置】和關鍵字引數【包裹關鍵字】

1.7.6 匿名函式

概念:是指一類無需定義識別符號(函式名)的函式或者子程式。

特點:匿名函式不使用def定義函式,使用lambda來建立匿名函式

1.lambda只是一個表示式,函式體比def簡單

2.關鍵字lambda表示匿名函式,冒號前面的x表示函式引數.

3.匿名函式有個限制,就是隻能有一個表示式,不用寫return,返回值就是該表示式的結果.

語法:

lambda 引數1,引數2,…,引數n: expression[表示式]

好處:函式沒有名字,不必擔心函式名衝突,此外,匿名函式也是一個函式物件,也可以把匿名函式賦值給一個變數,再利用變數來呼叫該函式.

sum = lambda num1, num2: num1 + num2
print(sum(1, 2))

相關文章