简明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,iterable)基本上等于[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 形式非常简洁 |
reduce()函数 | 对iter中每个元素依次两两使用func reduce(func,iter,[initial_value])
|
sorted()函数 | sorted(iterable,[cmp=None],[key=None],[reverse=False]) |
any()和all()函数 |
>>>any([1,1,1]) |
Generatorexpressions | 和listcomprehensions的语法稍有不同 (expressionforexpr1insequence1 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会话取得输入。
参考:
from:
相关文章推荐
- 简明python教程 --C++程序员的视角(八):标准库
- 【bzoj 3809】Gty的二逼妹子序列 题解&代码(c++)
- 简明python教程 --C++程序员的视角(七):异常
- 简明python教程 --C++程序员的视角(六):输入输出IO
- 简明python教程 --C++程序员的视角(五):面向对象的编程
- 简明python教程 --C++程序员的视角(四):容器类型(字符串、元组、列表、字典)和参考
- 简明python教程 --C++程序员的视角(三):模块
- 简明python教程 --C++程序员的视角(二):函数及作用域
- 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流
- C++对C语言的非面向对象特性扩充(3)
- 蓝桥杯 往届试题(C++B组)
- C++ vector多维数组初始化及清零
- C++的发展,特点和源程序构成
- 第一次c++上级报告-2
- C++之命名空间(End Chapter)
- Effective C++第三遍
- C++运算符重载:怎样定义函数才“符合常理”
- c/c++内存机制(一)(转)
- C++中关于函数的引用
- c++ 内存五区理解