02 你好世界
02 你好世界
“你好,世界!”程序是显示类似于“Hello, World!”的消息的计算机程序。在屏幕/终端上。它说明了所有周围的“生态系统”(例如编译器、解释器、源文件)如何一起使用。它还显示了编程语言的一些非常基本的语法。在 Python 等高级语言中,这样的程序对我来说往往很小。
我们将重复这个过程几次,每次我都会解释更多关于这个过程的东西。
但在此之前,我们需要进入预先配置 Python 环境的 Docker 容器。如果您没有安装 Docker,请转到上一章并安装 Docker。
现在,在您的主机操作系统中打开终端/CMD。类型:
docker pull alexberkovich/alpine-python39
{01_docker_pull}
此命令会将我的 Docker 映像从 Docker Hub 下载到您的主机操作系统。
你会得到这样的东西:
现在,输入:
docker run -it alexberkovich/alpine-python39 bash
{02_docker_run}
pwd — 打印工作目录。
ls -al — 列出目录中的所有文件,包括隐藏的,带有长描述(不仅是文件名)。
cd tmp — 将目录更改为 tmp(相对于 cwd=当前工作目录=/)
注意,登录后,我们从目录 / 开始。当我们列出该目录中的所有文件时,我们会看到其他文件 tmp.我们可以写 光盘 /tmp
这使用绝对路径,可以从任何目录工作。
笔记: 这些解释对你来说可能还不够。随意搜索这些特定命令或一些基本的 bash 教程。
现在,使用您最喜欢的文本编辑器,例如 六
, 但是我更喜欢 纳米
创建您的第一个程序。类型
纳米你好.py
{03_nano_hello}
类型:
print("你好,世界!")
{04_hello.py}
现在,点击 CTRL+O,
您应该看到以下屏幕:
按回车键,现在您应该在屏幕底部显示以下内容:
按 CTRL+X
退出编辑器。
类型 猫你好.py
为确保一切正常,您应该看到以下内容:
第一次迭代
所以,我们有文件 你好.py
一行:
print("你好,世界!")
{04_hello.py}
有所谓的“机器语言”——计算机可以理解和运行的语言,有人类语言,我们人类交流的语言,以及介于两者之间的编程语言,如汇编、C、C++、 Python。 Python 不是人类语言,它的使用方式有严格的限制。完成这些限制是为了让某些“翻译器”/其他程序能够将其“翻译”成机器语言。
在 Python 中,这样的“翻译器”就是解释器。他的名字是 Python
.基本用法如下:
蟒蛇你好.py
{05_python_hell.py}
Python
解释器逐行检查提供的文件 hello.py 并解释它,使其“执行”。
因此,文件中只有一个。它说在屏幕上打印“Hello, World”,所以解释器就是这样做的。还有更多细节,我在这里跳过,但我稍后会回复它们。
第二次迭代
现在,让我们运行“Hello, world!”以不同的方式。让我们打开 交互式翻译 模式,让我们输入:
Python
{06_python.py}
比,让我们输入
print("你好,世界!")
{07_print_hello_world.py}
比,我们会得到:
你好世界!
{08_hello_world.py}
在终端上。
我们也可以输入:
1+1
{09_1_plus_1}
我们会得到
2
{10_two}
正如预期的那样。为了退出解释器类型
相当()
{11_quite}
在 交互的 模式我们可以输入表达式并获得即时反馈。
另一方面,在第一次近似运行 Python
使用源文件就像逐行提供交互式解释器。如果我们深入挖掘,我们会发现运行 Python
带有源代码文件的解释器启用特殊类型的优化,有助于减少程序运行的时间。我将在下一章讨论它。
Jupyter Notebook 等基本上都是 交互的 口译员。它们提供了更加用户友好的、基于 Web 的、现代的 UI 来使用,而不是 CLI Python
确实如此,但原则上它们是完全相同的。
您可以通过运行 docker 容器进行尝试,如下所示:
docker run -itp 8888:8888 alexberkovich/alpine-python39 /bin/bash -c "\
conda install jupyter -y --quiet && \
mkdir -p /opt/笔记本 && \
jupyter笔记本\
--notebook-dir=/opt/notebooks --ip='*' --port=8888 \
--no-browser --allow-root"
{12_jupiter_notebook}
第三次迭代
运行“Hello, World!”至关重要。文本编辑器中的示例,没有任何 IDE 集成开发环境。在这样的环境中,您在一个地方拥有文本编辑器、解释器、调试器等。运行程序很容易,只需单击按钮即可。为了使用本书,你可以继续使用文本编辑器,甚至可以获取源代码,只看它并运行。
笔记 :
1. 掌握 IDE、调试等对于生产性工作是必不可少的,但这超出了本书的范围。
2. 如果你想在一些 docker 容器中使用 IDE,我推荐使用 PyCharm Proffessional。另一种选择可能是带有 Docker 扩展的 VSCode。我没有尝试过 VSCode。请注意,Pycharm 社区版不支持 Docker。
本书附有存储在 GitHub 中的源代码。
当然,您可以在主机操作系统上使用 Git,然后将我的文件内容复制并粘贴到 docker。您甚至可以上网并从他们那里获取文件的内容。您始终可以自己输入代码。
但是您不必知道如何使用 Git 来获取代码。搜索“git-hub alex-ber”,然后打开名为 IntroCS 的存储库。
我将为您提供一组说明如何下载源代码。当然,您可以使用 Git(无论是在 Docker 容器中还是在主机操作系统中)来执行此操作,甚至可以
笔记 :在我的 docker-container 中,我已经预装了 Git。
首先,我们将创建放置源代码的目录。例如,
mkdir -p /opt/project
{13_git1}
它可以是您想要的任何目录,但我想具体一点。此命令创建 - 如果不存在 /opt 而不是 /opt/project。比类型:
curl -L https://github.com/alex-ber/IntroCS/archive/refs/tags/1.0.0.tar.gz -o /tmp/1.0.0.tar.gz
{14_git2}
此命令从 GitHub 以 ZIP 文件的形式下载源代码为 tar.gz 文件并将其放入 /tmp。 -L,--location - 表示跟随重定向,-o - 表示将输出重定向到提供的文件名。
类型:
tar -zxvf /tmp/1.0.0.tar.gz -C /opt/project
{15_git3}
这会将 tag.gz 文件提取到 /选择/项目
目录。
要删除 tar.gz 文件类型:
rm /tmp/1.0.0.tar.gz
{16_git4}
比类型
cd /opt/project/IntroCS-1.0.0
{17_git4}
笔记 : 您可以使用
cd/密码/ls -al
遍历源树。请阅读任何基本教程如何做到这一点。我将展示如何运行第一个“Hello, world!”程序。您可以选择安装 Midnight Commander 来执行此操作。只需键入
apk 添加--no-cache mc
{18_mc}
所以,我们在 介绍CS-* 目录。只需输入:
cd 02_hello_world/
{19_cd_hello_world}
这是章节的名称。
然后,键入
蟒蛇04_hello.py
{20_python_hello}
你会看到“你好,世界!”终端上的消息。
您可以转到您正在阅读的章节的目录并从中运行文件。
第四次迭代-一些理论
Python(和 C)是 至关重要的 语。这是什么意思?
命令式编程 是一种编程范式,它使用改变程序状态的语句。与自然语言中的祈使语气表达的方式大致相同 命令 ,一个命令式程序由 命令 供计算机执行。命令式编程侧重于描述 ** 如何** 一个程序是逐步运行的,而不是对其预期结果的高级描述。该术语通常用于对比 声明性的 编程,它专注于程序应该完成什么,而不指定所有细节 如何 该计划应该达到的结果。简而言之,Python中的程序确实 确切地 我们说过要做的。
不,让我们回到 Python
.我说过,这是解释器,它只是用代码逐行读取和执行文件。
如你所见,有分裂 命令式 vs 声明式。 它不是排他性的,或者,它是一个范围。例如,在 Python 中使用正则表达式,就是使用声明性方法(但 Python 通常接近命令式语言的末端)。
如果这是您第一次阅读本书,请随意跳过所有内容,直到本章结束。如果您已经了解某种编程语言,我鼓励您阅读它。
你可以安全地跳过这一段。 声明式编程是一种 非强制性的 一种编程风格,其中程序描述了它们想要的结果,而没有明确列出必须执行的命令或步骤。 功能性 和 合乎逻辑的 编程语言的特点是 声明性的 编程风格。在 合乎逻辑的 在编程语言中,程序由逻辑语句组成,程序通过搜索语句的证明来执行。 逻辑 编程语言如 序言 状态和查询关系。如何回答这些查询的细节取决于实现及其定理证明者,但通常采用某种统一的形式。 制作 构建规范语言, Puppet 的配置管理语言 , 常用表达 , 和一个子集 SQL (例如,SELECT 查询)。例如,当我们编写简单的 从某个表中选择 *, 我们没有告诉数据库 如何 为我们提供所需的数据,它应该做什么步骤,我们只 描述 数据库是什么 期待我们想要达到的结果 .和 HTML 我们只是描述了我们希望我们的网页看起来如何,但执行特定步骤的是浏览器(有时,不同的浏览器会给你不同的结果……这就是 标准化 发生…)。
笔记: 在本书中,我将只考虑 Python 的实现,使用 C,经典实现(称为 CPython 或简称 Python)。您应该知道 IronPython 的其他实现——编译为 CLR 代码,即“.NET”,Jython——(编译为 JVM 代码),PyPy(它是用 Python 本身编写的)。
另一个区别是 ** 编译语言与解释语言** .
让我们定义一下,什么是 纯解释语言 , 和 纯编译语言 然后,我们将把 Python 融入其中。纯解释型语言就像 Python——我一直在描述你——我们逐行运行程序并 解释或执行 它。
C是 纯编译语言。 您不能像使用 Python 一样编写源代码并执行(或运行)它。计算机不直接理解 C(它也不直接理解 Python,它是 Python'
s 解释器工作将其“翻译”到计算机),C 程序的工作方式,它们有附加步骤 - ** 汇编** 步。
首先,你应该运行一个特殊的程序,叫做 编译器 , 生成“机器代码”,然后与其他 C 文件和启动代码链接以创建独立的可执行文件。生成可执行文件后,它会直接在机器上运行——您无需将用于生成程序的 C 编译器交付给用户。
相比之下,像 Python 这样的解释型语言要求您有解释器来运行程序,因为它不是由机器直接运行的。相反,它由解释器运行,解释器通常将程序翻译成中间的东西,称为字节码。令人困惑的地方在于,解释性语言还将将源文件转换为字节码的内置或独立工具称为“编译器”。在标准 Python (CPython) 中,单个可执行文件既可以作为源代码“编译器”,也可以作为编译字节码的解释器(有时可以以“pyc”文件的形式缓存到磁盘)。
在其他语言中,例如 Java,编译器和解释器是独立的程序。 Java 程序首先使用“javac”可执行文件编译为 Java 虚拟机字节码,然后使用“java”可执行文件运行编译后的 java 字节码。
因此,即使在某些情况下(例如,导入的包)将 Python 编译为字节码,编译后的字节码仍然不能由机器直接运行——它需要一个解释器。
https://codesolid.com/what-are-those-pyc-files-in-a-python-project/
引用 Python 的文档:
解释的
Python 是一种解释型语言,而不是编译型语言,尽管区别可以是 模糊的 因为字节码编译器的存在。这意味着可以直接运行源文件,而无需显式创建随后运行的可执行文件。解释型语言通常比编译型语言具有更短的开发/调试周期,尽管它们的程序通常也运行得更慢。
…交互的
Python 有一个交互式解释器,这意味着您可以在解释器提示符处输入语句和表达式,立即执行它们并查看它们的结果。刚启动
Python
没有参数(可能通过从计算机的主菜单中选择它)。这是测试新想法或检查模块和包的一种非常有效的方法(请记住帮助(x)
)。…
字节码
Python 源代码被编译成字节码,即 CPython 解释器中 Python 程序的内部表示。字节码也缓存在
.pyc
文件,以便第二次执行相同的文件更快(可以避免从源代码重新编译到字节码)。据说这种“中间语言”运行在虚拟机上,该虚拟机执行每个字节码对应的机器码。 请注意,字节码不能在不同的 Python 虚拟机之间工作,也不能在 Python 版本之间保持稳定。…
虚拟机
完全用软件定义的计算机。 Python 的虚拟机执行字节码编译器发出的字节码。
https://docs.python.org/3/glossary.html#term-interpreted
Python 将源文件编译为特定于 Python 的低级形式(称为“字节码”),在需要时自动编译(当没有对应于源文件的字节码文件,或者字节码文件比源文件旧时或由不同的 Python 版本编译),通常将字节码文件保存到磁盘(以避免将来重新编译它们)。 OTOH IronPython 通常会编译为 CLR 代码(是否将它们保存到磁盘,具体取决于)和 Jython 到 JVM 代码(是否将它们保存到磁盘 - 如果确实保存它们,它将使用 .class 扩展名)。
然后,这些较低级别的形式由适当的“虚拟机”(也称为“解释器”)执行——CPython VM、.Net 运行时、Java VM(也称为 JVM),视情况而定。
CPython 旨在尽可能快地编译,尽可能轻量级,尽可能少的仪式—— 编译器 很少做错误检查和优化,所以它可以 跑得快,数量少 内存,这反过来让它可以在需要时自动和透明地运行,而用户甚至不需要知道大部分时间正在编译。 Java 和 C# 通常在编译期间接受更多工作(因此不执行自动编译),以便更彻底地检查错误并执行更多优化。 ** 这是一个连续的灰度,** 不是非黑即白的情况,将阈值设置在某个给定级别并说仅在该级别之上您称之为“编译”是完全武断的。
因为,Python 的字节码不稳定,见上文,你不应该将它们保存为源代码的一部分。如果您要签入代码,请忽略所有 .pyc
文件或 __pycache__
目录。如果你发现你的 Python 代码有一些奇怪的行为,那么清理所有代码可能是个好主意 .pyc
文件。也可以看看 https://docs.python.org/3/library/sys.html?highlight=pycache#sys.pycache_prefix (只需搜索 sys.pycache_prefix)了解更多详情。
同样,在 Java 中,它的字节码是稳定的,通常是 独立于平台, 一般来说 前进独立, 一般来说 后向独立 .传播代码的方式,你“编译”它使用 爪哇
至 。班级
而不是使用 ZIP 格式创建单个文件。
笔记 : 我想再次强调一下“字节码”在 Python 中是非常不稳定的,而在 JVM 中是非常稳定的。
在 Python 中,引用:
Wheel 是一个 ZIP 格式的存档文件,具有特殊格式的文件名和 .whl 扩展名。它包含一个发行版,几乎就像根据 PEP 376 使用特定的安装方案进行安装一样。尽管建议使用专门的安装程序,但可以通过使用标准的“解压缩”工具简单地解压到站点包中来安装轮文件,同时保留足够的信息以在以后将其内容传播到最终路径上…… 车轮 ,是一种旨在跨多个 Python 版本工作的安装格式, 通常不包括 .pyc 文件。
https://peps.python.org/pep-0427/
在 Python 中,通常只有源代码( .py
文件)被传播,然后它们“编译”(到 .pyc
文件)。
笔记 : 我想再次强调,Python 再次是用 C 和 Python 本身编写的。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明