《从问题到程序:用Python学编程和计算》——2.5 标识符、变量和赋值

简介:

本节书摘来自华章计算机《从问题到程序:用Python学编程和计算》一书中的第2章,第2.5节,作者 裘宗燕,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5 标识符、变量和赋值

前面用表达式做的计算都是各自独立的,实际上是把Python用作一个简单计算器。在提示符下输入一个合法的表达式,解释器处理该表达式,得到一个结果。不同表达式的计算相互无关。显然,这种方式很有局限性,只能完成最简单的计算工作。复杂的计算可能需要经过许多步骤,每步做一点计算工作并记录得到的结果,再基于已得到的结果一步步继续工作下去。要实现这种计算方式,就要有记录计算结果的方法。

2.5.1 变量、名字和值

Python中记录计算结果的机制称为变量。一个变量有一个名字,在程序里可以用变量记录计算的结果,而后就可以通过这些变量使用记录的信息。

标识符和关键字

变量需要有名字,Python中的名字用标识符表示。标识符是语言中的一类单词,Python标识符是满足形式规定的连续字符序列。作为名字(如变量名)时,人们常用的标识符拼写形式是:第一个字符用一个小写或大写英文字母(a~z,A~Z),或者用下划线字符;后续字符可以是英文字母、下划线或数字。下面是一些合法标识符:

image

Python标识符区分大小写,这意味着OK、ok、Ok、oK是四个不同标识符。写程序时必须注意,拼写和大小写应一致,否则就是不同标识符了。实际上,Python允许在标识符里包含非英文的国际语言字母,但为了拼写和识别方便,人们通常只在这里用英文字母。

Python规定了一组称为关键字的特殊标识符,其中每一个都有特殊的语言意义,不能作为名字使用(不能作为变量名)。解释器看到这些关键字,就认定了它们的特殊意义。前面描述程序包导入时使用的from和import都是关键字。

Python语言的关键字一共有33个,如下所示:

image

虽然Python的关键字很多,但是没有关系,也不需要把它们背下来。随着讨论的深入,读者将一个个地接触并熟悉它们。

注意,除了False、True和None三个关键字之外,其他关键字都是完全由小写英文字母构成的。这三个关键字是字面量(特殊的表达式)。

变量和赋值

除关键字外的标识符都可以在Python程序里作为合法的名字。在前面讨论中,我们已经看到过名字的许多使用,包括类型名(如int、float、str等)、函数名(如type、len、sin等)、程序包名(如math、cmath)、数学常量名(e和pi)。请注意,这些类型名、函数名、程序包名都不是关键字,而是普通的标识符。

Python变量实际上是名字的一类使用方式:用于记录表达式求出的值。用一个变量记录一个表达式值的操作通过赋值语句描述,其最基本的形式是:

变量 = 表达式

这里给出的是赋值语言的语法形式,其中的变量应该是一个符合规定的名字,随后是一个表示赋值的等号(也称为赋值符),然后是一个表达式。赋值语句的作用(即语义,或说执行时的效果)是先求出表达式的值,然后用变量记录这个值。这个操作亦被称为赋值,人们也常说是把表达式的值赋给了变量。

如前所述,变量的作用就是保存计算的结果。赋值后的变量可以用在表达式里,解释器在求值表达式时遇到变量,就会取出其保存的值参加计算,例如:

>>> area = pi * 7.26**2
>>> volume = area * 13.49
>>> volume
2233.752562713233

前两个赋值语句分别给变量area和volume赋值,最后的表达式显示出volume的值。这里的连续三个命令计算出底半径为7.26(cm),高为13.49(cm)的圆柱体的体积,并将其显示出来。由于底面积和体积记录在变量里,这些值还可以在随后的计算中继续使用。例如,假设这是一个铅质圆柱体,下面语句计算其重量和对底面的压强:

>>> weight = volume * 11.3437
>>> pressure = weight / area
>>> pressure
153.026513

这段计算假定已经导入了数学包math,其中用到math里定义的pi。不难想象,其实pi也就是数学包里定义的一个变量,被赋予对应于圆周率的浮点数值。

在Python程序里,可以根据需要任意引进新变量。一旦给某个变量赋值,这个变量就有了定义。变量也是一种基本表达式,对有定义的变量求值将得到它的值。对没有定义的变量求值,解释器将报告一个错误。例如:

>>> 24 * Pressure
Traceback (most recent call last):
  File "<pyshell#53>", line 1, in <module>
    24 * Pressure
NameError: name 'Pressure' is not defined

这里想计算24cm2面积上的压力,由于不小心把字母p写成大写,解释器找不到名字为Pressure的变量(没定义),所以报错。

