您的位置:首页 > 编程语言 > C语言/C++

简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他

2016-03-15 19:21 836 查看

函数式编程

Lambda

exec,eval和assert语句,repr函数

lambda语句用来创建简短的单行匿名函数

print_assign=lambdaname,value:name+'='+str(value)
等同于
defprint_assign(name,value):

returnname+'='+str(value)


lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print语句也不能用在lambda形式中,只能使用表达式。

>>>ftwice=lambdas:s*2
>>>ftwice(2)
4

再如make_repeater函数在运行时创建新的函数对象,并且返回它。









yield表达式类似于迭代器,生成器允许处理数据序列

不同的是生成器通过使用yi e l d表达式,可以尽量减少程序耗费的内存,同时还能在大规模数据集上提供类似迭代器的功能

map()函数
从iterA,iterB...中取出对应元素应用map


map(f,iterA,iterB,...)

built-infunctionsoftenusedwithiterators.

returnsalistcontainingf(iterA[0],iterB[0]),f(iterA[1],iterB[1]),f(iterA[2],iterB[2]),....

map
(f,iterable)基本上等于[f(x)
[code]for
x
in
iterable]


但在多元的情况下不同:



>>>list1=[11,22,33]
>>>list2=[44,55,66]
>>>list3=[77,88,99]

map()只做了列内运算
>>>defabc(a,b,c):
...returna*10000+b*100+c
...

>>>map(abc,list1,list2,list3)
[114477,225588,336699]

列表解析做的是笛卡尔乘积

>>>[abc(a,b,c)forainlist1forbinlist2forcinlist3]

[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=[]

forainlist1:
  forbinlist2:
    forcinlist3:
      result.append(abc(abc))

filter()函数

(可以被列表解析替代)

从iter中选择满足predicate条件的元素

filter(predicate,iter)

returnsalistthatcontainsallthesequenceelementsthatmeetacertaincondition

形式非常简洁
existing_files=filter(os.path.exists,file_list)





reduce()函数
对iter中每个元素依次两两使用func

reduce(func,iter,[initial_value])

funcmustbeafunctionthattakestwoelementsandreturnsasinglevalue.





先算init=func(initial_value,A)再算func(init,B)再算func(func(init,B),C)...




sorted()函数
sorted(iterable,[cmp=None],[key=None],[reverse=False])
参考http://wiki.python.org/moin/HowTo/Sorting

any()和all()函数
any()returnsTrueifanyelementintheiterableisatruevalue

all()returnsTrueifalloftheelementsaretruevalues

>>>any([1,1,1])
True
>>>all([0,1,0])
False

Generatorexpressions
和listcomprehensions的语法稍有不同

(expressionforexpr1insequence1
ifcondition1...
forexprNinsequenceN
ifconditionN)

Output:thesuccessivevaluesofexpression

obj_total=sum(obj.countforobjinlist_all_objects())

Generators
functionsthatsimplifythetaskofwritingiterators,which


functools.partial()


partialfunctionapplication

exec语句用来执行储存在字符串或文件中的Python语句。

例如,可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。

>>>exec'print"HelloWorld"'
HelloWorld

eval语句用来计算存储在字符串中的有效Python表达式。

>>>eval('2*3')
6

assert语句用来声明某个条件是真的。
当assert语句失败的时候,会引发一个AssertionError。


repr函数用来取得对象的规范字符串表示。
反引号(也称转换符)可以完成相同的功能。
注意,在大多数时候有eval(repr(object))==object。

>>>i=['item']
>>>`i`
"['item']"
>>>repr(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会话取得输入。

参考:

Python中map()函数浅析
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
from:http://www.cnblogs.com/wei-li/p/3439182.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: