# -*- coding:gb2312 -*-
#coding=utf-8
# 高阶函数
import math
def is_sqr(x):
y = int(math.sqrt(x))
return x == y*y
print filter(is_sqr, range(1, 101)) # 返回函数
# 作用:延迟执行
def calc_prod(lst):
def lazy_prod():
def f(x,y):
return x*y
return reduce(f, lst) return lazy_prod f = calc_prod([1, 2, 3, 4])
print f() # 匿名函数
print filter(lambda s: s and len(s.strip()) > 0, ['test', None, '', 'str', ' ', 'END']) # 装饰器 @decorator
print "....装饰器...."
def log(f):
# 写法一
# def fn(x):
# print 'call ' + f.__name__ + '()...'
# return f(x)
# return fn
# 写法二
print 'call ' + f.__name__ + '()...'
return f @log
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10) # 无参数装饰器
print "....无参数装饰器...." import time
# 写法一,接收一个函数返回一个新函数,但是返回的新函数必须符合原函数的调用规则,即参数应该一致。
# 如,log()是无参函数,则调用就不能传递参数
def performance(f):
def log(x):
print time.time()
return f(x)
return log # 写法二,不用函数封装,直接添加新的操作
def performance2(f):
print time.time()
return f # 写法一优化,被装饰的函数前后可以执行不同的操作,即,返回的新函数可以在任意时候调用被装饰的函数
def performance3(f):
def log(x):
start_time = time.time()
r = f(x) # 在新函数的此处调用被装饰函数,但是,此时被装饰函数尚未被调用,因为log函数尚未被调用,只是返回了函数对象
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs' % (f.__name__, (end_time - start_time))
return r
return log # 写法二优化,不用函数封装,直接添加新的操作
def performance4(f):
start_time = time.time()
r = f # 在此处调用被装饰函数
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs' % (f.__name__, (end_time - start_time))
return r @performance4
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10) # 带参数装饰器
print "....带参数装饰器...." def performance_parm(unit='s'):
def performance5(f):
def log(x):
start_time = time.time()
r = f(x) # 在新函数的此处调用被装饰函数,但是,此时被装饰函数尚未被调用,因为log函数尚未被调用,只是返回了函数对象
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs %s' % (f.__name__, (end_time - start_time), unit)
return r
return log
return performance5 @performance_parm('M')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10) # 完善decorator
print "....完善decorator...."
print factorial.__name__
# => log
# 可见,由于decorator返回的新函数函数名已经不是'f2',而是@log内部定义的'wrapper'。这对于那些依赖函数名的代码就会失效。
# decorator还改变了函数的__doc__等其它属性。
# 如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中。
# Python内置的functools可以用来自动化完成这个“复制”的任务
import functools
def performance5(f):
@functools.wraps(f)
def log(x):
start_time = time.time()
r = f(x) # 在新函数的此处调用被装饰函数,但是,此时被装饰函数尚未被调用,因为log函数尚未被调用,只是返回了函数对象
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs %s' % (f.__name__, (end_time - start_time), unit)
return r
return log @performance5
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print "....装饰器修改后...."
print factorial.__name__

  

python 函数式编程 高阶函数 装饰器的更多相关文章

  1. Python函数式编程-高阶函数、匿名函数、装饰器、偏函数

  2. 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数

    函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---

  3. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  4. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  5. Python实用笔记 (12)函数式编程——高阶函数

    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 变量 ...

  6. [Python3] 035 函数式编程 高阶函数

    目录 函数式编程 之 高阶函数 1. 引子 2. 系统提供的高阶函数 3. functools 包提供的 reduce 4. 排序 函数式编程 之 高阶函数 把函数作为参数使用的函数,叫高阶函数 1. ...

  7. C#函数式编程-高阶函数

    随笔分类 -函数式编程 C#函数式编程之标准高阶函数 2015-01-27 09:20 by y-z-f, 344 阅读, 收藏, 编辑 何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的 ...

  8. 函数式编程 高阶函数 map&reduce filter sorted

    函数式编程 纯函数:没有变量的函数 对于纯函数而言:只要输入确定,那么输出就是确定的.纯函数是没有副作用的. 函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数 高阶函数:一个函数的 ...

  9. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

随机推荐

  1. Java动态代理与静态代理以及它能为我们做什么

    相信我们在网上和平时学习和工作中或多或少都接触过Java的代理模式,经常听到什么静态代理.动态代理的一些名词.但我们是否真的很清楚这些呢?至少我在面试时,发现很多人并不很清楚. 首先代理比较好理解,就 ...

  2. Java实现 LeetCode 810 黑板异或游戏 (分析)

    810. 黑板异或游戏 一个黑板上写着一个非负整数数组 nums[i] .小红和小明轮流从黑板上擦掉一个数字,小红先手.如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家 ...

  3. Java实现 LeetCode 679 24 点游戏(递归)

    679. 24 点游戏 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: ...

  4. Java实现 蓝桥杯VIP 算法训练 王后传说

    问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办 ...

  5. Java实现 LeetCode 371 两整数之和

    371. 两整数之和 不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a .b ​​​​​​​之和. 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: ...

  6. Java实现蓝桥杯VIP算法训练 二元函数

    试题 算法训练 二元函数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值. 只有满足以下要求的表达式才是合法的: ...

  7. Java实现 LeetCode 227 基本计算器 II(二)

    227. 基本计算器 II 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 . 整数除法仅保留整数部分. 示例 1: 输入: ...

  8. Java实现 LeetCode 132 分割回文串 II(二)

    132. 分割回文串 II 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一 ...

  9. java实现 洛谷 P1425 小鱼的游泳时间

    题目描述 伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的. 这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按24小时制计算),它发现自 ...

  10. Java实现 蓝桥杯 历届试题 小朋友排队

    问题描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的时候,所有小朋友的不高兴程度都是0. 如果某个小朋友 ...