python中的函数

  • List item

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值