简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他
来源:互联网 发布:ubuntu 16.04 中文字体 编辑:程序博客网 时间:2024/04/27 02:48
函数式编程
Lambda
exec,eval和assert语句,repr函数
lambda语句
用来创建简短的单行匿名函数
print_assign = lambda name, value: name + '=' + str(value)等同于def print_assign(name, value):
return name + '=' + str(value)
lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print语句也不能用在lambda形式中,只能使用表达式。
>>> ftwice = lambda s:s*2
>>> ftwice(2)
4
再如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
(f, iterable)基本上等于
[f(x)
for
x
in
iterable]
但在多元的情况下不同:
>>> list1 = [11,22,33]
>>> list2 = [44,55,66]
>>> list3 = [77,88,99]
map()只做了列内运算
>>> def abc(a, b, c):
... return a*10000 + b*100 + c
...
>>> map(abc,list1,list2,list3)
[114477, 225588, 336699]
列表解析做的是笛卡尔乘积
>>> [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:
for b in list2:
for c in list3:
result.append(abc(abc))
filter()函数
(可以被列表解析替代)
从iter中选择满足predicate条件的元素
filter(predicate, iter)
returns a list that contains all the sequence elements that meet a certain condition
形式非常简洁 existing_files = filter(os.path.exists, file_list)
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]) 参考 http://wiki.python.org/moin/HowTo/Sorting
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])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())
Generatorsfunctions that simplify the task of writing iterators, which
functools.partial()
partial function applicationexec语句用来执行储存在字符串或文件中的Python语句。
例如,可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。
>>> exec 'print "Hello World"'
Hello World
>>> eval('2*3')
6
当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
- 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他
- 简明python教程 --C++程序员的视角(五):面向对象的编程
- 简明python教程 --C++程序员的视角(三):模块
- 简明python教程 --C++程序员的视角(七):异常
- 简明python教程 --C++程序员的视角(二):函数及作用域
- 简明python教程 --C++程序员的视角(六):输入输出IO
- 简明python教程 --C++程序员的视角(八):标准库
- 简明python教程 --C++程序员的视角(四):容器类型(字符串、元组、列表、字典)和参考
- 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流
- 《简明python教程》总结(六)-- os, sys模块及其他内容
- 简明python教程学习笔记之九-str类方法简单介绍
- Python简明教程(二)函数
- 简明python教程学习笔记之九-(字典)
- 简明python教程学习笔记之九-序列的通用操作(索引和切片)
- 简明C语言教程(十七)函数
- 简明C语言教程(九)流程控制
- Vbs脚本编程简明教程之九
- python编程最最简明教程
- Android逆向分析基础-反破解技术
- c++和jboss和mangodb的关联
- (原创文章)羊毛党何去何从
- dos和shell和python的关联
- Java编程规范
- 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他
- 开发中总结的一些小的知识点,陆续更新中
- ZendStudio前端提示插件安装
- web前端--面试题
- iOS计时器NSTimer的使用
- 3des pkcs5填充加解密
- 地图控件-高德地图API
- 旋转:矩阵,四元数和欧拉角向量(2013-08-16 09:54:47)
- 陀螺仪加速度计MPU6050