一、函數
1、函數的定義: 用 def 關鍵字來實現
def greet_user():
"""顯示簡單的問候語"""
print('hello!')
greet_user()
結果:
hello!
注意: 在def 之後要加冒號;""" xxxxx """ 被稱爲 文檔字符串的註釋,描述了函數的做什麼的
2、形參 與 實參
在上面例子的基礎上做簡單修改:
def greet_user(name): # 這個 name 就是形參
"""顯示簡單的問候語"""
print('Hello, ' + name.title() + "!")
greet_user('jesse') # 這個 'jesse' 就是實參
結果:
Hello, Jesse!
個人理解,形參就是一個代稱,目的在於告訴 這個函數 有個值要被傳進來,但是具體是什麼值並不知道,也就是形式上的參數,沒有實際的值。而實參是傳遞給函數的值,是函數進行操作的實際值,所以叫實參。實參給形參實例化:實參→形參。
3、實參的傳遞方式
3.1 位置實參:實參的順序與形參的順序嚴格一致
def describe_pet(animal_type,pet_name):
"""顯示寵物的信息"""
print('\nI have a ' + animal_type + '.')
print('My ' + animal_type + "'s name is " + pet_name.title() + '.')
describe_pet('dog','harry')
describe_pet('cat','willie')
結果:
I have a dog.
My dog's name is Harry.
I have a cat.
My cat's name is Willie.
如果順序不一致的話,會出現問題,可以發現 這個時候所顯示的就不是我們想表達的了
def describe_pet(animal_type,pet_name):
"""顯示寵物的信息"""
print('\nI have a ' + animal_type + '.')
print('My ' + animal_type + "'s name is " + pet_name.title() + '.')
describe_pet('harry','dog')
describe_pet('willie','cat')
結果:
I have a harry.
My harry's name is Dog.
I have a willie.
My willie's name is Cat.
3.2 關鍵字實參:以 名稱=值 的方式傳遞參數,不考慮順序
def describe_pet(animal_type,pet_name):
"""顯示寵物的信息"""
print('\nI have a ' + animal_type + '.')
print('My ' + animal_type + "'s name is " + pet_name.title() + '.')
describe_pet(pet_name='willie',animal_type='cat')
結果:
I have a cat.
My cat's name is Willie.
上面這個例子中,傳遞形式就以 形參名=值 的形式進行
3.3 讓實參變成可選的:指定一個默認值--空字符串
有時候我們輸入的實參數目是不定的,比如在傳遞名字的時候,有的人有三個 有的 有兩個,特別是外文名字都有frist_name 和 last_name,但是 middle_name 不一定有,所以我們需要實現 實參可選。
def get_formatted_name(frist_name, last_name, middle_name=''):
"""返回整潔的名字"""
if middle_name:
full_name = frist_name + ' ' + middle_name + ' ' + last_name
else:
full_name = frist_name + ' ' + last_name
return full_name.title()
musician = get_formatted_name('john', 'lee', 'hooker')
print(musician)
musician = get_formatted_name('jimi', 'hendrix')
print(musician)
結果:
John Hooker Lee
Jimi Hendrix
在由於 middle_name 不一定有,所以就指定成了一個空的字符串 的默認值,在函數中判斷一下 是不是有值
4、傳遞任意數量的實參
4.1 不知道有多少實參:創建空元組(*形參名)
有些時候我們是不知道函數會接收多少個實參,所以就需要有 接收任意數量實參的能力。假設在製作披薩的時候不同客戶有不同的配料要求,所以每次的輸入參數的數量不定,我們可以這麼實現:
def make_pizzs(*toppings):
"""打印顧客點的所有配料"""
print(toppings)
make_pizzs('pepperoni')
make_pizzs('mushrooms','green peppers','extra cheese')
結果:
('pepperoni',)
('mushrooms', 'green peppers', 'extra cheese')
可以發現,使用 *toppings 生成了一個元組,把每次傳進去的實參變成了相應的元組,可以做一下的更改:
def make_pizzs(*toppings):
"""打印顧客點的所有配料"""
print('\nMaking a pizza with the following toppings:')
for topping in toppings:
print('-' + topping)
make_pizzs('pepperoni')
make_pizzs('mushrooms','green peppers','extra cheese')
結果:
Making a pizza with the following toppings:
-pepperoni
Making a pizza with the following toppings:
-mushrooms
-green peppers
-extra cheese
4.2 不知道實參的類型:創建空字典(**形參名)
上面的例子是我們不知道會向函數輸入多少的實參,但是有時候 我們不知道實參的類型,有時候是數值型 有時候是字符串,所以函數有時候需要有這個能力,我們可以用創建一個空字典來實現:
def build_profile(first, last, **user_info):
proflie = {}
proflie['first_name'] = first
proflie['last_name'] = last
for key, value in user_info.items(): # .items() 函數可以提取字典中的 鍵-值 對
proflie[key] = value
return proflie
user_profile = build_profile('albert','einstein',
location='princeton',
field='physics')
print(user_profile)
結果:
{'field': 'physics', 'last_name': 'einstein', 'location': 'princeton', 'first_name': 'albert'}
可見,**user_info 創建了一個空字典
二、函數編寫指南
1、給函數起一個 描述性的名稱 並且使用小寫字母及下劃線,可以直接從函數的名稱就知道函數的功能
2、編寫較好的文檔字符串("""xxxxxx"""),讓別的程序員只需要閱讀文檔中的描述就能使用這個函數
3、給形參在指定默認值的時候,等號兩邊最好不要加空格;函數調用時也最好不要加空格
def function_name(parameter_0, parameter_1='default value')
function_name(value_0, parameter_1='value')
4、所有的import都放在程序的開頭