Python的函数以及模块

一、函数传递实参的三种方式:

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 *

该方法一般很少采用,只是在看别人代码时,如果有这样的代码,能够明白意思即可

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

致虚守静~归根复命

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值