主要是流程控制的语法:if/else、三元操作符(?:)、while、for、break、continue、pass的使用方法
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)
while…else 和 for…else,以前没发现可以这样搭配。
为什么要使用迭代器?
使用迭代器
书上使用 fectch.next(),但我使用时会报错,估计是版本问题。
程序中使用:
可变对象和迭代器
记住,在迭代可变对象的时候修改它们并不是个好主意!!!
如何创建迭代器
iter(obj)
iter(func, sentinel) : 当函数返回的值等于sentinel时停止迭代
语法:
[expr for iter_var in iterable (if cond_expr)]
快速生成列表:
生成矩阵:
计算磁盘文件单词个数及大小:
语法:
(expr for iter_var in iterable (if cond_expr))
列表解析的一个不足就是必要生成所有的数据, 用以创建整个列表. 这可能对有大量数据的迭代器有负面效应. 生成器表达式通过结合列表解析和生成器解决了这个问题.
生成器不会让列表解析废弃,它只是一个内存使用更友好的结构。
试了一下,其实列表解析式也可以:
重构样例:
寻找文件的最长一行的字符数
#版本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'))
测试结果:
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()