python的入门7
1.闭包
1.闭包的定义
定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
结合这段简单的代码和定义来说明闭包:
如果在一个内部函数里:funY(y)就是这个内部函数,
对在外部作用域(但不是在全局作用域)的变量进行引用:x就是被引用的变量,x在外部作用域funX里面,但不在全局作用域里,
则这个内部函数funY就是一个闭包。
2.闭包的使用
1
输出结果为:
说明在使用闭包的时候,需要对i进行调用多次。在只调用一次的情况下,i的类型为function。
注:也不能在外部函数的外边对内部函数进行调用。
2.闭包中是不能修改外部作用域的局部变量的
错误案例:
这样的输出结果就会报错。
因为funY这个内部函数是不能调用外部函数里面的变量。
解决方法
1.容器类方法来解决
只要将x设定为一个容器就可以了。因为容器是被存放在栈里的。
输出结果为:
25
2.nonlocal关键字
作用:用来修改局部变量
nonlocal 修改局部变量时,采用LEGB原则
1.跳出当前函数这一层空间,到上一层寻找
2.如果上一层不存在该变量,继续向上一层寻找
3.如果最顶级也找不到了,直接报错
输出结果为:
25
2.匿名函数lambda
匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。所谓匿名函数,通俗地说就是没有名字的函数,lambda函数没有名字,是一种简单的、在同一行中定义函数的方法。
lambda函数一般功能简单:单行expression决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。由于其实现的功能一目了然,甚至不需要专门的名字来说明。
lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的运算结果就是函数的返回值。
lambda函数实际生成了一个lambda对象。
lambda表达式的基本语法如下:
lambda arg1,arg2,arg3… :<表达式>
arg1/arg2/arg3为函数的参数(函数输入)
表达式相当于函数体,运算结果是表达式的运算结果。
lambda x, y: xy;函数输入是x和y,输出是它们的积xy
lambda:None;函数没有输入参数,输出是None
lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
lambda **kwargs: 1;输入是任意键值对参数,输出是1
相当于下面这个函数:
1.将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
例如,执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add便成为具有加法功能的函数。例如,执行add(1,2),输出为3。
add=lambda x, y: x+y
add(1,2)
输出结果为:
3
3.特殊的内置函数
1.filert()
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
该接收两个参数,第一个为函数也可以为none,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
输出结果为:
[1,3,5,7,9]
相当于
print(list(filter(lambda x:x%2,range(10))))
2.map
1.map()的使用
map是python内置函数,会根据提供的函数对指定的序列做映射。
map()函数的格式是:
map(function,iterable,…)
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。
把函数依次作用在list中的每一个元素上,得到一个新的list并返回。注意,map不改变原list,而是返回一个新list。
def square(x):
return x ** 2
print(list(map(square,[1,2,3,4,5])))
输出结果为:
[1,4,9,16,25]
通过使用lambda匿名函数的方法使用map()函数:
map(lambda x, y: x+y,[1,3,5,7,9],[2,4,6,8,10])
输出结果为:
[3,7,11,15,19]
2.通过map实现类型转换
通过map还可以实现类型转换
将元组转换为list:
print(list(map(int,(1,2,3))))
输出结果为:
[1,2,3]
将字符串转换为list:
print(list(map(int,‘1234’)))
#输出结果为:
[1,2,3,4]