python入门与进阶篇(六)之高级语法及用法

    高级知识针对包、类库的开发者,函数只是一段可执行的代码 并不是对象,闭包、函数式编程

闭包=函数+环境变量

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

 

map

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))

 

map与lambda


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))

 

reduce

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  函数式编程 大数据编程模型 映射 归约 并行计算

 

filter

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





 

你可能感兴趣的:(python入门与进阶)