您的位置:首页 > 编程语言

函数式编程

2018-11-14 13:40 183 查看

基于lambda演算的一种编程方式

  • 程序中只有函数
  • 函数既可以作为参数同样也可以作为返回值

python没有传值和传址的区别,只有可变对象和不可变对象区别

lambda函数(匿名函数)

  • 最大程度上复用代码
  • lambda 参数:表达式

高阶函数

  • 把函数当成参数使用
  • 函数名称是变量
  • 既然函数名称是变量,那么函数名称可以当做参数传入另一个函数

map

  • map(func,×iterables)
  • 映射,把集合或列表的每一个元素按照一定规则操作,生成一个新的列表或者集合

reduce

  • 归并,缩减,比如计算序列和将一个可迭代对象最终归并成一个结果
  • 必须有两个参数和返回结果
  • 这个函数模块在functools包里面

filter函数

  • 过滤函数对一组数据过滤,符合条件的数据会产生一个新的列表返回
  • 跟map相比较
  1. 相同的:都是是每一元素进行操作
  2. 不同:map会生成一个跟原来数据相对应的新队列,filter只有符合条件的才会进入新的数据集合
  3. filter函数怎么写:
    利用给定函数进行判断
    返回值一定是个布尔值
    调用格式: filter(f, data), f是过滤函数, data是数据
  4. filter内容是一个可迭代的对象

排序函数

  1. 把一个序列按照一定算法进行排列
  2. sorted(list,reverse(正向排序还是反向排序))
  3. 例子
# 排序案例2

a = [-43,23,45,6,-23,2,-4345]
# 按照绝对值进行排序
# abs是求绝对值的意思
# 即按照绝对值的倒叙排列
al = sorted(a, key=abs, reverse=True)

print(al)
结果
[-4345, 45, -43, 23, -23, 6, 2]

闭包

  • 当一个函数在内部定义函数,并且内部的函数应用外部的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量 保存在返回的函数中
    趟雷:
# 闭包常见坑
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())
print(f2())
print(f3())
结果
9
9
9
出现问题:
- 造成上述状况的原因是,返回函数引用了变量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

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

装饰器

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

# 高阶函数,以函数作为参数
def printTime(f):
def wrapper(*args, **kwargs):
print("Time: ", time.ctime())
return f(*args, **kwargs)
return wrapper
在这里我认为它是既可以运行修饰函数同时还可以运行当成参数的函数
# 上面定义了装饰器,使用的时候需要用到@, 此符号是python的语法糖
@printTime
def hello():
print("Hello world")

hello()
Time:  Mon Apr  2 21:14:52 2018
Hello world
#装饰器一旦定义,就可以装饰任何函数,一旦被修饰,相当于装饰器挂载到了定义函数功能上

zip函数

  • 把两个可迭代内容生成一个可迭代内容(tuple)
l1 = [ 1,2,3,4,5]
l2 = [11,22,33,44,55]

z = zip(l1, l2)

print(type(z))
print(z)

for i in z:
print(i)
结果
<class 'zip'>
<zip object at 0x7f61c457ab88>
(1, 11)
(2, 22)
(3, 33)
(4, 44)
(5, 55)
  • 自己理解就是生成字典类型的元组

enumerate

  • 跟zip功能很像
  • 给可迭代对象加上索引构成tuple类型
em = enumerate(l1, start=100)
l2 = [ i for i in em]
print(l2)
结果
[(100, 11), (101, 22), (102, 33), (103, 44), (104, 55)]

collections模块

  • namedtuple
  1. tuple
  2. 是一个可以命名的类型
import collections
Point = collections.namedtuple("Point", ['x', 'y'])
p = Point(11, 22)
print(p.x)
print(p[0])
结果
11
11
  • deque
  1. 比较方便的解决了频繁删除插入带来的效率问题
from collections import deque

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

q.append("d")
print(q)

q.appendleft('x')
print(q)
结果
deque(['a', 'b', 'c'])
deque(['a', 'b', 'c', 'd'])
deque(['x', 'a', 'b', 'c', 'd'])
  • counter统计字符串个数
    字符串里面每个字符都是可迭代的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: