![代替VBA!用Python轻松实现Excel编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/254/43738254/b_43738254.jpg)
1.2 常量和变量
常量和变量是计算机语言中最基本的语言元素,类似于英语中的单词、汉语中的字、高楼大厦的一砖一瓦。所以,对计算机语言学习的千里之行,始于这里。
回顾一下小时候学习语言,大眼睛里充满了对世界的好奇。当看到那些阳光下的树随风摇曳时,最初并不知道它们叫树。树是前人定义的一个名称,其背后是那些真实存在的绿色植物,是真实的对象。对应到计算机语言,常量或变量就相当于“树”,常量或变量表示的对象就好比树对应的真实对象。
在定义好常量后,在代码运行过程中常量的值不能改变;变量的值则可以改变。
1.2.1 常量
在编写程序时,有一些字符或数字会经常用到,就可以将它们定义为常量。所谓常量,就是指用一个表示这些字符或数字含义的名称来代替它们。使用常量能提高程序代码的可读性,比如用名称PI表示圆周率3.1415926,意义更清晰,表达更简洁。在定义了常量的值以后,在程序运行过程中其不能改变。常量包括内部常量和自定义常量。
内部常量是Python已经定义好的常量,常见的有True、False和None等。True与False表示逻辑真和假,是布尔型变量的两个取值。None表示对象为空,即对象缺失。在程序运行过程中不能改变内部常量的值,例如,下面试图改变True的值为3,返回一个语法错误。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/020-1.jpg?sign=1738866698-s9jPsx5mne46YQDZa7esXqeLCyMP6gJ1-0-f7e16a84bf18081b6e610c6c168c6291)
为了使用方便,一些内置模块或第三方模块中也预定义了常量。比如在常用的math模块中,预定义了圆周率pi和自然指数e。在使用math模块前,需要先使用import语句导入它。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/020-2.jpg?sign=1738866698-bVQ94przgQ14WOKNSY09BmcayRmm3jxq-0-c48daf56ba1c2640f7736db265ab39ba)
在C或VBA语言中,可以使用const关键字自定义常量。定义好常量后,常量的值在程序运行过程中不能修改,否则将提示语法错误。默认时,Python不支持自定义常量。当需要定义常量时,常常将变量的字母全部大写来表示常量,比如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/020-3.jpg?sign=1738866698-JsngU0ztoKoxh9wEcoUGbOpsDGO3XWU6-0-7e2440018108c6155d3eb7a10d0c3786)
这样定义的常量本质上还是变量,因为可以在程序运行时修改它的值:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/020-4.jpg?sign=1738866698-z8jcrs0NRngxVN052uQIdvIbtzDvv6dt-0-97685749e54e188ed5cad338ff15c045)
所以将变量名称全部大写,这是一个约定。当我们看到或用到它时,就知道这是常量,不要去修改它的值。
实际上,在math模块中预定义的pi常量和e常量也是变量,因为可以修改它们的值:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/021-1.jpg?sign=1738866698-jOsF7Zuz9cS6MQlEtA5DORZr6pTqyb3T-0-9f4866df3be6422f0371cf12b2ffe2f8)
1.2.2 变量及其名称
与常量不同,在程序运行过程中,变量与变量所表示的对象之间的这种引用关系是可以改变的,即变量的值是可以改变的。
变量的命名必须遵循一定的规则:
• 变量名可以由字母、数字、下画线(_)组成,其中数字不能打头。
• 变量名不能是Python关键字和内部函数的名称,但可以包含它们。
• 变量名不能包含空格。
• 变量名区分大小写。
合法的变量名如tree、TallTree、tree_10_years、_tree_0等,不合法的变量名如表1-1所示。
表1-1 不合法的变量名示例
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/021-2.jpg?sign=1738866698-ElX7wlNfwsQauiLXw4CwqyycNxzioWSh-0-9cab4b609bde429c345452bbdffa8561)
使用下面语法可以查看Python的关键字列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/021-3.jpg?sign=1738866698-JuMjd2t21JFgHcIZ1VRcVC32iatTVtYw-0-4977e72814b75cd87c590d9198c0bd69)
1.2.3 变量的声明、赋值和删除
在Python中,不需要先声明变量,或者说变量的声明和赋值是一步完成的,给变量赋了值,也就创建了该变量。
使用赋值运算符“=”给变量赋值,例如,给变量a赋值1:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/022-1.jpg?sign=1738866698-u4vsKzMgIOkdno1M4HYjp9mQnT4bR6x4-0-498fa8c7c6c7bd941fecde1bc2edb0d6)
现在变量a的值就是1:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/022-2.jpg?sign=1738866698-1yjPQGWzk5vtdr7QfltBE5xtO6ScuNiW-0-31cbe11c76bd94c55a93fd75726d252d)
把字符串"hello python"赋给变量b:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/022-3.jpg?sign=1738866698-F3a3LFS1FeTzyTxOoWeUJGUU5S3Re5lh-0-842fa9ae03313fed8b4cb95d33f089c7)
在给一个变量赋值之前,不能调用它。例如,没有给变量c赋值,调用它时报错,提示名称“c”没有被定义。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/022-4.jpg?sign=1738866698-JU04UjwxLFqtB1DnST5aoCvcHL4Tkba5-0-8b02889e1539593eeb656c50f28509f7)
使用print函数输出变量的值,例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/022-5.jpg?sign=1738866698-9wRNMFUGeVnOp942WDCtoYgA6Ite9qYl-0-2249a29ce78079700fb3ad1587612800)
Python可以将同一个值赋给多个变量,称为链式赋值。例如,给变量a和b都赋值1:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/022-6.jpg?sign=1738866698-6Yeeq0OlzkqTcS5KUqpQPwLfeMkuD8O4-0-a41cd06e3f3b78af42535e02e614cb0e)
等价于
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/022-7.jpg?sign=1738866698-mjTSYBxQ3m5K0dTnGK5JTAkzxX5Dz2pk-0-78f16e0bc41ec4b5d9ddc2e7af8a732e)
注意:可以将多条语句写在同一行,它们之间用分号分隔即可。
也可以同时给多个变量赋不同的值,称为系列解包赋值。例如,给变量a和b分别赋值1和2:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/022-8.jpg?sign=1738866698-Thprcv19EXW6l44reG8mKQRMFxe8uJOk-0-956e22634928e181995d67b9550dd0d7)
交换a和b的值,可以直接写:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/023-1.jpg?sign=1738866698-WTVbZZG3oc17LncBxYUDPgDktPut7nlW-0-a34b056f15826bff2c8cd118ce675e51)
使用del命令删除变量。删除以后,再调用该变量时就会报错。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/023-2.jpg?sign=1738866698-G9aWVnkfM4zDo9BvMsE5ySFnUUigfJql-0-25e7bf93f07acd50b7ad51527649e4d6)
1.2.4 深入变量
前面用树和它对应的真实对象说明了变量和变量对应的对象之间的关系,这种对应关系在计算机语言中被称为“引用”。对于赋值语句:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/023-3.jpg?sign=1738866698-EgM2krAnDba8E0d7GpWrPzjkXf8lho1D-0-da877a9b5e07f491ea8d296707ade875)
1是对象,赋值语句建立变量a对对象1的引用。
在Python中,一切皆对象,如数字、字符串、列表、字典、类对象等都是对象。每个对象都在内存中占据一定的空间。变量引用对象,存储对象的地址。对象的存储地址、数据类型和值被称为Python对象三要素。
存储地址就像我们的身份证号码,是对象的唯一身份标识符,使用内建函数 id()可以获取。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/023-4.jpg?sign=1738866698-eev8eqncDKLNGBwWVsYlqd5fsvI1QgeR-0-6d0f9c9a19636d896a516f77522207d2)
每个对象的值都有自己的数据类型,使用type()函数可以查看对象的数据类型。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/023-5.jpg?sign=1738866698-3htwLIT8A1Q2zeCJokgUr3tav12pGOzd-0-518335300eeefb8ffcb57884e0c76fed)
返回值为<class 'int'>,表示变量a的值是整型数字。
变量的值指的是它引用的对象表示的数据,前面给变量a赋值1,那么它的值就是1。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/023-6.jpg?sign=1738866698-PioGp9LjAU1oxVPAfSGItkDpu5PHgw4Q-0-e8f77b456750070b454954d5f8e94543)
使用“==”可以比较对象的值是否相等,使用is可以比较对象的地址是否相同。
1.2.5 变量的数据类型
每个对象的值都有自己的数据类型,常见的数据类型有布尔型、数字型、字符串型、列表、元组等,如表1-2所示。
表1-2 Python中常见的数据类型
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/024-1.jpg?sign=1738866698-04ht9qV8g8XrrG4fBvA0QrjQoWPra8Oz-0-884b377e733ea2b89cffa5f540d19f03)