python 入坑学习之函数式编程06

lambda表达式:(简写函数)

stm = lambda x,y: return x+y

 

高阶函数:(把函数作为参数使用的函数)

函数名就是一个变量

 

系统自带的高阶函数:

1、map()

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

例:

l1 = [1 for i in range(10)] ==>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

def mulTem(n):

n*10

l2 = map(mulTem,l1) ==>l2是一个可迭代的对象,但并不是真正的列表

2、reduce()

原意是归并,缩减

把一个可迭代对象最后归并成一个结果

对于作为参数的函数要求: 必须由两个参数,必须由返回结果

reduce([1,2,3,4,5]) == f( f(f(f(1,2),3), 4),5)

reduce 需要导入functools包

例:

def add(x,y):

x+y

l = [i for i in range(6)]

num = reduce(add,l) ==>num = 15

3、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]

res = filter(isEven,l) ==>[4, 56, 2, 4556, 4, 4]

4、sorted()

把一个序列按照给定算法进行排序

key: 在排序钱对每一个元素进行key函数运算,可以理解成按照key函数定义的逻辑进行排序

python2 和 python3 相差巨大

例:

a = [234,22312,123,45,43,2,3,66723,34]

al = sorted(a, reverse=True) ===>[66723, 22312, 234, 123, 45, 43, 34, 3, 2]

# 按照绝对值进行排序

# abs是求绝对值的意思

# 即按照绝对值的倒叙排列

a = [-43,23,45,6,-23,2,-4345]

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

5、zip()

把两个可迭代内容生成一个可迭代的tuple元素类型组成的内容

l1 = [ 1,2,3,4,5]

l2 = [11,22,33,44,55]

z = zip(l1, l2) ==> (1, 11) (2, 22) (3, 33) (4, 44) (5, 55)

6、enumerate()

对可迭代对象里的每一元素,配上一个索引,然后索引和内容构成tuple类型

l1 = [11,22,33,44,55]

em = enumerate(l1) ==>[(0, 11), (1, 22), (2, 33), (3, 44), (4, 55)]

em = enumerate(l1, start=100) -->[(100, 11), (101, 22), (102, 33), (103, 44), (104, 55)]

7、collections.namedtuple

tuple类型,是一个可命名的tuple

Point = collections.namedtuple("Point", ['x', 'y']) -->创建类

p = Point(11, 22) -->实例化类

print(p.x)

print(p[0])

8、collections.deque

比较方便的解决了频繁删除插入带来的效率问题

q = deque(['a', 'b', 'c'])

print(q)

 

q.append("d")

print(q)

 

q.appendleft('x')

print(q)

9、collections.defaultdict

当直接读取dict不存在的属性时,直接返回默认值

func = lambda: "没有"

d2 = defaultdict(func)

 

d2["one"] = 1

d2["two"] = 2

 

print(d2['one']) ==》1

print(d2['four']) ==》没有

10、collections.Counter()

统计字符串个数

s = ["I", "love", "love", "love", "love", "zhu"]

c = Counter(s) ==>Counter({'love': 4, 'I': 1, 'zhu': 1})

 

返回函数:

函数可以返回具体的值,也可以返回一个函数作为结果

 

闭包:

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

def myF4( *args):

def myF5():

rst = 0

for n in args:

rst += n

return rst

return myF5

闭包出现的问题:

  • 造成上述状况的原因是,返回函数引用了变量i, i并非立即执行,而是等到三个函数都返回的时候才统一使用,此时i已经变成了3,最终调用的时候,都返回的是 3*3
  • 此问题描述成:返回闭包时,返回函数不能引用任何循环变量
  • 解决方案: 再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不再改变

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

 

装饰器:

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

 

偏函数:

  • 参数固定的函数,相当于一个由特定参数的函数体
  • functools.partial的作用是,把一个函数某些函数固定,返回一个新函数 int16 = functools.partial(int, base=16)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值