第 1 章 Python 初探
我们从一个小谜题以及它的答案开始。你认为下面这两行的含义是什么?
(Row 1): (RS) K18,ssk,k1,turn work.
(Row 2): (WS) Sl 1 pwise,p5,p2tog,p1,turn.
它们看起来像是某种计算机程序。实际上,这是一个针织图案。更准确地说,这两行描述的是如何编织袜子的足跟部分。对我来说,看懂它们就像让猫看懂《纽约时报》上的填字游戏一样难,但是对我妻子来说却轻而易举。如果你也懂编织,一样可以轻松看懂。
来看另一个例子。虽然你不知道最终会做出什么,但是马上就能明白下面的内容是什么。
1/2杯黄油或者人造黄油
1/2杯奶油
2.5杯面粉
1茶匙盐
1汤匙糖
4杯糊状土豆(冷藏)
确保在加入面粉之前冷藏所有材料。
混合所有材料。
用力揉。
揉成20个球并冷藏。
对于每一个球:
在布上洒上面粉。
用擀面杖把球擀成圆饼。
入锅,炸至棕色。
翻面继续炸。
即使你不会做饭,应该也能看懂这是一个菜谱:一系列食物原料以及准备工作。这道菜是什么呢?是 lefse,一道和玉米饼很像的挪威美食。做好之后抹上黄油、果酱或者其他你喜欢吃的东西,最后卷起来吃。
编织图案和菜谱有一些共同的特征。
专有名词、缩写以及符号。有些很常见,有些很难懂。
规定专有名词、缩写以及符号的使用方法,也就是它们的语法。
一个操作序列,按照顺序进行。
有时需要重复一些操作(循环),比如炸 lefse 的每一面。
有时需要引用其他操作序列(用计算机术语来说就是一个函数)。在菜谱中,你可能需要引用另一个将土豆捣成糊状的菜谱。
假定已经有相关知识。菜谱假定你知道水是什么以及如何烧水。编织图案假定你学过编织并且不会经常扎到手。
一个期望的结果。在我们的例子中分别是袜子和食物,千万不要把它们混在一起哦。
以上这些概念都会出现在计算机程序中。这两个例子的目的是让你知道编程并不像看起来那么高深莫测,其实只是学习一些正确的单词和规则而已。
下面来看看真正的程序。你知道它在做什么吗?
for countdown in 5, 4, 3, 2, 1, "hey!":
print(countdown)
这其实是一段 Python 程序,会打印出下面的内容:
5
4
3
2
1
hey!
看到了吗?学习 Python 就像看懂菜谱或者编织图案一样简单。此外,你可以在桌子上舒服并且安全地练习编写 Python 程序,完全不用担心被热水烫到或者被针扎到。
Python 程序有一些特殊的单词和符号——for
、in
、print
、逗号、冒号、括号以及其他符号。这些单词和符号是语法的重要组成部分。好消息是,Python 的语法非常优秀,相比其他大多数编程语言,学习 Python 需要记住的语法内容很少。Python 语法非常自然,就像一份菜谱一样。
下面的 Python 程序会从一个 Python 列表(list)中选出一条电视新闻的常用语并打印出来:
cliches = [
"At the end of the day",
"Having said that",
"The fact of the matter is",
"Be that as it may",
"The bottom line is",
"If you will",
]
print(cliches[3])
程序会打印出第四条常用语:
Be that as it may
一个 Python 列表,比如 cliches
,就是一个值序列,可以通过它们相对于列表起始位置的偏移量来访问。第一个值的偏移量是 0
,第四个值的偏移量是 3
。
人们通常从 1 开始数数,所以从 0 开始数似乎很奇怪。用偏移量来代替位置会更好理解一些。
列表在 Python 中很常用,第 3 章会讲解列表的用法。
下面这段程序同样会打印出一条引用内容,但是这次是用说话者的人名而不是列表中的位置来进行访问:
quotes = {
"Moe": "A wise guy, huh?",
"Larry": "Ow!",
"Curly": "Nyuk nyuk!",
}
stooge = "Curly"
print(stooge, "says:", quotes[stooge])
运行这个小程序会打印出:
Curly says: Nyuk nyuk!
quotes
是一个 Python 字典。字典是一个集合,包含唯一键(本例中是跟屁虫“Stooge”的名字)及其关联的值(本例中是跟屁虫说的话)。使用字典可以通过名字来存储和查找东西,和列表一样非常有用。第 3 章会详细讲解字典。
常用语的例子中使用方括号([
和 ]
)来创建 Python 列表,跟屁虫的例子中使用大括号({
和 }
,大括号的英文是 curly bracket,但是大括号和 Curly 没有任何关系 1)来创建 Python 字典。这些都是 Python 的语法,在之后的内容中你会看到更多语法。
1Curly 是美国乌鸦童子军(Crow Scouts)的一员,乌鸦童子军是美国和印第安人打仗时由印第安人战俘组成的军队。Curly 是小巨角河战役中为数不多的幸存者之一。小巨角河战役是美军和北美势力最庞大的苏族印地安人之间的战争,在这场战争中印第安人歼灭了美国历史上最有名的第七骑兵团,Curly 当时没有参战,他是第一个报告第七骑兵团战败的人,也因此出名。——译者注
现在我们来看另一个完全不同的例子:示例 1-1 中的 Python 程序会执行一系列复杂的任务。你可能还看不懂这段程序,没关系,学完本书之后就可以看懂了。这个例子的目的是让你了解典型的 Python 程序长什么样。如果你了解其他计算机语言,可以对比一下。
示例 1-1 会连接 YouTube 网站并获取当前评价最高的视频的信息。如果 YouTube 返回的是常见的 HTML 文本,那就很难从中挖掘出我们想要的信息(9.3.4 节会介绍网页抓取)。幸运的是,它返回的是 JSON 格式的数据,这种格式可以直接用计算机处理。JSON(JavaScript Object Notation,JavaScript 对象符号)是一种人类可以阅读的文本格式,它描述了类型、值以及值的顺序。JSON 就像一个小型编程语言,使用 JSON 在不同计算机语言和系统之间交换数据已经成为了一种非常流行的方式。更多关于 JSON 的内容请参考 8.2.4 节。
Python 程序可以把 JSON 文本翻译成 Python 的数据结构——你会在之后的两章中学习它们——和你自己创建出来的一样。这个 YouTube 响应包含很多数据,作为演示我只打印出了前 6 个视频的标题。再说一次,这是一个完整的 Python 程序,你自己也可以运行一下。
示例 1-1:intro/youtube.py
import json
from urllib.request import urlopen
url = "https://gdata.youtube.com/feeds/api.standardfeeds/top_rated?alt=json"
response = urlopen(url)
contents = response.read()
text = contents.decode('utf8')
data = json.loads(text)
for video in data['feed']['entry'][0:6]:
print(video['title']['$t'])
最后一次运行这个程序得到的输出是:
Evolution of Dance - By Judson Laipply
Linkin Park - Numb
Potter Puppet Pals: The Mysterious Ticking Noise
"Chocolate Rain" Original Song by Tay Zonday
Charlie bit my finger - again !
The Mean Kitty Song
这个 Python 小程序仅仅用了 9 行代码就很好地完成了任务,并且具备很高的可读性。如果你看不懂下面的术语,没关系,接下来的几章会让你明白它们的意思。
第 1 行:从 Python 标准库中导入名为
json
的所有代码。第 2 行:从 Python 标准
urllib
库中导入urlopen
函数。第 3 行:给变量
url
赋值一个 YouTube 地址。第 4 行:连接指定地址处的 Web 服务器并请求指定的 Web 服务。
第 5 行:获取响应数据并赋值给变量
contents
。第 6 行:把
contents
解码成一个 JSON 格式的文本字符串并赋值给变量text
。第 7 行:把
text
转换为data
——一个存储视频信息的 Python 数据结构。第 8 行:每次获取一个视频的信息并赋值给变量
video
。第 8 行:使用两层 Python 字典(
data['feed']['entry']
)和切片操作([0:6]
)。第 9 行:使用
print
函数打印出视频标题。
视频信息中包含多种你之前见过的 Python 数据结构,第 3 章会详细介绍。
在这个例子中,我们使用了一些 Python 标准库模块(它们是安装 Python 时就已经包含的程序),但是它们并不是最好的。下面的代码使用第三方 Python 软件包 requests
重写了这个例子:
import requests
url = "https://gdata.youtube.com/feeds/api.standardfeeds/top_rated?alt=json"
response = requests.get(url)
data = response.json()
for video in data['feed']['entry'][0:6]:
print(video['title']['$t'])
新版代码只有 6 行,并且我认为可读性更高。第 5 章会详细介绍 requests
以及其他第三方 Python 软件。
1.1 真实世界中的Python
那么,是否真的值得付出时间和努力来学习 Python 呢?它真的有用吗?实际上,Python 诞生于 1991 年(比 Java 还早),并且一直是最流行的十门计算机语言之一。公司需要雇用程序员来写 Python 程序,包括你每天都会用到的 Google、YouTube、Dropbox、Netflix 和 Hulu 等。我用 Python 开发过许多产品级应用,从邮件搜索应用到商业网站都有。对于发展迅速的组织来说,Python 能极大地提高生产力。
Python 可以应用在许多计算环境下,如下所示:
命令行窗口
图形用户界面,包括 Web
客户端和服务端 Web
大型网站后端
云(第三方负责管理的服务器)
移动设备
嵌入式设备
Python 程序从一次性脚本——就像你在本章中看到的一样——到几十万行的系统都有。我们会介绍 Python 在网站、系统管理和数据处理方面的应用,还会介绍 Python 在艺术、科学和商业方面的应用。
1.2 Python与其他语言
Python 和其他语言相比如何呢?什么时候该选择什么语言呢?本节会展示一些其他语言的代码片段,这样更直观一些。如果有些语言你从未使用过,也不必担心,你并不需要看懂所有代码(当你看到最后的 Python 示例时,会发现没学过其他语言也不是什么坏事)。如果你只对 Python 感兴趣,完全可以跳过这一节。
下面的每段程序都会打印出一个数字和一条描述语言的信息。
如果你使用的是命令行或者终端窗口,那你使用的就是 shell 程序,它会读入你的命令、运行并显示结果。Windows 的 shell 叫作 cmd
,它会运行后缀为 .bat 的 batch 文件。Linux 和其他类 Unix 系统(包括 Mac OS X)有许多 shell 程序,最流行的称为 bash 或者 sh
。shell 有许多简单的功能,比如执行简单的逻辑操作以及把类似 *
的通配符扩展成文件名。你可以把命令保存到名为“shell 脚本”的文件中稍后运行。shell 可能是程序员接触到的第一个程序。它的问题在于程序超过百行之后扩展性很差,并且比其他语言的运行速度慢很多。下面就是一段 shell 程序:
#!/bin/sh
language=0
echo "Language $language: I am the shell. So there."
如果你把这段代码保存为 meh.sh
并通过 sh meh.sh
命令来运行它,就会看到下面的输出:
Language 0: I am the shell. So there.
老牌语言 C 和 C++ 是底层语言,只有极其重视性能时才会使用。它们很难学习,并且有许多细节需要你自己处理,处理不当就可能导致程序崩溃和其他很难解决的问题。下面是一段 C 程序:
#include <stdio.h>
int main(int argc, char *argv[]) {
int language = 1;
printf("Language %d: I am C! Behold me and tremble!\n", language);
return 0;
}
C++ 和 C 看起来很相似,但是特性完全不同:
#include <iostream>
using namespace std;
int main(){
int language = 2;
cout << "Language " << language << \
": I am C++! Pay no attention to that C behind the curtain!" << \
endl;
return(0);
}
Java 和 C# 是 C 和 C++ 的接班人,解决了后者的许多缺点,但是相比之下代码更加冗长,写起来也有许多限制。下面是 Java 代码:
public class Overlord {
public static void main (String[] args) {
int language = 3;
System.out.format("Language %d: I am Java! Scarier than C!\n", language);
}
}
如果你没写过这些语言的程序,可能会觉得很奇怪:这都是什么东西?有些语言有很大的语法包袱。它们有时被称为静态语言,因为你必须告诉计算机许多底层细节,下面我来解释一下。
语言有变量——你想在程序中使用的值的名字。静态语言要求你必须声明每个变量的类型:它会使用多少内存以及允许的使用方法。计算机利用这些信息把程序编译成非常底层的机器语言(专门给计算机硬件使用的语言,硬件很容易理解,但是人类很难理解)。计算机语言的设计者通常必须进行权衡,到底是让语言更容易被人使用还是更容易被计算机使用。声明变量类型可以帮助计算机发现更多潜在的错误并提高运行速度,但是却需要使用者进行更多的思考和编程。C、C++ 和 Java 代码中经常需要声明类型。举例来说,在上面的例子中必须使用 int
将 language
变量声明为一个整数。(其他类型的存储方式和整数不同,比如浮点数 3.14159
、字符以及文本数据。)
那么为什么它们被称为静态语言呢?因为这些语言中的变量不能改变类型。它们是静态的。整数就是整数,永远无法改变。
相比之下,动态语言(也被称为脚本语言)并不需要在使用变量前进行声明。假设你输入 x = 5
,动态语言知道 5
是一个整数,因此变量 x
也是整数。这些语言允许你用更少的代码做更多的事情。动态语言的代码不会被编译,而是由解释器程序来解释执行。动态语言通常比编译后的静态语言更慢,但是随着解释器的不断优化,动态语言的速度也在不断提升。长期以来,动态语言的主要应用场景都是很短的程序(脚本),比如给静态语言编写的程序进行数据预处理。这样的程序通常称为胶水代码。虽然动态语言很擅长做这些事,但是如今它们也已经具备了处理大型任务的能力。
许多年来,Perl(http://www.perl.org/)一直是一门万能的动态语言。Perl 非常强大并且有许多扩展库。然而,它的语法非常难用,并且似乎无法阻挡 Python 和 Ruby 的崛起。下面是一段 Perl 代码:
my $language = 4;
print "Language $language: I am Perl, the camel of languages.\n";
Ruby(http://www.ruby-lang.org/)是一门新语言。它借鉴了一些 Perl 的特点,并且因为 Web 开发框架 Ruby on Rails 红遍大江南北。Ruby 和 Python 的许多应用场景相同,选择哪一个通常看个人喜好或者是否有你需要的库。下面是一段 Ruby 代码:
language = 5
puts "Language #{language}: I am Ruby, ready and aglow."
PHP(http://www.php.net/)在 Web 开发领域非常流行,因为它可以轻松结合 HTML 和代码,就像例子中展示的那样。然而,PHP 语言本身有许多缺陷,并且很少被应用在 Web 以外的领域。
<?PHP
$language = 6;
echo "Language $language: I am PHP. The web is <i>mine<i>, I say.\n";
?>
最后是我们的主角,Python:
language = 7
print("Language %s: I am Python. What's for supper?" % language)
1.3 为什么选择Python
Python 是一门非常通用的高级语言。它的设计极大地增强了代码可读性,可读性远比听上去重要得多。每个计算机程序只被编写一次,但是会被许多人阅读和修改许多次。提高可读性也可以让学习和记忆更加容易,因此也更容易修改。和其他流行的语言相比,Python 的学习曲线更加平缓,可以让你很快具备生产力,当然,想成为专家还需要深入学习才行。
Python 简洁的语法可以让你写出比静态语言更短的程序。研究证明,程序员每天可以编写的代码行数是有限的——无论什么语言,因此,如果完成同样的功能只需要编写一半长度的代码,生产力就可以提高一倍。对于重视这一点的公司来说,Python 是一个不算秘密的秘密武器。
在顶尖的美国大学中(http://cacm.acm.org/blogs/blog-cacm/176450-python-is-now-the-most-popular-introductory-teaching-language-at-top-us-universities/fulltext),Python 是计算机入门课程中最流行的语言。此外,它也被两千多名雇主(http://blog.codeeval.com/codeevalblog/2014#.U73vaPldUpw=)用来评估编程技能。
当然,它是免费的,就像啤酒和演讲一样。你可以免费用 Python 来编写任何东西并用在任何地方。没人可以一边阅读你的 Python 程序一边说:“这是一个非常棒的小程序,希望不会发生什么意外。”
Python 几乎可以运行在任何地方并且其标准库中有很多有用的软件。
不过,选择 Python 最关键的理由可能出乎你的意料:大家都喜欢它。实际上,大家不只是把 Python 当作一个完成工作的工具,而是非常享受用它编程。在工作中不得不用其他语言时,人们通常会非常想念 Python 的某些特性。这就是 Python 能够胜出的原因。
1.4 何时不应该使用Python
Python 并非在所有场合都是最好用的语言。
它并不是默认安装在所有环境中。如果你的电脑上没有 Python,附录 D 会告诉你如何安装。
对于大多数应用来说,Python 已经足够快了,但是有些场合下,它的性能仍然是个问题。如果你的程序会花费大量时间用于计算(专业术语是中央处理器受限),那么可以使用 C、C++ 或者 Java 来编写程序从而提高性能。但是这并不是唯一的选择!
有时候用 Python 实现一个更好的算法(一系列解决问题的步骤)可以打败 C 中的低效算法。Python 对于开发效率的提升可以让你有更多的时间来尝试各种选择。
在许多应用中,程序会因为等待其他服务器的响应而浪费时间。这段时间里 CPU(中央处理单元,计算机中负责所有计算的芯片)几乎什么都不做,因此,静态和动态程序的端到端时间几乎是一样的。
Python 的标准解释器用 C 实现,所以可以通过 C 代码进行扩展。12.10 节会介绍一些。
Python 解释器变得越来越快。Java 最初也很慢,经过大量的研究和资金投入之后,它变得非常快。Python 并不属于某个公司,因此它的发展会更缓慢一些。12.10.4 节会介绍 PyPy 项目及其意义。
可能你的项目要求非常严格,无论如何努力 Python 都无法达到要求。那么,借用伊恩 · 荷姆在电影《异形》中说过的一句话,我很同情你。通常来说可以选择 C、C++ 和 Java,不过新语言 Go(http://golang.org,写起来像 Python,性能像 C)也是一个不错的选择。
1.5 Python 2与Python 3
你即将面临的最大问题是,Python 有两个版本。Python 2 已经存在了很长时间并且预装在 Linux 和 Apple 电脑中。Python 是一门很出色的语言,但是世界上不存在完美的东西。和其他领域一样,在计算机语言中许多问题很容易解决,但是也有一些问题很难解决。后者的难点在于不兼容:使用修复后的新版本编写的程序无法运行在旧的 Python 系统中,旧的程序也无法运行在新的系统中。
Python 的发明者(吉多 · 范 · 罗苏姆,https://www.python.org/~guido)和其他开发者决定把这些困难问题放在一起解决,并把解决后的版本称作 Python 3。Python 2 已经成为过去,Python 3 才是未来。Python 2 的最后一个版本是 2.7,它会被支持很长一段时间,但也就仅此而已,再也没有 Python 2.8 了。新的开发全部会在 Python 3 上进行。
本书使用的是 Python 3。如果你使用的是 Python 2 也不用担心,两者差别不大。最明显的区别在于调用 print
的方式,最重要的区别则是处理 Unicode 字符的方式,详情参见第 2 章和第 7 章。流行的 Python 软件需要逐步升级,和常见的“先有鸡还是先有蛋”问题一样。不过,看起来我们现在终于到达了发生转变的临界点。
1.6 安装Python
为了让这章更加简洁,安装 Python 3 的细节参见附录 D。如果你还没安装 Python 3 或者不确定是否安装过 Python,请阅读附录 D。
1.7 运行Python
安装好 Python 3 之后,可以用它来运行本书中的 Python 程序和你自己的 Python 代码。那么如何运行 Python 程序呢?通常来说有两种方法。
Python 自带的交互式解释器可以很方便地执行小程序。你可以一行一行输入命令然后立刻查看运行结果。这种方式可以很好地结合输入和查看结果,从而快速进行一些实验。我会用交互式解释器来说明一些语言特性,你可以在自己的 Python 环境中输入同样的命令。
除此之外,可以把 Python 程序存储到文本文件中,通常要加上 .py 扩展名,然后输入
python
加文件名来执行。
我们来分别尝试一下这两种方式。
1.7.1 使用交互式解释器
本书中大多数代码示例都用到了交互式解释器。当你输入示例中的命令并且看到同样的输出时,就可以确定你没有跑偏。
可以在电脑上输入 Python 主程序的名称来启动解释器:应该是 python
、python3
或者类似的东西。在本书接下来的内容中,我们会假设它叫 python
;如果你的 Python 主程序名字不同,请把代码示例中的 python
全部替换成你电脑上的名称。
交互式解释器的工作原理基本上和 Python 对文件的处理方式一样,除了一点:当你输入一些包含值的东西时,交互式解释器会自动打印出这个值。举例来说,如果你启动 Python 并输入数字 61
,它会立刻出现在终端中。
在下面的例子中,
$
表示系统提示符,用来输入终端中的命令,比如python
。本书的代码示例都会使用它,尽管在你的电脑中提示符可能不是$
。
$ python
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 01:25:11)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 61
61
>>>
这种自动打印值的省时特性只有交互式解释器中有,在 Python 语言中没有。
顺便说一句,也可以使用 print()
在解释器中打印内容:
>>> print(61)
61
>>>
如果你亲自动手在交互式解释器中执行了上面这些例子并看到了相同的结果,恭喜你,你成功运行了真正的 Python 代码(虽然有点短)。接下来的几章中会接触到更长的 Python 程序。
1.7.2 使用Python文件
如果你把 61
放在文件中并使用 Python 来执行它,确实可以,但是程序什么都不会输出。在非交互式的 Python 程序中,你必须调用 print
函数来打印内容,如下所示:
print(61)
我们来生成一个 Python 程序文件并运行它。
(1) 打开你的文本编辑器。
(2) 输入代码 print(61)
,如上所示。
(3) 保存文件,命名为 61.py。一定要确保存储为纯文本而不是“富文本”格式,比如 RTF 或者 Word。Python 程序文件并不是一定要以 .py 结尾,但是加上它可以让你清楚这个文件的作用。
(4) 如果你使用的是图形用户界面——基本上每个人都会用——请打开一个终端窗口 2。
2如果你不明白什么是终端窗口,请阅读附录 D。
(5) 输入下面的命令来运行程序:
$ python 61.py
应该可以看到一行输出:
61
成功了吗?如果成功了,恭喜你运行了你的第一个 Python 程序!
1.7.3 下一步
你可以向真正的 Python 系统中输入命令,不过它们必须符合 Python 的语法。我们不会一次性向你展示所有的语法规则,而是在接下来的几章中逐一进行讲解。
开发 Python 程序最基础的方法是使用一个纯文本编辑器和一个终端窗口。在本书中会直接展示纯文本,有时候在交互式终端中,有时候在 Python 文件中。不过除此之外,还有很多优秀的 Python 集成开发环境(IDE)。它们的图形用户界面可能会有许多高端文本编辑功能和辅助开发功能。在第 12 章中你会看到一些相关介绍。
1.8 禅定一刻
每种计算机语言都有自己的风格。在前言中我提到过,你可以用 Python 的方式来表达自己。Python 中内置了一些自由体诗歌,它们简单明了地说明了 Python 的哲学(就我所知,Python 是唯一一个包含这种复活节彩蛋的语言)。只要在交互式解释器中输入 import this
,然后按下回车就能看到它们:
>>> import this
《Python之禅》 Tim Peters
优美胜于丑陋
明了胜于隐晦
简洁胜于复杂
复杂胜于混乱
扁平胜于嵌套
宽松胜于紧凑
可读性很重要
即便是特例,也不可违背这些规则
虽然现实往往不那么完美
但是不应该放过任何异常
除非你确定需要如此
如果存在多种可能,不要猜测
肯定有一种——通常也是唯一一种——最佳的解决方案
虽然这并不容易,因为你不是Python之父
动手比不动手要好
但不假思索就动手还不如不做
如果你的方案很难懂,那肯定不是一个好方案
如果你的方案很好懂,那可能是一个好方案
命名空间非常有用,我们应当多加利用
这些哲学观点会贯穿全书。
1.9 练习
本章介绍了 Python 语言——它是干什么的、它是什么样的以及它在计算机世界中的作用。在每章的结尾我都会列出一些小练习来帮助你巩固刚学到的知识并为学习新知识做好准备。
(1) 如果你还没有安装 Python 3,现在就立刻动手。具体方法请阅读附录 D。
(2) 启动 Python 3 交互式解释器。再说一次,具体方法请阅读附录 D。它会打印出几行信息和一行 >>>
,这是你输入 Python 命令的提示符。
(3) 随便玩玩解释器。可以用它来计算 8 * 9
,按下回车来查看结果,Python 应该会打印出 72
。
(4) 输入数字 47
并按下回车,解释器有没有在下一行打印出 47
?
(5) 现在,输入 print(47)
并按下回车,解释器有没有在下一行打印出 47
?