函数是python中最重要,最基础的代码组织和代码复用方式。根据经验,如果你需要多次重复相同或类似的代码,就非常值得写一个可复用的函数。通过给一组python语句一个函数名,形成的函数可以使你的代码更加可读。
函数声明时使用def关键字,返回时使用return关键字:
def function(x,y,z=1.5):
if z > 1:
return z * (x+y)
else:
return z / (x+y)
有多条返回语句是没有问题的。如果python达到函数的尾部时仍然没有遇到return语句,就会自动返回None。
每个函数都可以有位置参数和关键字参数。关键字参数最常用于指定默认值或者可选参数。在前面的函数中,x和y是位置参数,z是关键字参数。这意味着函数可以通过以下任意一种方式进行调用:
function(5,6,z=0.7)
0.06363636363636363
function(10,20)
45.0
function(3.14,7,3.5)
35.49
函数参数的主要限制是关键字参数必须跟在位置参数后。你可以按照任意顺序指定关键字参数,这可以让你不必强行记住函数参数的顺序,而只需要参数名指定。也可以使用关键字参数向位置参数传参,例如:
function(x = 5,y = 6, z = 7)
77
function(y = 6,x = 5, z = 7)
77
在部分场景中,这样做有助于代码可读性。
函数有两种连接变量的方式:全局和本地。在python中另一种更贴切地描述变量作用于域的名称是命名空间。在函数内部,任意变量都默认分配到本地命名空间。本地命名空间是在函数被调用时生成的,并没有立即由函数的参数填充。当函数执行结束后,本地命名空间就会被销毁,例如以下函数:
def func():
a = []
for i in range(5):
a.append(i)
a
NameError Traceback (most recent call last)
<ipython-input-2-3f786850e387> in <module>()
----> 1 a
NameError: name 'a' is not defined
当调用func()时,空的列表a会被创建,五个元素被添加到列表,之后a会在函数退出时被销毁,假设我们像下面这样声明a:
a = []
def func():
for i in range(5):
a.append(i)
a
[]
在函数外部给变量赋值是可以的,但是那些变量必须使用global关键字声明为全局变量:
a = None
def a_variable():
global a
a = []
a_variable()
a
[]
global关键字的用法是通常全局变量用来存储系统中的某些状态。如果你发现你大量的使用了全局变量,可能表面你需要面向对象编程(使用类)
python编程时最方便的就是使用简单语法就可以从函数中返回多个值,例如:
def f():
a =5
b = 6
c = 7
return a,b,c
a,b,c = f()
a,b,c
(5, 6, 7)
在数据分析以及许多应用中,你可能会发现经常需要返回多个值。这里实质上是返回了一个对象,也就是元组,而元组之后又被拆包为多个结果变量。当然,我们也可以使用下面的代码来替代前面的例子:
return_value = f()
return_value
(5, 6, 7)
在这个例子中,return_value是一个包含3个元素的元组。像之前那样一次返回多个值还有一种潜在的,更有吸引力的实现:
def f():
a = 5
b = 6
c = 7
return {'a':a,'b':b,'c':c}
return_value = f()
return_value
{'a': 5, 'b': 6, 'c': 7}
具体用哪种技术取决于你需要做什么。