另一方面,如果一个变量已经有值(赋过值),完全可以再次给它赋值。再次赋值后这个变量的值就改变了,用在表达式里将得到新赋的值。这一情况说明,在一个变量的存在期间,其值可能不断变化。取值时得到的总是此前最后一次赋给这个变量的值。由此可见,程序里的一个变量真是一个“可能变化着的量”。

变量的命名

用变量记录计算中得到的结果,相当于给有关结果取了一个名字。如果名字取得好,可以帮助人理解计算中的情况,提示这个结果表示什么。就像在自然科学和技术领域,人们经常需要定义一些概念,如面积、体积、加速度等,其实它们也可能是从其他度量值求出的结果。取名就是定义概念,是一种最基本的抽象技术,有助于人把握自然中的现象或者过程。编程中情况类似,适当的变量名有助于人把握计算的描述和过程。

虽然变量的名字可以随意取,但人们的经验说明,对于开发复杂的程序,好的变量名很有意义(后面将会见到其他对象,也有类似的命名问题)。采用简单的a1、x2、b1之类作为变量名是不好的做法,因为它们字面上不携带任何信息。而area、volume等就好得多,其英文词义有助于人思考和理解程序,正确安排计算的过程。

Python并不强制性地要求如何为变量取名,但有些建议:首先,应该采用有意义的名字(除非对本身没意义的辅助变量,后面会看到)。有合适的单词最好,也可以采用词组,用下划线连接不同单词,如cylinder_volume、start_point等。此外,Python建议变量名中不包含大写字母,只用小写字母、数字和下划线。

以下划线开头的名字不要随便用,只建议在一些特殊情况下使用它们。此外,以两个下划线开头和结尾的名字保留给Python系统,编程者不应自己创造这种名字。

本书中的例子将尽可能遵循这些规则。

2.5.2 简单顺序计算

通过赋值把计算得到的值保存到变量,而后通过变量(的名字)使用,使人可以写出一串赋值语句,一点点把解决问题需要的中间结果计算出来,最后算出所需的最终结果。加上Python的内置函数和数学函数包,通过这些功能已经可以解决许多问题了。一段计算中可以使用的变量个数没有限制,可以根据需要随时定义。这些机制组合起来,其威力已经大大超过常见的科学计算器(常见的计算器只有最简单的存储机制)。

引入变量的一个作用是避免重复计算。以前面2.2.3节最后的已知三角形的三边长度,求三角形的面积为例,现在不需要重复描述和计算半周长了:

>>> s = (5 + 7 + 11) / 2
>>> (s * (s - 5) * (s - 7) * (s - 11))**0.5
12.968712349342937

这段描述与数学公式有更好的对应,半周长也只需计算一次,更合理。减少重复计算,把需要多次使用的中间结果记录下来,是变量的一种重要用途。

有了赋值语句,前面的语句可能影响后面语句的效果,因此需要考虑如何组织起一段不断进展的计算。如果需要做某种复杂计算,就要先规划好得到最终结果的过程,将其分解为一条条命令,通过多次与计算机交互的方式完成计算。这里的规划就是编程,把复杂的计算过程分解为一条条Python解释器可以直接执行的语句。通过与解释器交互,反复要求其执行所提供的命令,实现的是一种简单的顺序计算。

请注意前面提到的一种情况:变量可以重新赋值,例如:

>> n = 1
>> n = n + 1
>> n = n + 3
>> print(n)
5

这是一段完全合法的计算,其中n = n + 1要求给变量n赋一个新值,这个值是基于变量n当时的值计算出来的。

不难看到,上面这种计算有一个很大的缺点:计算过程的进展依赖于人的活动,因为解释器需要一次次等待人的命令,人的输入速度限制了计算机能力的发挥。要发挥计算机的威力,就需要利用其自动执行的能力,把一系列命令做成一个程序,然后要求Python解释器自动地执行程序里的命令。这样写出的Python程序也称为脚本。实际上,相应的脚本执行方式是解释器执行Python程序的基本方式。

相关文章
|
12天前
|
Python
python增量赋值运算的应用
Python中的增量赋值运算符用于便捷地执行算术操作,如`+=`, `-=`等,它们分别代表加法、减法、乘法、除法、取模、整除和幂运算。
13 1
|
13天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
13天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
5天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
5天前
|
安全 数据处理 开发者
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
19 1
|
5天前
|
人工智能 数据挖掘 程序员
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
35 0
|
6天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
14 0
|
6天前
|
索引 Python
Python高维变量选择:SCAD平滑剪切绝对偏差惩罚、Lasso惩罚函数比较
Python高维变量选择:SCAD平滑剪切绝对偏差惩罚、Lasso惩罚函数比较
|
6天前
|
Python Serverless API
Python风险价值计算投资组合VaR、期望损失ES
Python风险价值计算投资组合VaR、期望损失ES
23 0
Python风险价值计算投资组合VaR、期望损失ES
|
6天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
19 0