一敌呈、定義函數(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ù)為形參,調(diào)用函數(shù)的時候傳遞的參數(shù)為實參条舔。如get_username的代碼中枫耳,username為形參,而'jie'為實參孟抗。
二迁杨、傳遞實參
向函數(shù)傳遞實參的方式有很多種,可使用位置實參凄硼,這要求形參的順序和實參的順序相同铅协;也可以使用關(guān)鍵字實參,其中每個實參都由變量名和值組成摊沉;還可使用列表和字典狐史。
1. 位置實參
def get_name(first, last):
"""打印姓名"""
firstname = first
lastname = last
print(firstname + " " + lastname)
get_name("bill", "su")
位置實參的順序很重要,如果位置實參的順序到了,在函數(shù)中的形參的值也會顛倒骏全。
2. 默認(rèn)值
在編寫函數(shù)的時候苍柏,可以給每一個形參一個默認(rèn)值。在調(diào)用函數(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ù)的人就只需要在必要時才提供額外的信息柜裸。可使用默認(rèn)值來讓實參變成可選的粱锐。
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ù)只有一個形參*names溅潜,但不管調(diào)用語句提供了多少實參术唬,這個形參都將它們統(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ù)量實參的形參放在最后眶掌。Python先匹配位置實參和關(guān)鍵字實參,再將余下的實參收集到最后一個形參中巴碗。
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ù)量的實參,但預(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')