题目
回忆一下函数的要点,然后一边做这个练习,一边注意一下函数和文件是如何一起协作发挥作用的。
加分练习
- 通读脚本,在每一行之前加注解,以理解脚本里发生的事情。
- 每次
print_a_line运行时,你都传递了一个叫current_line的变量,在每次调用时,打印出current_line的值,跟踪一下他在print_a_line中是怎样变成line_count的。 - 找出脚本中每一个用到函数的地方。检查
def一行,确认参数没有用错。 - 上网研究一下
file中的seek函数是做什么用的。试着运行pydoc file看看能不能学到更多。 - 研究一下
+=这个简写的作用,写一个脚本,把这个操作用在里边试试。
我的答案
20.0 基础练习 + 20.1注释
# 本练习通过脚本的参数获取被打印的文件名
# 因此需要 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)
20.2 current_line 是怎么变成 line_count 的
这里其实 line_count 要叫做 位置参数,之所以调用时的参数 current_line 成为了函数定义时的 line_count 就是因为它们在定义与被调用时所处的位置是一样的。
如果我们把函数定义时两个参数的位置对调,并保持调用的顺序不变。或者,函数定义时不变,调用时对调。都会因为行号这个整数(int) 么有 readline() 这个方法而导致错误发生
20.4 使用 pydoc file 学习 seek 的作用
我们在 15.读取文件 提到了 Py3 已经没有 file 这个东西了,不过我们利用一样的方法可以了解到 seek 的用途。
仔细看了注释的同学可以发现,seek 是用来设置被 open 打开的文件对象指针。这个指针我爱想象它是打字的光标,read() 的时候光标会从当前位置逐字移动到末尾,每移动一个字就打印这个字( open的打开方式 'r' 'w' 'r+' 'w+' 等影响光标默认位置)。而 readline() 的时候则从当前位置移动到行末至下一行起始位置。
另外 seek 还有一个可选参数 whence
它一个可能有三种值 0,1,2
- 默认时是
0,表示从文件开始位置计算指针移动多少个cookie字节。 1,表示以当前为开始移动。2,表示从末尾开始移动。
Python3 VS. Python2
在 Py3 环境中,如果
seek(cookie[,whence])面对的是文本文件,而whence填写1或2时,则cookie必须为0在 Py2 中,则没有这样的条件。
20.5 += 操作符(赋值运算符)
+= 这个符号其实和 = 一类,一般都叫做赋值运算符,它还有几个兄弟姐妹。其意义是:
左边已存在的变量,与右边的值进行运算后,重新赋值给左边的变量。
假设已经有一个变量 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 |
本文通过具体示例讲解了Python中函数与文件的基本操作,包括如何通过函数读取和逐行打印文件内容,并深入探讨了文件对象的seek方法及其工作原理。
846

被折叠的 条评论
为什么被折叠?



