python核心编程 第八章

=使用项和索引迭代=

使用内建函数 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 块.

迭代器

  1. 迭代器是什么:提供类序列对象的类序列接口
  2. 为什么使用迭代器:性能增强。创建了迭代接口,而不是随机对象访问。代码更加简洁。
  3. 如何使用迭代器:enumerate(),iter()返回一个迭代器,reversed()返回一个反序访问的迭代器。还有iterools模块,有各种迭代器。
    any()和all(),如果迭代器的所有的值都为布尔真的话,返回值为真,感觉没什么用。
    实际上使用for循环序列的话,会自己生成一个迭代器。

字典方法的迭代器:dict.iterkeys()通过keys迭代。dict.itervalues()通过values迭代。dict.iteritems()通过key-values来迭代。

4.迭代器的局限性:不能移动,不能回到开始。不能复制。迭代可变对象,不可以修改对象。

生成器与列表解析

生成器是列表解析的一个扩展。

  1. 列表解析:可以动态的创建列表。简单,灵活。
    例子:[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)]

  1. 生成器表达式
    列表解析的一个不足就是必要生成所有的数据, 用以创建整个列表. 这可能对有大量数据的迭
    代器有负面效应.(其实就是占内存) 生成器表达式通过结合列表解析和生成器解决了这个问题.
    生成器表达式:(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
原文地址:https://www.cnblogs.com/jikeboy/p/5911502.html