数据类型和变量
计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据。不同的数据,需要定义不同的数据类型。
Python数据类型一览
在Python中,能够直接处理的基本数据类型有以下几种:
🔢
整数
1, 100, -8080, 0
🔟
浮点数
1.23, 3.14, -9.01
📝
字符串
'abc', "xyz"
✅
布尔值
True, False
∅
空值
None
📋
列表
[1, 2, 3]
整数
Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样:
>>> 1 1 >>> 100 100 >>> -8080 -8080 >>> 0 0
十六进制表示
计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便。十六进制用0x前缀和0-9、a-f表示:
>>> 0xff00 65280 >>> 0xa5b4c3d2 2775680978
大数字分隔符
对于很大的数,例如10000000000,很难数清楚0的个数。Python允许在数字中间以下划线_分隔:
>>> 10_000_000_000 10000000000 >>> 0xa1b2_c3d4 2708615124
小技巧
在Python 3.6+中,可以使用下划线作为数字分隔符,让大数字更易读。1_000_000和1000000是完全一样的。
浮点数
浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的:
1.23x10⁹和12.3x10⁸是完全相等的
浮点数的表示方法:
>>> 1.23 1.23 >>> 3.14 3.14 >>> -9.01 -9.01
科学计数法
对于很大或很小的浮点数,必须用科学计数法表示,用e替代10:
>>> 1.23e9 1230000000.0 >>> 12.3e8 1230000000.0 >>> 1.2e-5 0.000012
浮点数的精度问题
整数运算永远是精确的,而浮点数运算则可能会有四舍五入的误差。这是计算机存储浮点数的原理决定的,并非Python的bug。
>>> 0.1 + 0.2 0.30000000000000004
字符串
字符串是以单引号'或双引号"括起来的任意文本:
>>> print('hello, world') hello, world >>> print("hello, world") hello, world
转义字符
如果字符串内部既包含'又包含",可以用转义字符\来标识:
>>> print('I\'m \"OK\"!') I'm "OK"!
常用转义字符
\\ - 反斜杠
\' - 单引号
\" - 双引号
\n - 换行
\t - 制表符
\r - 回车
raw字符串
如果字符串里面有很多字符都需要转义,可以用raw字符串r'',内部默认不转义:
>>> print('\\\t\\') \ \ >>> print(r'\\\t\\') \\\t\\
多行字符串
如果字符串内部有很多换行,可以用三引号'''...'''的格式表示多行内容:
>>> print('''line1 ... line2 ... line3''') line1 line2 line3
┌─────────────────────────────────────────────────────────────┐
│Windows PowerShell - □ x │
├─────────────────────────────────────────────────────────────┤
│>>> print('''line1 │
│... line2 │
│... line3''') │
│line1 │
│line2 │
│line3 │
│ │
│>>> │
│ │
└─────────────────────────────────────────────────────────────┘
布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有True和False两种值:
>>> True True >>> False False >>> 3 > 2 True >>> 3 > 5 False
布尔运算
布尔值可以用and(与)、or(或)、not(非)运算:
and(与运算)
所有都为True,结果才是True:
>>> True and True True >>> True and False False >>> False and False False >>> 5 > 3 and 3 > 1 True
or(或运算)
只要其中有一个为True,结果就是True:
>>> True or True True >>> True or False True >>> False or False False >>> 5 > 3 or 1 > 3 True
not(非运算)
把True变成False,False变成True:
>>> not True False >>> not False True >>> not 1 > 2 True
空值
空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值:
>>> None None >>> print(None)
变量
变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。
变量命名规则
变量名必须是大小写英文、数字和_的组合,且不能用数字开头:
>>> a = 1 # 正确:变量a是整数 >>> t_007 = 'T007' # 正确:变量t_007是字符串 >>> Answer = True # 正确:变量Answer是布尔值
变量赋值
在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量。同一个变量可以反复赋值,而且可以是不同类型的变量:
>>> a = 123 # a是整数 >>> print(a) 123 >>> a = 'ABC' # a变为字符串 >>> print(a) ABC
动态语言 vs 静态语言
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错:
Java(静态语言)示例:
int a = 123; // a是整数类型
a = "ABC"; // 错误!不能把字符串赋给整型变量
Python(动态语言)示例:
a = 123 # a是整数
a = 'ABC' # a变为字符串,完全OK!
结论
动态语言更灵活,静态语言更安全。各有优劣,Python的定位是"简单但强大"。
变量的内存管理
理解变量在计算机内存中的表示非常重要!
变量赋值原理
当我们执行a = 'ABC'时,Python解释器干了两件事情:
- 在内存中创建了一个
'ABC'的字符串 - 在内存中创建了一个名为
a的变量,并把它指向'ABC'
执行 a = 'ABC' 后: ┌────────────────────────────────────────────┐ │ 内存 │ ├────────────────────────────────────────────┤ │ │ │ 变量a │ │ ┌───────┐ │ │ │ a │ ─────────────────┐ │ │ └───────┘ │ │ │ ▼ │ │ ┌─────────────┐ │ │ │ 'ABC' │ │ │ └─────────────┘ │ │ │ └────────────────────────────────────────────┘
变量指向的深入理解
也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据:
a = 'ABC'
b = a
a = 'XYZ'
print(b)
问:b的值是'ABC'还是'XYZ'?让我们一步步执行:
第一步:执行 a = 'ABC'
┌────────────────────────────────────────────┐ │ 内存 │ ├────────────────────────────────────────────┤ │ │ │ 变量a 字符串'ABC' │ │ ┌───────┐ ┌─────────────┐ │ │ │ a │ ────▶│ 'ABC' │ │ │ └───────┘ └─────────────┘ │ │ │ └────────────────────────────────────────────┘
第二步:执行 b = a
┌────────────────────────────────────────────┐ │ 内存 │ ├────────────────────────────────────────────┤ │ │ │ 变量a, b 字符串'ABC' │ │ ┌───────┐ ┌─────────────┐ │ │ │ a │ ────▶│ │ │ │ ├───────┤ │ │ │ │ │ b │ ────▶│ │ │ │ └───────┘ └─────────────┘ │ │ │ └────────────────────────────────────────────┘
第三步:执行 a = 'XYZ'
┌────────────────────────────────────────────┐ │ 内存 │ ├────────────────────────────────────────────┤ │ │ │ 变量a ──────▶┌─────────────┐ │ │ ┌───────┐ │ 'XYZ' │ │ │ │ a │ ────▶│ │ │ │ ├───────┤ └─────────────┘ │ │ │ b │ ──┐ │ │ └───────┘ │ │ │ ▼ │ │ ┌─────────────┐ │ │ │ 'ABC' │ ← b仍然指向这里 │ │ └─────────────┘ │ │ │ └────────────────────────────────────────────┘
所以,最后打印变量b的值是'ABC'!
重要提醒
赋值语句 x = y 是把变量x指向变量y所指向的对象。随后对变量y的赋值不会影响变量x的指向。
常量
常量就是不能变的变量。在Python中,通常用全部大写的变量名表示常量:
>>> PI = 3.14159265359 >>> print(PI) 3.14159265359
注意
事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变。所以,用全部大写的变量名表示常量只是一个习惯上的用法。
精确的整数运算
Python的整数运算永远是精确的!
除法:/
/除法计算结果是浮点数:
>>> 10 / 3 3.3333333333333335 >>> 9 / 3 3.0
地板除://
//地板除只取结果的整数部分:
>>> 10 // 3 3 >>> -10 // 3 -4
取余:%
%取余运算可以得到两个整数相除的余数:
>>> 10 % 3 1 >>> 9 % 3 0
除法小结
| 运算符 | 名称 | 说明 | 示例 | 结果 |
|---|---|---|---|---|
/ |
除法 | 结果永远是浮点数 | 10 / 3 |
3.3333... |
// |
地板除 | 只取整数部分 | 10 // 3 |
3 |
% |
取余 | 返回除法的余数 | 10 % 3 |
1 |
练习题
练习1:计算并打印
假设某商品价格100元,打8折后再减10元,请计算最终价格:
- 使用Python计算:
(100 * 0.8) - 10 - 打印结果
练习2:变量练习
创建以下变量并打印:
n = 123f = 456.789s1 = 'Hello, world's2 = 'Hello, \\'Adam\\''(转义字符)s3 = r'Hello, "Bart"'(raw字符串)
选择题:10 // 3 的结果是?
小结
- Python支持多种数据类型:整数、浮点数、字符串、布尔值、空值、列表等;
- 变量在程序中就是用一个变量名表示,变量名必须是大小写英文、数字和
_的组合,且不能用数字开头; - Python是动态语言,变量不需要指定类型,可以指向任意数据类型;
- 赋值语句
x = y是把变量x指向变量y所指向的对象; /除法结果永远是浮点数,//地板除只取整数部分,%取余返回除法的余数;- Python的整数没有大小限制,而浮点数超出范围会表示为
inf。