回忆一下函数的要点,然后一边做这个练习,一边注意一下函数和文件是如何一起协作发挥作用的。
print_a_line
运行时,你都传递了一个叫 current_line
的变量,在每次调用时,打印出 current_line
的值,跟踪一下他在 print_a_line
中是怎样变成 line_count
的。def
一行,确认参数没有用错。file
中的 seek
函数是做什么用的。试着运行 pydoc file
看看能不能学到更多。+=
这个简写的作用,写一个脚本,把这个操作用在里边试试。
# 本练习通过脚本的参数获取被打印的文件名
# 因此需要 argv 获取脚本参数。
from sys import argv
# 第一个函数,打印整个文档。
def print_all(f):
print(f.read())
# 第二个函数,用来重置指针(相当于光标)到文件开头的位置
def rewind(f):
f.seek(0)
# 函数:打印一个数字代表行号后,打印打印一行文件
def print_a_line(line_count, f):
print(line_count, f.readline())
# 运用以上函数把脚本参数中的文件打印一遍。
# 获取脚本参数
script, input_file = argv
# 从函数可以看出其中对参数 f 使用的方法都是
# Py2 的 file 对象(在15题中得知在 Py3中是 TextIOWrapper)
# 它们都是被 open 后才出现的,所有我们需要打开文件已被被函数调用
current_file = open(input_file)
# 首先打印全文
print("First let's print the whole file:\n")
print_all(current_file)
# 打印全文之后指针已经移动到了文档的末尾,想要做其他打印需要复位一下。
# Zed 比喻这个过程像倒带一样
print("Now let's rewind, kind of like a tape.")
rewind(current_file)
# 然后指针已经回到起始位置了(0的位置)
# 逐行打印
print("Let's print three lines:")
# 设置一个代表航好的变量,打印第一行
current_line = 1
print_a_line(current_line, current_file)
# 变更行号,打印第二行(这里设置行号并不会改变
# f.readline 的行,这个被打印的行号只是给人看的,写100 也行
# 打印过一行之后,指针其实已经在第二行开头等着了)
current_line = current_line + 1
print_a_line(current_line, current_file)
# 重复上一步在打印一行
current_line = current_line + 1
print_a_line(current_line, current_file)
current_line
是怎么变成 line_count
的这里其实 line_count
要叫做 位置参数,之所以调用时的参数 current_line
成为了函数定义时的 line_count
就是因为它们在定义与被调用时所处的位置是一样的。
如果我们把函数定义时两个参数的位置对调,并保持调用的顺序不变。或者,函数定义时不变,调用时对调。都会因为行号这个整数(int)
么有 readline()
这个方法而导致错误发生
pydoc file
学习 seek
的作用我们在 15.读取文件 提到了 Py3 已经没有 file
这个东西了,不过我们利用一样的方法可以了解到 seek
的用途。
仔细看了注释的同学可以发现,seek
是用来设置被 open
打开的文件对象指针。这个指针我爱想象它是打字的光标,read()
的时候光标会从当前位置逐字移动到末尾,每移动一个字就打印这个字( open
的打开方式 'r'
'w'
'r+'
'w+'
等影响光标默认位置)。而 readline()
的时候则从当前位置移动到行末至下一行起始位置。
它一个可能有三种值 0,1,2
0
,表示从文件开始位置计算指针移动多少个 cookie
字节。1
,表示以当前为开始移动。2
,表示从末尾开始移动。Python3 VS. Python2
在 Py3 环境中,如果
seek(cookie[,whence])
面对的是文本文件,而whence
填写1
或2
时,则cookie
必须为0
在 Py2 中,则没有这样的条件。
+=
操作符(赋值运算符)+=
这个符号其实和 =
一类,一般都叫做赋值运算符,它还有几个兄弟姐妹。其意义是:
左边已存在的变量,与右边的值进行运算后,重新赋值给左边的变量。
假设已经有一个变量 a = 6
和一个 b = 2
运算符 | 描述 | 等价于 | 打印结果 print(a) |
---|---|---|---|
a = b |
赋值 | a = b |
2 |
a += b |
相加后赋值 | a = a + b |
8 |
a -= b |
相减后赋值 | a = a - b |
4 |
a *= b |
相乘后赋值 | a = a * b |
12 |
a /= b |
相除后赋值 | a = a / b |
3.0 |
a %= b |
取模后赋值 | a = a % b |
0 |
a **= b |
幂运算后赋值 | a = a ** b |
36 |
a //= b |
整除后赋值 | a = a // b |
3 |
《笨办法学 python3》系列练习计划——目录