13.python-函数式编程

函数式编程

–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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值