课程章节

03.Python语言中的变量

Python语言中的变量

对于想学习编程的新手来说,有两个问题可能是他们很想知道的,其一是“什么是(计算机)程序”,其二是“写(计算机)程序能做什么”。先说说我对这两个问题的理解:程序是数据和指令的有序集合,写程序就是用数据和指令控制计算机做我们想让它做的事情。今时今日,为什么有那么多人选择用 Python 语言来写程序,因为 Python 语言足够简单和强大。相较于 C、C++、Java 这样的编程语言,Python 对初学者和非专业人士更加友好,很多问题在 Python 语言中都能找到简单优雅的解决方案。接下来,我们就从最基础的语言元素开始,带大家认识和使用 Python 语言。

PyCharm项目中的文件夹

在上一课中,我们使用 PyCharm 创建了 Python 项目。打开项目以后,大家通常会看到.venv和.idea两个文件夹,它们都是 PyCharm 创建项目时产生的辅助目录,不是我们编写 Python 程序必须手动创建的代码文件夹。

.venv是项目的虚拟环境目录。虚拟环境中保存了这个项目使用的 Python 解释器以及后来安装的第三方库。不同项目可以使用各自独立的虚拟环境,这样一个项目升级某个库时,不会影响其他项目。项目运行时,PyCharm会优先使用.venv中的 Python 解释器。

.idea是 PyCharm 的项目配置目录。其中保存了项目使用的解释器、运行配置、代码风格、窗口布局等 PyCharm 专属设置。它服务于开发工具,不属于 Python 程序本身;如果在另一台电脑上重新打开项目,PyCharm可能会根据当前环境重新生成部分配置。

说明:.venv通常比较大,而且不同操作系统中的内容并不完全相同;.idea中也可能包含个人电脑相关的设置。学习阶段可以先认识它们的作用,不要随意删除或手动修改其中的文件。使用版本控制工具时,通常会把.venv排除在外,.idea则根据团队约定决定是否提交。

在项目文件夹中,我们自己编写的.py文件、assets目录和数据文件才是课程代码和项目资料的主要内容。创建 Python 文件时,建议仍然使用有意义的英文名称,并使用小写字母和下划线组合命名。

一些常识

在开始系统的学习 Python 编程之前,我们先来科普一些计算机的基础知识。计算机的硬件系统通常由五大部件构成,包括:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们常说的中央处理器(CPU),它的功能是执行各种运算和控制指令。刚才我们提到过,程序是指令的集合,写程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。存储器可以分为内部存储器和外部存储器,前者就是我们常说的内存,它是中央处理器可以直接寻址的存储空间,程序在执行的过程中,对应的数据和指令需要加载到内存中。输入设备和输出设备经常被统称为 I/O 设备,键盘、鼠标、麦克风、摄像头是典型的输入设备,而显示器、打印机、扬声器等则是典型的输出设备。目前,我们使用的计算机基本大多是遵循“冯·诺依曼体系结构”的计算机,这种计算机有两个关键点:一是将存储器与中央处理器分开;二是将数据以二进制方式编码。

二进制是一种“逢二进一”的计数法,跟人类使用的“逢十进一”的计数法本质是一样的。人类因为有十根手指,所以使用了十进制计数法,在计数时十根手指用完之后,就只能用进位的方式来表示更大的数值。当然凡事都有例外,玛雅人可能是因为长年光着脚的原因,把脚趾头也都用上了,于是他们使用了二十进制的计数法。基于这样的计数方式,玛雅人使用的历法跟我们平常使用的历法就产生了差异。按照玛雅人的历法,2012 年是上一个所谓的“太阳纪”的最后一年,而 2013 年则是新的“太阳纪”的开始。后来这件事情还被以讹传讹的方式误传为“2012 年是玛雅人预言的世界末日”的荒诞说法。今天有很多人猜测,玛雅文明之所以发展缓慢跟使用了二十进制是有关系的。对于计算机来说,二进制在物理器件上最容易实现的,因为可以用高电压表示 1,用低电压表示 0。不是所有写程序的人都需要熟悉二进制,熟悉十进制与二进制、八进制、十六进制的转换,大多数时候我们即便不了解这些知识也能写程序。但是,我们必须知道,计算机是使用二进制计数的,不管什么样的数据,到了计算机内存中都是以二进制形态存在的。

说明:关于二进制计数法以及它与其他进制如何相互转换,大家可以翻翻名为《计算机导论》或《计算机文化》的书,都能找到相应的知识,此处就不再进行赘述了,不清楚的读者可以自行研究。

变量和类型

