8.1定义函数
1.一个简单的 打招呼的函数
def greet_user():
#显示简单的问候语
name=input('what is your name?')
print('hello! '+name)
greet_user()
2.向函数传递信息
def greet_user(username):
print('hello! '+username.title())
greet_user('MingJing')
3.实参和形参
在上述代码中:
username是形参
形参函数完成其工作时所需的信息
‘MingJing’是实参;
实参是调用函数时传递给函数的信息
练习
喜欢的图书 :编写一个名为favorite_book() 的函数,其中包含一个名为title 的形参。这个函数打印一条消息,如One of my favorite books is Alice in Wonderland 。调用这个函数,并将一本图书的名称作为实参传递给它。
def favorite_book(bookname):
print('one of my favotite books is '+bookname.title())
bookname=input('输入你喜欢的书名')
favorite_book(bookname)
8.2 传递实参
def describe_pet(pet_name,animal_type='dog'):
print('\n I have a '+animal_type+'.')
print('My '+animal_type+"'s name is "+pet_name.title()+'.')
describe_pet(pet_name='willie')
describe_pet(pet_name='harry',animal_type='hamster')
describe_pet(animal_type='hamster',pet_name='harry')
运行结果:
练习
1.T恤 :编写一个名为make_shirt() 的函数,它接受一个尺码以及要印到T恤上的字样。这个函数应打印一个句子,概要地说明T恤的尺码和字样。 使用位置实参调用这个函数来制作一件T恤;再使用关键字实参来调用这个函数
def make_shirt(size='m',font='hello '):
print('size of the T-shirt is '+size+'. Font is '+font)
make_shirt()
2.大号T恤 :修改函数make_shirt() ,使其在默认情况下制作一件印有字样“I love Python”的大号T恤。调用这个函数来制作如下T恤:一件印有默认字样的大号T 恤、一件印有默认字样的中号T恤和一件印有其他字样的T恤(尺码无关紧要)
def make_shirt(size='l',font='i love python'):
print('size of the T-shirt is '+size+'. Font is '+font)
make_shirt()
make_shirt(size='m',)
make_shirt('s','i love huahua')
3.城市 :编写一个名为describe_city() 的函数,它接受一座城市的名字以及该城市所属的国家。这个函数应打印一个简单的句子,如Reykjavik is in Iceland 。给用于存储国家的形参指定默认值。为三座不同的城市调用这个函数,且其中至少有一座城市不属于默认国家。
def describe_city(city_name='paris',country='France'):
print(city_name+' is in '+country)
descirbe_city()
describe_city('Rekyjavik','Iceland')
describe_city(city_name='Wuhan',country='China')
运行结果:
8.3返回值
1.让实参变成可选的
并非所有的人都有中间名,但如果你调用这个函数时只提供了名和姓,它将不能正确地运行。为让中间名变成可选的,可给实参middle_name 指定一个默认值——空字 符串,并在用户没有提供中间名时不使用这个实参。为让get_name() 在没有提供中间名时依然可行,可给实参middle_name 指定一个默认值——空字符串, 并将其移到形参列表的末尾:
def get_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()
musician=get_name('jimmy','hendrix')
print(musician)
musician=get_name('john','hooker','lee')
print(musician)
运行结果:
2.返回字典
def build_person(first_name,last_name,age=''):
person={'first':first_name,'last':last_name}
if age:
person['age']=age
return person
musician=build_person('chenyu','hua')
print(musician)
musician=build_person('chenyu','hua',age=27)
print(musician)
运行结果:
3.使用函数和while循环
问候用户
def get_name(first_name,last_name):
full_name=first_name+' '+last_name
return full_name.title()
while True:
print('\n Please tell me your name:')
print("(enter 'quit' to quit)")
f_name=input('enter your first name: ')
if f_name=='quit':
break
l_name=input('enter your last name: ')
if l_name=='quit':
break;
name=get_name(f_name,l_name)
print('\n Hello, '+name+' !')
练习
1.专辑 :编写一个名为make_album() 的函数,它创建一个描述音乐专辑的字典。这个函数应接受歌手的名字和专辑名,并返回一个包含这两项信息的字典。使 用这个函数创建三个表示不同专辑的字典,并打印每个返回的值,以核实字典正确地存储了专辑的信息。
def make_album(name,album):
albums={'name':name,'album':album}
return albums
album_0=make_album('huachenyu','yilei')
album_1=make_album('TaylorSwift','lover')
album_2=make_album('duizhang','yexing')
print(album_0)
print(album_1)
print(album_2)
运行结果:
给函数make_album() 添加一个可选形参,以便能够存储专辑包含的歌曲数。如果调用这个函数时指定了歌曲数,就将这个值添加到表示专辑的字典中。调用这个 函数,并至少在一次调用中指定专辑包含的歌曲数。
def make_album(name,album,num=''):
albums={'name':name,'album':album}
if num:
albums['num']=num
return albums
album_0=make_album('huachenyu','yilei')
album_1=make_album('TaylorSwift','lover','1')
album_2=make_album('duizhang','yexing','5')
print(album_0)
print(album_1)
print(album_2)
8.4传递列表
1.简单例子
和列表中每一个人问好。
def greet_users(names):
for name in names:
msg='hello,'+name.title()+'!'
print(msg)
usernames=['huahua','E.T.','mingjing']
greet_users(usernames)
运行结果:
2.在函数中修改列表
将列表传递给函数后,函数就可对其进行修改。
在函数中对这个列表所做的任何修改都是永久性的。
3D打印机的代码:
unprinted_designs=['iphone','robot','haier']
completed_models=[]
while unprinted_designs:
current_design=unprinted_designs.pop()
print('Printing models:'+current_design)
completed_models.append(current_design)
print('\n The following models have been printed:')
for completed_model in completed_models:
print(completed_model)
运行结果:
两个操作:将当前在打印模型的操作 和遍历已完成模型的操作
它们将编写两个函数,使上述代码更加有效率。
def print_models(unprinted_designs,completed_models):
while unprinted_designs:
current_design=unprinted_designs.pop()
completed_models.append(current_design)
def show_completed_models(completed_models):
for completed_model in completed_models:
print(completed_model)
unprinted_designs=['iphone','robot','haier']
completed_models=[]
print_models(unprinted_designs,completed_models)
show_completed_models(completed_models)
2.禁止函数修改列表
将列表的副本传递给函数
function_name(list_name[:])
切片表示法[:] 创建列表的副本。
在print_models.py中,如果不想清空未打印的设计列表,可像下面这样调用print_models() :
print_models(unprinted_designs[:], completed_models)
练习
1.魔术师 :创建一个包含魔术师名字的列表,并将其传递给一个名为show_magicians() 的函数,这个函数打印列表中每个魔术师的名字。
magicians=['hudini','harry','liuqian']
def show_magicians(magicians):
for magician in magicians:
print(magician)
show_magicians(magicians)
2 . 了不起的魔术师 :在你为完成练习8-9而编写的程序中,编写一个名为make_great() 的函数,对魔术师列表进行修改,在每个魔术师的名字中都加入字样“the Great”。调用函数show_magicians() ,确认魔术师列表确实变了。
magicians=['hudini','harry','liuqian']
def show_magicians(magicians):
for magician in magicians:
magician='The Great '+magician
print(magician)
show_magicians(magicians)
3.不变的魔术师 :修改你为完成练习8-10而编写的程序,在调用函数make_great() 时,向它传递魔术师列表的副本。由于不想修改原始列表,请返回修改后的 列表,并将其存储到另一个列表中。分别使用这两个列表来调用show_magicians() ,确认一个列表包含的是原来的魔术师名字,而另一个列表包含的是添加了字 样“the Great”的魔术师名字。
magicians=['hudini','harry','liuqian']
great_magicians=[]
def show_magicians(magicians):
for magician in magicians:
magician='The Great '+magician
great_magicians.append(magician)
print(magician)
show_magicians(magicians[:])
print(magicians)
print(great_magicians)
运行结果: