python函数式编程

1.  匿名函数和有名函数  c1.py

# 匿名函数
    # 1.lambda 关键字,
    # 2.没有return;只能为一个表达式,不能为代码块(例如:a = x+y ,就会报错)
    # 3.没有名字,
    # 4.调用时赋值给一个变量,同过该变量来调用
    # 5.由于匿名函数后只能接一个表达式,不能接代码,有了三元表达式就能实现简单的if else 的实现了

# 有名函数
def add_num(x,y):
    return x+y
# 匿名函数
f = lambda x,y: x+y

# print(add_num(1,2))
# print(f(1,2))

# 三元表达式
# x,y  x大于y x 否则 y

# 在js 中为 x > y ? x : y

# 在Python中   条件为真时返回结果 if 条件判断 else 条件为假时返回结果 ('x if x > y else y'这个只是一个表达式,结果需要用一个变量接收一下)
x = 2
y = 3
r = x if x > y else y
print(r)

2.  map  c2.py

# map
    # 接收两个参数:第一个为一个函数,第二个是一个序列(可以传入多个列表)
    # map 结合lambda使用,使某些问题更简单化了 (例如:下边的球平方)
    # lambda 传入变量的个数和map第二个参数的列表个数须相同,内部个数可以不等,但最终结果取最小的个数
    # 不论是map还是lambada都不能提高代码得运行效率,只能使代码更加简洁

# 问题:求一组数的平方
list_x = [1,2,3,4,5,6,7,8]
list_x1 = [1,2,3,4,5,6,7,8]
list_x11 = [1,2,3,4]
# list_y = [1, 4, 9, 16, 25, 36, 49, 64]  铜鼓map获得的,相当于list_x的每一项的映射

def square(x):
    return x*x

# 思路一:通过for in
# for x in list_x:
#     square(x)

# 思路二:通过map实现
r = map(square,list_x)
print(r)
print(list(r))

# 利用map对其进行简化
r_lambda = map(lambda x: x*x, list_x)
print(list(r_lambda))

# 传入多个参数
r_lambda1 = map(lambda x,y: x*x + y, list_x,list_x1)
print(list(r_lambda1))

# 传入多个参数(内部个数不等,取最少的展示)
r_lambda11 = map(lambda x,y: x*x + y, list_x,list_x11)
print(list(r_lambda11))

3.  reduce  c3.py

from functools import reduce

# reduce 
    # 不是全局的,须要从functools中引入
    # 第三个参数是初始值

# 连续计算,连续调用lambda  
    # (第一次会将x传为1,y传为2;每次lambda表达式的计算结果作为下一次的lambda的x参与计算,一直到计算结束)
list_x = [1,2,3,4,5,6,7,8]

r = reduce(lambda x,y: x+y,list_x)

print(r)

# 还可以像这样传入两个,并不只是能计算加法其它别的运算也可
a = (0,0)
ar = reduce(lambda x,y: (x,x*x+y),(1,2))
print(ar)

4.  filter  c4.py


# filter 过滤
    # filter 返回必须能是真和假

list_x = [1,0,1,0,0,1]

r = filter(lambda x: True if x == 1 else False,list_x)
# 简化写法
# r = filter(lambda x: x,list_x)
print(r)
print(list(r))

5.  c5.py


# 命令式编程
    # def(函数);if else(条件判断);for(循环)
    # 用的比较多

# 函数式编程
    # map ,reduce ,filter ,lambda (算子) ,
    # 不太建议全盘使用函数式编程,可以在命令式编程中穿插使用,简化代码

6.  装饰器  c6.py

import time
# 装饰器

# 打印的时间戳,单位是秒

def say1():
    print('hello1')

def say2():
    print('hello2')

# 对修改时封闭的,对扩展是开放的
# 通过将函数作为参数传入一个函数的方式

# 现在这种方式不太好,相当远新增加了一个函数
# 打印时间这个函数本来就属于每个函数自己的方法
# 更优雅的方式,就得通过装饰器来实现了
def print_time(func):
    print(time.time())
    func()

print_time(say1)
print_time(say2)

7.  封装  c7.py

import time

# @ AOP思想

# 封装的基本原则:可以定义复杂,调用简单;不能接受调用复杂  (定义只一遍就好,复杂点没关系,但调用一定得简单)

# 通过@语法糖,来实现原来的调用方式不变,将新扩展的功能也能执行

# 多个函数调用一个装饰器,但每个函数可以接收不同个数的参数
# 关键字参数

def decorator(func):
    def wrapper():
        print(time.time())
        func()
    return wrapper
@decorator
def f():
    print('hello')


# 不用装饰器时,感觉挺麻烦的,先把函数当参数传入,再用一个变量接收返回的函数,再将这个函数执行
# f1 = decorator(f)
# f1()

# 用了装饰器,原来的执行代码不变
f()

def decorator11(func):
    def wrapper11(param):
        print(time.time())
        func(param)
    return wrapper11
@decorator11
def f11(param):
    print('hello ' + param)

# 如果需要传入一个参数
f11('world')

print('~~~不同个数参数~~~')

# 可以通过 *arg 传入多个参数
def decorator22(func):
    def wrapper22(*arg,**kw):
        print(time.time())
        func(*arg,**kw)
    return wrapper22
@decorator22
def f21(param):
    print('hello ' + param)
@decorator22
def f22(param1,param2):
    print('hello ' + param1)
    print('hello ' + param2)
@decorator22
def f23(param1,param2,**kw):
    # 不过还是比较推荐使用明确参数;但当不知道有哪些参数使,可以使用这种模糊的方式
    print('hello ' + param1)
    print('hello ' + param2)
    # 这里print的是kw而不是**kw
    print(kw)


f21('world')
f22('你好','you')
f23('sky','sun',a=1,b='flower',c='tree',d='air')

(备注:以上内容来自七月老师的学习笔记,仅作为学习使用)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章