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

函数式编程

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 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())

Generators
functions that simplify the task of writing iterators, which
functools.partial()


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

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

>>> exec ‘print "Hello World"‘ 
Hello World

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

时间: 2024-08-02 19:23:33

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

简明python教程 --C++程序员的视角(三):模块

模块和包 1 python程序由包(package).模块(module)和函数组成.包是由一系列模块组成的集合.模块是处理某一类问题的函数和类的集合.函数是一段可以重复多次调用的代码. 2 python的程序是由一个个模块组成的.模块把一组相关的函数或代码组织到一个文件中,一个文件即是一个模块.模块由代码.函数和类组成.每个模块文件是一个独立完备的命名空间,一个模块文件不能看到其他文件定义的变量名,除非它明确地导入了那个文件,模块文件起到了最小化命名冲突的作用. 3 导入模块使用import和

简明python教程 --C++程序员的视角(八):标准库

os模块 这个模块包含普遍的操作系统功能. 如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.一个例子就是使用os.sep可以取代操作系统特定的路径分割符. os.system() 执行linux命令 >> os.system('ls -l') 也可以使用subprocess模块 >> subprocess.call('ls -l'.split()) os.getcwd() 得到当前工作目录 os.getenv()和os.putenv() 读取和设置环境变量 os.lis

简明python教程 --C++程序员的视角(六):输入输出IO

程序与用户交互 你会从用户那里得到输入,然后打印一些结果.我们可以分别使用raw_input,input和print语句来完成这些功能.raw_input会返回字符串,而input会返回字面值,相当于eval(raw_input([promt])). 对于输出,你也可以使用多种多样的str(字符串)类.例如,你能够使用rjust方法来得到一个按一定宽度右对齐的字符串.利用help(str)获得更多详情. 另一个常用的输入/输出类型是处理文件.创建.读和写文件的能力是许多程序所必需的,我们将会在这

简明python教程 --C++程序员的视角(七):异常

当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了.上述这些情况可以使用异常来处理. 假如你的程序中有一些无效的语句,Python会引发并告诉你那里有一个错误,从而处理这样的情况.考虑一个简单的print语句.假如我们把print误拼为Print,注意大写,这样Python会 引发一个语法错误. 我们可以观察到有一个SyntaxError被引发,并且检测到的错误位置也被打印了出来.这是这个错误的 错误

简明python教程 --C++程序员的视角(四):容器类型(字符串、元组、列表、字典)和参考

数据结构简介 Python定义的类型(或对象)层次结构在概念上可以划分为四种类别:简单类型.容器类型.代码类型 和内部类型. 可以将 PyObject 类之下的所有 Python 类划分为 Python 运行时解释器可以使用的四个主要类别: 简单类型 —— 基本构建块,如 int 和 float. 容器类型—— 保存其他对象. 代码类型—— 封装 Python 程序的元素. 内部类型 —— 程序执行期间使用的类型. 内置的简单类型 Python 有五个内置的简单类型:bool.int.long.

【转帖】简明 Python 教程

简明 Python 教程   下一页 简明 Python 教程 Swaroop, C. H. 著 沈洁元  译 版本:1.20 A Byte of Python Copyright © 2003-2005 Swaroop C H 简明 Python 教程 <简明 Python 教程>为 "A Byte of Python" 的唯一指定简体中文译本,版权 © 2005 沈洁元 本书依照 创作公用约定(署名-非派生作品-非商业用途) 发布. 概要 无论您刚接触电脑还是一个有经验

【转】简明 Python 教程

原文网址:http://woodpecker.org.cn/abyteofpython_cn/chinese/ 简明 Python 教程Swaroop, C. H. 著沈洁元  译www.byteofpython.info 版本:1.20 A Byte of Python Copyright © 2003-2005 Swaroop C H 简明 Python 教程 <简明 Python 教程>为 "A Byte of Python" 的唯一指定简体中文译本,版权 © 200

简明 Python 教程:总结

 简明 Python 教程 说明:本文只是对<简明Python教程>的一个总结.请搜索该书查看真正的教程. 第3章 最初的步骤 1. Python是大小写敏感的. 2. 在#符号右面的内容都是注释 3. Python至少应当有第一行那样的特殊形式的注释.它被称作组织行——源文件的头两个字符是#!,后面跟着一个程序.这行告诉你的Linux/Unix系统当你执行你的程序的时候,它应该运行哪个解释器. #!/usr/bin/python 4. Linux/Unix用户适用:chmod命令用来改变文件

简明 Python 教程中的第一个备份脚本

第一次学习python写的脚本 原为简明 Python 教程中的第一个脚本 原脚本如下 #!/usr/bin/python # Filename: backup_ver1.py import os import time # 1. The files and directories to be backed up are specified in a list. source = ['/home/swaroop/byte', '/home/swaroop/bin'] # If you are u