Python—函数(基础)

1.定义函数

def hello(): #使用关键字def告诉Python我要定义一个名为hello的函数,即使我们定义的函数不需要参数,括号也必不可少,最后以冒号结尾
    '''简单的问候''' #此处的文本为文档字符串的注释,描述了函数是做什么的
    print('hello!') #本函数函数体内的唯一一行代码,打印hello

hello()#调用函数
>>>hello!

 

2.调用函数

等效的函数调用

  鉴于可混合使用位置实参、关键字实参和默认值,通常有多种等效的函数调用方式。

def pets(pet_name,animal_type='dog'):
#基于这种定义,在任何情况下都必须给pet_name提供实参;指定该实参时可以使用位置方式,也可以使用关键字方式。
#如果要描述的动物不是小狗,还必须在函数调用中给animal_type提供实参,同样,指定该实参时可以使用位置方式,也可以使用关键字方式。
#小面对这个函数的所有调用都可行: #一条名为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 #将姓名合二为一并在之间加了个空格并将结果存储到变量full_name中
    return full_name.title() #将full_name的首字母大写,结果返回到函数调用行

musician = get_formatted_name('jimi','hendrix')
print(musician)

>>>Jimi Hendrix

#在需要分别存储大量名和姓的大型程序中,类似这样的函数非常有用

没有返回值

  • 不写return
  • 只写return,不加返回值,结束函数
  • return None,不常用

返回一个值

  • 可以返回任何数据类型
  • 只要返回了就可以接收
  • 如果在函数体中有多个return,只执行一个return,return执行后该函数体结束

返回多个值

  • 多个返回值用多个变量接收,有多少返回值就用多少变量接收
  • 返回多个值用一个变量接收,得到的是一个元组

4.函数的参数

参数的主要作用就是向函数传递信息

def hello(username): #通过在括号内添加username,就可以让函数接受你给username指定的任何值
    '''简单的问候'''
    print('hello!,' + username.title() + '!')
    
hello('jason') #调用函数时,将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() + '.')

pets('harry','hamster') #在函数调用中,我们先指定名字,再指定动物类型。由于实参'harry'在前,这个值将存储到形参animal_type中;同理,'harry’将存储到形参pet_name中。
>>>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才能正确地将位置实参关联到形参

 

posted @ 2017-12-26 16:32  NeroCl  阅读(317)  评论(0编辑  收藏  举报