python程式設計學習筆記⑦-1函式

Tachyon.xue發表於2020-11-20

函式是帶名字的程式碼塊
8.1定義函式
使用關鍵字def 告訴python你要定義一個函式。

def greet_user():#()是必要的
	print("Hello!")
greet_user()
結果:
Hello!
[Finished in 0.1s]

8.1.1向函式傳遞資訊
8.1.2實參和形參

def greet_user(username):#形參
	print(f"Hello,{username.title()}")
greet_user("tachyon xue")#()內是實參
結果:
Hello,Tachyon Xue
[Finished in 0.1s]

練習8-1:訊息

def display_message():
	print("本章學習的是函式'def'")
display_message()
結果:
本章學習的是函式'def'
[Finished in 0.1s]

練習8-2:喜歡的圖書

def favorite_book(title):
	print(f"我最喜歡的書《{title}》")
favorite_book('愛麗絲夢遊仙境')
結果:
我最喜歡的書《愛麗絲夢遊仙境》
[Finished in 0.1s]

8.2傳遞實參
函式定義可包含多個形參,因此函式呼叫也可包含多個實參。
每個實參都有變數名和值組成,也可以是列表和字典。
8.2.1位置實參
所謂位置實參就是,形參和實參位置要相互對應。

  1. 多次呼叫函式
def describe_pet(animal_type, pet_name):
	print(f"\nI have a {animal_type}")
	print(f"My {animal_type}'s name is {pet_name.title()}.")
describe_pet('hamster', 'harry')#第一次呼叫,對應形參位置
describe_pet('dog', 'willie')#第二次呼叫,對應形參位置
.....
......
....
結果:

I have a hamster
My hamster's name is Harry.

I have a dog
My dog's name is Willie.
[Finished in 0.1s]
  1. 位置實參的順序很重要
def describe_pet(animal_type, pet_name):
	print(f"\nI have a {animal_type}")
	print(f"My {animal_type}'s name is {pet_name.title()}.")
describe_pet('harry', 'hamster')#如果位置對應錯了,程式不會出錯但結果就不是你要的結果了。
結果:

I have a harry
My harry's name is Hamster.
[Finished in 0.1s]

8.2.2關鍵字實參
關鍵字實參是轉遞給函式的名稱值對,因為直接在實參中將名稱和值關聯起來,所以向函式傳遞實參時不會混淆。也無須考慮函式呼叫中的實參順序。

def describe_pet(animal_type, pet_name):
	print(f"\nI have a {animal_type}")
	print(f"My {animal_type}'s name is {pet_name.title()}.")
describe_pet('hamster', 'harry') #位置實參
describe_pet(animal_type='hamster', pet_name='harry')#關鍵字實參
結果:

I have a hamster
My hamster's name is Harry.

I have a hamster
My hamster's name is Harry.
[Finished in 0.1s]

8.2.3預設值
為了簡化,我們可以在起初編寫函式的時候,給每個形參指定預設值,這樣在呼叫函式的時候就不用在寫實參了。
使用預設值,在函式呼叫時候遵循’位置實參‘
注意:使用預設值,必須先在形參列表中列出沒有預設值的形參,再列出有預設值的形參=實參。

def describe_pet(pet_name, animal_type='dog'):  #先寫沒預設值的形參。
	print(f"\nI have a {animal_type}")
	print(f"My {animal_type}'s name is {pet_name.title()}.")
describe_pet('wille')#這裡沒有指定位置2個實參,使用了預設值
結果:

I have a dog
My dog's name is Wille.
[Finished in 0.1s]

8.2.4等效的函式呼叫
位置實參、關鍵字實參和預設值。可混用。
8.2.5避免實參錯誤
有多少形參,寫多少實參,避免少寫或多寫
練習8-3:T恤

def make_shirt(size, word):
	print(f"我的衣服是{size}碼,上面寫著{word}")
make_shirt(75, '我愛祖國')#位置實參呼叫
make_shirt(size=75, word='我愛祖國')#關鍵字實參呼叫
結果:
我的衣服是75碼,上面寫著我愛祖國
我的衣服是75碼,上面寫著我愛祖國
[Finished in 0.1s]

練習8-4:大號T恤

def make_shirt(size, word='I love Python'):
	print(f"我的衣服是{size}碼,上面寫著{word}")
make_shirt('大號')
make_shirt('中號')
make_shirt('小號', '我愛祖國')
結果:
我的衣服是大號碼,上面寫著I love Python
我的衣服是中號碼,上面寫著I love Python
我的衣服是小號碼,上面寫著我愛祖國
[Finished in 0.1s]

