【廖雪峰Python学习笔记】函数式编程
Functional Programming
- 高阶函数
- 返回函数
- 匿名函数
- 装饰器
- 偏函数
高阶函数
- 面向过程的程序设计:
把大段代码拆成函数,通过一层层函数调用,可将复杂任务分解成若干简单的任务 - 函数是面向过程的程序设计的基本单位
- 计算机Computer && 计算compute:
Computer: CPU执行指令代码进行加减乘除运算,及各种条件判断和跳转指
Compute: 数学意义的计算
汇编语言是最贴近计算机的语言
越低级的语言,越贴近计算机,抽象程度低,执行速度快 c
越是高级的语言,越远离计算机,抽象程度高,执行效率低 lisp - 函数式编程的特点:函数可以作为参数,或作为返回值
- Python不是纯函数式编程语言
返回函数
- 使用场景:后续代码中仍可能需要使用的函数
- 返回函数即使调用相同的参数,返回的也是不同的新函数
def lazy_sum(*args):def sum():ax = 0for n in args:ax = ax + nreturn axreturn sum
调用lazy_sum(*args)时,每次返回新的函数
>>> f1 = lazy_sum(1,3,5,7,9) # f1返回的是函数sum
>>> f1
<function lazy_sum.<locals>.sum at 0x102f32158>
>>> f1()
25
>>> f2 = lazy_sum(1,3,5,7,9) # f2返回的是一个新的函数sum
>>> f1 == f2 # f1与f2传入相同的参数,但在调用的时候,每次返回新的函数
False
- 闭包:调用一个函数返回一个函数后,其局部变量被新函数引用
>>> def count():
... fs = []
... for i in range(1, 4):
... def func():
... return i*i
... fs.append(func)
... return fs>>> f = count() # 返回三个函数组成的列表
>>> f # 三个函数不相同
[<function count.<locals>.f at 0x1091540d0>, <function count.<locals>.f at 0x109154400>, <function count.<locals>.f at 0x109154488>]
>>> f[1]() # 先返回三个函数,后执行函数。故此时,他们引用的变量均为3
9
>>> f[2]()
9
>>> f[3]()
9
tips:返回闭包时,返回函数尽量不要引用循环变量,或后续会发生变化的变量
匿名函数
lambda()
- 使用场景:传入不需要显示定义的函数
- 使用限制:只能有一个表达式,不能return,返回表达式的结果
>>> list(filter(lambda x : x % 2 == 1, range(1, 20)))
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
装饰器
- 使用场景:调用函数前自动打印日志,但不修改函数定义
- 自定义装饰器Decorator步骤:
- 定义装饰器decorator
def log(text = ''):def decorator(func):def wrapper(*args, **kw):# func.__name__用于获取函数名print('%s %s():' % (text, func.__name__)) return func(*args, **kw)return wrapperreturn decorator
- 使用装饰器
@log('execute')
def now():print('2019-05-06')
相当于:
>>> log('execute')(now)()
execute wrapper():
execute now():
2019-05-06
- 缺点:原始函数的__name__ 变成为自定义的 wapper
- 解决方案: 使用Python内置的 functions.wraps
import functoolsdef log(text = ''):def decorator(func):@functions.wraps()def wrapper(*args, **kw):print('%s %s():' % (text, func.__name__)) return func(*args, **kw)return wrapperreturn decorator
偏函数
- 偏函数Partial function:通过设定参数默认值,降低函数调用的难度
>>> import functools
>>> int2 = functools.partial(int, base=2) # 将int()函数中base参数设置默认值为2
- functools.partial设置默认参数后,可在函数调用时传入其他值;
- functools.partial最后接受函数对象、*args和**kw三部分参数
import functoolsdef add(*args, **kwargs):print(*args)print('-' * 20)for key, value in kwargs.items():print('%s : %s' % (key, value))add_partial = functools.partial(add, 10, k1 = 10, k2 = 20)
print add_partial(10, 2, 3, k1 = 40, k3 = 30)
返回结果为
10 10 2 3
--------------------
k1 : 40
k2 : 20
k3 : 30
相关文章:

asp 随机读取ID之Access
我在用ASP连接access 这个桌面数据库的时候,有时候要随机读取ID,传统的办法是: select top 3 * from tablename order by Rnd(ID) 但这样不行,默认还是按ID排序。 解决办法加上timer() 这个函数 select top 3 * from tablenam…

