学习
实践
活动
工具
TVP
写文章

练习 13-15 Learn Python 3 The Hard Way

昨天我们学习了转义字符、如何从用户那里获得输入、以及如何给用户提示信息。今天我们继续学习练习 13-15 关于参数、解包、变量、如何提示用户输入,以及如何阅读文件等一些内容。

练习 13 参数,解包,变量

在这个练习中我们会再学习一种 方法,通过这种方法可以把变量传给一个脚本(也就是你的 文件)。

想想我们之前都是如何运行脚本文件的,比如要运行 ,就是输入 (Windows 下输入 )。这句命令中的 就叫做参数(argument)。我们现在要做的就是写一个也接受参数的脚本。

先做完这个练习,然后我们再详细分解:

(注:第二行注释中的 WYSS 是“What You Should See”,即练习中的“你会看到”部分,在示例代码这部分的后面)

ex13.py

第一行我们进行了 “import”(导入),这样可以把 Python 功能库中的特征或者功能(features)添加到我们的脚本中。Python 不会一次把所有的功能都给我们用,为了不让程序过于庞大,需要我们自己去导入需要的功能,这样也可以为其它阅读你代码的程序员提供参考。

后面的 是 “argument variable” (参数变量),这是一个在编程语言中非常标准和常见的名字。当你运行 Python 脚本的时候,这个变量(variable)保存了你传给 Python 脚本的参数(argument),也就是说, 不是一个参数,而是一个保存参数的变量。

在第三行中,我们“解包”(unpacks)了 ,把它分成了四个变量:, , , 以及 。“解包”这个词可能现在很难理解,但是它很恰当地定义了这个操作。你可以理解为, 这个参数变量在文件运行的时候接收了四个参数,而后又把这四个参数从左到右分配给了四个变量,最后像平常一样把它们打印出来。

前面老肖一直把我们导入进来让 python 做更多事情的东西叫做 features,但其实很少有人这么叫它,它真正的名字应该是 modules (模块)。所以之后的学习中,我们会说成“导入 模块”。还有一些程序员把它们叫做“libraries”(库),但是我们就用模块这个名字吧。

你会看到

注意!我们之前一直都是直接运行 python 脚本,不用输入命令行参数,但接下来的练习还需要加上参数,以后有 的地方都需要加上参数!

如果不明白怎么操作,看下面输出结果的第一行, 都是我们需要在命令行输入的内容!其中 、 、、 代表了 4 个我们让 保存的参数。

练习 13 结果

我们还可以把 、 、、 这 4 个参数换成任何想替换的内容,比如:

如果你没有正确运行,就会收到这样的报错:

这种情况一般是你运行脚本的时候没有在命令行放足够的变量,在这个例子中只放了 、,所以就会出现错误说“需要三个以上的值来解包”,这就是告诉你,你没有给到足够多的参数。类似的报错信息还包括

附加练习

试着给你的脚本三个以内的参数,看看你会收到什么样的报错,你是否能解释它。

写一个参数少的脚本和一个参数多的脚本,给未解包的变量起个合适的名字。

把 和 结合起来创建一个脚本,从用户那里获取更多 。别想得太难,就用 来获取一些东西,再用 从用户那里获取一些东西。

常见问题

和 之间的区别是什么?区别取决于用户在哪被要求输入,如果是在命令行,就用 。如果你想让它们在程序已经运行的情况下用键盘输入,那就用 。

命令行参数是字符串吗?是的,它们是以字符串的形式进来的,即使你在命令行输入的是数字。你可以用 把它们转化成数值,就像 。

我不知道怎么把 和 结合在一起。别把它想得太难。就在脚本最后加两行,用 获取一些东西,再打印出来。然后试着用更多方式在同一个脚本中使用这两样东西。

为什么我不能这样用: ?因为它写反了,按我的要求写,就能运行。

注意:如果你现在还不知道怎么使用命令行,先去学习附录 A 的命令行速成教程,然后再学正文的练习。

练习 14 提示和传递

如果你在前面的附加练习中不知道怎么把 和 结合在一起写脚本,这个练习中我们就会学到。我们会用一种不同的方式使用 ,就是让它打印出一个简单的 提示符。废话不多说,先做练习:

ex14.py

我们把用户提示符设置成了变量 ,然后把它赋给 而不是一遍遍地输入它们。现在如果我们想把提示符变成别的东西,只要修改一个地方,然后重新运行脚本即可,非常方便。

你会看到

注意:当你运行脚本的时候,记住一定要把你的名字赋给这个脚本,让 接收到你的名字。

练习 14 结果

附加练习

查查看 Zork 和 Adventure 游戏是什么,找来玩玩。(这两个游戏我没找到,找到的小伙伴可以在评论区留言,跟大家分享一下,实在找不到其实也没关系,对学习理解没有太大影响,所以不要纠结这个啦~)

把 变量改成别的东西。

在你的脚本里再加一个参数,就像之前练习中 一样。

确定你理解了我是如何在最后一行把 多行格式字符(style multiline string)和 格式激活器(format activator)结合起来的。

常见问题

我运行脚本的时候收到了 。我再说一次,你得在命令行里运行它,而不是在 python 里。如果你输入 ,然后再输入 ,就会无法运行,因为你是在 python 里面运行 python。关掉窗口,然后只输入 。

