Python函数基础知识
2018-03-18 00:00
417 查看
摘要: 函数定义,函数调用,返回值,参数
返回简单值
只写return,不加返回值,结束函数
return None,不常用
只要返回了就可以接收
如果在函数体中有多个return,只执行一个return,return执行后该函数体结束
返回多个值用一个变量接收,得到的是一个元组
在函数hello()的定义中,变量username是一个形参——函数完成其工作所需的一项信息。
在代码hello('jason')中,值'jason'是一个实参——实参是调用函数时传递给函数的信息,我们调用函数时,需要将函数使用的信息放在括号内。在hello('jason')中,将实参'jason'传递给了函数hello(),这个值被存储在形参username中。
def name(*args): 参数名约定俗成*args,星号必须有,接收按位置传参的值,组成元组
def name(**kwargs): 参数名约定俗成**kwargs,接收按关键字传参的值,组成字典,key值是变量,不能是数字
定义形参时,必须先定义位置参数,再定义动态参数*args,后定义关键字参数/默认参数,最后定义**kwargs
位置实参的顺序很重要
使用位置实参来调用函数时,如果实参的顺序不正确,结果可能出乎意料:
1.定义函数
#使用关键字def告诉Python我要定义一个名为hello的函数,即使我们定义的函数不需要参数,括号也必不可少,最后以冒号结尾 def hello(): '''简单的问候''' #此处的文本为文档字符串的注释,描述了函数是做什么的 #本函数函数体内的唯一一行代码,打印hello print('hello!') #调用函数 hello()
2.调用函数
等效的函数调用
鉴于可混合使用位置实参、关键字实参和默认值,通常有多种等效的函数调用方式。#基于这种定义,在任何情况下都必须给pet_name提供实参;指定该实参时可以使用位置方式,也可以使用关键字方式。 #如果要描述的动物不是小狗,还必须在函数调用中给animal_type提供实参,同样,指定该实参时可以使用位置方式,也可以使用关键字方式。 def pets(pet_name,animal_type='dog'): #下面对这个函数的所有调用都可行: #一条名为Willie的小狗 pets('willie') pets(pet_name='willie') #一只名为Harry的仓鼠 pets('harry','hamster') pets(pet_name='harry',animal_type='hamster') pets(animal_type='hamster',pet_name='harry')
3.函数的返回值
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。返回值能将程序的大部分繁重工作移到函数中去完成,从而简化程序。返回简单值
#通过形参接收名和姓 def get_formatted_name(first_name,last_name): '''返回整洁的姓名''' full_name = first_name + ' ' + last_name return full_name.title() musician = get_formatted_name('jimi','hendrix') print(musician) #在需要分别存储大量名和姓的大型程序中,类似这样的函数非常有用
没有返回值
不写return只写return,不加返回值,结束函数
return None,不常用
返回一个值
可以返回任何数据类型只要返回了就可以接收
如果在函数体中有多个return,只执行一个return,return执行后该函数体结束
返回多个值
多个返回值用多个变量接收,有多少返回值就用多少变量接收返回多个值用一个变量接收,得到的是一个元组
4.函数的参数
参数的主要作用就是向函数传递信息def hello(username): '''简单的问候''' print('hello!,' + username.title() + '!') #调用函数时,将Jason指定给username,username就相当于一个函数体内的变量 hello('jason')
在函数hello()的定义中,变量username是一个形参——函数完成其工作所需的一项信息。
在代码hello('jason')中,值'jason'是一个实参——实参是调用函数时传递给函数的信息,我们调用函数时,需要将函数使用的信息放在括号内。在hello('jason')中,将实参'jason'传递给了函数hello(),这个值被存储在形参username中。
①形参
默认值
编写函数时,可以给每个形参指定默认值。在调用函数中给形参提供了实参时,Python将使用指定的实参值;否则将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可以简化函数调用,还可以清楚地指出函数的典型用法。例如,如果你发现调用pets()函数时,描述的大都是小狗,就可以将形参animal_type的默认值设置为'dog'。这样,调用pets()来描述小狗时,就可以不提供这种信息:def pets(pet_name,animal_type='dog'): #这里给形参animal_type指定了默认值'dog', '''显示宠物的信息''' print('\nI have a ' + animal_type + '.') print('My ' + animal_type + "'s name is " + pet_name.title() + '.') pets(pet_name='harry') #调用这个函数时,没有给animal_type指定值,Python将把这个形参设为'dog' >>>I have a dog. My dog's name is Harry. #注意,使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。这让Python依然能正确解读位置实参。
动态参数
动态参数可以接收任意多个参数,动态参数的使用方法:def name(*args): 参数名约定俗成*args,星号必须有,接收按位置传参的值,组成元组
def name(**kwargs): 参数名约定俗成**kwargs,接收按关键字传参的值,组成字典,key值是变量,不能是数字
定义形参时,必须先定义位置参数,再定义动态参数*args,后定义关键字参数/默认参数,最后定义**kwargs
②实参
函数的定义可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其中每个实参都有变量名和值组成。位置实参
调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。#这个函数指出一个宠物属于哪种动物以及它叫什么名字 #这个函数定义表明,它需要一种动物类别和一个名字 def pets(animal_type,pet_name): '''显示宠物的信息''' print('\nI have a ' + animal_type + '.') print('My ' + animal_type + "'s name is " + pet_name.title() + '.') pets('hamster','harry') >>>I have a hamster. My hamster's name is Harry.
#可以根据需要调用函数任意次 pets('dog','willie') >>>I have a dog. My dog's name is Willie.
#调用pets()时,需要按顺序提供一种动物类型和一个名字 #例如,在本函数中,实参’hamster‘存储在形参animal_type中,而实参’harry‘存储在形参pet_name中
位置实参的顺序很重要
使用位置实参来调用函数时,如果实参的顺序不正确,结果可能出乎意料:
def pets(animal_type,pet_name): '''显示宠物的信息''' print('\nI have a ' + animal_type + '.') print('My ' + animal_type + "'s name is " + pet_name.title() + '.') #在函数调用中,我们先指定名字,再指定动物类型。由于实参'harry'在前,这个值将存储到形参animal_type中;同理,'harry’将存储到形参pet_name中。 pets('harry','hamster') >>>I have a harry. My harry's name is Hamster. #调用函数时,请确认调用中实参的顺序与函数定义中形参的顺序一致。
关键字实参
关键字实参是传递给函数的名称—值对。直接在实参中将名称和值关联起来,因此向函数传递实参时不会混淆。关键字实参让无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。def pets(animal_type,pet_name): #函数未变动 '''显示宠物的信息''' print('\nI have a ' + animal_type + '.') print('My ' + animal_type + "'s name is " + pet_name.title() + '.') pets(animal_type='hamster',pet_name='harry') #调用这个函数时,我们向Python明确指出了各个实参对应的形参。 #关键字实参的顺序无关紧要
避免实参错误
提供的实参多余或少于函数完成工作所需的信息时,将出现实参不匹配错误。例如,如果调用pets()函数时没有指定任何实参,结果将会如何?def pets(pet_name,animal_type='dog'): '''显示宠物的信息''' print('\nI have a ' + animal_type + '.') print('My ' + animal_type + "'s name is " + pet_name.title() + '.') pets() #函数调用时提供的参数少于函数完成工作所需的参数,出现报错 >>> Traceback (most recent call last): File "pets.py", line 17, in <module> pets() TypeError: pets() missing 1 required positional argument: 'pet_name' #如果提供的实参太多,将出现类似的Traceback。
让实参变成可选的
有时候,需要让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。可使用默认值来让实参变成可选的。例如,假设我们要扩展函数get_formatted_name(),使其还处理中间名:def get_formatted_name(first_name,middle_name,last_name): '''返回整洁的姓名''' full_name = first_name + ' ' + middle_name + ' ' + last_name return full_name.title() musician = get_formatted_name('john','lee','hooker') print(musician) >>>John Lee Hooker #然而并非所有的人都有中间名,如果你调用了这个函数时只提供了名和姓,它将不能正确地运行。为让中间名变成可选的,可给middle_name指定一个默认值——空字符串。 #并在用户没有提供中间名时不使用这个实参 def get_formatted_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_formatted_name('john','lee','hooker') print(musician) >>>John Hooker Lee #调用这个函数时,如果只想指定名和姓,调用起来将非常简单。如果还要指定中间名,就必须确保它是最后一个实参,这样Python才能正确地将位置实参关联到形参
相关文章推荐
- Python函数基础知识
- python基础知识4(字典和函数)
- Python 专题一 函数的基础知识
- python基础知识之变量、语句、函数、模块
- Python基础知识:函数、三元函数、lambda函数
- python函数基础知识学习
- python基础知识-函数
- 关于python的基础知识2--函数
- Python基础知识3:函数、三元函数、lambda函数
- 基础知识(八)python文件操作相关函数
- Python自动化运维之函数基础知识
- python-基础知识之函数一
- Python基础知识(2)——函数
- python3函数基础知识一
- Python基础知识(四)--函数
- [Python学习] 专题一.函数的基础知识
- 关于python的基础知识4--函数
- 关于python的基础知识12--方法/函数
- 温故知新python3--基础知识2(函数基础)
- 温故知新python3--基础知识3(函数高级特性)