简明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()只做了列内运算 >>> 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])
|
sorted()函数 |
sorted(iterable, [cmp=None], [key=None], [reverse=False])
|
any()和all()函数 |
any() returns True if any element in the iterable is a true value
>>> any([1,1,1]) True >>> all([0,1,0]) False |
Generator expressions |
和list comprehensions的语法稍有不同 ( expression for expr1 in sequence1 if condition1... for exprN in sequenceN if conditionN) 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