winston 发表于 2012-9-26 14:48:10

迭代器、推导式、函数式编程学习笔记


1、迭代器简介Python中很多对象都是迭代器,例如列表、元组、字符串、文件、映射、集合。所有可迭代的类必须实现__iter__()函数,得到迭代器对象,通常返回自身(即自身就是迭代器对象);所有的迭代器类都实现了next()函数,当然迭代器类也需要实现__iter__()函数;3.0中是__next__()函数。
2、迭代器常见用法用法1: for 变量 in 可迭代对象用法2:if 变量 in 可迭代对象用法3(较少使用):变量 = iter(可迭代对象),然后循环iter.next()得到每个值,直到StopIteration异常出现。如果想重新循环,没有回到开头的函数,可以重新得到迭代器变量,例如:it = iter(mylist) it2 = iter(it)
3、列表推导式的三种形式基本形式: [结果表达式 for 变量 in 可迭代对象] 其中结果表达式包含循环变量例如:扩展形式(增加条件):[结果表达式 for 变量 in 可迭代对象 if 条件表达式] 其中条件表达式对循环变量进行检查例如:扩展形式(多重循环): [结果表达式 for 变量 in 可迭代对象 for 变量2 in 可迭代对象2 ]多重循环中还可以包含 if 条件表达式,对前一循环变量等进行过滤判断。例如:[(x,y) for x in range(10) for y in range(10, 20)]
4、map/reduce/filtermap(function, 可迭代对象): 对可迭代对象的每一个元素,代入单参数的函数,得到的结果依次放入列表,最后得到列表。reduce(function, 可迭代对象 [,可选的初始值]):从可迭代对象中先取两个元素,代入这个双参数的函数,得到一个结果值,然后再取出下一个值,将结果值和下一个值传入函数,再将结果与下一个值进行计算,最后得到一个列表。如果指定了可选的初始值,则第一次从可迭代对象中只取一个元素,将初始值和第一个元素代入函数。举例: map(x**2 for x in ) 等效于 ]map(string.lower, ['4A', 'dF']) 得到 ['4a', 'df'])map/reduce/filter 常与lambda函数式结合起来用。
5、lambda 匿名函数格式: lambda 变量列表: 单一表达式例如: f = lambda x: x**2 assert( f(2) == 4 ) map(f, )也可直接: map(lambda x: x**2, )两个参数的例子: reduce(lambda x,y: x+y, )
6、lambda 递归函数f = lambda n: n > 2 and f(n-1)+f(n-2) or 1map(f, range(1,10))得到:提示1:表达式中可以有函数变量名提示2:通过 and 和 or 表达条件和多语句的效果
7、三元表达式从lambda 递归函数顺带说明三元表达式: A if B else C ,等效于C++的 “B ? A : C”
8、简单生成器表达式如果元素很多,才用列表会一次性加载所有元素,此时可以使用生成器表达式,即将中括号[]改为小括号()。例如 [ x**2 for x in range(10000) ] 会一次性分配10000个元素的一个列表,而“ x**2 for x in range(10000) ”则只是一个表达式,此时并没有分配元素空间。例如 for v in (x**2 for x in range(10000))传入函数中时不需要加两个小括号,例如 sum(x**2 for x in range(10000))
http://www.cnblogs.com/rhcad/archive/2011/10/21/2220727.html
页: [1]
查看完整版本: 迭代器、推导式、函数式编程学习笔记