要想在计算机的内存中保存数据,首先得说一说变量这个概念。在编程语言中,变量是数据的载体,简单的说就是一块用来保存数据的内存空间,变量的值可以被读取和修改,这是所有运算和控制的基础。计算机能处理的数据有很多种类型,最常见的就是数值,除了数值之外还有文本、图像、音频、视频等各种各样的数据类型。虽然数据在计算机中都是以二进制形态存在的,但是我们可以用不同类型的变量来表示数据类型的差异。Python 语言中预设了多种数据类型,也允许我们自定义新的数据类型,这一点在后面会讲到。我们首先来了解几种 Python 中最为常用的数据类型。

  1. 整型(int):Python 中可以处理任意大小的整数,而且支持二进制(如0b100,换算成十进制是4)、八进制(如0o100,换算成十进制是64)、十进制(100)和十六进制(0x100,换算成十进制是256)的表示法。运行下面的代码,看看会输出什么。

    print(0b100)  # 二进制整数
    print(0o100)  # 八进制整数
    print(100)    # 十进制整数
    print(0x100)  # 十六进制整数
  2. 浮点型(float):浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如123.456)之外还支持科学计数法(如1.23456e2,表示$\small{1.23456 \times 10^{2}}$)。运行下面的代码,看看会输出什么。

    print(123.456)    # 数学写法
    print(1.23456e2)  # 科学计数法
  3. 字符串型(str):字符串是以单引号或双引号包裹起来的任意文本,比如'hello'和"hello"。

  4. 布尔型(bool):布尔型只有True、False两种值,要么是True,要么是False,可以用来表示现实世界中的“是”和“否”,命题的“真”和“假”,状况的“好”与“坏”,水平的“高”与“低”等等。如果一个变量的值只有两种状态,我们就可以使用布尔型。

变量命名

