函数是 Python 中最主要也是最重要的代码组织和复用手段。作为最重要的原则,如果你要重复使用相同或非常类似的代码,就需要写一个函数。通过给函数起一个名字,还可以提高代码的可读性。
创建函数函数使用def关键字声明,使用return关键字返回结果:
def my_function(x, y, z=1.5):
if z > 1:
return z * (x + y)
else:
return z / (x + y)
函数可以拥有多个return语句,但是如果函数一个return语句都没有则返回None
函数参数函数的参数有位置参数(positional)和关键字参数(keyword),关键字参数通常用于指定默认值或可选参数
上面的函数中x,y是位置参数,z是关键字参数,x,y参数为必须要有的,z参数可以不要直接用默认值。
也就是说,该函数可以下面这两种方式进行调用:
my_function(5, 6, z=0.7) my_function(3.14, 7, 3.5) my_function(10, 20)
关键字参数必须在位置参数之后,位置参数可以不用写参数名称,直接填写参数值(不过这种情况下,参数的顺序需要和定义函数的参数顺序一致,如果不想一致必须使用参数名称以确定参数值是指的哪个参数)
my_function(x=5, y=6, z=7) my_function(y=6, x=5, z=7)变量作用域
一个程序的变量并不是在哪里都可以访问的,变量的作用域取决于家这个变量是在哪里赋值的
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称,两种最基本的作用域如下:
全局变量
局部变量
定义在函数内部的变量是局部变量,定义在函数外部的变量是全局变量
局部变量只能在函数内部访问,而全局变量可以在整个程序中访问,调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
#!/usr/bin/python # -*- coding: UTF-8 -*- total = 0 # 这是一个全局变量 # 可写函数说明 def sum( arg1, arg2 ): #返回2个参数的和." total = arg1 + arg2 # total在这里是局部变量. print "函数内是局部变量 : ", total return total #调用sum函数 sum( 10, 20 ) print "函数外是全局变量 : ", total
以上实例输出结果:
函数内是局部变量 : 30 函数外是全局变量 : 0
虽然可以在函数中对全局变量进行赋值操作,但是那些变量必须用 global 关键字声明成全局的才行:
In [168]: a = None In [169]: def bind_a_variable(): .....: global a .....: a = [] .....: bind_a_variable() .....: In [170]: print(a) []匿名函数
python 使用 lambda 来创建匿名函数。
lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
def short_function(x):
return x * 2
equiv_anon = lambda x: x * 2
本书其余部分一般将其称为 lambda 函数。它们在数据分析工作中非常方便,因为你会发现很多数据转换函数都以函数作为参数的。直接传入 lambda 函数比编写完整函数声明要少输入很多字(也更清晰),甚至比将 lambda 函数赋值给一个变量还要少输入很多字。看看下面这个简单得有些傻的例子:
def apply_to_list(some_list, f):
return [f(x) for x in some_list]
ints = [4, 0, 1, 5, 6]
apply_to_list(ints, lambda x: x * 2)
再来看另外一个例子。假设有一组字符串,你想要根据各字符串不同字母的数量对其进行排序:
In [177]: strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
这里,我们可以传入一个 lambda 函数到列表的sort方法:
In [178]: strings.sort(key=lambda x: len(set(list(x)))) In [179]: strings Out[179]: ['aaaa', 'foo', 'abab', 'bar', 'card']



