函數(一)

基本定義

定義:函數是指將一組語句的集合通過一個函數名封裝起來,如果想要執行這段函數,只需要調用其函數名即可。

特性:

  1. 減少重複代碼
  2. 程序可擴展
  3. 程序易於維護
語法定義
def function_name(*args):  # def關鍵字用來定義函數  function_name函數名,*args代表可以有任意個參數
	code							   #代碼塊
	...

function_name(*args)		 #調用函數

參數的作用在於調用函數時,通過傳入不同的參數來決定函數內部的執行流程,從而滿足自己不同的需求。

注意:如果想要調用函數,必須要加括號,參數的話視實際情況而定,如果不加參數,不是調用函數,而是函數的地址,如下:

#python解釋器
>>> def fun():
		print('help')
>>> fun
<function fun at 0x0000000002F8CAE8>   # at之後是內存地址
>>> fun()
help

參數

形參

形式參數,只有在被調用時纔會分配內存單元,在調用結束時,即刻釋放所分配的內存單元,因此形參只在函數內部有效,可以簡單的理解爲只是一種意義上的參數,在定義的不是並不佔內存地址。

實參

實際參數,實際佔用內存地址,在調用函數時,實際傳遞給函數的參數,函數訪問該參數的內存地址,可以是常量、變量、函數等。

def fun(x, y):  # x和y代表形參
    print x + y
fun(a, b)		# a和b代表實參
部分特殊參數
默認參數

在定義函數的時候可能會遇到這麼一種情況,比如學生註冊,在註冊國籍的時候,如果是在中國境內,那麼國籍很大一部分是中國,這樣的話每次頻繁輸入會比較麻煩,那麼可以將國籍設置成默認參數,不填寫的話默認就是默認值,如果不一樣的話可以對改參數進行修改,同樣可以省掉大部分重複的工作。
默認函數定義語法:

#位置參數:以位置順序確定對應關係的參數
def fun(param1, param2,param3='default value'):  # 這裏param1,param2叫做位置參數,param3叫做默認參數
	code
	...

這裏需要注意的是,默認函數必須放在位置參數之後,否則會報錯,SyntaxError: non-default argument follows default argument。

關鍵參數

正常情況下,給函數傳參數的時候需要按照函數參數的的順序,如果不想按照順序就可以使用關鍵參數,只需要指定參數名即可,指定了參數名的參數就叫做關鍵參數,但是,關鍵參數必須放在位置參數之後。如下所示:

#python解釋器
>>> def stu_register(name, age, major='math', country='中國'):
	print("---註冊學生信息---")
	print("姓名:%s\n年齡:%s\n國籍:%s\n專業:%s" % (name, age, country,major))

	
>>> stu_register("張三", major='Chinese', age=23)  # 正確調用
---註冊學生信息---
姓名:張三
年齡:23
國籍:中國
專業:Chinese
>>> stu_register("張三", major='Chinese', 23, country="印度")  # 錯誤調用
SyntaxError: positional argument follows keyword argument
非固定參數

在實際場景中可能會遇到一種情況,就是你也不知道調用者會傳遞多少個參數,那麼就可能會用到python中的非固定參數。
python中的非固定參數有兩種,一種是args,一種是**kwargs,區別是args會將傳入參數打成元組形式,通常傳遞位置參數,**kwargs會將傳入的參數打成字典,通常傳遞關鍵參數。
*args:

#python解釋器
>>> student_register("張三", 22)
張三 22 ()  # 這裏的括號就是上面的args,因爲沒有傳值,所以爲空。
>>> student_register("張三", 22, '中國', '河北')
張三 22 ('中國', '河北')  # 將最後兩個元素打成了tuple

**kwargs:

#python解釋器
>>> def student_register(name, age, *args, **kwargs):
	print(name, age, args, kwargs)
>>> student_register("張三", 22, "本科", "數學")
張三 22 ('本科', '數學') {}  # ‘{}’裏就是**kwargs,沒傳值,所以爲空
>>> student_register("張三", 22, "本科", "數學",native_place='河北石家莊',address="山東濟南")
張三 22 ('本科', '數學') {'native_place': '河北石家莊', 'address': '山東濟南'}

返回值

我們上面定義的函數,都是在調用的時候直接進行輸出的,那麼我們能接受他們的返回值嗎?

#python解釋器
>>> info = stu_register("張三", major='Chinese', age=23)
---註冊學生信息---
姓名:張三
年齡:23
國籍:中國
專業:Chinese
>>> print(info)
None

結果爲None,說明我們沒有獲取到函數的運行結果,那麼如果想獲取運行結果給外部調用,那麼就需要使用return語句來講結果返回給調用者(這裏解釋一下,個人理解,你沒有寫return語句,不代表這個函數沒有返回,只不過是返回None)。

# python解釋器
>>> def stu_register(name, age, major='math', country='中國'):
	if(age < 50):
		print("---註冊學生信息---")
		print("姓名:%s\n年齡:%s\n國籍:%s\n專業:%s" % (name, age, country,major))
		return "註冊成功"
	else:
		print("年齡太大,註冊失敗")
		return "註冊失敗"
>>> info = stu_register("張三", major='Chinese', age=23)
---註冊學生信息---
姓名:張三
年齡:23
國籍:中國
專業:Chinese
>>> print(info)
註冊成功

tips:函數在執行過程中如果遇見return語句,那麼就會停止執行並返回結果,也就是在return後面的語句就不會執行了,如下圖,上面的’return語句之後’並沒有被打印出來

>>> def stu_register(name, age, major='math', country='中國'):
	if(age < 50):
		print("---註冊學生信息---")
		print("姓名:%s\n年齡:%s\n國籍:%s\n專業:%s" % (name, age, country,major))
		return "註冊成功"
		print('return語句之後')
	else:
		print("年齡太大,註冊失敗")
		return "註冊失敗"
		print('return語句之後')

		
>>> stu_register("張三", major='Chinese', age=23)
---註冊學生信息---
姓名:張三
年齡:23
國籍:中國
專業:Chinese
'註冊成功'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章