函数式编程

lambda表达式

函数: 最大程度复用代码

存在问题: 如果函数很小,很短,则会造成啰嗦
如果函数被调用次数少,则会造成浪费
对于阅读者来说,造成阅读流程的被迫中断

# 1. 以lambda开头
# 2. 紧跟一定的参数(如果有的话)
# 3. 参数后用冒号和表达式主题隔开
# 4. 只是一个表达式,所以,没有return
stm=lambda x,y,z:x+y*10+z*100
print(stm(1,2,3))=>321

函数名称是变量,则可以被当做参数传入另一个函数
高阶函数

def funC(n, f):
    return f(n) * 3
def funD(n):
    return n*10
print(funC(9,funD))=>270        

map函数

原意就是映射,即把集合或者列表的元素,每一个元素都按照一定规则进行操作,生成一个新的列表或者集合
map函数是系统提供的具有映射功能的函数,返回值是一个迭代对象

def square(x):
    return x**2
rst=map(square,[1,2,3,4,5])
print([i for i in ret])=>[1, 4, 9, 16, 25]

reduce

原意是归并,缩减
把一个可迭代对象最后归并成一个结果
对于作为参数的函数要求: 必须由两个参数,必须由返回结果
reduce([1,2,3,4,5]) == f( f(f(f(1,2),3), 4),5)
reduce 需要导入functools包

from functools import reduce

# 定义一个操作函数
# 加入操作函数只是相加
def myAdd(x,y):
    return x + y
    
# 对于列表[1,2,3,4,5,6]执行myAdd的reduce操作
rst = reduce( myAdd, [1,2,3,4,5,6] )
print(rst)=>21

filter 函数

过滤函数: 对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回
跟map相比较:
相同:都对列表的每一个元素逐一进行操作
不同:
map会生成一个跟原来数据想对应的新队列
filter不一定,只要符合条件的才会进入新的数据集合
filter函数怎么写:
利用给定函数进行判断
返回值一定是个布尔值
调用格式: filter(f, data), f是过滤函数, data是数据

def isEven(a):
    return a % 2 == 0
l = [3,4,56,3,2,3,4556,67,4,4,3,23455,43]
rst = filter(isEven, l)
print([i for i in rst])=>[4, 56, 2, 4556, 4, 4]

高阶函数-排序

把一个序列按照给定算法进行排序
key: 在排序钱对每一个元素进行key函数运算,可以理解成按照key函数定义的逻辑进行排序
python2 和 python3 相差巨大

#排序
a=[234,22312,123,45,43,2,3,66723,34]
al=sorted(a,reverse=False)#al=sorted(a)
print(al)=>[2, 3, 34, 43, 45, 123, 234, 22312, 66723]
bl=sorted(a,reverse=True)
print(bl)=>[66723, 22312, 234, 123, 45, 43, 34, 3, 2]

a = [-43,23,45,6,-23,2,-4345]
al=sorted(a,key=abs)
print(al)=>[2, 6, 23, -23, -43, 45, -4345]

#key=str.lower
#字符串小的,排序

返回函数

def myF4( *args):
    def myF5():
        rst = 0
        for n in args:
            rst += n
        return rst
    return myF5
f5 = myF4(1,2,3,4,5,6,7,8,9,0)
f5()=>45

闭包

当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数中,这种结果,叫闭包

def count():
    # 定义列表,列表里存放的是定义的函数
    fs = []
    for i in range(1,4):
        # 定义了一个函数f
        # f是一个闭包结构
        def f():
            return i*i
        fs.append(f)
    return fs

f1,f2,f3 = count()
print(f1())=>9
print(f2())=>9
print(f3())=>9
def count2():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1,4):
        fs.append(f(i))
    return fs

f1,f2,f3 = count2()
print(f1())=>1
print(f2())=>4
print(f3())=>9

装饰器

在不改动函数代码的基础上无限制扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数的高阶函数
装饰器的使用: 使用@语法, 即在每次要扩展到函数定义前使用@+函数名

import time
def printTime(f):
    def wrapper(*args, **kwargs):
        print("Time: ", time.ctime())
        return f(*args, **kwargs)
    return wrapper
@printTime
def hello():
    print("Hello world")
hello()=>
Time:  Thu Feb 14 17:25:10 2019
Hello world

偏函数

print(int("123456",base=8))=>42798
print(int(12.88))=>12
def int16(x,base=16):
    return int(x,base)
print(int16("12345"))=>74565

参数固定的函数,相当于一个由特定参数的函数体
functools.partial的作用是,把一个函数某些函数固定,返回一个新函数

import functools
int16=functools.partial(int,base=16)
print(int16("12345"))=>74565
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值