简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他
函数式编程
Lambda
exec,eval和assert语句,repr函数
lambda语句 |
用来创建简短的单行匿名函数 print_assign = lambda name, value: name + '=' + str(value) return name + '=' + str(value) lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print语句也不能用在lambda形式中,只能使用表达式。 >>> ftwice = lambda s:s*2 再如make_repeater函数在运行时创建新的函数对象,并且返回它。 |
yield表达式 |
类似于迭代器,生成器允许处理数据序列 不同的是生成器通过使用yi e l d表达式,可以尽量减少程序耗费的内存,同时还能在大规模数据集上提供类似迭代器的功能 |
map()函数 |
从iterA,iterB...中取出对应元素应用map map(f, iterA, iterB, ...) built-in functions often used with iterators. returns a list containing f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ....
但在多元的情况下不同:
map()只做了列内运算 >>> map(abc,list1,list2,list3) 列表解析做的是笛卡尔乘积 >>> [abc(a,b,c) for a in list1 for b in list2 for c in list3] [114477, 114488, 114499, 115577, 115588, 115599, 116677, 116688, 116699, 224477, 224488, 224499, 225577, 225588, 225599, 226677, 226688, 226699, 334477, 334488, 334499, 335577, 335588, 335599, 336677, 336688, 336699] 等同于 result = [] for a in list1: |
filter()函数 (可以被列表解析替代) |
filter(predicate, iter) returns a list that contains all the sequence elements that meet a certain condition 形式非常简洁 |
reduce()函数 |
对iter中每个元素依次两两使用func reduce(func, iter, [initial_value]) func must be a function that takes two elements and returns a single value. 先算init=func(initial_value,A)再算func(init,B)再算func(func(init, B), C)... |
sorted()函数 |
sorted(iterable, [cmp=None], [key=None], [reverse=False]) |
any()和all()函数 |
any() returns True if any element in the iterable is a true value all() returns True if all of the elements are true values >>> any([1,1,1]) |
Generator expressions |
和list comprehensions的语法稍有不同 ( expression for expr1 in sequence1 Output: the successive values of expression obj_total = sum(obj.count for obj in list_all_objects()) |
Generators |
functions that simplify the task of writing iterators, which |
functools.partial() |
partial function application |
exec语句 | 用来执行储存在字符串或文件中的Python语句。
例如,可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。 >>> exec 'print "Hello World"' |
eval语句 | 用来计算存储在字符串中的有效Python表达式。
>>> eval('2*3') |
assert语句 | 用来声明某个条件是真的。 当assert语句失败的时候,会引发一个AssertionError。 |
repr函数 | 用来取得对象的规范字符串表示。 反引号(也称转换符)可以完成相同的功能。 注意,在大多数时候有eval(repr(object)) == object。 >>> i = ['item'] |
函数修饰符 | 通过介入函数的启动和关闭机制,调整一个已存在函数的行为 |
类的特殊方法
__init__(self,...) |
在新建对象恰好要被返回使用之前被调用。 |
__del__(self) |
恰好在对象要被删除之前调用。 |
__str__(self) |
对对象使用print语句或是使用str()的时候调用。 |
__lt__(self,other) |
当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。 |
__getitem__(self,key) |
使用x[key]索引操作符的时候调用。 |
__len__(self) |
对序列对象使用内建的len()函数的时候调用。
|
测试
对于规模更大的程序,测试框架必不可少。
在标准库中,unittest模块基于流行的xunit测试框架。doctest允许从shell会话取得输入。
参考:
http://docs.python.org/2/howto/functional.html
Python特殊语法:filter、map、reduce、lambda、yield
http://www.dataguru.cn/blog-10716-1133.html
http://jgy3.ggclk.com/url?url=http%3A%2F%2Fmikecvet.wordpress.com%2F2010%2F07%2F02%2Fparallel-mapreduce-in-python%2F&v=4&i=6&q=map%20python%20lambda%20%20yield%20reduce%20filter&p=0&tr=0&at=0&ar=0&ab=0&mr=0&ir=0&kgr=0&nr=0&iar=0&sr=0
简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他的更多相关文章
- 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流
最初的步骤 Python是大小写敏感的 任何在#符号右面的内容都是注释 >>> help('print')在“print”上使用引号,那样Python就可以理解我是希望获取关于“pr ...
- 简明python教程 --C++程序员的视角(二):函数及作用域
函数通过def关键字定义.def关键字后跟一个函数的标识符名称,然后跟一对圆括号.圆括号之中可以包括一些变量名,该行以冒号结尾.接下来是一块语句,它们是函数体. 函数的基本概念 1 位置:从左往右进行 ...
- 简明python教程 --C++程序员的视角(四):容器类型(字符串、元组、列表、字典)和参考
数据结构简介 Python定义的类型(或对象)层次结构在概念上可以划分为四种类别:简单类型.容器类型.代码类型 和内部类型. 可以将 PyObject 类之下的所有 Python 类划分为 Pytho ...
- 简明python教程 --C++程序员的视角(八):标准库
os模块 这个模块包含普遍的操作系统功能. 如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.一个例子就是使用os.sep可以取代操作系统特定的路径分割符. os.system() 执行li ...
- 简明python教程 --C++程序员的视角(七):异常
当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了.上述这些情况可以使用异常来处理. 假如你的程序中有一 ...
- 简明python教程 --C++程序员的视角(六):输入输出IO
程序与用户交互 你会从用户那里得到输入,然后打印一些结果.我们可以分别使用raw_input,input和print语句来完成这些功能.raw_input会返回字符串,而input会返回字面值,相当于 ...
- 简明python教程 --C++程序员的视角(五):面向对象的编程
面向对象的编程 在大多数时候你可以使用过程性编程,但是有些时候当你想要编写大型程序或是寻求一个更加合适的解决方案的时候,你就得使用面向对象的编程技术. 对象可以使用普通的属于对象的变量存储数据.属于一 ...
- 简明python教程 --C++程序员的视角(三):模块
模块和包 1 python程序由包(package).模块(module)和函数组成.包是由一系列模块组成的集合.模块是处理某一类问题的函数和类的集合.函数是一段可以重复多次调用的代码. 2 pyth ...
- 【转】简明 Python 教程
原文网址:http://woodpecker.org.cn/abyteofpython_cn/chinese/ 简明 Python 教程Swaroop, C. H. 著沈洁元 译www.byteof ...
随机推荐
- 【转】数据库范式(1NF 2NF 3NF BCNF)详解二
以下内容转自:http://jacki6.iteye.com/blog/774889 -------------------------分割线----------------------------- ...
- ASP.NET Web API路由规
默认的规则 在ASP.NET MVC4中 global.asax.cs代码中并无注册默认路由规则的代码 代码如下: public class WebApiApplication : System.We ...
- 扫盲如何在ECLIPSE中使用条件断点
有时候在编码的时候我们希望知道代码变量符合某个条件时,才中断点,其他的情况不中断点. 解决办法1: 我们写个代码 判断,符合条件在符合条件处进行断点,这个方法很麻烦,需要去修改代码,不要是还需 ...
- 第五章 CSS页面布局基础
1.标准文档流 在正常流中,在没有使用浮动或者定位的情况下,文本元素按照从上到下.从左到右的格式布局.这是浏览器的默认行为.在正常流中,块级元素从上到下依次排列,而行级元素从左到右依次排列.正常流中的 ...
- linux-虚拟机安装
第一步:下载 安装虚拟机! 链接: http://pan.baidu.com/s/1nuGLwsL 密码: 2qdy 第二步:镜像文件! 链接: http://pan.baidu.com/s/1nuG ...
- iOS只执行一次的方法
IOS开发(64)之GCD任务最多只执行一次 1 前言 使用 dispatch_once 函数 在 APP 的生命周期内来保证你想确保每段代码只执行一次,即使它在代码的不同地方多次调用(比如单例的初始 ...
- ASP.NET MVC 基于角色的权限控制系统的示例教程
上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...
- Hello Hibernate
Hibernate 一个框架; 一个 Java 领域的持久化框架; 一个 ORM 框架 ORM(Object/Relation Mapping): 对象/关系映射 –ORM的思想:将关系数据库中表中的 ...
- Xcode6.2创建Empty Application
运行Xcode 6,创建一个Single View Application工程. 创建好后,把工程目录下的Main.storyboard和LaunchScreen.xib删除,扔进废纸篓. 打 ...
- C/C++文件结构
总结者:kate (1).h 为头文件:存放 版权和版本声明,预处理块 ,函数和类结构声明 (2).cpp文件:代码文件,存放程序的实现 大都数时候,源文件和头文件是对应出现的,比如有一个A.cpp ...