練習8-5:城市

def describe_city(city, state='中國'):
	print(f"{city}屬於{state}")
describe_city('昆明')
describe_city('太原')
describe_city('拉斯維加斯', '美國')
結果:
昆明屬於中國
太原屬於中國
拉斯維加斯屬於美國
[Finished in 0.1s]

8.3返回值
return語句將值返回到呼叫函式的程式碼行中去完成,來簡化主程式。
8.3.1返回簡單值

def get_formatted_name(first_name, last_name):
	full_name = f"{first_name} {last_name}"
	return full_name.title()#return將值返回給函式呼叫行
musician = get_formatted_name('tachyon', 'xue')#返回值賦給了一個變數musician
print(musician)
結果:
Tachyon Xue
[Finished in 0.1s]

8.3.2讓實參成可選的
我們可以把形參使用預設值,並把預設值設定為空字串,並使用條件來判斷是否使用這個預設值為空的形參。
在python裡非空字串被解釋為“True”,空字串解釋為“False”

def get_formatted_name(first_name, last_name, middle_name=''):
	if middle_name:  #條件判斷函式的有預設值的形參當為空字串時為False;當不為空字串時為True。
		full_name = f"{first_name} {middle_name} {last_name}"
	else:
		full_name = f"{first_name} {last_name}"
	return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')#實參只寫了2個第3個使用預設值,則是空,為False
print(musician)
musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)
結果:
Jimi Hendrix
John Lee Hooker
[Finished in 0.1s]

8.3.3返回字典
示例:

def build_person(first_name, last_name):
	person = {'first': first_name, 'last': last_name} #將鍵值對賦給變數
	return person
musician = build_person('jimi', 'hendrix')
print(musician)
結果:
{'first': 'jimi', 'last': 'hendrix'}
[Finished in 0.1s]
def build_person(first_name, last_name, age=None):#None佔位值,可看作False.這裡用空字元作用一樣。
	person = {'first': first_name, 'last': last_name} #將鍵值對賦給變數
	if age:
		person['age'] = age
	return person
musician = build_person('jimi', 'hendrix', age=22)
print(musician)
結果:
{'first': 'jimi', 'last': 'hendrix', 'age': 22}
[Finished in 0.1s]

8.3.4結合使用函式和while迴圈

def get_formatted_name(first_name, last_name):
	full_name = f"{first_name} {last_name}"
	return full_name.title()
while True: #while 為True程式為迴圈中。
	print("\n請告訴我你的名字")
	print("輸入小寫字母'q'鍵可隨時退出程式。")
	f_name = input("你叫什麼名字:")
	if f_name == 'q':  #條件判斷退出程式。
		break
	l_name = input("你姓什麼:")
	if l_name == 'q':
		break
	formatted_name = get_formatted_name(f_name, l_name)
	print(f"\n你好,{formatted_name}")

練習8-6:城市名

def city_country(city, country):
	city_country_0 = f"{city}, {country}"
	return city_country_0.title()
attach_to = city_country('西安', '中國')
print(attach_to)
attach_to = city_country('tokyo', 'japanese')
print(attach_to)
attach_to = city_country('pattaya', 'thailand')
print(attach_to)
結果:
西安, 中國
Tokyo, Japanese
Pattaya, Thailand
[Finished in 0.1s]

練習8-7:專輯

def make_album(singer_name, album_name, number_song=None):
	albums = {
		'singer': singer_name,
		'album': album_name
		}
	if number_song:
		albums['number_song'] = number_song
	return albums#一定要注意return的縮排,它不是if的縮排,而是def函式的縮排。
singers = make_album('劉德華', '忘情水')
print(singers)
singers = make_album('張學友', '吻別')
print(singers)
singers = make_album('陳奕迅', '十年', number_song=12)
print(singers)
結果:
{'singer': '劉德華', 'album': '忘情水'}
{'singer': '張學友', 'album': '吻別'}
{'singer': '陳奕迅', 'album': '十年', 'number_song': 12}
[Finished in 0.1s]

練習8-8:使用者專輯

def make_album(singer_name, album_name, number_song=None):
	albums = {
		'singer': singer_name,
		'album': album_name
		}
	if number_song:
		albums['number_song'] = number_song
	return albums#一定要注意return的縮排,它不是if的縮排,而是def函式的縮排。
