高级知识针对包、类库的开发者,函数只是一段可执行的代码 并不是对象,闭包、函数式编程
a=10
def outer():
a=25
def inner(x):
print(a*x*x)
return inner
f=outer()
# __closure__内置变量
# 环境变量
print(f.__closure__[0].cell_contents) #25
f(2) # 100
def f1():
a=10
def f2():
# a此时被python认为是一个局部变量 局部变量是不影响外部变量的
a=20
print(a) #20
print(a) #10
f2()
print(a) #10
f1() # 10 20 10
#非闭包方式
x=0
def f1(num):
#global关键字可以使用全局变量
global x
y=x+num
x=y
return y
print(f1(3)) #3
print(f1(5)) #5
print(f1(8)) #8
#闭包方式
def f1():
x=0
def f2(steps):
#nonlocal关键字将变量强制为非本地的局部变量
nonlocal x
x=x+steps
return x
return f2
f=f1()
print(f(3)) #3
print(f(5)) #8
print(f(8)) #16
#匿名函数 lambda 不需要return 函数体只能是表达式
f=lambda x,y:x+y
print(f(2,3)) #5
x>y 返回x 否则返回y
条件为真的结果 if 条件 else 条件为假的结果
r=x if x>y else y
list_x=[1,2,3,4,5]
def squre(x):
return x*x
# for v in list_x:
# squre(v)
r=map(squre,list_x)
# [1, 4, 9, 16, 25]
print(list(r))
list_x=[1,2,3,4,5,6]
list_y=[1,2,3,4,5]
# 以参数较少的为准 list_x->x list_y->y
r=map(lambda x,y:x*x+y,list_x,list_y)
#[2, 6, 12, 20, 30]
print(list(r))
from functools import reduce
# reduce 连续计算
list1=['1','2','3','4','5']
#reduce(lambda表达式,参数序列,初始值)
# 执行过程 (((('aaa'+'1')+'2')+'3')+'4')+'5'
r=reduce(lambda x,y:x+y,list1,'aaa')
print(r) #aaa12345
#map/reduce 函数式编程 大数据编程模型 映射 归约 并行计算
list1=[1,0,0,1,1]
# 大小写的过滤 list2=['a','B','C','d']
#x>0 返回布尔值
r=filter(lambda x:x>0,list1) #filter 返回一个集合
print(list(r)) #[1, 1, 1]
命令式编程:def if else for 类 对象等
函数式编程:lambda:算子 map reduce filter 使代码更简洁
#装饰器
# 在每一个函数前面打印当前时间
import time
#func:核心函数
def decorate(func):
# *arg 可变参数 **kw:关键字参数组成的字典
def wrapper(*arg,**kw):
#unix时间戳:是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
print(time.time())
# 未知函数参数的函数的通用写法
func(*arg,**kw)
return wrapper
#1个参数 @装饰器名 语法糖
@decorate
def f1(func_name):
print("this is function1"+func_name)
#2个参数
@decorate
def f2(func_name1,func_name2):
print("this is function2"+func_name1)
print("this is function2"+func_name2)
# 带关键字参数的情况
@decorate
def f3(func_name1,func_name2,**kw):
print("this is function3"+func_name1)
print("this is function3"+func_name2)
print(kw) # {'a': 1, 'b': 2, 'c': 3}
# 无参
@decorate
def f4():
print("this is function4")
# 不改变原函数的调用方式
#1538815374.121 ,this is function1参数1
f1("参数1")
# 1538815374.122 this is function2参数1 this is function2参数2
f2("参数1","参数2")
#1538815374.122,this is function3参数1,this is function3参数2,{'a': 1, 'b': 2, 'c': 3}
f3("参数1","参数2",a=1,b=2,c=3)
#1538815374.125,this is function4
f4()
# 装饰器的应用:flask框架 @api.router使函数成为控制器
# 还有可以设置对外可以访问的接口还是需要登录才能访问的接口的装饰器 @auth.login.required