又要跟大家说对不起了,昨晚写完学习笔记已经过了零点了,然后又困得不行,所以一直到今晚回来才开始排版推送~年底事情多,希望大家多多理解~好了,进入正题吧~
上节课我们学习了练习 13-15 关于参数、解包、变量、如何提示用户输入,以及如何阅读文件等一些内容。没有印象的童鞋最好先复习一下(练习 13-15 Learn Python 3 The Hard Way),再学习今天的内容。
今天的练习 16-18 我们将继续学习读写文件、复制文件以及函数等一些内容。
练习 16. 读写文件
如果你做了上一节的附加练习,你应该看到了所有的命令(commands,modules,functions),我们可以把这些命令施加给文件。以下这几个命令是需要我们记住的:
close- 关闭文件,就像编辑器中的 “文件->另存为”一样。
read- 读取文件内容。你可以把读取结果赋给一个变量。
readline- 只读取文本文件的一行内容。
truncate- 清空文件。清空的时候要当心。
write('stuff')- 给文件写入一些“东西”。
seek(0)- 把读/写的位置移到文件最开头。
这些命令里面有些需要参数,但是先不要在意这点,记住每一个命令的格式和用法即可。
接下来,让我们用这些命令做一个小小的编辑器:
ex16.py
这个练习的代码比前面多了很多,而且有大量字符,所以输的时候一定要仔细,90% 的运行出错都是因为我们输错或漏输了某个字符或者符号,所以一定要认真,敲完之后检查一遍。
你应该看到
事实上我们会看到两样东西,一个是我们新脚本的输出结果:
练习 16 结果
另一个是我们创建的文本文件(比如本例中是 test.txt),你可以打开这个文件检查一下对不对。
注:line 1-3 的内容你可以自由发挥,只要最后打开文本文件看到的内容跟你在命令行界面输入的内容能对得上就行。
如果你在运行脚本之后选择 还是回车的时候选择了 ,程序就会中止,Windows 系统下会出现这样的文字:
MacOS 我没试过,但应该也是会终止。当然终止完你还是要重新运行一下然后选回车,让后面的步骤运行完。
附加练习
如果你理解不了这个练习,回过头去按照给每行加注释的方法再过一遍,注释能帮助你理解每一行的意思,至少让你知道你不理解的地方在哪里,然后动手去查找答案。
写一个类似于上个练习的脚本,使用 和 来读取你刚刚创建的文件。(这个不难,做过练习 15 附加练习的话,代码都可以直接用)
这个练习中有太多的重复,试着用一个 命令来打印 line1、line2、line3,你可以使用字符串、格式字符串和转义字符。
弄明白为什么我们要用一个 作为一个额外的参数来打开。提示:通过明确说明你想要写入一个文件,来安全地打开它。
如果你用 模式打开文件,那你还需要 吗? 读一读 Python 的 open 函数文件,来搞明白这个问题。
注:这个附加练习最难的应该就是第 3 题了,你可能会想到把 都放在 后面的圆括号里,但是你不确定到底这些东西之间要不要加空格、逗号以及引号,在哪加,以及加多少。怎么办呢?最好的办法就是一个一个试,这样学习效果最好,印象最深,加油!
常见问题
对于 参数来说是必须的吗?详见附加练习 5。
到底是什么意思?它真的只是一个有字符的字符串,来表示文件的一种模式。如果你用了 ,就代表你说“用 ‘write’ 模式打开这个文件。此外还有 表示 read 模式, 表示增补模式,后面还可能加一些修饰符(modifiers)。(ai酱注: 是 命令的一种模式,这种模式只会写,它会覆盖现有的文件,如果文件不存在,它会自己创建。你也可以去网上了解一下 其他模式的用法和含义。)
我能对文件使用哪些修饰符?目前最重要的一个就是 ,你可以用 , 以及。这样会让文件以读和写的模式打开,取决于你用的是那个符号以及文件所在的位置等。
如果只输入 是不是就用 (读)模式打开?是的,那是 函数的默认值。
练习 17. 更多文件
练习 17 我们学习的是复制文件。代码非常短,来吧。
ex17.py
我们在第二行调用了一个比较常用的命令 。它会基于一个字符串里面的变量文件名来判断,如果一个文件存在,它就会返回 ,不存在就会返回 。我们会在这本书的下半部分经常用到这个函数,现在不用过多深究。
注:使用 可以调出海量的免费代码,这些是程序员已经写过的代码,你就不用重复造轮子了。有兴趣的话可以了解一下 python 可以 import 哪些有趣的东西~
你会看到
我们还像以前一样运行 ex17.py ,再加上两个变量:一个是要复制的源文件,一个是要复制到的目标文件:
练习 17 结果
前面一部分是用命令行打印参数和浏览文本文件(应该有不少同学已经忘了 是什么意思了吧?附录的命令表要定期复习哦~),后面是运行脚本的结果。
附加练习
这个脚本真的很烦人。在复制之前其实没必要问你,而且它打印了太多内容,试着通过删掉一些特征让这个脚本更简洁一些。
看看你能把这个脚本缩到多短,我可以把它变成一行。
注意“你会看到”部分,我用了 ,这是一种把文件打印到屏幕的简单办法,你可以输入 来看看关于这个命令的作用。
弄明白你为什么得在代码里写 。
去读读 Python 的 import statement,然后自己试试 import 一些东西,看能不能成功运行。不成功也没关系。
注:把脚本变成一行这个题很有意思,大家可以试试,欢迎在评论区展示自己的“一行”代码~
常见问题
为什么 要用引号?因为这是一个字符串。你已经用了一段时间字符串了,你得知道它的含义。
你不可能把那些代码变成一行!那;取决于;你;如何;定义;一行;代码。
我觉得这个练习很难,这正常吗?是的,很正常。甚至到练习 36 的时候,或者学完这本书的时候,你可能还是会觉得很难。每个人的情况都不一样,所以坚持学下去,坚持做练习,要有耐心。
函数是什么作用?它能够取字符串的长度,然后返回一个数字。你可以试着玩玩。
但我试着把这些代码缩短的时候,我在关闭文件时遇到了错误。你可能用了 ,这意味着你不需要在之后再输入 ,因为你已经到了脚本的最后。一旦那一行运行过之后,它就已经被 Python 关掉了。
我收到了一个这样的错误:。你忘了在字符串后面加引号了,再检查一遍的代码。
练习 18 名称,变量,代码,函数
接下来我们要给学习函数了。这可以说是编程里面非常常用的东西了。不过也别怕,我们会从最简单你的练习入手。
函数一般就是做这些事情:
它们为一些代码起名字,就像变量为字符串和数字起名字一样。
它们像脚本获取 一样获取参数(arguments)。
通过 1 和 2 的操作,让你做一些你自己的“小脚本”或者“微命令”。
我们可以通过在 Python 中用 来创建一个函数。下面的练习中我们会创建 4 个不同的函数:
ex18.py
拆解一下:
首先,我们告诉 Python 我们想要用 (即 define)来创建一个函数。
在 的同一行我们给了函数一个名字,本例中是 ,你也可以随意起名,不过最好简短一些,并且能够说明这个函数的作用。
然后我们告诉它我们想要 ,它很像参数 ,只不过是为函数设的,必须放在括号里面才能工作。
之后我们以 结束这一行,另起一行开始缩进。
在 之后缩进四个空格的所有行都是关于 这个函数名的。我们第一个缩进的行就是用来解包这个参数(argument),跟之前的脚本一样。
要表明它是如何工作的,我们把这些参数打印了出来,就像我们在脚本中所做的一样。
不是创建一个函数最简单的方法。在 python 里面,我们可以跳过整个解包参数的过程,只用我们需要的 里面的名字即可,这也正是 所做的事情。
之后我们用一个参数创建了 这个函数。
最后我们创建了一个没有参数的函数 。
如果你现在不太明白,别灰心,我们会再做几个跟函数相关的练习,慢慢你就会明白的。
你会看到
如果你运行了 ,你会看到:
练习 18 结果
我们使用函数的方式就像使用 exists、open 这些“命令”一样。那么命令和函数到底什么区别呢?答案是:没有区别!!!老肖一直在给我们卖关子,所以“命令”就是“函数”,记住了。
附加练习
创建一个如下的函数 checklist (核查表)用于后面的练习。把这些内容写在索引卡上并牢记在心,一直保留到你完成所有剩余练习的时候或者当你感觉你不再需要这些索引卡的时候:
你是否用 来创建函数了?
你的函数名是只包含字符和 (下划线)吗?
你在函数名后面放 (左圆括号)了吗?
你在左圆括号后面放参数(argument)了吗?参数之间是以逗号隔开的吗?)
你的每个参数都是唯一的吗(即没有重名)?
你在参数后面放 (右圆括号)和 (冒号)了吗?
你在与这个函数相关的代码行前面加上四个空格的缩进了吗?(不能多,也不能少)
你是通过另起一行不缩进来结束你的函数的吗?
当你运行(使用或者调用)一个函数时,检查以下事项:
你是通过输入函数名称来运行/调用/使用一个函数的吗?
你运行的时候有在名称后面加 吗?
你有把你想要的值放在圆括号里并用逗号隔开了吗?
你是以 来结束调用这个函数的吗?
注意:我们在练习中说的“运行”(run)、“调用”(call)、“使用”(use)都是一个意思。
常见问题
函数名称有哪些要求?跟变量名一样,任何不以数字开头的字母、数字、下划线组合都可以。
中的 是什么作用?这是告诉 Python 取所有的参数给函数,然后把它们放在 里放成一列,很像你之前学的 ,只不过这个是为函数设置的。这种不常用,除非有特殊需要。
这部分好无聊好烦人啊。这就对了,这说明你已经开始一边输入代码一边思考它的作用了。如果想让它不这么无聊,按照我的要求一字不差地输入进去,然后再故意打乱它们,看看你能不能修复好。
今天的练习整体有些难度,大家还是要多花些心思,如果有任何问题,欢迎在评论区、后台以及微信群留言讨论~
好好学习|天天进步
领取专属 10元无门槛券
私享最新 技术干货