03 程序化编程:变量和控制流介绍
变量和控制流介绍
让我们看看下面的程序:
{01_variables1.py}
如果你去 03_procedural_programming 目录和类型 蟒蛇01_variables1.py,
您将在屏幕上看到 5. 让我们像解释器那样逐行进行,并尝试了解这里发生的情况。
实际上,虽然第一行看起来很短,但在幕后发生了很多事情。让我们先尝试描述简化版本。 2 是常量整数,所以我们将 2 分配给 多变的 第一的 . 我们也可以说第一个“持有” 价值 2.
我将使用以下简化模型: 中央处理器 或处理器是负责计算的计算单元。在当前执行的行上还有一些“指针”,这个指针是 一般来说 上升(在上面的程序中从 1 到 4)。有2种 记忆 : 堆 和 堆 .
一般来说,每个对象(在 Python 中,一切都作为对象实现)创建于 堆, 但 ** 指针 ** 这个对象可以同时保存在 堆 和上 堆 .
现在,忽略, 堆 部分 .第一的 是全局变量。这意味着,它可以在源文件中的每个位置访问(为了 改变 但是,您将需要一些额外的命令)。所以,翻译见 运行 2,这是 整数 (常量和整数)值,它创建 int 目的 在 堆 并保存 指针 给它 多变的 叫 第一的 .
那么,Python 中的变量是什么?这只是 参考 到定义的对象 堆 或者 堆 .的类型 第一的 变量仅在运行时并且仅在初始化之后才知道。这被称为 ** 动态的** 类型。
所以, 第一的 是 ( 全球的 ) 指向对象 2 并具有 ( 动态的 ) 类型 整数 .
笔记: 除了全局变量之外,我们还没有看到其他类型,但是这个概念非常简单明了,不那么简单的是动态类型。例如,在 C 中,所有类型都是静态的。我稍后会回到这个区别。
变量名称中允许使用的内容有一些限制。首先,变量名只能包含字母数字字符和下划线(Az、0–9 和 _)。变量名区分大小写(age、Age 和 AGE 是三个不同的变量)。变量名必须以字母或下划线字符开头。变量名不能以数字开头。最好使用描述性名称,例如第一个参数、第二个参数、结果,而不是短名称,例如 a、b、c。
在第二行中,我们定义变量/引用 整数 3 对象。
在第三行,我们执行 第一+第二
首先,我们得到新对象(它持有 整数 5) 关于 堆 并将其引用分配给 结果 多变的 .
比我们打印 结果 屏幕上的变量。
所以,我们得到了预期的 5 (5=2+3)
.
让我们看一下同一程序的轻微变体:
{02_variables2.py}
在这里,您可以看到前 3 行与前面的程序相同,但我们提供的不是仅在屏幕上打印 5 行,而是提供了更多信息,实际上,它是 2+3
.但是为什么,我们用 6 行来打印这样的微不足道的东西呢?是什么 结束=''
每一个 打印
命令?
“的结果” 和 第一的 有不同的类型。 “的结果” 就是所谓的 Python 字符串 和 首先是int。打印 命令知道如何打印两者 整数 和 细绳, 所以在这里,我只是把每行中我有的句子或 整数或字符串。 默认, 打印 命令还打印“新行”,指定 结束=''
是说使用空白而不是“新行”。
笔记 : 你们中的许多人都在筛选我,称打印“命令”是错误的,这是一个功能。但是我们还没有学习函数。所以,我不想用这个词。
所以,第 4 行打印到屏幕“结果”,第 5 行添加“2”,第 6 行添加“+”,第 7 行添加“3”,第 8 行添加“is”,第 9 行添加“5”,我们有结果 “2 + 3 的结果是 5”。
像这样简单的事情看起来太费劲了。我们期待着,我们可以用一行来表达上面写的句子。让我们尝试这样的事情:
{03_variables3.py}
如果我们运行它,我们将收到以下消息:
_回溯(最近一次通话最后):
文件“/opt/project/IntroCS/03_procedural_programming/03_variables3.py”,第 4 行,在<module>
print(""+first+" + "+second+" 的结果是"+result)
TypeError:只能将str(不是“int”)连接到str_
显然,我们没有得到我们想要的信息。我们正在寻找的是未捕获的错误/消息的示例。我们稍后会了解这一点。因为,了解 Python 就足够了
_只能将 str(不是“int”)连接到 str_
那是 “你好,”+“世界!”
(这是字符串到字符串的连接)没问题, 2+3
可以(这是两个整数的和),但是“+2”的结果 Python 不知道怎么处理。
笔记: 我们使用相同的符号 + 都表示
整数 + 整数
(总和)和_字符串+字符串_
__ (级联)。 + 的语义不同,取决于类型。
我们可以使用简单的技巧来解决这个问题。看
{04_variables4.py}
字符串()
是内置的“命令”,几乎可以将任何类型转换为 细绳
.所以,在第 4 行,我们只有 细绳
s,这是允许的。
但是,这种风格的窃取有问题。让我们仔细看看。
当我们有第一个连接时
""+str(first) 的结果
创建了新的中间对象,然后将这个新创建的对象与 str(秒)
,创建第二个中间对象,然后将其与 str(结果)
第三次。每个 +
标志我们正在创建中间对象。
我们能以某种方式一次性创建字符串吗?我们可以!在 Python 中有一个东西叫做 f-字符串
或者 格式化字符串
.代码如下所示:
{05_variables5.py}
在这里,我们有一个长字符串(+ 只是字符串中的一个符号,如 T),我们可以在 {} 中指定 变量 ,每个值都可以替换为。例如,首先我们将看到 2。这已完成,无需创建许多中间对象。完成所有替换后(在运行时),结果很普通 细绳
.搜索“f-String”以获取更多详细信息。
现在,让我们编写一些非常简单的测试程序。这个程序会问,2+3是多少,它会得到用户的输入,如果用户是对的,它会打印“你是对的!”,如果用户错了,它会打印“对不起,你错了。”
笔记: 为简单起见,我忽略了异常。
{06_variables6.py}
前 3 行如上。
在第 4 行,我使用 f-String 来创建短语 “2+3是多少?” 这是写作的首选方式。如果稍后,我们将更改 first 或 second 的值,我们可以保持第 4 行不变。 输入()
内置的“命令”在屏幕上键入此短语,然后等待输入。无论您输入什么(按回车键后),都将被放入可变答案中。你应该只放 整数
重视他们(见上面的注释)。在第 5 行,我使用了内置的“命令” 整数(一些值)
将类型更改为 整数
. 结果
有 整数
类型。如果我们想与之比较,我们应该比较 整数
-s。否则,用户的答案将始终与计算的不同。
笔记 :如您所见,虽然您不必编写类型(但您可以,如果您愿意的话)),而您有 动态的 打字,你仍然应该关心对象的正确类型。
第 6-9 行是所谓的 分枝 操作员。首先它 评估 if 后面的值,结果是否等于 answer ( ==
被使用,因为 =
用于分配,例如 第一个=2
,只是不要混淆)。为了 整数
对象它通过检查实际值来做到这一点。
如果在第 4 行,您输入 5,而不是在第 6 行,您将检查是否 5==5,这显然是正确的,对于任何其他值,您将得到 — 错误。
笔记: 在 **** Python 布尔值只有 2 个值——
真的
和错误的
.
取决于 if 语句是否获取值 _真的_
或者 _错误的_
__ 只会执行一份早午餐。如果 _真的_
— 第一个早午餐,打印“你是对的!”,如果 _错误的_
– 第二个早午餐,打印“对不起,你错了”。
执行完近一个分支后,从第 10 行继续执行——if 之后的第一条语句 分枝 操作员。
在引擎盖下
您可以看到,这些早午餐中的语句是用 4 个空格编写的(它可以是制表符)。这就是所谓的 缩进 ,它是 Python 的方式来表示上面的“早午餐”。如果其中一个 brunches 有超过 1 个语句,则必须用 4 个空格标识,否则程序可能会崩溃。见一般如果 分枝 操作员在下面稍作说明。
笔记: 对于不耐烦的读者,我不得不说,在 Python 中,if 语句没有定义新的范围。当我将讨论定义函数时,我将讨论范围。
总而言之,有以下形式的if 分枝 操作员:
如果条件:
声明1
陈述2
别的:
声明3
声明4
声明5
- 条件正在评估。
- 如果为真,则语句 1 和 声明2 被执行。
- 如果是假的, 声明3 和 声明4 被执行。
- 在这两种情况下 声明5 被执行。
笔记: 在机器层面有一种叫做“条件跳转”的东西。如果条件为真,则程序执行的指针“跳转”到程序的一部分,否则跳转到另一部分。当每个分支结束时,“跳转”运算符到 if 块之后的第一个运算符。
if 有很多变化 分枝 操作员。它们中的每一个都可以在这个基础的帮助下表达 分枝 操作员。
笔记 : Python 有一个叫做 noop 的特殊命令——没有操作符,这个命令什么都不做。有时,你会需要它。
这只是对变量和分支的介绍。所以,下一章我们会讲到 Python的原始类型 .
这个故事是我新的一部分 书 .
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/18428/21090608
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/287862.html