zoukankan      html  css  js  c++  java
  • 《笨方法学Python》加分题20

    加分练习
    通读脚本,在每一行之前加注解,以理解脚本里发生的事情。
    每次 print_a_line 运行时,你都传递了一个叫 current_line 的变量,在每次调用时,打印出 current_line 的值,跟踪一下他在 print_a_line 中是怎样变成 line_count 的。
    找出脚本中每一个用到函数的地方。检查 def 一行,确认参数没有用错。
    上网研究一下 file 中的 seek 函数是做什么用的。试着运行 pydoc file 看看能不能学到更多。
    研究一下 += 这个简写的作用,写一个脚本,把这个操作用在里边试试。

    20.0 基础练习 + 20.1注释

     1 # 本练习通过脚本的参数获取被打印的文件名
     2 # 因此需要 argv 获取脚本参数。
     3 from sys import argv
     4 
     5 # 第一个函数,打印整个文档。
     6 def print_all(f):
     7     print(f.read())
     8 
     9 # 第二个函数,用来重置指针(相当于光标)到文件开头的位置
    10 def rewind(f):
    11     f.seek(0)
    12 
    13 # 函数:打印一个数字代表行号后,打印打印一行文件
    14 def print_a_line(line_count, f):
    15     print(line_count, f.readline())
    16 
    17 # 运用以上函数把脚本参数中的文件打印一遍。
    18 
    19 # 获取脚本参数
    20 script, input_file = argv
    21 
    22 # 从函数可以看出其中对参数 f 使用的方法都是
    23 # Py2 的 file 对象(在15题中得知在 Py3中是 TextIOWrapper)
    24 # 它们都是被 open 后才出现的,所有我们需要打开文件已被被函数调用
    25 current_file = open(input_file)
    26 
    27 # 首先打印全文
    28 print("First let's print the whole file:
    ")
    29 print_all(current_file)
    30 
    31 # 打印全文之后指针已经移动到了文档的末尾,想要做其他打印需要复位一下。
    32 # Zed 比喻这个过程像倒带一样
    33 print("Now let's rewind, kind of like a tape.")
    34 rewind(current_file)
    35 
    36 # 然后指针已经回到起始位置了(0的位置)
    37 # 逐行打印
    38 print("Let's print three lines:")
    39 # 设置一个代表航好的变量,打印第一行
    40 current_line = 1
    41 print_a_line(current_line, current_file)
    42 
    43 # 变更行号,打印第二行(这里设置行号并不会改变
    44 # f.readline 的行,这个被打印的行号只是给人看的,写100 也行
    45 # 打印过一行之后,指针其实已经在第二行开头等着了)
    46 current_line = current_line + 1
    47 print_a_line(current_line, current_file)
    48 
    49 # 重复上一步在打印一行
    50 current_line = current_line + 1
    51 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


    ---------------------
    作者:哈哈餐馆
    来源:CSDN
    原文:https://blog.csdn.net/aaazz47/article/details/79594097
    版权声明:本文为博主原创文章,转载请附上博文链接!

    常见问题回答

    print_all 和其它函数里的 f 是什么?

    和 Ex 18 里的一样, f 只是一个变量名而已,不过在这里它指的是一个文件。Python 里的文件就和老式磁带机,或者 DVD 播放机差不多。它有一个用来读取数据的“磁头”,你可以通过这个“磁头”来操作文件。每次你运行 f.seek(0) 你就回到了文件的开始,而运行 f.readline() 则会读取文件的一行,然后将“磁头”移动到 后面。后面你会看到更详细的解释。

    问什么文件里会有间隔空行?

    readline() 函数返回的内容中包含文件本来就有的 ,而 print 在打印时又会添加一个 ,这样一来就会多出一个空行了。解决方法是在 print 语句结尾加一个逗号 ,,这样 print 就不会把它自己的 打印出来了。

    python 3x,在结尾加上,end =""。

    为什么 seek(0) 没有把 current_line 设为 0?

    首先 seek() 函数的处理对象是 字节 而非行,所以 seek(0) 只是转到文件的 0 byte,也就是第一个 byte 的位置。其次, current_line 只是一个独立变量,和文件本身没有任何关系,我们只能手动为其增值。

    += 是什么?

    英语里边 “it is” 可以写成 “it’s”,”you are” 可以写成 “you’re”,这叫做简写。而这个操作符是吧 = 和 + 简写到一起了。 x += y 的意思和 x = x + y 是一样的。

    readline() 是怎么知道每一行在哪里的?

    readline() 里边的代码会扫描文件的每一个字节,直到找到一个 为止,然后它停止读取文件,并且返回此前的文件内容。文件 f 会记录每次调用 readline() 后的读取位置,这样它就可以在下次被调用时读取接下来的一行了。
    readline() 函数返回的内容中包含文件本来就有的 ,而 print 在打印时又会添加一个 , 这样一来就会多出一个空行了。解决办法时在print函数中多加一个参数 end="",这个print就不会为每一行多打印 出来了

    从Python中readline()函数读取的一行内容中含有换行符 ,很多时候我们需要处理不含有换行符的字符串,此时就要去掉换行符 。

    方法是使用strip()函数。

    例子如下:

    1 file = open('test.txt')
    2  
    3 line = readline(file)
    4  
    5 while line:
    6     line = line.strip('
    ')
    7     line = readline(file)
    8  
    9 file.close()
  • 相关阅读:
    C
    A
    枚举子集的几种方法
    Codeforces Round #476 (Div. 2) [Thanks, Telegram!] ABCDE
    wannafly挑战赛14
    2018西安电子科大同步赛
    概率dp学习记录
    xcoj 1103 插线板(树链刨分求最大子段和)
    bzoj 2286(虚树+树形dp) 虚树模板
    bzoj3012(Trie)
  • 原文地址:https://www.cnblogs.com/python2webdata/p/10145358.html
Copyright © 2011-2022 走看看