- List item
python中的函数特性
python中的函数和其他编译语言中函数的区别
1.在python中,def是可执行语句,这意味着函数直到被调用前,都是不存在的。当程序调用函数时,def语句才会创建一个新的函数对象,并赋予名字
2.python是dynamically typed的,可以接受任何数据类型(整型、浮点、字符串等)作为函数入参,在编程语言中我们称之为多态。
3.python函数的另一大特性,是python函数支持嵌套,函数里面可以包含一个函数。
4.和其他语言相比,python中的函数参数可以设定默认值。
5.函数可以赋予变量
6.函数可以作为参数传递给函数
def f1():
print('hello')
def f2():
print('world')
f2()
f1()
#输出
hello
world
这里函数f1()的内部,又定义了函数f2()。在调用f1()时,会先打印字符串‘hello’,然后f1()内部在调用f2(),打印字符’world’,函数嵌套第一可以保护内部函数的隐私,内部函数只能被外部函数调用和访问,不会暴露在全局域中;第二时合理使用函数嵌套,可以提高运行效率。
函数变量作用域
1.如果变量定义在函数内部,成为局部变量,只在内部有效,一旦函数执行完毕,局部变量就会被收回,无法访问。
2.全局变量是定义在整个文件层次商的,如下代码:
MIN_VALUE=1
MAX_VALUE=10
def validation_check(value):
if value< MIN_VALUE or value>MAX_VALUE:
raise Exception('validation check fails')
这里的MIN_VALUE和MAX_VALUE就是全局变量,可以在文件内的任何地方被访问,当在可以在函数内部访问,不过不能在函数内部随意改变全局变量的值,如果需要改变需要在在前面加上global声明使用的是全局变量。
MIN_VALUE=1
MAX_VALUE=10
def validation_check(value):
global MIN_VALUE
MIN_VALUE+=1
return MIN_VALUE
validation_check(5)
3.如果遇到函数内部局部变量和全局变量同名的情况,那么在函数内部,局部变量会覆盖全局变量
4.对于嵌套函数来说,内部函数可以访问外部函数定义的变量,但是不可以修改,若要修改必须在变量前加上nonlocal这个关键字
def outer():
x='local'
def inner():
nonlocal x
x='nonlocal'
print('inner:',x)
inner()
print('outer:',x)
outer()
#输出
inner:nonlocal
outer:nonlocal
闭包(closure)
闭包和嵌套函数类似,不同的是,这里外部函数返回的是一个函数,而不是一个具体的值。返回的函数常赋予一个变量,这个变量可以在后面继续执行调用。使用闭包可以让程序变得简单易读。闭包常常和装饰器(decorator)一起使用。
def power(x):
def expone(y):
return y**X
return expone
square=power(2)
cube=power(3)
print(square(2)) #2的2次方
print(cube(3)) #2的3次方
匿名函数
匿名函数格式:lamdb argument1,argument2,…argumentN:expression
square=lamdb x:x**2
square(3)
#输出
9
def square(x):
return x**2
square(3)
#输出
9
可以看出,匿名函数和常规函数一样,返回的都是一个函数对象(function object),他们用法极其相似,但区别如下:
1.lambda 是一个表达式(expression),而不是一个语句(statement)
表达式:就是一系列公式去表达一个东西,比如:x+2,x/2
语句:则是完成了某些功能,比如赋值语句x=1完成了赋值,print语句完成打印,等
lamdda可以用在一些def不能用到的地方,如list:
[(lamdb x:x**2) for x in rang(10)]
用在函数参数:l=[(1,20),(2,23)]
l.sort(key=lambda x:x[1])
2.lamdb的主体只有一行简单的表达式,并不能扩展成一个多行的代码
为什么要使用匿名函数?
1.减少代码的重复性
2.模块化代码
python中map()、filter()、reduce()常结合匿名函数使用
1、map(function,iterable)
l=[1,2,3,4,5]
nuw_list=map(lamdba x:x*2,l)
#结果为:[2,4,6,8,10]
2、filter(function,iterable)
filter函数主要是使用function来进行判断,并返回True or False,最终将返回True的元素组成一个新的可遍历的集合
l=[1,2,3,4,5]
nuw_list=filter(lamdba x:x/2==0,l)
#结果为:[2,4,
3 、reduce(function,iterable)
reduce函数主要对一个集合做一些累积操作,function同样是一个函数对象,规定他有2个参数,表示对iterable中的每个元素以及上一次调用后的结果,运用function进行计算,最后返回一个单独的数值。
l=[1,2,3,4,5]
product=reduce(lamdba x,y:x*y,l)