第三天
回顾上几章我们所学的分支和循环的内容,大家会发现代码量很大,有时候还会出现一些重复性的代码,这个时候我们就要考虑一下是不是有一种好的方式可以减少这些代码量和重复性的代码,这就是我们今天要讲的函数,函数就是可复用的功能块,可以让我们在任意需要的地方拿来用。
函数的定义
使用关键字def 来定义一个函数,这就是函数定义,而且定义以冒号结尾。
def 函数名(参数列表):
函数体
函数名:就是功能块的名字。函数名和参数列表一起构成了函数签名。
参数列表:小括号里面代表参数,参数像一个占位符,多个参数逗号隔开。
函数体:大括号里面是函数体,就是我们要实现某个功能的代码。
下面以获得a,b的较大者为例
def getMax(a, b):
if a > b:
print a, 'is max'
else:
print b, 'is max'
函数的参数
根据有没有参数可以分为无参函数、有参函数。
无参函数的定义与使用
定义:
def getMax():
a = int(input("请输入数字a"))
b = int(input("请输入数字b"))
if a > b:
print a, 'is max'
else:
print b, 'is max'
使用:
调用该函数,只需要函数名()即可
getMax()
有参函数的定义与使用
定义:
def getMax(a,b):
if a > b:
print a, 'is max'
else:
print b, 'is max'
调用:
getMax(3,9)
同时也可以根据有没有返回值分为无返回值函数和有返回值函数,关键字return。
无返回值函数
我们上述写的代码其实就是没有返回值return,是无返回值函数。
有返回值函数
def getMax(a,b):
if a > b:
max = a
else:
max = b
调用有返回值函数
max = getMax(3,6)
print(max)
参数的传递
值传递:
实际上就是将实际参数值的副本(复制品)传入函数,而参数本身不会受到任何影响。
值传递的方式,类似于《西游记》里的孙悟空,它复制一个假孙悟空,假孙悟空和真孙悟空能力相同。但不管这个假孙悟空遇到什么事,真孙悟空都不会受到任何影响。与此类似,传入函数的是实际参数值的复制品,不管在函数中对这个复制品如何操作,实际参数值本身不会受到任何影响。
def swap(a , b) :
# 下面代码实现a、b变量的值交换
a, b = b, a
print("swap函数里,a的值是", \
a, ";b的值是", b)
a = 6
b = 9
swap(a , b)
print("交换结束后,变量a的值是", \
a , ";变量b的值是", b)
swap函数里,a的值是 9 ;b的值是 6;
交换结束后,变量a的值是 6 ;变量b的值是 9。
从上面的运行结果来看,在 swap() 函数里,a 和 b 的值分别是 9、6,交换结束后,变量 a 和 b 的值依然是 6、9。从这个运行结果可以看出,程序中实际定义的变量 a 和 b,并不是 swap() 函数里的 a 和 b 。
引用传递:
如果实际参数的数据类型是可变对象(列表、字典),则函数参数的传递方式将采用引用传递方式。需要注意的是,引用传递方式的底层实现,采用的依然还是值传递的方式。
def swap(dw):
# 下面代码实现dw的a、b两个元素的值交换
dw['a'], dw['b'] = dw['b'], dw['a']
print("swap函数里,a元素的值是",\
dw['a'], ";b元素的值是", dw['b'])
dw = {'a': 6, 'b': 9}
swap(dw)
print("交换结束后,a元素的值是",\
dw['a'], ";b元素的值是", dw['b'])
swap函数里,a元素的值是 9 ;b元素的值是 6
交换结束后,a元素的值是 9 ;b元素的值是 6
从上面的运行结果来看,在 swap() 函数里,dw 字典的 a、b 两个元素的值被交换成功。不仅如此,当 swap() 函数执行结束后,主程序中 dw 字典的 a、b 两个元素的值也被交换了。这很容易造成一种错觉,即在调用 swap() 函数时,传入 swap() 函数的就是 dw 字典本身,而不是它的复制品。
Python中的变量
全局变量是定义在外面的变量;
局部变量是定义在一个函数内部的变量,局部变量只在函数体内部有效,出了函数体,外面是访问不到的。
另外这里强调一下:在Python中不可变的数据有以下几种整型、浮点型、字符串和元组。
以一道题为例子:
a = 10
def test():
a = 8;
print("在test方法中a的值是"+str(a))
test()
print("在test方法外a的值是"+str(a))
输出的结果
在test方法外a的值是10
在test方法中a的值是8
说明:
全局变量可以直接在函数体内容部使用的,你可以直接访问,但是注意的是,如果对于不可变类型的数据,如果在函数里面进行了赋值操作,则对外面的全局变量不产生影响,因为相当于新建了一个局部变量,只是名字和全局一样,而对于可变类型,如果使用赋值语句,同样对外部不产生影响,但是使用方法的话就会对外部产生影响。
global关键字:
上面说到,如果使用的是赋值语句,在函数内部相当于新建了一个变量,并且重新给了指向,但是有时候我们想把这个变量指向外部的全局变量,那么我们可以通过global关键字来表示我在函数里面的这个变量是使用的全局那个。
a = 10
def test():
global a
a = 8
print("在test方法中a的值是" + str(a))
test()
print("在test方法外a的值是" + str(a))
结果为:
在test方法中a的值是8
在test方法外a的值是8
网友评论