1. 程式人生 > >Python中函式的詳解

Python中函式的詳解

Python中的函式作用跟其他語言的函式作用基本相同,都是帶名字的程式碼塊,用於一些完成具體的工作。
要執行函式定義的特殊任務,可呼叫該函式。需要在程式中,多次執行同一項任務的函式,無需反覆編寫完成該任務的程式碼,而只需要呼叫執行該任務的函式即可。
首先:定義一個簡單的無參函式

def func():
	'''列印簡單的問候語'''
    print("Hello")


func()

定義一個有引數的函式 (注意:有參函式需要傳入資訊)

def func(name):
	print("Hello "+name.title()+"!")

func('darren573')

形參(形式引數)和實參(實際引數)


形參:是定義函式名和函式體的時候使用的引數,目的是用來接收呼叫該函式時傳遞的引數。
實參:是在呼叫時傳遞給函式的引數,即傳遞給被呼叫函式的值。
接下來,我們舉栗子,用來傳遞實參;

def my_animal(type,name):
	'''顯示動物資訊'''
	print("\nI have a "+type+".")
	print("My "+ type+"`s name is "+ name+".")

my_animal("dog","皮皮")
輸出結果為:I have a dog. My dog`s name is 皮皮.

這裡我們傳入的“dog”和“皮皮”就是實參。另外,傳遞引數從左到右,定義預設引數由右到左。

預設值 編寫函式時可給每個引數指定預設值,如果在函式呼叫中,傳入了新的實參,則替換掉預設值,如果沒有新的實參傳入,則使用預設值執行函式。、

def my_animal(name,type='dog'):
	'''顯示動物資訊'''
	print("\nI have a "+type+".")
	print("My "+ type+"`s name is "+ name+".")


my_animal("皮皮")
my_animal("dog","皮皮")

以上兩種寫法都是可以的,需要注意的是:帶有預設值的形參通常寫在最右邊

等效的函式呼叫
以my_animal()方法為例,在傳入實參時我們可以換種方式,如下:

my_animal(name='皮皮',type='dog')
my_animal(type='dog',name='皮皮')

這些函式呼叫的輸出與前面的示例相同。

返回值 函式並非總是直接顯示輸出,相反,他還可以處理一些資料,並返回一個或一組值。這就是返回值。
我們通過下面函式來進行詳細認識:

def get_formatted_name(first_name,last_name):
	'''返回整潔的名字'''
	full_name = first_name+'.'+last_name
	return full_name.title()

name = get_formatted_name('darren','Hendrix')
print(name)
返回結果為:Darren.Hendrix

讓實參變成可選的
有時候,需要把實參變成可選的,這樣使用函式的人就只需在必要的時候提供額外資訊,那麼如何把實參變成可選的呢?以上述方法為例

def get_formatted_name(first_name,last_name,middle_name=''):
	'''返回整潔的名字'''
	if middle_name:
		full_name = first_name+''+middle_name+''+last_name
	else:
		full_name = first_name+''+last_name
	return full_name.title()

s1 = get_formatted_name('da', '573', 'rren')
print(s1)
s2 = get_formatted_name('darren','573')
print(s2)

以上兩種方式的輸出都是一樣的,但是s1我們給了三個引數,s2我們只給了兩個引數,由此可見,這就是引數的可選擇行。

返回字典
函式可以返回任何型別的值,包括列表和字典等比較複雜的資料結構。咱們還是通過示例來進行研究

def build_person_name(first_name, last_name):
    person = {'first': first_name, 'last': last_name}
    return person

name = build_person_name('darren','573')
print(name)
輸出結果:{'first': 'darren', 'last': '573'}

可以很明確的看到,name的形式是以字典的方式輸出的

函式中的引數問題
本段將通過一個方法和多個傳參形式詳細講解函式中引數的問題,廢話少說,上程式碼。

def machine(x,y,*args):
	print(x)
	print(y)
	print(agrs)

machine(1,2)
machine(1,2,3)
結果:1 2 () 
1 2 (3,)

顯而易見,這裡的*args表示後面跟的是一個元組,此外,*args還能處理多餘的實參
那我們再換一種方式進行研究

def machine2(x,*y,**z):
	print(x)
	print(y)
	print(z)

machine2(1,2,3,4)
結果:1 (2,3,4,) {}

這個第三個**z打印出來的是{},即字典,x位列印的是1,而*y位就是以元組的方式進行傳入了,所以列印了(2,3,4)。

可是如果想對**z賦值該怎麼辦呢?,這裡就要考慮到字典的儲存方式了,我們都知道,字典是以key:value的鍵-值對方式進行儲存的,所以對z賦值我們可以這樣寫,如下

machine2(1,2,3,4,z=5,s=6)
看一下結果:1 (2,3,4) {'z':5,'s':6}

符合我們的預期,由此我們可以說*後面跟的是列表,**後面跟的是字典。

使用函式和while結合
本段將把函式和while迴圈結合起來,看程式碼

'''以輸出名字為例'''
def get_formatted_name(first_name, last_name):
    full_name = first_name + '' + last_name
    return full_name


'''結合使用函式和While迴圈'''
while True:
    print('\nPlease tell me your name: ')
    print("(enter 'q' at any time to quit)")
    f_name = input("First name: ")
    if f_name == 'q':
        break '''跳出迴圈'''
    l_name = input("Last name: ")
    if l_name == 'q':
        break
    formatted_name = get_formatted_name(f_name, l_name)
    print("\nHello, " + formatted_name + "!")
執行結果如下圖:

在這裡插入圖片描述

傳遞列表
在具體的專案中,有時候向函式傳遞列表是很必要的,這種列表可以包含,名字、數字、或者更復雜的物件(如字典)

def get_username(name):
	for i in name :
		message = "Hello,"+i.title()+"!"
		print(message)

username = ['darren573','androidwing','idioticbear']
get_username(username)
結果如下:Hello,Darren573! Hello,Androidwing! Hello,Idioticbear!

首先我們聲明瞭一個列表,並賦值,然後傳給get_username()方法,在方法中通過for迴圈遍歷輸出元素,並問好。

本文到處就結束了,如發現有錯誤可留言,共勉!