singers = make_album('劉德華', '忘情水')
print(singers)
singers = make_album('張學友', '吻別')
print(singers)
singers = make_album('陳奕迅', '十年', number_song=12)
print(singers)
print("\n你還知道哪些專輯和歌手")
while True:
	print("寫出你知道的歌手名字和專輯名字:")
	print("當輸入小寫字母'q'可以隨時退出")
	s_name = input("歌手名字:")
	if s_name == 'q':
		break
	a_name = input("專輯名字:")
	if a_name == 'q':
		break
	albums = make_album(s_name, a_name)
	print(albums)

8.4傳遞列表

def greet_users(names):#names形參
	for name in names:
		msg = f"Hello, {name.title()}"
		print(msg)
usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)#usernames實參
結果:
Hello, Hannah
Hello, Ty
Hello, Margot
[Finished in 0.1s]

8.4.1在函式中修改列表
對比兩段程式碼,不使用函式和使用函式。
不使用函式:

unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []
while unprinted_designs:
	current_design = unprinted_designs.pop()
	print(f"Printing model: {current_design}")
	completed_models.append(current_design)
print("\nThe following models have been printed:")
for completed_model in completed_models:
	print(completed_model)
結果:
Printing model:dodecahedron
Printing model:robot pendant
Printing model:phone case

The following models have been printed:
dodecahedron
robot pendant
phone case
[Finished in 0.1s]

下面是使用了函式的:

#第一個函式,列印列表和列印好的列表
def print_models(unprinted_designs, completed_models):
	while unprinted_designs:
		current_design = unprinted_designs.pop()
		print(f"Printing model:{current_design}")
		completed_models.append(current_design)
#第二個函式,顯示出列印好的列表中的每個模型
def show_completed_models(completed_models):
	print("\nThe following models have been printed:")
	for completed_model in completed_models:
		print(completed_model)
unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)
結果:
Printing model: dodecahedron
Printing model: robot pendant
Printing model: phone case

The following models have been printed:
dodecahedron
robot pendant
phone case
[Finished in 0.1s]

學習到這對python函式中的return的使用有點迷,查了查資料,現在簡單記錄下:
作用是函式執行結果返回給呼叫程式,可用來儲存進行再計算。也就是說當你需要某個函式的結果再向下延續使用時候必須有返回值。
對比下面兩段程式碼:
在這裡插入圖片描述
8.4.2禁止函式修改列表
當我們需要保留原有列表的時候可以採用先建立個列表副本,讓函式操作這個列表副本,這樣就保留了原有的列表。
函式(列表變數[:])
[:]切片法,列表中的全部元素。
把上面程式中的

print_models(unprinted_designs, completed_models)
改為
print_models(unprinted_designs[:], completed_models)

就可以實現函式對列表unprinted_designs的副本操作。
練習8-9:訊息

def show_messages(messages):
	for message in messages:
		print(message)
user_messages = ['我是tachyon', '我姓xue', '我來自中國']
show_messages(user_messages)
結果:
我是tachyon
我姓xue
我來自中國
[Finished in 0.1s]

練習8-10:傳送訊息

def show_messages(messages):
	for message in messages:
		print(message)
def send_messages(user_messages, sent_messages):
	while user_messages:
		current_message = user_messages.pop()
		print(current_message)
		sent_messages.append(current_message)
user_messages = ['我是tachyon', '我姓xue', '我來自中國']
show_messages(user_messages)
sent_messages = []
send_messages(user_messages, sent_messages)
print(user_messages)
print(sent_messages)
結果:
我是tachyon
我姓xue
我來自中國
我來自中國
我姓xue
我是tachyon
[]
['我來自中國', '我姓xue', '我是tachyon']
[Finished in 0.1s]

練習8-11:訊息歸檔

def show_messages(messages):
	for message in messages:
		print(message)
def send_messages(user_messages, sent_messages):
	while user_messages:
		current_message = user_messages.pop()
		print(current_message)
		sent_messages.append(current_message)
user_messages = ['我是tachyon', '我姓xue', '我來自中國']
show_messages(user_messages)
sent_messages = []
send_messages(user_messages[:], sent_messages)
print(user_messages)
print(sent_messages)
結果:
我是tachyon
我姓xue
我來自中國
我來自中國
我姓xue
我是tachyon
['我是tachyon', '我姓xue', '我來自中國']
['我來自中國', '我姓xue', '我是tachyon']
[Finished in 0.1s]

相關文章