zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Django之模板
    Web框架的原理
    mysql 索引
    pymysql模块的使用
    MySQl创建用户和授权
    php去除h5标签
    phpcms_完整版
    快速上手Linux 玩转典型应用_慕课网笔记
    php 微擎
    二维码接口
  • 原文地址:https://www.cnblogs.com/jikeboy/p/5911502.html
Copyright © 2011-2022 走看看