《从问题到程序:用Python学编程和计算》——2.5 标识符、变量和赋值-阿里云开发者社区

开发者社区> 华章计算机> 正文

《从问题到程序:用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程序的基本方式。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
用字符串连接SQL语句并用EXEC执行时,出现名称 '‘不是有效的标识符
原文:用字符串连接SQL语句并用EXEC执行时,出现名称 '‘不是有效的标识符  用字符串连接SQL语句并用EXEC执行时,出现名称 '这里是字符串连接的一条SQL语句‘不是有效的标识符  才发现,在写exec @sql 时,忘了在@sql加(),这样写 exec (@sql) 就不会出错了!
593 0
SAP ABAP 如何查询一个变量表里的变量被哪支程序使用到?
STVARV,维护了如下的变量 Z_PR_PO_PRICE_NO_CHNG,     如何知道该变量是在哪个增强或者用户出口里所调用?   SE3...
1257 0
《并行计算的编程模型》一3.6.3 锁
本节书摘来华章计算机《并行计算的编程模型》一书中的第3章 ,第3.6.3节, [(美)帕万·巴拉吉(Pavan Balaji)编著;张云泉等译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
729 0
xcode反汇编调试iOS模拟器程序(六)函数出入口处的处理与局部变量
引用第二节的例子: 函数的入口处,通常都是把esp的值传给ebp保存,然后下面的操作以ebp为基准做偏移量引用。因为esp作为栈指针,push和pop都会自动修改其值,所以用ebp可以不受影响。
708 0
从零开始学 Web 之 JavaScript(二)变量
大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程。此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注。在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。
1150 0
Java基础-07.总结private,this,封装,static,成员方法变量,局部变量匿名对象
1:成员变量和局部变量的区别(理解)(1)在类中的位置不同成员变量:类中方法外局部变量:方法定义中或者方法声明上(2)在内存中的位置不同 成员变量:在堆中局部变量:在栈中(3)生命周期不同(成员的创建与销毁时间)成员变量:随着对象的创建而存在,随着对象的消失而消失局部变量:随着方法的调用而存在,随着方法的调用完毕而消失(4)初始化值不同成员变量:有默认值局部变量:没有默认值,必须定义,赋值
1361 0
Python编程:Python2.7的MD5编码问题
Python编程:Python2.7的MD5编码问题
18 0
【转】C# 计算程序运行时间
 1 //计算程序运行时间(.net1.1 于.net2.0的区别)在.net2.0中提供了Stopwatch类,简单例子  2 using System.Diagnostics;  3  4 private Stopwatch stw = new Stopwatch();  5  6 pri...
600 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载