《python核心编程》第八章

  • python核心编程第八章
    • 81 89
    • 810 再谈else
    • 811 迭代器和iter函数
    • 812 列表解析式
    • 813 生成器表达式
    • 815 练习

《python核心编程》第八章

8.1 — 8.9

主要是流程控制的语法:if/else、三元操作符(?:)、while、for、break、continue、pass的使用方法

8.10 再谈else

maxFact.py

def show_max_factor(num):
    count = num // 2
    while count > 1:
        if num % count == 0:
            print('largest factor of %d is %d' % (num, count))
            break
        count -= 1
    else:
        print(num, 'is prime')


for each_num in range(10, 21):
    show_max_factor(each_num)

输出结果:
《python核心编程》第八章_第1张图片

while…else 和 for…else,以前没发现可以这样搭配。

《python核心编程》第八章_第2张图片

8.11 迭代器和iter()函数

为什么要使用迭代器?

  • 提供了可扩展的迭代器接口
  • 增强了列表迭代的性能
  • 字典迭代中性能提升
  • 创建真正的迭代接口,而不是原来的随机访问
  • 向后兼容
  • 迭代非序列集合时,可以创建更简洁的代码

使用迭代器
《python核心编程》第八章_第3张图片
书上使用 fectch.next(),但我使用时会报错,估计是版本问题。
程序中使用:
《python核心编程》第八章_第4张图片

可变对象和迭代器
记住,在迭代可变对象的时候修改它们并不是个好主意!!!

《python核心编程》第八章_第5张图片

如何创建迭代器
iter(obj)
iter(func, sentinel) : 当函数返回的值等于sentinel时停止迭代

8.12 列表解析式

语法:
[expr for iter_var in iterable (if cond_expr)]
快速生成列表:
0-5的平方
生成矩阵:
生成3*5的矩阵
计算磁盘文件单词个数及大小:
计算单词个数及文件大小

8.13 生成器表达式

语法:
(expr for iter_var in iterable (if cond_expr))
    列表解析的一个不足就是必要生成所有的数据, 用以创建整个列表. 这可能对有大量数据的迭代器有负面效应. 生成器表达式通过结合列表解析和生成器解决了这个问题.
    生成器不会让列表解析废弃,它只是一个内存使用更友好的结构。

交叉配对的例子
《python核心编程》第八章_第6张图片

试了一下,其实列表解析式也可以:

这里写图片描述

重构样例:

寻找文件的最长一行的字符数

#版本1
def find_longest_line():
    f = open('e:\hhga.txt', 'r')
    longest = 0
    while True:
        linelen = len(f.readline().strip())
        if not linelen:
            break
        if linelen > longest:
            longest = linelen
    f.close()
    return longest

    逻辑上没有问题,但是执行的时候,文件一直是打开状态,占用了资源。应该得到一个这样的理念,读取文件的行的首选方法应该是这样的:

#版本2
def find_longest_line2():
    f = open('e:\hhga.txt', 'r')
    longest = 0
    all_lines = f.readlines()
    f.close()
    for line in all_lines:
        linelen = len(line.strip())
        if linelen > longest:
            longest = linelen
    return longest

    可以使用列表解析式:

#版本3
def find_longest_line3():
    f = open('e:\hhga.txt', 'r')
    longest = 0
    all_lines = [x.strip() for x in f.readlines()]
    f.close()
    for line in all_lines:
        linelen = len(line)
        if linelen > longest:
            longest = linelen
    return longest

     以上两个例子在处理大文件时都有问题,因为readlines()函数会读取所有的行。我们有了迭代器,文件本身就是它自己的一个迭代器,不需要使用readlines()函数。我们可以直接获取每一行的长度的集合,而不是每一行内容的集合,这样就可以使用max()函数获取最大值。

#版本4
def find_longest_line4():
    f = open('e:\hhga.txt', 'r')
    all_lines = [len(x.strip()) for x in f]
    f.close()
    return max(all_lines)

     我们还发现,列表生成器需要把所有行读取到内存中,因此可以使用生成器表达式替换,6比5更加精简,但是并不会增加阅读的困难。

#版本5
def find_longest_line5():
    f = open('e:\hhga.txt', 'r')
    longest = max(len(x.strip()) for x in f)
    f.close()
    return longest
#版本6
def find_longest_line6():
    return max(len(x.strip()) for x in open('e:\hhga.txt', 'r'))

测试结果:

《python核心编程》第八章_第7张图片

8.15 练习

8-1.条件语句,请看下面的代码

def test(x):
    print('A')
    if x > 0:
        print('B')
        pass
    elif x < 0:
        print('C')
        pass
    else:
        print('D')
        pass
        print('E')

(a) 如果x<0,上面的(A,B,C,D,E)哪一句将被执行?
(b) 如果 x == 0,上面哪个语句将被执行?
(c) 如果 x > 0,上面哪个语句将被执行?
答:(a)AC
(b)ADE
(c)AB
8-2. 循环。编写一个程序,让用户输入三个数字:(f)rom, (t)o,  和  (i)ncrement. 以i为步长,从f计数到t,包括f和t。例如,如果输入的是 f == 2, t == 26, i == 4,程序将输出2, 6, 10, 14, 18, 22, 26.
答:

def increase(f, t, i):
    return [t for t in range(f, t + 1, i)]
def test():
    f = input('Enter the start number: ')
    t = input('Enter the end number: ')
    i = input('Enter increment: ')
    print(increase(int(f), int(t), int(i)))
if __name__ == '__main__':
    test()

结果:
这里写图片描述

这样太浪费时间,拣几道想做的做吧!!!

8-12. (整数)位操作。编写一个程序,用户给出起始数字和结束数字后给出一个下面这样的表格,分别显示出两个数字间所有整数的十进制, 二进制,八进制和十六进制表示.。如果字符是可打印的 ASCII 字符, 也要把它打印出来,如果没有一个是可打印字符,就省略掉 ASCII 那一栏的表头.。

def multi_number_system(begin, end):
    print('DEC        BIN       OCT       HEX   \    
          ASCII')
    print('-' * 50)
    for i in range(begin, end + 1):
        print('%-10d%-10s%-10o%-10x' % (i, bin(i), i, i))
        if 33 <= i <= 126:
            print('%-10d%-10s%-10o%-10x%-10s' % \
                 (i, bin(i), i, i, chr(i)))
def test():
    b = input('Enter the first number: ')
    e = input('Enter the last number: ')
    multi_number_system(int(b), int(e))
if __name__ == '__main__':
    test()

结果:
《python核心编程》第八章_第8张图片

你可能感兴趣的:(Python核心编程)