
2.2 变量与输入输出控制
2.2.1 命名Python变量
在Python中,变量不需要提前声明,创建时直接对其赋值即可,变量类型由赋给变量的值决定。需要注意的是,变量的命名须严格遵守标识符的规则,一旦创建了一个变量,就需要给该变量赋值。变量声明的一般格式如下:

在上述格式中,变量名好比一个标签,指向内存空间的一块特定的地址。创建一个变量时,在机器的内存中,系统会自动给该变量分配一块内存,用于存放变量值。如声明变量x=100,其变量存储模型如图2-1所示。

图2-1 变量存储模型
通过id()函数可以具体查看创建变量和变量重新赋值时内存空间的变化过程,代码如下:

从上述代码的输出可以直观地看出,一个变量在初次赋值时就会获得一块内存空间来存放变量值;当令变量y等于变量x时,其实是一种内存地址的传递,变量y获得的是存储变量x值的内存地址,所以当变量x改变时,变量y并不会发生改变。此外还可以看出,变量x的值改变时,系统会重新分配另一块内存空间存放新的变量值。
变量的值就是赋给变量的数据,有数字(Number)、字符串(String)、列表(List)、元组(Tuple)、字典(Dictionary)、集合(Sets)。其中,列表、元组、字典和集合属于复合数据类型。
2.2.2 向程序输入数据
如果需要和程序进行交互,则可以使用键盘通过input()函数向程序中输入数据,需要注意的是无论用户通过控制台输入的是什么内容,都被input()函数转换为字符串处理。在获得用户输入之前,input()函数还可以输出一些提示性文字,其语法格式如下:

上述格式将用户从控制台输入的内容转换为字符串,并赋给指定的变量。如果想将字符串转换为指定的内容,可以使用Python提供的eval()函数,该函数的形式如下:

该函数会将指定的字符串内容转换为数字型数据,如果输入的是整型数字则变量类型转换为int;若输入为小数,则变量类型转换为float。
【任务 2-2】世界上大部分国家计量时采用公制单位(米),但美国等一些国家使用英制单位(英尺)。编写程序,输入你的身高(公制,单位:米),将其换算成英制单位(单位:英尺)并输出(1米≈3.28英尺)。

代码说明:
第1行代码——从控制台输入身高,并转换为字符串赋给变量height。
第2行代码——将height转换为数字型,并乘以3.28,计算得到英制单位的身高。
第3行代码——输出将米转换为英尺的高度。
运行程序,其输出如下:

2.2.3 控制格式化输出
Python使用print()函数向屏幕上输出指定的字符串信息,print()函数接受多个字符串,字符串之间用逗号“,”分隔,逗号在打印时以空格代替。print()函数的语法格式如下:

上述格式在输出纯字符串时,可以将待输出的内容直接传递给print()函数,但是当输出变量的值时,需要采用格式化输出的方式,Python提供了3种格式化输出的方法,下面分别进行介绍。
1. 使用格式化操作符%
格式化字符串时,Python使用一个字符串作为模板,模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python将多个值传递给模板,每个值对应一个格式符。格式符可以包含有一个类型码,用以控制显示的类型。例如%f表示浮点数格式,%s表示字符串格式等。
整型数据可以指定占有宽度,其具体格式和含义如表2-2所示。
表2-2 整型格式及含义

浮点型数据可以指定小数位数,其具体格式和含义如表2-3所示。
表2-3 浮点型格式及含义

除此之外,Python还有其他一些格式控制符,其具体格式及含义如表2-4所示。
表2-4 Python其他格式控制符

另外,Python对换行和退格等一些特殊字符使用转义字符控制,其符号和说明如表2-5所示。
表2-5 Python特殊字符转义符

【任务 2-3】BMI(Body Mass Index,身体质量指数,简称体质指数)是用体重(千克)除以身高(米)的平方得出的值。编写程序,输入姓名、身高和体重,计算BMI,并输出全部信息(BMI保留2位有效数字)。

代码说明:
第1行代码——程序注释,说明该程序的作用。
第2行代码——从控制台输入姓名,赋给变量name。
第3~4行代码——输入身高和体重并转换为数值,并分别赋给变量height和weight。
第5行代码——根据公式计算BMI的值。
第6行代码——以字符串的形式输出姓名。
第7行代码——输出身高、体重和BMI,保留2位小数。
运行程序,输入相关数值,其输出结果如下:

2. 使用字符串的format()函数
相对基本格式化输出采用“%”的方法,format()函数功能更强大,该函数把字符串当成一个模板,在模板中由一系列的槽位组成,用来控制字符串中嵌入值出现的位置,其基本思想是将format()函数中以逗号分隔的参数按照序号关系替换到模板字符串的槽中。槽用大括号“{}”表示,如果没有大括号,则按照出现的顺序替换。其基本语法格式如下:

以下代码描述format()函数进行格式化控制的方式:

上述代码将format()函数中的两个字符串的值分别填入字符串模板的相应槽中,其原理如图2-2所示。

图2-2 format()函数槽与参数的关系
【任务 2-4】编写程序,输入美元金额,计算并输出可以兑换的人民币金额(假设1美元兑换人民币6.70元),结果保留2位小数。

代码说明:
第1行代码——从控制台输入美元字符串,赋给变量dollar。
第2行代码——使用eval()函数将dollar字符串转换为数字型。
第3行代码——根据汇率计算兑换成人民币的金额。
第4行代码——使用format()函数进行格式化输出,且第2个参数保留2位小数。
运行程序,输入美元,其输出结果如下:

3. 格式化字符串f-string
f-string简称为格式化字符串,是Python 3.6新引入的一种字符串格式化方法,主要目的是使格式化字符串的操作更加简便。f-string在形式上是以f或F修饰符引领的字符串(f'xxx'或F'xxx')格式化方法,以大括号“{}”标明被替换的字段,其代码描述形式如下:

在上述代码中,使用了格式化字符串f-string,在输出的过程中,使用name变量的值替换{name},使用age变量的值替换{age}。
【任务 2-5】编写程序,输入购买商品的价格(price)和数量(num),求应付款(pay)并输出全部信息(保留2位小数)。

代码说明:
第1~2行代码——分别从控制台输入两个字符串,赋给变量price和number。
第3行代码——将price和number分别转换成数字型,计算两者的乘积。
第4行代码——使用格式化字符串控制输出,将{}中的变量替换为相应的值。
运行程序,输入商品单价和购买数量,其输出结果如下:
