一、函数传递实参的三种方式:
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('tiankang','wanglongtai')
输出示例:
I have a tiankang.
My tiankang's name is Wanglongtai.
当然了,函数可以多次调用,在此不再多说
再次强调,该方式的顺序非常重要,一定注意!
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='wanglongtai',animal_type='tiankang')
输出示例:
I have a tiankang.
My tiankang's name is Wanglongtai.
在该方式中顺序无关紧要,只要将想要关联的形参和实参对应好即可
补充:默认值;
再调用函数时,如果给了实参一个形参,那么将会使用实参,若没有给形参实参,则会使用默认值
代码如下:
def describe_pet(pet_name,animal_type='dog'):
print("\nI have a "+animal_type+".")
print("My "+animal_type+"'s name is "+pet_name.title()+".")
describe_pet(pet_name='tiankang')
输出示例:
I have a dog.
My dog's name is Tiankang.
以上代码使用了默认值,注意:在该代码中没有给pet_name这个形参加默认值,为了避免在实参传给函数形参时发生混乱,必须指定关键字
def describe_pet(pet_name,animal_type='dog'):
print("\nI have a "+animal_type+".")
print("My "+animal_type+"'s name is "+pet_name.title()+".")
describe_pet(pet_name='tiankang',animal_type='wanglongtai')
输出示例:
I have a wanglongtai.
My wanglongtai's name is Tiankang.
上面的代码给了animal_type实参,那么将实参传给对应的形参,而不使用默认值
注:1、使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参
2、实参与形参必须一一对应
下面演示如何将形参变成可选的:
def full_names(first_name,last_name,middle_name=''):#给middle-name空字符
if middle_name:#middle_name不是空字符为真
full_name=first_name+' '+middle_name+' '+last_name
else:
full_name=first_name+' '+last_name
return full_name.title()
name_1=full_names('abc','def')#未给middle_name传入实参
print(name_1)
name_2=full_names('abc','def','xyz')#给middle_name传入实参
print(name_2)
输出示例:
Abc Def
Abc Xyz Def
二、返回值
1、返回值为字典
下面是一段使用while 循环的描述音乐专辑的字典:
def make_album(singer_name,album_name,song_count=''):
if song_count:
info={'singer_name':singer_name,'album_name':album_name,
'song_count':song_count}
else:
info={'singer_name':singer_name,'album_name':album_name}
return info
while True:
print('\n请按照提示输入专辑信息!')
print("\n(enter 'q' at any times to quit)")
singer_name=input("请输入歌手名字:")
if singer_name=='q':
break
album_name=input("请输入专辑名称:")
if album_name=='q':
break
count=input("若知道专辑内的歌曲数,请输入'y',否则输入'n':")
if count=='q':
break
elif count=='y':
count_info=int(input("请输入歌曲数:"))
album_info=make_album(singer_name,album_name,count_info)
elif count=='n':
album_info=make_album(singer_name,album_name)
print(album_info)
输出示例:
请按照提示输入专辑信息!
(enter 'q' at any times to quit)
请输入歌手名字:王龙泰
请输入专辑名称:我是憨憨
若知道专辑内的歌曲数,请输入'y',否则输入'n':n
{'singer_name': '王龙泰', 'album_name': '我是憨憨'}
请按照提示输入专辑信息!
(enter 'q' at any times to quit)
请输入歌手名字:田康
请输入专辑名称:我不是憨憨
若知道专辑内的歌曲数,请输入'y',否则输入'n':y
请输入歌曲数:250
{'singer_name': '田康', 'album_name': '我不是憨憨', 'song_count': 250}
请按照提示输入专辑信息!
(enter 'q' at any times to quit)
请输入歌手名字:q
代码比较简单,不再解释了,嘿嘿
2、返回值为列表
def show_magicians(magicians):
for every_one in magicians:
print(every_one)#输出列表的每一个元素
def make_great(magicians):
great_magician=[]
while magicians:
new_message=magicians.pop()#从列表依次删除末尾元素给new_message
new_messages=new_message+" the Great"#添加“the Great”
great_magician.append(new_messages)
for new_every_one in great_magician:
magicians.append(new_every_one)
return magicians #返回一个新的列表
previous_magicians=['wangyanping','hanxiao','wanglongtai']
show_magicians(previous_magicians)
print("\n")
new_great_magicians=make_great(previous_magicians[:])
#利用分片使得原列表的元素不发生变化
show_magicians(new_great_magicians)
print("\n")
show_magicians(previous_magicians)#验证原列表未被改变
输出示例:
wangyanping
hanxiao
wanglongtai
wanglongtai the Great
hanxiao the Great
wangyanping the Great
wangyanping
hanxiao
wanglongtai
若将上述第20行代码更改成下列代码
new_great_magicians=make_great(previous_magicians)
//没有使用分片,则改变原列表,那么输出将变成:
wangyanping
hanxiao
wanglongtai
wanglongtai the Great
hanxiao the Great
wangyanping the Great
wanglongtai the Great
hanxiao the Great
wangyanping the Great
注:虽然向函数中传递原列表的副本(分片)不会改变源列表的内容,除非有必要需要传递副本,否则应该将原始列表传递给函数,因为使用原列表可以避免花时间和内存创建副本,从而提高效率,尤其在处理大型列表时
三、传递任意数量实参
1、代码如下:
def pizza_fun(*toppings):
for every in toppings:
print("-"+every)
pizza_fun('a','b')
print('\n')
pizza_fun('c','d','e')
输出示例:
('a', 'b')
-a
-b
('c', 'd', 'e')
-c
-d
-e
toppings的“”让python创建一个名为toppings的空元组,并将所有接受的值都封装在该元组中,就算传入的形参只有一个实参,也封装在元组中
2、结合位置实参和任意数量实参
代码如下:
def pizza_fun(size,*toppings):
print(toppings)
print("该披萨里面有"+str(size)+"种配料")
for every in toppings:
print("-"+every)
pizza_fun(2,'a','b')
print('\n')
pizza_fun(3,'c','d','e')
输出示例:
('a', 'b')
该披萨里面有2种配料
-a
-b
('c', 'd', 'e')
该披萨里面有3种配料
-c
-d
-e
注:一定要注意位置实参的顺序,尤其有多个位置实参时;
另外,一定将将接纳任意数量实参的形参放在最后
3、使用任意数量的关键字参数
def user_info(first_name,last_name,**user):
profile={}
profile["first_name"]=first_name
profile["last_name"]=last_name
for key,value in user.items():
profile[key]=value
return profile
user_profile=user_info('wang','yanping',location='shandong',field='auto')
print(user_profile)
输出示例:
{'first_name': 'wang', 'last_name': 'yanping',
'location': 'shandong', 'field': 'auto'}
四、将函数保存在模块
在此先进行下面一个操作:
将下列代码保存到文件pizza中:
def pizza_fun(size,*toppings):
print(toppings)
print("该披萨里面有"+str(size)+"种配料")
for every in toppings:
print("-"+every)
1、导入整个模块
>>>import pizza#导入pizza模块
>>>pizza.pizza_fun(2,'a','b')#使用pizza中的pizza_fun函数
输出示例:
('a', 'b')
该披萨里面有2种配料
-a
-b
2、导入特定函数:
如果模块中含有多个函数,而我们只使用其中一部分,则可用下面代码导入特定函数:
from module_name import function_1,function_2,function_3
例如:
>>>from pizza import pizza_fun#导入pizza_fun函数
>>>pizza_fun(2,'a','b')#导入特定函数无需使用‘.’
输出示例:
('a', 'b')
该披萨里面有2种配料
-a
-b
因为pizza模块只含有一个pizza_fun函数,所以只能导入一个
3、使用as给函数指定别名(只导入模块中一个函数时使用)
>>>from pizza import pizza_fun as pf
>>>pf(3,'a','b','c')
输出示例:
('a', 'b','c')
该披萨里面有3种配料
-a
-b
-c
4、使用as 给模块指定别名
>>>import pizza as p
>>>p.pizza_fun(4,'a','b','c','d')#此处要注意使用'.'分离模块别名与函数
输出示例:
('a', 'b','c','d')
该披萨里面有4种配料
-a
-b
-c
-d
5、导入模块所有函数:
使用"*"导入:
from module_name import *
该方法一般很少采用,只是在看别人代码时,如果有这样的代码,能够明白意思即可