加分练习
通读脚本,在每一行之前加注解,以理解脚本里发生的事情。
每次 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
---------------------
作者:哈哈餐馆
来源:CSDN
原文:https://blog.csdn.net/aaazz47/article/details/79594097
版权声明:本文为博主原创文章,转载请附上博文链接!
常见问题回答
print_all 和其它函数里的 f 是什么?
和 Ex 18 里的一样, f 只是一个变量名而已,不过在这里它指的是一个文件。Python 里的文件就和老式磁带机,或者 DVD 播放机差不多。它有一个用来读取数据的“磁头”,你可以通过这个“磁头”来操作文件。每次你运行 f.seek(0) 你就回到了文件的开始,而运行 f.readline() 则会读取文件的一行,然后将“磁头”移动到 \n 后面。后面你会看到更详细的解释。
问什么文件里会有间隔空行?
readline() 函数返回的内容中包含文件本来就有的 \n,而 print 在打印时又会添加一个 \n,这样一来就会多出一个空行了。解决方法是在 print 语句结尾加一个逗号 ,,这样 print 就不会把它自己的 \n 打印出来了。
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() 里边的代码会扫描文件的每一个字节,直到找到一个 \n 为止,然后它停止读取文件,并且返回此前的文件内容。文件 f 会记录每次调用 readline() 后的读取位置,这样它就可以在下次被调用时读取接下来的一行了。
readline() 函数返回的内容中包含文件本来就有的\n,而 print 在打印时又会添加一个\n, 这样一来就会多出一个空行了。解决办法时在print函数中多加一个参数 end="",这个print就不会为每一行多打印\n出来了
从Python中readline()函数读取的一行内容中含有换行符\n,很多时候我们需要处理不含有换行符的字符串,此时就要去掉换行符\n。
方法是使用strip()函数。
例子如下:
file = open('test.txt') line = readline(file) while line:
line = line.strip('\n')
line = readline(file) file.close()
《笨方法学Python》加分题20的更多相关文章
-
";笨方法学python";
<笨方法学python>.感觉里面的方法还可以.新手可以看看... 本书可以:教会你编程新手三种最重要的技能:读和写.注重细节.发现不同.
-
笨方法学python 22,前期知识点总结
对笨方法学python,前22讲自己的模糊的单词.函数进行梳理总结如下: 单词.函数 含义 print() 打印内容到屏幕 IDLE 是一个纯Python下自带的简洁的集成开发环境 variable ...
-
笨办法学python 13题:pycharm 运行
笨办法学python 13题 代码: # -*- coding: utf-8 -*- from sys import argv # argv--argument variable 参数变量 scrip ...
-
《笨方法学Python》加分题29
加分练习猜一猜 “if 语句” 是什么,他有什么作用.在做下一道题之前,试着用自己的话回答下面的问题: 你认为 if 对他下一行代码做了什么?为什么 if 语句的下一行需要 4 个空格缩进?如果不缩进 ...
-
《笨方法学Python》加分题17
题目通过前学习的文件操作把一个文件中的内容拷贝到另一个文件中,并使用 os.path.exists 在拷贝前判断被拷贝的文件是否已经存在,之后由用户判断是否继续完成拷贝. 新知识os.path.exi ...
-
《笨方法学Python》加分题15
本题本题开始涉及文件的操作,文件操作是一件危险的事情,需要仔细细心否则可能导致重要的文件损坏. 本题除了 ex15.py 这个脚本以外,还需要一个用来读取的文件 ex15_sample.txt 其内容 ...
-
《笨方法学Python》加分题32
注意一下 range 的用法.查一下 range 函数并理解它在第 22 行(我的答案),你可以直接将 elements 赋值为 range(0, 6) ,而无需使用 for 循环?在 python ...
-
《笨方法学Python》加分题33
while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...
-
《笨方法学Python》加分题28
#!usr/bin/python # -*-coding:utf-8-*- True and True print ("True") False and True print (& ...
随机推荐
-
用extract-text-webpack-plugin提取出来的css文件中背景图片url的不正确的问题
在一个main.js中require一个scss文件,scss文件中用了背景图片,图片url是用的相对路径,用extract-text-webpack-plugin插件提取出的css文件背景图片路径不 ...
-
基于Flot可放缩的折线图
Flot初步 Flot是一个免费开源的图标插件,可以用它开发出功能强大的图表系统.下面着重讲解在Asp.net中如何使用这个插件做出功能强大的图表应用. 关于Flot,可以在这里查看现有的例子(或者是 ...
-
采用EaglePHP框架解决分布式集群服务器利用MEMCACHE方式共享SESSION数据的问题
一.问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网 站,用户系统是统一的,即一套用户名.密码在整个网站的各个模块中都是可以登录 ...
-
【SQLite】使用replace替换字段中的字符
使用replace替换字段中的字符 如:替换production表中的specification字段中的两个空格为一个空格: update production set specification = ...
-
客户端是选择Java Swing还是C# Winform
登录|注册 mentat的专栏 目录视图 摘要视图 订阅 [专家问答]韦玮:Python基础编程实战专题 [知识库]Swift资源大集合 [公告]博客新皮肤上线啦 ...
-
带OpenSSL和MySQL的静态编译版本~
http://www.npcglib.org/~stathis/blog/precompiled-qt4-qt5/ http://www.npcglib.org/~stathis/blog/preco ...
-
java中“==”和equals方法的区别,再加上特殊的String引用类型
==和equals的区别: 1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的 2.进行比较时,分为 基本数据类型 的比较和 引用数据类型 的比较 ...
-
【转载】奇异值分解(SVD)计算过程示例
原文链接:奇异值分解(SVD)的计算方法 奇异值分解是线性代数中一种重要的矩阵分解方法,这篇文章通过一个具体的例子来说明如何对一个矩阵A进行奇异值分解. 首先,对于一个m*n的矩阵,如果存在正交矩阵U ...
-
beta版本汇总
deta版本五天汇总 day1 day2 day3 day4 day5 GitHub地址 前端代码github地址 后端代码github地址 这里说明一下我们队伍的安排风格: 第一天:明确安排前后端的 ...
-
Git 修正错误
大部分的人都会犯错.所以每VCS提供了一个功能,修正错误,直到特定的点. Git提供功能使用,我们可以撤销已作出的修改到本地资源库. 假设用户不小心做了一些更改,以他的本地的仓库,现在他要扔掉这些变化 ...