你说的“改变提示符”是什么意思?我不太理解。看到这个变量 了吗?改变它的值, 只是一个字符串,前面的 13 个练习我们都在创建字符串,你得真正理解这个概念。(也就是把 换成别的内容)

我收到了报错信息:我前面说过,你需要看看“你会看到”那部分然后复制我的做法。这儿也一样,注意我是如何输入命令行的,以及我为什么有一个命令行参数。

我能在 变量外面用双引号吗?你完全可以,试试吧。

我运行的时候收到了报错信息: 。你要么把 变量拼写错了,要么把那行漏掉了。回过头去,从下到上比较每一行代码。记住,你一旦遇到这种报错,就说明你拼写错误或者忘了创建变量。

练习 15 阅读文件

现在我们已经知道如何用 或者 来获取用户的输入了。接下来我们将学习如何阅读文件。对文件的操作要千万小心,因为很容易把文件删掉。

在这个练习中我们要写两个文件。一个是通常要运行的 ,一个是叫做 的文本文件。以下是文本文件中要输入的内容:

我们要做的就是在我们的脚本中打开这个文件并把它打印出来。然而,我们不想只是简单粗暴(hard coding)地把 这个文件名输入进去(hard coding 的意思是把一些应该从用户那里获取的信息直接放到源代码里)。这样不好,因为我们随后会需要它载入别的文件。解决方法就是用 或者 来问用户应该打开哪个文件,而不是 hard coding 文件名。

ex15.py

看第一遍可能不是特别明白,让我们快速分解来看一下:

第 1-3 行用了 来获取一个文件名,然后第 5 行用了一个新的命令 。我们可以通过运行 来看 的用法。

看完后你应该会明白,第 5 行所做的事情很简单,就是打开了一个文件。具体来说,你在最开始运行脚本的时候输入的第二个参数(即文本文件名)在第 3 行被解包给了 这个变量,现在对 这个变量使用 命令,也就是打开了 这个变量中包含的文本文件,然后这个打开的文本文件又被赋给了 变量。(不明白的话先往后看)

第 7 行打印了一些格式字符串信息,第 8 行我们对 用了一个叫做 的函数,我们从 那里得到的是一个文件,而且我们还可以通过 、命令名、以及参数,来给它一个命令,就像用 和 那样。区别是, 是说: ,执行不带参数的 命令!

剩下的部分基本上类似,我们会把分析留到附加练习里。

你会看到

注意:再次强调,我们之前一直不带参数运行脚本,现在我们学习 之后,在运行的时候就需要输入要求的参数,否则一定会出错。

在运行之前确保自己已经创建了前面要求的文本文件,可以命名为 。

练习 15 结果

附加练习

这部分可能比较难,在往下进行之前,最好花些心思来做这个附加练习。

在每行上面添加注释解释其含义。

如果你不确定,上网搜,或者问别人,比如你不知道 的用法,直接搜 即可。

我在这儿用的是“命令”(command)这个词,不过,它也叫“函数”(function)或者“方法”(method)。你会在本书后面学到 functions 和 methods。

把第 10-15 行删掉(或者用别的方法使其失效)然后再运行脚本。

只用 input 来试试运行这个脚本。为什么关于获取文件名,一种方法比另一种方法更好?

开启 python3.6 shell,然后就像这个程序中一样从提示界面用 。注意你是如何从 python3.6 里面打开文件并运行 的?

在你的脚本中对 以及 变量 调用 。当你对它们完成操作后关掉文件是非常重要的。(注意要用 而不是)

第 6 题乍一看有点不明白是什么意思,老肖就是想让我们直接在命令行中使用来打开这个文本文件。具体如何操作,大家可以大胆尝试,看看练习中是用什么格式使用这个命令的,然后在命令行界面多试几次。

这里其实ai酱也遇到了一个小问题,虽然最后成功打开了 txt 文件(弹出文本文档窗口),但是 Shell 上还是有报错信息。我输入的是:

错误信息是:

如果有遇到类似问题并解决了的小伙伴欢迎在评论区留言分享 solution~

常见问题

会返回文件的内容吗?不会。它其实是创建了一个叫做“文件对象”(file object)的东西。你可以把它想象成曾经的 DVD 播放器,你可以在里面移动然后“读取”它们。但是 DVD 播放器不是 DVD 本身,就像文件对象也不是文件本身一样。

为什么打开文件两次不会收到报错?

Python 不会限制你只能打开一次文件,事实上有时候确实需要打开多次。

是什么意思?现在你只需要明白 是一个包(package),这个短语是说从那个包里获取 功能(feature)。你会在后面深入学习这块内容。

我把脚本文件名这样放进去:, 但是无法运行。你不能这样做。严格按照我的代码来,然后用同样的方法在命令行运行它。你不用把文件名放进去,你得让 python 自己放。

好了,今天就学这么多,大家应该感觉到了一些难度,不过只要边练习边思考了,很多问题自然就想明白了,不明白的地方也欢迎大家在评论区、公众号后台留言,或者在群里跟大家交流~(由于公布群二维码以后吸引了一些僵尸号和不可描述的号,所以群二维码就不放了,大家还是先加ai酱微信再入群吧~)

好好学习|天天进步

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180121G083O700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券