=使用项和索引迭代=
使用内建函数 enumerate()函数
nameList = ['Donn', 'Shirley', 'Ben', 'Janice',... 'David', 'Yen', 'Wendy']
for i, eachLee in enumerate(nameList):
... print "%d %s Lee" % (i+1, eachLee)
...
1 Donn Lee
2 Shirley Lee
3 Ben Lee
4 Janice Lee
5 David Lee
6 Yen Lee
7 Wendy Lee
与序列有关的内建函数
xrange()类似range(),使用的情景是一个用于很大范围的列表,但是不可用于for循环以外的时候
sorted()返回一个已经排序的列表。
reversed()返回一个顺序颠倒的序列。
zip():传入两个列表,返回一个包含两个列表的列表。
以前的误解
continue 语句"立即启动循环的下一次迭代". 实际上, 当遇到continue 语句时, 程序会终止当前循环,并忽略剩余的语句, 然后回到循环的顶端.
else的其他使用方法。
在循环中使用时, else子句只在循环完成后执行, 也就是说 break 语句也会跳过 else 块.
迭代器
- 迭代器是什么:提供类序列对象的类序列接口
- 为什么使用迭代器:性能增强。创建了迭代接口,而不是随机对象访问。代码更加简洁。
- 如何使用迭代器:enumerate(),iter()返回一个迭代器,reversed()返回一个反序访问的迭代器。还有iterools模块,有各种迭代器。
any()和all(),如果迭代器的所有的值都为布尔真的话,返回值为真,感觉没什么用。
实际上使用for循环序列的话,会自己生成一个迭代器。
字典方法的迭代器:dict.iterkeys()通过keys迭代。dict.itervalues()通过values迭代。dict.iteritems()通过key-values来迭代。
4.迭代器的局限性:不能移动,不能回到开始。不能复制。迭代可变对象,不可以修改对象。
生成器与列表解析
生成器是列表解析的一个扩展。
- 列表解析:可以动态的创建列表。简单,灵活。
例子:[expr for iter_var in iterable if comdition]
for循环迭代iterable对象所有的条目,if 是筛选满足条件的条目,前面的expr应用于序列的每个成员。最后结果值是该表达式的列表。
例子:map(lambda x: x ** 2, range(6)) 这是一个计算序列成员平方的lmbda函数表达式:
扩展:
map(function, list)函数作用是,把list中所有元素都做函数的操作。
lambda函数表达式,相当于一个单条语句的函数。
上面的例子等效于>>>[x**2 for x in range(6)]
[0,1,4,9,16,25]
但是列表解析的效率更高。
更多的例子:迭代一个三行五列的矩阵。
[(x+1,y+1) for x in range(3) for y in range(5)]
- 生成器表达式
列表解析的一个不足就是必要生成所有的数据, 用以创建整个列表. 这可能对有大量数据的迭
代器有负面效应.(其实就是占内存) 生成器表达式通过结合列表解析和生成器解决了这个问题.
生成器表达式:(expr for iter_var in iterable if cond_expr)
不需要创建新的列表, 直接就可以创建配对. 我们可以使用下面的生成器表达式:
x_product_pairs = ((i, j) for i in rows for j in cols())
练习
8–5. 约数. 完成一个名为 getfactors() 的函数. 它接受一个整数作为参数, 返回它所有约数的列表, 包括 1 和它本身,
def getfactors(number):
return [x for x in range(1,number+1) if number%x==0]
列表解析真好用。。
8–6. 素因子分解. 以刚才练习中的 isprime() 和 getfactors() 函数为基础编写一个函
数, 它接受一个整数作为参数, 返回该整数所有素数因子的列表. 这个过程叫做求素因子分解, 它
输出的所有因子之积应该是原来的数字. 注意列表里可能有重复的元素. 例如输入 20 , 返回结果
应该是 [2, 2, 5] .
def getfactors(number):
return [x for x in range(1, number+1) if number%x==0]
def isprime(number):
"判断是否是素数"
return len(getfactors(number)) == 2
def factor_resolve(number):
factor = []
lists = getfactors(number)
lists = [lists[1],lists [-2]]
print lists
for i in lists:
if isprime(i):
factor.append(i)
else:
factor+=factor_resolve(i)
return factor
print factor_resolve(20)
8–7. 全数. 完全数被定义为这样的数字: 它的约数(不包括它自己)之和为它本身. 例如: 6
的约数是 1, 2, 3, 因为 1 + 2 + 3 = 6 , 所以 6 被认为是一个完全数. 编写一个名为 isperfect()的函数,
它接受一个整数作为参数, 如果这个数字是完全数, 返回 1 ; 否则返回 0 .
def getfactors(number):
return [x for x in range(1, number+1) if number%x==0 and number!=x]
def isperfect(number):
return sum(getfactors(number))==number
print isperfect(6)
8–8. 阶乘. 一个数的阶乘被定义为从 1 到该数字所有数字的乘积. N 的阶乘简写为 N! .
写一个函数, 指定 N, 返回 N! 的值.
def xmul(number):
return reduce(lambda x,y:x*y,range(1,number+1))
print xmul(4)
8–9. Fibonacci 数列. Fibonacci 数列形如 1, 1, 2, 3, 5, 8, 13, 21, 等等. 也就是说,
下一个值是序列中前两个值之和. 写一个函数, 给定 N , 返回第 N 个 Fibonacci 数字. 例如, 第
1 个 Fibonacci 数字是 1 , 第 6 个是 8 .
def series(number):
number_list = [1,1]
for i in range(number-2):
number_list.append(number_list[i]+number_list[i+1])
#print number_list
return number_list[number-1]
print series(100)
8–12. (整数)位操作. 编写一个程序, 用户给出起始和结束数字后给出一个下面这样的表格,
分别显示出两个数字间所有整数的十进制, 二进制, 八进制和十六进制表示. 如果字符是可打印的
ASCII 字符, 也要把它打印出来, 如果没有一个是可打印字符, 就省略掉 ASCII 那一栏的表头.
def number_form(start,stop):
number_list = []
for i in range(start,stop+1):
temporary_list = [i, hex(i), oct(i), bin(i)]
try:
temporary_list.append(chr(i))
except:
temporary_list.append(None)
number_list.append(temporary_list)
return number_list
for i in number_form(1,100):
print i