python函数式编程

高阶函数

把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
与js相似,与c#中的委托一相似。

  • abs() 求一个数的绝对值
#模拟abs得到一个数的绝对值
def absFun(n):
    if n<0:
        return -n;
    return n
  • map(fn,list) 集合处理函数,作用到循环迭代对象的每个元素,返回新的对象
    fn是逐个处理元素的函数
#将list值全部转换成字符串,str是一个函数(字符串转int使用int())
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
#首字母大小,其他小写,处理map的示例
def normalize(name):
    return name[0].upper()+name[1:].lower()
#等同于
lambda name:name[0].upper()+name[1:].lower()
  • reduce(fn,list) fn是函数需要两个参数,结果会累积,求和会用到
reduce(lambda x,y:x*y,L)

int()转换成整数,float()转换成浮点数,sum()求和,.index('.')符号.首次出现的下标,.upper()转换成大写,.lower()转换成小写

def str2float(s):
    n=s.index('.')
    s=s[:n]+s[n+1:]
    DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    def char2num(x):
        return DIGITS[x]
    return reduce(lambda x,y:10*x+y,map(char2num,s))/(10**(len(s)-n))
  • filter() 筛选过滤元素
    标准的写法:
def not_empty(s):
    return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))

使用lambda便捷函数

def _not_divisible(n):
    return lambda x : x%n > 0
#等价于:
def _not_divisible(n):
    def suibian(x):
        return x%n>0
    return suibian
  • sorted()排序算法
    对集合排序,忽略大小写,反向
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

用sorted()排序的关键在于实现一个映射函数。

#对字典姓名,第三个字母进行排序
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
    return t[0][2]

闭包

在一个函数内部定义另一个函数,它可以调用外部函数的参数和局部变量,就形成了闭包

def count2():
    def f(j):        
        def g():
            return j*j        
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs
#使用lambda简化
def count3():
    fs = []
    for i in range(1, 4):
        def f(j):
            return lambda: j*j
        fs.append(f(i))
    return fs
  • 在count2中j的值被传入f()中,但不会执行g函数,而是返回了函数g
  • 函数count2返回的是一个集合,每个元素都是一个函数
    执行结果:
>>> f1, f2, f3 = count2()
>>> f1()
1
>>> f2()
4

使用闭包和生成器结合起来,形成每次调用就+1的效果:

def createCounter():
    def dizeng ():
        a=1
        while True:
            yield a
            a =a+ 1
    def sd ():return next(g)#如果直接使用dizeng(),会导致多次执行该函数
    g = dizeng()#函数执行了一次,所以内部变量a只声明了一次,结果是一个生成器
    return sd#因调用方式,结果必须返回函数
#调用函数
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5

匿名函数

使用lambda x: x * x这样方式的就是一个匿名函数
x表示匿名函数的参数,:后面的是应用计算

  • 与普通函数应用方式一样,都可以作为变量或返回值
  • 因为没有名字,不必担心名称冲突的问题
  • 只能有一个表达式,返回值就是表达式的结果

装饰器

在函数的上面添加@函数名 的形式就是装饰器

#定义了一个执行函数前,自动打印日志的功能函数
def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper
#定义一个应用函数
@log
def now():
    print('2015-3-25')
  • 执行now( )就相当于执行了log(now)( )
  • 除了@log标记,就是一个闭包函数的应用
  • 为了保持now函数的__name__属性不变,可以使用@functools.wraps(func)
import functools
def log(text):
    def decorator(func):
        @functools.wraps(func)#可保持得到的最终运行的函数__name__值仍是func的值
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator
#定义一个应用函数
@log('execute')
def now():
    print('2015-3-25')
  • 以上定义了一个带参数的log函数
  • 执行now( )就相当于执行了log('execute')(now)( )

偏函数

针对一些有默认值的函数,生成一个固定项的函数
如int(x,base=10)参数base默认是10,如下:

int2 = functools.partial(int, base=2)
>>> int2('1000000')
64

生成了一个新的函数int2,调用int2(二进制字符串),得到十进制数字

python模块开发的使用 - 简书 (jianshu.com)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确...
    齐天大圣李圣杰阅读 1,527评论 0 2
  • 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简...
    祐吢房_2c9a阅读 391评论 1 1
  • functional函数式。 特点 把计算视为函数而非指令 纯函数式编程不需要变量,没有副作用(任意执行多少次结果...
    WilliamY阅读 334评论 0 2
  • 本文翻译自Functional Programming Howto 本文将介绍Python中函数式编程的特性。在对...
    大蟒传奇阅读 2,608评论 4 14
  • 本系列主要学习Python的基本使用和语法知识,后续可能会围绕着AI学习展开。Python3 (1) Python...
    猿来如痴阅读 2,369评论 0 0