• 8ch


    这章很基础的东西很多……就跳过一些

    三元操作符:

    X if C else Y

    在发明这个语法之前,人们用(C and [X] or [Y])[0]实现三元操作

    我们可以使用相迭代和索引迭代,也可以两者兼之,使用enumerate()

    >>>nameList = ['Donn', 'Shirley', 'Ben', 'Janice']
    >>>for i, eachLee in enumerate(nameList):
                print "%d %s Lee" %(i+1, eachLee)

    8.6.5 xrange()

    比起range(),xrange()不会在内存里创建列表的完整拷贝,它只能被用在for里,产生一个可迭代对象,

    也因此性能比range()更好

    8.6.6与序列相关的内建函数

    sorted() 和zip() 返回序列

    reversed()和enumerate()返回迭代器

    8.11迭代器和iter()函数

    8.11.1 什么是迭代器

    迭代器为类序列(sequence-like)对象提供了一个类序列的接口,你可以迭代不是序列但是有序列行为的对象,比如字典的键,

    文件的行。

    8.11.3 如何迭代

    根本上来说,迭代器就是一个具有next()方法的对象,而不是通过索引来计数。

    当你或是一个循环机制(例如for语句)需要下一个项时,调用迭代器的next()方法就可以获得它,

    项全部迭代后会给出StopIteration一场,这并不表示错误发生,只是告诉外部调用者,迭代完成。

    不过迭代器也有一些限制,你不能移动也不能复制一个迭代器,如果你要再次或者同时迭代同一个对象,

    你只能再创建另一个迭代器。

    reversed()内建函数将返回一个反序访问的迭代器,enumerate()也将返回一个迭代器。

    any(),all()返回布尔数来判断一个可迭代对象的项是否都为真,比如:

    >>>a = [1,2,3,4,0]
    >>>any(a)
    True
    >>>all(a)
    False

    itertools模块包含了各种有用的迭代器。

    8.11.4迭代器的应用

    1.序列

    for循环
    for i in seq:
        do_something_to(i)
    实际上是这样工作的
    fetch = iter(seq)
    while True:
        try:
            i = fetch.next()
        except StroIteration:
            break
        do_something_to(i)

    2.字典

    字典和文件是另外两个可迭代的python数据类型,字典的迭代器会历遍它的键,所以我们直接使用

    for eachkey in dict,而不是for eachkey in dict.keys()。

    你可使用内建方法iteritems() iterkeys itervalues()来对字典进行相应类型的迭代。

    3.文件

    文件对象生成的迭代器会自动调用readline()方法。这样,循环就可以访问文本文件的所有行,

    代码也可以简洁地表示为for eachLine in myFile 而不是 for eachLine in my File.readlines()

    8.11.5可变对象和迭代器

    在迭代可变对象时修改它们不是一个好主意,因为这会立即影响到你的迭代。

    8.11.5如何创建迭代器

    iter(obj)对一个对象调用iter()就可以得到它的迭代器。

    iter(func, sentinel)传递两个参数时,它会反复调用func,直到迭代器的下一个值等于sentinel

    8.12列表解析(list comprehensions)

    语法:
    [expr for iter_var in iterable]

    >>>[x**2 for x in range(6)]
    [0,1,4,9,16,25]

    加上If语句可以拓展如下:

    [expr for iter_var in iterable if cond_expr]

    这样在迭代时会过滤出满足条件表达式cond_expr的序列成员

    比如:

    >>>seq = [11,10,9,9,10,10,9,8,23,9,7,18,12,11,12]
    >>>[x for x in seq if x % 2]
    [11,9,9,9,23,9,7,11]

    这里给出更多应用的例子:

    1.矩阵样例
    创造一个3行5列的矩阵
    >>>[(x+1, y+1) for x in range(3) for y in range(5)]
    
    2.文件操作样例
    读单词数
    假设text.txt里单词间以空格区分,
    >>> f = open('text.txt','r')
    >>> len([word for line in f for word in line.split()])
    
    快速计算文件大小
    import os
    >>> os.stat('text.txt').st_size
    499L
    假设文件中至少有一个空白字符,那么文件中的非空字符少于499个,我们
    可以把每个单词的长度加起来得到和。
    >>> f.seek(0)
    >>> sum( [len(word) for line in f for word in line.split()] )
    408
    
    这里我们使用seek()函数回到文件的开头,因为迭代器已经访问完了文件的所有行

    8.13 生成器表达式

    当处理大量数据是,迭代器因为必须生成所有数据所以效率较低,所以我们使用生成器表达式,

    生成器表达式并不真正创建列表,而是返回一个生成器,这个生成器在每次计算出一个条目以后,

    把这个条目“产生”(yield)出来。生成器表达式使用了“延迟计算”(lazy evaluation),这让它在使用内存上更有效。

    生成器表达式的语法和列表解析的语法很相似,比较如下

    列表解析:

    [expr for iter_var in iterable if cond_expr]

    生成器表达式:

    (expr for iter_var in iterable if cond_expr)

    给出几个生成器表达式的样例:

    1。如之前计算单词数的样例,当数据较大时,只需:
    >>>sum(len(word) for line in date for word in line.split())
    
    2.交叉匹配
    rows = [1,2,3]
    def cols():    #生成器(generator)
        yield 4 
        yield 5
        yield 6
    >>>pairs = ((i,j) for i in rows for j in cols())
    >>for pair in pairs:
            print pair
    (1,4)
    (1,5)
    (1,6)
    ...
    (3,4)
    (3,5)
    (3,6)
    
    3.重构样例(查找文件中最长行的长度)
    原始代码
    f = open('/etc/motd', 'r')
    longest = 0
    allLines = f.readlines()
    f.close()
    for line in allLines:
        linelen = len(line.strip())
        if linelen > longest:
            longest = linelen
    return longest
    
    使用列表解析
    f = open('/etc/motd', 'r')
    longest = 0
    allLines = [x.strip() for x in f.readlines()]
    f.close()
    for line in allLines:
        linelen = len(line)
        if linelen > longest:
            longest = linelen
    return longest
    
    对列表使用内建函数
    f = open('/etc/motd', 'r')
    allLineLens = [len(x.strip()) for x in f]
    f.close()
    return max(allLineLens)
    
    使用性能更佳的生成器表达式
    f = open('/etc/motd','r')
    longest = max(len(x.strip()) for x in f)
    f.close()
    return longest
  • 相关阅读:
    ETHINK组件取值手册
    【学习笔记】PYTHON数据分析与展示(北理工 嵩天)
    Python可视化查看数据集完整性: missingno库(用于数据分析前的数据检查)
    【学习笔记】PYTHON网络爬虫与信息提取(北理工 嵩天)
    【学习笔记】PYTHON语言程序设计(北理工 嵩天)
    ORACLE隐藏参数查看及修改
    LINUX中ORACLE 11.2.0.1 升级到11.2.0.4
    ORACLE ORION测试IO性能
    OEL7.6设置光盘YUM源
    连载《一个程序猿的生命周期》- 40、张弛有度的工作,留给自己一些思考的时间
  • 原文地址:https://www.cnblogs.com/autoria/p/4471118.html
Copyright © 2020-2023  润新知