iOS Plist 文件的 增 删 改
一:Plist 文件的创建 Plist 文件作为我们IOS开发的一种数据存储文件,还是经常会用到的。在看《X-code江湖录》的时候,看到了这一点。自己就写了一下,把写的东西分享出来!先看看它的创建,它的创建和我们其他…
Shine Button动画效果 类似Tinder APP的卡片界面
Shine Button动画效果--WCLShineButton 类似太阳动画的button FSPagerView 主要使用UICollectionView实现的优雅的屏幕幻灯片效果,主要用于Banner、产品展示、欢迎引导等。有Swift和OC两个版本。 folding-cell 一个可扩展的具有折叠效果的内容单元格 Cell折叠动效…

【廖雪峰Python学习笔记】面向对象编程OOP
面向对象编程 OOP:Object Oriented Programming程序的基本单元:对象 [ 数据 操作数据的函数] [属性 方法]三大特点:数据封装、继承和多态OPP中的计算机程序: 一系列命令的集合 —— 一组函数顺序执行。函数化大为小࿰…
基于 CoreText 实现的高性能 UITableView
来源:伯乐在线 - Hawk0620 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 引起UITableView卡顿比较常见的原因有cell的层级过多、cell中有触发离屏渲染的代码(譬如:cornerRadius、maskTo…

.net程序员面试题
1. 在web页面中不论显示器的分辨率的大小是800600,还是1024768使得页面都显示在屏幕中间。 答:Margin:auto; 2. 请利用正则表达式验证一个字符串是否为数字串 (请用csharp)。 1 public static b…

Android深度探索与驱动开发(一)
Android移植可分为两个部分:应用移植和系统移植。应用移植是指将应用程序移植到某一特定硬件平台上。由于不同硬件平台之间的差异,Android SDK API也有可能存在差异,或者将应用程序从低版本Android移植到高版本的Android上。为了保证应用程序…

【廖雪峰Python学习笔记】面向对象高级编程
文章目录为实例和类绑定属性和方法\_\_slots__限制当前class实例,对子类不管用property装饰器,将getter方法变成属性多重继承 —— 一个子类可同时获得多个父类的所有功能[Mixin]定制类枚举类元类为实例和类绑定属性和方法 创建类 class Animal(object…

5分钟 搭建免费个人博客
五分钟倒数已经可以计时了。 三步完成免费个人博客搭建, 这是一篇小白也能看懂的文章,本文主要针对mac OS ,Windows 除了软件安装方式和命令有些区别(装了git bash也一样),其他基本一样。 你可能会经常看到…

基数排序之算法
一、定义基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。二、…

MyBaties学习记录
typeAliases详解: 类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余;(也就是为类型设置简称) 实例: 通过包名称加上简称调用代替; 注解表示: // …

【廖雪峰Python学习笔记】错误、调试、测试
文章目录错误处理调试单元测试unitcase文档测试错误类型程序编写问题bug – 字符类型错误等用户输入错误 – 输入不符合规定的字符串异常,程序运行时无法预测 – 磁盘满了,无法写 错误处理 错误处理机制:try…except…finally… try运行可…
iOS开发——手势识别器(用手势实现图片旋转和缩小放大)
iOS开发中,除了有关触摸的这组方法来控制用户的手指触控外,还可以用UIGestureRecognize的衍生类来进行判断,方便了开发。 UIGestureRecognize的子类类别有以下几种: UITapGestureRecognizer //轻拍识别器UIPinchGestureRecognize…
直播APP常用动画效果
作者: 落影loyinglin 地址: http://www.jianshu.com/p/a9a201ed3aa8 介绍 记录、总结开发遇到一些问题,大家一起交流学习。 这次带来,对直播APP的常用动画总结。 效果展示 下面是一个很多平台都有的入门豪华礼物动画——烟花。 一个复杂的礼物动画&…

windows8下安装Visual Studio2008
windows8下安装Visual Studio2008是一个比较麻烦的事情,不过经过我3个小时的奋斗终于安装成功了。这是我安装Visual Studio 2008过程中遇到的最复杂的一次。 下面我用图解的方式,一步一步的说明安装Visual Studio2008的过程。 第一步:因为win…

[SDK文档]SDK简介
文档链接:https://docs.growingio.com/docs/sdk-integration SDK工作方式 主要内容:GIO采集内容,数据安全措施,针对数据采集的控制项 JS SDK 添加GIO跟踪代码于<head>...</head> 之间异步加载,不影响网…

mysql主从库配置ps:mysql5.6
1 Mysql cluster版本主从服务器搭建实践 主从的作用:MySQL的主从服务器可以满足同步数据库,同步表,同步表内容,也可以指定仅同步某个数据库或某个表,还可以排除不同步某个数据库某个表。 同步原理:主从数据…

XCODE 4.5 IOS多语言设置
转:http://blog.csdn.net/samuelltk/article/details/8480403 前些天升级到Xcode4.5,现在正在用Xcode4.5IOS6开发项目,当使用国际化时,遇到了一点问题,之前版本Xcode上新建Localizable.strings后,添加语言的…
socket第三方库 AsyncSocket(源码注释解读.转)
作者 OneTea 关注 2016.09.19 11:33* 字数 0 阅读 83评论 0喜欢 1#import <Foundation/Foundation.h> class AsyncSocket;//async异步的 synchro同步 class AsyncReadPacket; class AsyncWritePacket; //extern来说可以理解为扩展吧是这样的是从一个类扩展到另一个类中的…

【每日一学】复杂度分析
文章目录目标什么是数据结构复杂度分析目标 建立时间复杂度、空间复杂度意识,写出高质量的代码能够设计基础架构提高编程技能训练逻辑思维 什么是数据结构 广义:一组数据的存储结构 | 操作数据的一种方法 解决问题:如何更快更省的处理数据…

noip2010提高组3题题解 by rLq
本题地址http://www.luogu.org/problem/show?pid1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气…

hdu 1306(字符串匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid1306 思路:一开始还以为是求最长公共序列呢。。。仔细一看,orz.....就是求两个串匹配时公共部分字符最多相同的个数。。。 View Code 1 #define _CRT_SECURE_NO_WARNINGS2 #include<…

iOS之使用CoreImage进行人脸识别
更新 :应各位朋友的需求,补上了OC版本的demo, OC版下载地址 另外附上 : swift版下载地址 CoreImage是Cocoa Touch中一个强大的API,也是iOS SDK中的关键部分,不过它经常被忽视。在本篇教程中,我会带大家一起…

[HTTP协议]入门篇
文章目录http的前世今生1. 史前时期2. 创世纪3. 从产生到发展HTTP是什么与HTTP相关的各种概念与HTTP相关的技术TCP/IP协议栈http的前世今生 1. 史前时期 20世纪60年代,美国国防部高等研究计划署ARPA建立ARPA网,四个分布在各地的节点20世纪70年代&#…

CSS中实现DIV容器垂直居中
1.vertical-align:middle 垂直对齐 如表格元素中的<td>、<th>、<caption>等,而像<DIV>、<span>这样的元素是没有valign特性的,因此使用vertical-align对它们不起作用。 2.text-align:center 文本水平居中 一、…
如何制作自己的CocoaPod库
作者 OneTea 关注 2016.12.29 18:02* 字数 848 阅读 102评论 0喜欢 6制作流程图: 流程图1.将代码托管在github上 1.1本地代码 如图: Snip20161228_7.png在github上创建 并上传 Snip20161228_3.png切换到本地项目cd xxx路径后 用git命令行 (…

【HTTP协议】域名
1. 域名的出现 IP协议将物理网卡的MAC地址抽象转化为4位数字数字化的IP地址对人不友好,需要友好的域名便于人类识别标记 2. 域名的形式 域名是一个有层次的结构——一串用’.分隔的多个单词【主机名.二级域名.顶级域名】最左边是主机名【eg:www提供万…

iOS 多级下拉菜单
前言 App 常用控件 -- 多级下拉菜单, 如团购类, 房屋类, 对数据进行筛选. 有一级, 二级, 三级, 再多就不会以这种样式,呈现给用户了. 作者就简单聊一下 多级下拉菜单 二级下拉筛选菜单.png一 目标 默认显示一个 TableView, 点击数据后, 添加第二个TableView, 并实现大小变化第二…

fork有啥用
#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(){ pid_t pid1; pid_t pid2; pid1 fork(); pid2 fork(); printf("pid1:%d, pid2:%d\n", pid1, pid2);}输出:pid1:3411, pid2:3412 //父进…

Html Agility Pack基础类介绍及运用
Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:) 基础类和基础方法介绍 Html Agility Pack最常…