这一章我们开始说函数
函数
Python中定义函数的关键词是def,比如我们写一个Max(a,b)函数,用于返回两个数的较大的数。
def Max(a, b):
if a > b:
return a
else:
return b
# 调用
a = int(input())
b = int(input())
print(Max(a, b))
函数的意义
和循环一样,为了解决重复的劳动和大量重复的代码,函数应运而生。
参数的类型
上面这个函数中,a和b都是必选参数,就是调用的时候不可缺少的参数,如果调用的时候写成Max(a)或者Max(a, b, c)…等等参数不是两个整形参数时,就会报错。
函数中不仅仅只有必选参数,还有默认参数、可变参数、关键字参数等等。上面的代码就是关键参数。下面我们来看看其他参数
# 可变参数
# 1.默认参数要放在所有必选参数的后面
# 2.默认参数必须指向不变对象
def plus(a, b=2):
return a+b
# 调用
a = int(input()) # 假设输入1
print(plus(a)) # 输出结果为3
# 可变参数(很多时候定义函数不确定函数应含多少参数)
# 在参数前面加一个*,就变成了可变参数,可变参数接收到的值是一个tuple。
def plus(*numbers):
add = 0
for i in numbers:
add += i
return add
# 调用
print(plus(1, 2, 3, 6)) #输出12
print(plus(1, 2)) # 输出3
# 关键字参数
# 关键字函数类似于可变函数
# 关键字参数允许传入任意含参数名的参数,这些关键字参数在函数调用时自动组装为一个dict
def plus(**kw):
return kw
# 调用
print(plus())
print(plus(x=1,y=1))
print(zm=100, wzw=90, zk=60, yz=80)
# 输出的都是字典
这里输入的1,是第一段代码的输入。其他都可以对应着看了。
当然,看到这里还是看不出关键字参数怎么应用,这里给出个例子
def plus(x, y, z):
return x+y+z
dict_1 = {'x':100, 'y':90, 'z':80} # keys的名字要与定义函数时的参数名一致
print(plus(**dict_1))
当然,这些参数还可以混杂在一起使用
def plus(x,y,z=0,*args,**kw):
print('x=', x)
print('y=', y)
print('z=', z)
print('args=', args)
print('kw=', kw)
plus(1,2)
print()
plus(1,2,3,4,5,6)
print()
plus(1,2,3,4,5,k=1,m=1)
通过这几个调用,我们可以知道必选参数是必须要给值的,其他类型参数都可以不给值
当然,变量的话,还分局部变量和全局变量。这个概念学编程的人都应该非常清楚。
当变量处于被定义的函数内时,就是局部变量,只能在这个函数内被访问;当变量处于被定义的函数外时,就是全局变量,可以在程序中的任何位置被访问。
python中局部变量想定义成全局变量的关键词是global,这里就不给出代码了,可以自己试一试
函数的返回值
在上面的函数例子中,大多都含return,最后一个代码没有return。这里的return是返回值,下面用代码体验一下
# 用return的
def plus_1(a, b):
return a+b
print(plus_1(1, 2))
# 不用return的
def plus_2(a, b):
print(a+b)
plus_2(1, 2)
两段代码实现的功能是一样的,一个是有return的,一个是没有return的,这个看个人的习惯了,自己觉得各有优缺点吧。
return返回的值必须是一个,如果是多个,它会以元组的形式返回比如
def a():
return 1,'ad'
print(a())
再来,return不光能返回数值,还能返回函数。
def system(t, *numbers):
def plus():
add = 0
for i in numbers:
add += i
return add
def cheng():
temp = 1
for i in numbers:
temp *= i
return temp
if t == 1:
return plus()
else:
return cheng()
print(system(1, 2, 2, 3))
print(system(0, 2, 2, 3))
返回函数会让这段代码中的求和函数和累乘函数,根据输出的一个数值的不同而去执行不同函数。在这里plus()函数和cheng()函数我们称为 闭包 (内部函数)。
函数使用范围(同样适用于变量)
在Java中有private,public,protected的一些限制关键词,Python中用_
符号来解决了这一问题。
Python中正常写的函数就默认是public;首尾用双下划线(我也不知道叫啥,我就叫_是下划线了)来命名的函数__XXX__()
,是特殊变量,允许直接用,但会被用作特殊用途,我们自己编程一般不会用这种变量名;首部有单或双下划线的函数和变量是非公开的,不应该直接引用。_XXX()
是protected(单下划线),__XXX()
是private(双下划线)
加粗了不应该,是因为Python中没有一种可以真正完全限制访问private函数或变量,但良好的编程习惯是不直接引用private函数或变量的,因为private函数可以隐藏内部逻辑,使函数有更好的封装性,这个学过Java的人应该会了解到,Python同样是面对对象的语言,许多地方与Java是类似的。
我们把上段代码修改一下
def _plus(*numbers):
add = 0
for i in numbers:
add += i
return add
def _cheng(*numbers):
temp = 1
for i in numbers:
temp *= i
return temp
def system(t, *numbers):
if t == 1:
return _plus(*numbers)
else:
return _cheng(*numbers)
print(system(1, 2, 2, 3))
print(system(0, 2, 2, 3))
得出的结果虽然是一样的,但是这段程序块公开了函数system,而_plus()和_cheng()都会被隐藏起来,只知道system()函数调用了_plus()和_cheng()两个函数,而细节实现就会隐藏起来,是一个十分常用的代码封装方法。