对于每个变量,我们都需要给它取一个名字,就如同我们每个人都有自己的名字一样。在 Python 中,变量命名需要遵循以下的规则和惯例。

  • 规则部分:
    • 规则1:变量名由字母、数字和下划线构成,数字不能开头。需要说明的是,这里说的字母指的是 Unicode 字符,Unicode 称为万国码,囊括了世界上大部分的文字系统,这也就意味着中文、日文、希腊字母等都可以作为变量名中的字符,但是一些特殊字符(如:!、@、#等)是不能出现在变量名中的。我们强烈建议大家把这里说的字母理解为尽可能只使用英文字母。
    • 规则2:Python 是大小写敏感的编程语言,简单的说就是大写的A和小写的a是两个不同的变量,这一条其实并不算规则,而是需要大家注意的地方。
    • 规则3:变量名不要跟 Python 的关键字重名,尽可能避开 Python 的保留字。这里的关键字是指在 Python 程序中有特殊含义的单词(如:is、if、else、for、while、True、False等),保留字主要指 Python 语言内置函数、内置模块等的名字(如:int、print、input、str、math、os等)。
  • 惯例部分:
    • 惯例1:变量名通常使用小写英文字母,多个单词用下划线进行连接。
    • 惯例2:受保护的变量用单个下划线开头。
    • 惯例3:私有的变量用两个下划线开头。

惯例2和惯例3大家暂时不用管,讲到后面自然会明白的。当然,作为一个专业的程序员,给变量命名时做到见名知意也是非常重要,这彰显了一个程序员的专业气质,很多开发岗位的面试也非常看重这一点。

变量的使用

下面通过例子来说明变量的类型和变量的使用。

"""
使用变量保存数据并进行加减乘除运算
"""
a = 45        # 定义变量a,赋值45
b = 12        # 定义变量b,赋值12
print(a, b)   # 45 12
print(a + b)  # 57
print(a - b)  # 33
print(a * b)  # 540
print(a / b)  # 3.75

上面的程序没有从键盘读取数据,变量的初始值直接写在代码中。程序运行时,先把45和12保存到变量a、b中,再通过print把变量和运算结果输出到屏幕。把数据保存到变量以后,后续语句就可以反复使用这些数据,而不必每次重新写出具体的数字。

在 Python 中可以使用type函数对变量的类型进行检查。程序设计中函数的概念跟数学上函数的概念非常类似,数学上的函数相信大家并不陌生,它包括了函数名、自变量和因变量。如果暂时不理解函数这个概念也不要紧,我们会在后续的内容中专门讲解函数的定义和使用。

"""
使用type函数检查变量的类型
"""
a = 100
b = 123.45
c = 'hello, world'
d = True
print(type(a))  # <class 'int'>
print(type(b))  # <class 'float'>
print(type(c))  # <class 'str'>
print(type(d))  # <class 'bool'>

可以通过 Python 内置的函数来改变变量的类型,下面是一些常用的和变量类型相关的函数。

  • int():将一个数值或字符串转换成整数,可以指定进制。
  • float():将一个字符串(在可能的情况下)转换成浮点数。
  • str():将指定的对象转换成字符串形式,可以指定编码方式。
  • chr():将整数(字符编码)转换成对应的(一个字符的)字符串。
  • ord():将(一个字符的)字符串转换成对应的整数(字符编码)。
  • eval():将字符串当作 Python 表达式进行求值,并返回表达式的结果;它可以处理包含运算符的简单表达式,但不能对不可信的用户输入使用。

下面的例子为大家演示了 Python 中类型转换的操作。

"""
变量的类型转换操作
"""
a = 100
b = 123.45
c = '123'
d = '100'
e = '123.45'
f = 'hello, world'
g = True
print(float(a))         # int类型的100转成float,输出100.0
print(int(b))           # float类型的123.45转成int,输出123
print(int(c))           # str类型的'123'转成int,输出123
print(int(c, base=16))  # str类型的'123'按十六进制转成int,输出291
print(int(d, base=2))   # str类型的'100'按二进制转成int,输出4
print(float(e))         # str类型的'123.45'转成float,输出123.45
print(bool(f))          # str类型的'hello, world'转成bool,输出True
print(int(g))           # bool类型的True转成int,输出1
print(chr(a))           # int类型的100转成str,输出'd'
print(ord('d'))         # str类型的'd'转成int,输出100

说明:str类型转int类型时可以通过base参数来指定进制,可以将字符串视为对应进制的整数进行转换。str类型转成bool类型时,只要字符串有内容,不是''或"",对应的布尔值都是True。bool类型转int类型时,True会变成1,False会变成0。在 ASCII 字符集和 Unicode 字符集中, 字符'd'对应的编码都是100。

除了使用int、float等函数进行类型转换外,Python还提供了eval函数,它可以把字符串当作 Python 表达式进行计算。例如,字符串'1 + 2 * 3'经过eval处理后会得到数值7。

expression = '1 + 2 * 3'
result = eval(expression)
print(result)  # 7

注意:eval会执行字符串中的表达式。如果字符串来自键盘输入、网页表单或其他不可信来源,输入者可能构造出危险代码,因此实际开发中不要直接对不可信的字符串使用eval。对于普通的数字输入,使用int或float进行转换更加安全。

知识点总结

  1. 程序、数据与指令

    • 程序是数据和指令的有序集合,编写程序就是使用指令控制计算机处理数据。
    • 计算机硬件通常包括运算器、控制器、存储器、输入设备和输出设备;运算器与控制器共同构成 CPU。
    • 程序运行时,相关的数据和指令需要加载到内存中;键盘、鼠标、摄像头等属于输入设备,显示器、打印机、扬声器等属于输出设备。
  2. 计算机中的数据表示

    • 现代计算机普遍遵循冯·诺依曼体系结构,其重要特征包括存储器与中央处理器分离,以及数据采用二进制编码。
    • 二进制是“逢二进一”的计数法,计算机中的数据最终都以二进制形式存储和处理。
    • Python 整数支持二进制、八进制、十进制和十六进制表示,前缀分别为 0b、0o、无特殊前缀和 0x。
  3. 变量的概念

    • 变量是数据的载体,可以理解为保存数据的内存空间。
    • 变量的值可以被读取和修改,变量和运算、控制结构共同构成程序处理问题的基础。
  4. Python 的常用数据类型

    • int:整数,支持任意大小的整数。
    • float:浮点数,也就是小数,支持普通写法和科学计数法。
    • str:字符串,用单引号或双引号包裹文本。
    • bool:布尔值,只有 True 和 False 两种取值。
  5. 变量命名规则与惯例

    • 变量名由字母、数字和下划线组成,不能以数字开头。
    • Python 区分大小写,大写字母和小写字母表示不同的名称。
    • 变量名不能与 Python 关键字重名,也应尽量避开 int、print、input、str、math、os 等内置名称。
    • 通常使用小写英文字母命名,多个单词之间使用下划线连接,并尽量做到见名知意。
    • 单下划线和双下划线开头的命名具有特殊约定,具体含义将在后续面向对象内容中学习。
  6. 变量的基本使用

    • 使用赋值语句可以把数据保存到变量中,例如 a = 45。
    • 变量可以参与加、减、乘、除等运算,也可以使用 print() 输出变量或运算结果。
    • type() 函数可以查看变量的数据类型。
    • eval() 可以计算字符串形式的 Python 表达式,但只能处理可信来源的字符串。
  7. 常用类型转换函数

    • int():将数值或符合要求的字符串转换为整数,也可以通过 base 指定字符串的进制。
    • float():将数值或符合要求的字符串转换为浮点数。
    • str():将对象转换为字符串。
    • bool():将对象转换为布尔值;非空字符串通常转换为 True。
    • chr():将整数编码转换为对应字符;ord():将字符转换为对应整数编码。
    • 布尔值转换为整数时,True 对应 1,False 对应 0。
  8. 学习重点

    • 能够区分变量、变量值和数据类型。
    • 能够按照命名规则定义变量,使用 type() 检查类型,并根据需要进行类型转换。
    • 能够编写简单的赋值、输出和算术运算程序,为后续学习运算符、分支结构和循环结构打下基础。