Python—函数

一.引言

函数是一段具有特定功能的、可重用的语句组,用函数名来表示并通过函数名进行功能调用。
函数也可以看作是一段具有名字的子程序,可以在需要的地方调用执行,不需要在每个执行地方重复编写这些语句。将可能需要反复执行的代码封装为函数,不仅可以实现代码的复用,更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调用均受到影响。
每次使用函数可以提供不同的参数作为输入,以实现对不同数据的处理;函数执行后,还可以反馈相应的处理结果。

二.定义

1.函数分类:
系统自带函数: Python内嵌的函数(如abs()、eval())、 Python标准库中的函数(如math库中的sqrt())等
自定义函数:用户自己编写的

2.使用函数目的:降低编程的难度,代码重用

3.函数定义:使用def语句

def <函数名>(<参数列表>):
 '''注释'''                         #对函数的说明
 <函数体>
    return <返回值列表>    #仅在需要返回结果时使用

 

4.函数组成

函数名:可以是任何有效的Python标识符

参数列表:是调用函数时传递给它的值(可以由多个,一个,或者零个参数组成,当有多个参数时,各个参数用逗号分隔)
参数个数大于等于零,多个参数由逗号分隔

函数体:函数被调用时执行的代码,由一个或多个语句组成

形式参数:定义函数时,函数名后面圆括号中的变量,简称“形参”。形参只在函数内部有效。

实际参数:调用函数时,函数名后面圆括号中的变量,简称 “实参”。

函数调用的一般形式:<函数名>([参数列表])

 

 

例:

 

函数功能:将传给它的数值增1,返回增加后的值
return语句:结束函数调用,并将结果返回给调用者
return语句是可选的,可出现在函数体的任意位置
没有return语句,函数在函数体结束位置将控制权返回给调用方

 

三.实例

例子1:编写一个程序打印“ Happy Birthday” 的歌词
标准的歌词:
Happy Birthday to you!
Happy Birthday to you!
Happy Birthday, dear <insert-name>
Happy Birthday to you!

 

方法1:使用四个print语句
给Mike唱生日快乐歌的程序代码:

 

方法2:使用函数来打印歌词的第一、二、四行
定义函数happy()
定义函数实现为Mike打印生日歌的歌词

 

 

例子2:写出给Mike和Lily唱生日歌的程序
给Lily唱生日歌的程序

 

 

例子3:简化程序,编写通用函数唱生日歌
person参数:此变量在函数被调用时初始化

sing()函数只需在函数调用的时候提供名字作为参数
如:sing(“Mike”)

 

综合例子:利用sing(),为Mike、 Lily和Elmer三个人唱生日歌。

 

关于注释:在定义函数时,开头部分的注释并不是必需的,但是如果为函数的定义加上这段注释的话,可以为用户提供友好的提示和使用帮助。

 

例如,把上述唱生日歌函数改写如下:

 

关于函数定义的说明:

函数形参不需要声明其类型,也不需要指定函数返回值类型;

即使该函数不需要接收任何参数,也必须保留一对空的圆括号;

括号后面的冒号必不可少;

函数体相对于def关键字必须保持一定的空格缩进。

 

例如,

编写函数,接收两个整数,并输出其中最大数。

 

这个程序并不是很好,如果输入的参数不支持比较运算,会出错。 可结合异常处理机制来解决。

例1:编写函数计算圆的面积。

 

 

形参与实参

函数定义时括弧内为形参(Parameters),一个函数可以没有形参,但是括弧必须要有,表示该函数不接受参数。

函数调用时向其传递实参(arguments),将实参的值或引用传递给形参。

在函数内直接修改形参的值不影响实参。

绝大多数情况下,在函数内部直接修改形参的值不会影响实参。

def addOne(a):

      print(a)

      a += 1

      print(a)

 

如果传递给函数的是Python可变序列,并且在函数内部使用下标或其它方式为可变序列增加、删除元素或修改元素值时,修改后的结果是可以反映到函数之外的,即实参也得到了相应的修改。

 >>> def modify(v): #修改列表元素值
 v[0] = v[0]+1
>>> a = [2]
>>> modify(a)
>>> a
[3]

 

在Python中,函数参数有很多种:可以为普通参数、默认值参数、关键参数、可变长度参数等等。
Python函数的定义非常灵活,在定义函数时不需要指定形参的类型,也不需要指定函数的返回值类型,由函数中的return语句来决定
如果函数中没有return语句或者没有执行到return语句而返回或者执行了不带任何值的return语句,则默认返回空值None
函数编写如果有问题,只有在调用时才能被发现,传递某些参数时执行正确,而传递另一些类型的参数时则出现错误。

 

默认值参数

def 函数名(形参名=默认值,……)
        函数体
默认值参数必须出现在函数参数列表的最右端,且任何一个默认值参数右边不能有非默认值参数。

 

调用带有默认值参数的函数时,可以不对默认值参数进行赋值,也可以赋值,具有较大的灵活性。

可以使用函数名.__defaults__查看默认参数的当前值

 

关键参数

关键参数主要指实参,即调用函数时的参数传递方式,与函数定义无关。
通过关键参数传递,实参顺序可以和形参顺序不一致,但不影响传递结果,避免了用户需要牢记位置参数顺序的麻烦。

 

 

可变长度的参数

可变长度参数主要有两种形式:*parameter和**parameter,前者用来接受多个实参并将其放在一个元组中,后者接受字典形式的实参。

 

 

 

案例,编写函数,接收任意多个实数,返回一个元组,其中第一个元素为所有参数的平均值,其他元素为所有参数中大于平均值的实数。

 

参数的序列解包

传递参数时,可以通过在实参序列前加星号将其解包,然后传递给多个单变量形参。

 

return语句

return语句用来从一个函数中返回,即跳出函数,同时可用return语句从函数中返回一个任意类型的值

不论return语句出现在函数的什么位置,一旦执行将直接结束函数。

如果函数没有return语句或者执行了不返回任何值的return语句,Python将认为该函数以return None结束。

def fmax ( x, y ):

      if x>y:

      return x

      else:

      return y

在调用内置数据类型的方法时,一定要注意该方法有没有返回值。

变量的作用域

变量起作用的范围称为变量的作用域。 一个变量在函数外部定义和在函数内部定义,其作用域是不同的。

函数内部定义的变量一般为局部变量,不属于任何函数的变量一般为全局变量。

局部变量的引用比全局变量速度快。 globals(),locals()

 

局部变量与全局变量

在函数内定义的变量只在该函数内起作用,称为局部变量

函数结束时,其局部变量被自动删除

如果想要在函数内部给一个定义在函数外的变量赋值,那么这个变量就不能是局部的,其作用域必须为全局的,

能够同时作用于函数内外,称为全局变量,可以通过global来定义。

 

全局变量

global定义全局变量:

a,一个变量已在函数外定义,如果在函数内需要为这个变量赋值,并要将这个赋值结果反映到函数外,可以在函数内用global声明这个变量,将其定义为全局变量。

b,在函数内部直接将一个变量声明为全局变量,在函数外没有声明,在调用这个函数之后,将增加为新的全局变量。

 

posted @ 2018-05-29 12:54  王陸  阅读(1859)  评论(0编辑  收藏  举报