函数式编程
–log模块资料
- 函数式编程
–给予lambda演算的一种编程
1.程序中只有函数
2.函数可以作为参数,也可以作为返回值
3.纯函数式编程:LISP,Haskell
–python函数式编程纸质借鉴函数式编程的一些特点,可以理解成一半函数一半python:
1.高阶函数
2.返回函数
3.匿名函数
4.装饰器
5.偏函数
– lambda表达式(匿名函数):
- 一个表达式,函数题相对简单
- 不是一个代码块,仅仅是一个表达式
- 可以有参数,用逗号隔开
- 以lambda开头,没有return
#lambda
stm = lambda x:x**2 #lambda后跟变量,冒号后边跟表达式
stm(100)
– 高阶函数
- 把函数作为参数使用的函数
def funA(n):
return n * 10
def funB(n,f):
return f(n) * 10
print(funB(2,funA))
–系统高阶函数
- map映射,把集合或列表的元素,没有格斗进行统一操作,生成新的列表或集合map(fun,list)
l1 = [i for i in range(0,10)]
def funA(n):
return n * 10
l2 = map(funA,l1) #操作函数与被操作列表
l3 = [i for i in l2]#l2为迭代器类型需转化成列表
print(l3)
- reduce
–归并缩减
–把一个可迭代的对象归并成一个结果
–必须有两个参数,必须有返回结果
–reduce需要导入dunctools包
import functools
def add(x,y):
return x + y
a = functools.reduce(add,[1,2,3,4,5,6])#迭代相加
print(a)
- filter
– 过滤函数需要定义
– 要求有输入,返回布尔值
#过滤函数
l = [111,123,2,52,534,53,53,45,1,23,12,312,3,123,456,235,4,6,9,56,4,6]
def q(n): #过滤条件函数
return n * 2 > 10
rst = filter(q,l)#生成迭代器
print([i for i in rst])#迭代器提取集合
– 高阶函数-排序
- 把一个序列按照给定算法进行排序
- key:在排序前对每一个元素进行key运算排序
- 写法:sorted(a,key=abs,reverse=ture/false)降序/升序
#排序函数
Lstr = ["qks","asdhakd","Asdhakd","Qks"]
l1 = sorted(Lstr,key=str.lower)#忽略大小写
print(l1)
– 返回函数
- 可以返回值,也可以返回函数作为结果、
- 闭包:返回闭包没返回函数不能引用任何循环变量
#返回函数
def w(*args):
def a():
i = 0
for n in args:
i += n
return i
return a
b = w(1,2,3,4,5,6,7,8,9)
b()
返回函数的坑
返回闭包时,返回函数不能引用任何循环变量
–造成以下状况的原因是,返回函数引用了变量i,i并非立即执行,而是等到三个函数都返回的时候才统一使用,此时i已经变成了3,最终调用的时候 都是返回3*3
–解决方法:再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不再改变
def count():
fs = []
for i in range(1,4):
def f():
return i*i
fs.append(f)
return fs
f1,f2,f3 = count()
print(f1(),f2(),f3()) # 返回9 9 9 不是 1 4 9
– 装饰器
- 对现有函数功能进行扩展
- 不改动现有代码
import time
def printtime(f):
def wrapper(*args,**kwargs):
print(time.ctime())
return f(*args,**kwargs)
return wrapper
@printtime #语法糖
def hello():
print("hello world")
hello() #执行此函数调用printtime
- 偏函数
– 有参数固定的函数体
– functools.partial的作用是,把一个函数某些函数固定,返回一个新函数
import functools
int16 = functools.partial(int,base=16)
int16("10")#输出16进制数字
- zip
– 压缩进行对应
l1 = [1,2,3,4,5,6]
l2 = [11,22,33,44,55,66]
z = zip(l1,l2)
print([i for i in z])#迭代器提取
- enumerate
–跟zip类似
–对可迭代对象里的每一个元素配一个索引,构成一个tuple
l3 = [11,22,33,44,55]
em = enumerate(l3,start = 0)
print([i for i in em])#索引从0开始
- collections
– 是一个可命名的tuple类型
import collections
a = collections.namedtuple("apple",['x','y','z'])
b = a(100,200,0)
print(b)#输出apple(x=100, y=200, z=0)
isinstance(b,tuple)# 检测是否为tuple,ture
–deque(属于↑collcetions模块内的)
方便的插入删除列表内的元素
import collections
q = collections.deque(['a','b','c'])
q.append("d")
q.appendleft("l")
print(q)
–defaultdict
读取字典不存在的属性时,返回一个默认值
import collections
func = lambda:"啊,没有"
d = collections.defaultdict(func)
d["one"] = 1
d["two"] = 2
print(d["three"])#找不到键值对,返回默认函数func
–Counter
统计字符串个数(首字母大写)
import collections
a = "skfjalksjfl;skadjfl;kajfl;ksjf;liwoiouriowklsja"
c = collections.Counter(a)
print(c)