一、定義函數(shù)
使用關(guān)鍵字def定義函數(shù)。
def get_name():
"""打印名字"""
print("Hello")
get_name()
get_name為函數(shù)名,在get_name( ):后面的所有縮進(jìn)行構(gòu)成了函數(shù)體。而在上面代碼中的第二行的文本是被稱為文檔字符串的注釋,描述了函數(shù)使用來做什么的。
1. 向函數(shù)傳遞信息
可以在函數(shù)定義def get_name( )的括號內(nèi)添加username,通過這里添加username,就可以讓函數(shù)接受給函數(shù)指定的值。
def get_name(username):
"""打印名字"""
print(username)
get_name('jie')
2. 實(shí)參和形參
在函數(shù)中,定義函數(shù)時的參數(shù)為形參,調(diào)用函數(shù)的時候傳遞的參數(shù)為實(shí)參。如get_username的代碼中,username為形參,而'jie'為實(shí)參。
二、傳遞實(shí)參
向函數(shù)傳遞實(shí)參的方式有很多種,可使用位置實(shí)參,這要求形參的順序和實(shí)參的順序相同;也可以使用關(guān)鍵字實(shí)參,其中每個實(shí)參都由變量名和值組成;還可使用列表和字典。
1. 位置實(shí)參
def get_name(first, last):
"""打印姓名"""
firstname = first
lastname = last
print(firstname + " " + lastname)
get_name("bill", "su")
位置實(shí)參的順序很重要,如果位置實(shí)參的順序到了,在函數(shù)中的形參的值也會顛倒。
2. 默認(rèn)值
在編寫函數(shù)的時候,可以給每一個形參一個默認(rèn)值。在調(diào)用函數(shù)時,如果給形參提供了實(shí)參,則將使用指定的實(shí)參值,否則,就使用形參的默認(rèn)值。
def get_name(username = 'Tom'):
"""打印名字"""
print(username)
get_name()
三、返回值
函數(shù)可以處理一些數(shù)據(jù),并返回一個或一組值。函數(shù)返回的值被稱為返回值。在函數(shù)中,可使用==return==語句將值返回到調(diào)用函數(shù)的代碼行
1. 返回簡單值
def get_name(first, last):
"""打印名字"""
firstname = first
lastname = last
full_name = firstname + " " + lastname
return full_name
full_name = get_name('bill', 'su')
print(full_name)
2. 讓實(shí)參變成可選的
有時候,需要讓實(shí)參變成可選的,這樣使用函數(shù)的人就只需要在必要時才提供額外的信息。可使用默認(rèn)值來讓實(shí)參變成可選的。
def get_name(first, last = ''):
if last:
print(first + last)
else:
print(first)
get_name('bill')
3. 返回字典
函數(shù)可返回任何類型的值,包括列表和字典等較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
def get_name(first, last):
person = {'first': first, 'last': last}
return person
musician = get_name('jim', 'hen')
print(musician)
四、傳遞列表
函數(shù)可以傳遞列表,這種列表可以包含的可能是名字、數(shù)字或更復(fù)雜的對象(如字典)。將列表傳遞給函數(shù)后,函數(shù)就能直接訪問其內(nèi)容。
def greet_name(names):
for name in names:
msg = "Hello" + " " + name.title() + "!"
print(msg)
user_names = ['han', 'ty', 'jim']
greet_name(user_names)
1. 在函數(shù)中修改列表
將列表傳遞給函數(shù)后,函數(shù)就可以對其進(jìn)行修改。在函數(shù)中對這個列表所做的任何修改都是永久性的。
def del_name(names):
names.pop()
names = ['han', 'ty', 'jim']
del_name(names)
print(names)
2. 禁止函數(shù)修改列表
可以向函數(shù)傳遞列表的副本而不是元件,這樣函數(shù)所做的任何修改都只影響副本。
def del_name(names):
names.pop()
print("修改后的列表副本:")
print(names)
names = ['han', 'ty', 'jim']
del_name(names[:])
print("調(diào)用函數(shù)后的列表:")
print(names)
五、傳遞任意數(shù)量的實(shí)參
下面的函數(shù)只有一個形參*names,但不管調(diào)用語句提供了多少實(shí)參,這個形參都將它們統(tǒng)統(tǒng)納入囊中。
def names(*names):
print(names)
names('jim')
names('jim', 'make', 'len')
形參名*names 中的星號讓Python創(chuàng)建一個名為names的空元組,并將收到的所有值都封裝到這個元組中。函數(shù)體內(nèi)的print語句通過生成輸出來證明Python能夠處理使用一個值調(diào)用函數(shù)的情形,也能處理使用三個值來調(diào)用函數(shù)的情形。
1. 結(jié)合使用位置實(shí)參和任意數(shù)量的實(shí)參
如果讓函數(shù)接受不同類型的實(shí)參,必須在函數(shù)定義中將接納任意數(shù)量實(shí)參的形參放在最后。Python先匹配位置實(shí)參和關(guān)鍵字實(shí)參,再將余下的實(shí)參收集到最后一個形參中。
def make_pizza(size, *toppings):
print("\nmakeing a"+ str(size) +
"-inch pizza with the folling topping")
for topping in toppings:
print("-"+ topping)
make_pizza(16, 'peppersion')
make_pizza(12, 'pepper', 'green peppers')
3. 使用任意數(shù)量的關(guān)鍵字實(shí)參
有時候,需要接受任意數(shù)量的實(shí)參,但預(yù)先不知道傳遞給函數(shù)的會是什么樣的信息。在這種情況下,可將函數(shù)編寫成能夠接受任意數(shù)量的鍵-值對——調(diào)用語句提供了多少就接受多少。
def build_profile(first, last, **user_info):
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key, value in user_info.items():
profile[key] = value
return profile
user_profile = build_profile('albert', 'jim',
location='princetion',
field='physics')
print(user_profile)
形參**user_info中的兩個星號讓Python創(chuàng)建一個名為profile的空字典,用于存儲用戶簡介。
六、將函數(shù)存儲在模塊中
函數(shù)的優(yōu)點(diǎn)之一是:使用它們可將代碼塊與主程序分離。通過給函數(shù)指定描述性名稱,可讓主程序容易理解的多。還可以更進(jìn)一步,將函數(shù)文件存儲在被稱為模塊的獨(dú)立文件中,再將模塊倒入到主程序中。import語句允許在當(dāng)前運(yùn)行的程序文件中使用模塊中的代碼。
通過將函數(shù)存儲在獨(dú)立的文件中,可隱藏程序代碼的細(xì)節(jié),將重點(diǎn)放在程序的高層邏輯上。這能夠在眾多的程序中重用函數(shù)。將函數(shù)存儲在獨(dú)立文件中后,可與其它程序員共享這些文件而不是整個程序,
1. 導(dǎo)入整個模塊
要讓函數(shù)是可導(dǎo)入的,得先創(chuàng)建模塊。模塊是擴(kuò)展名為.py的文件,包含要導(dǎo)入到程序中的代碼。
pizza.py
def make_pizza(size, *toppings):
print("\nmakeing a"+ str(size) +
"-inch pizza with the folling topping")
for topping in toppings:
print("-"+ topping)
making_pizzas.py
import pizza
pizza.make_pizza(16, 'peppersion')
pizza.make_pizza(12, 'pepper', 'green peppers')
2. 導(dǎo)入特定的函數(shù)
還可以導(dǎo)入模塊中的特定函數(shù):
from pizza import makez_pizza
通過用逗號分隔函數(shù)名,可根據(jù)需要從模塊中導(dǎo)入任意數(shù)量的函數(shù)
from module_name import function_0, function_1, function_2
3. 使用as給函數(shù)指定別名
如果要導(dǎo)入的函數(shù)的名稱可能與程序中現(xiàn)有的名稱沖突,或者函數(shù)的名稱太長,可指定簡短二獨(dú)一無二的別名——函數(shù)的另一個名稱,類似于外號。
from pizza import make_pizza as mp
mp(16, 'peppersion')
mp(12, 'pepper', 'green peppers')
4. 使用as給模塊指定別名
import pizza as p
p.make_pizza(16, 'peppersion')
p.make_pizza(12, 'pepper', 'green peppers')
5. 導(dǎo)入函數(shù)中的所有函數(shù)
import語句中的星號讓Python將模塊pizza中每個函數(shù)都復(fù)制到這個程序文件中。由于導(dǎo)入了每個函數(shù),可通過名稱來調(diào)用每個函數(shù)與,而無需使用句點(diǎn)表示法。
from pizza import *
make_pizza(16, 'peppersion')
make_pizza(12, 'pepper', 'green peppers')