数据类型
计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在 Python 中,能够直接处理的数据类型有以下几种:
整型
在 python3 中只有一种整型int
,可以处理任意大小的整数,包括负整数,大小没有限制。
/
和 //
运算符
在整数除法中,除法/
总是返回一个浮点数。如果只想得到整数的结果,丢弃可能的分数部分,可以使用运算符//
:
>>> 17 / 3
5.666666666666667
>>> 17 // 3
5
>>> 17 % 3
2
注意: //
得到的不一定是整数类型的结果,与分母分子的数据类型有关系。
>>> 17.0 / 3
5.666666666666667
>>> 17.0 // 3
5.0
>>> 17.0 % 3
2.0
整型的二进制、八进制、十六进制表示:
>>> a = 0b100 #二进制
>>> a
4
>>> a = 0o100 #八进制
>>> a
64
>>> a = 0x100 #十六进制
>>> a
256
浮点型
浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109
和 12.3x108
是完全相等的。浮点数可以用数学写法,如 1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把 10 用 e 替代,1.23x109
就是 1.23e9
,或者12.3e8
,0.000012
可以写成 1.2e-5
等等。
整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。
字符串
python 字符串是以'
或者"
括起来的任意文本,比如'abc'、"ABC"
等。
Python 中的字符串不能改变。
如果字符串中既包含'
又包含"
:
'I\'m \"OK\"。'
如果字符串里面有很多字符都需要转义,就需要加很多 \,为了简化,Python 还允许用 r” 表示” 内部的字符串默认不转义:
>>> print('\\\t\\')
\ \
>>> print(r'\\\t\\')
\\\t\\
如果字符串内部有很多换行,用 \ n 写在一行里不好阅读,为了简化,Python 允许用”’…”’的格式表示多行内容:
>>> print('''hello
... world
... python
... ''')
hello
world
python
>>>
多行字符串”’…”’还可以在前面加上r
使用:
>>> print(r'''hello\n
... world''')
hello\n
world
字符串运算符
a = 'Hello'
b = 'Python'
操作符 | 描述 | 实例 |
---|---|---|
+ | 字符串连接 | a+b 输出 HelloPython |
* | 重复字符串 | a*2 输出 HelloHello |
[] | 通过索引获取字符 | a[1] 输出 e |
[:] | 截取字符串的一部分 | a[1:4] 输出结果 ell |
in | 成员运算符,包含给定的字符返回 True | ‘H’ in a 输出 True |
not in | 成员运算符,不包含给定的字符返回 True | ‘M’ not in a 输出 True |
r/R | 所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 | print(r’\n’) 或者 print(R’\n’) |
布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有 True、False 两种值,要么是 True,要么是 False,在 Python 中,可以直接用 True、False 表示布尔值(请注意大小写)。
注意:在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。
>>> True + 0
1
>>> False + 0
0
>>> True + False
1
空值
空值是 Python 里一个特殊的值,用 None
表示。None
不能理解为 0,因为 0 是有意义的,而 None
是一个特殊的空值。
_
值
在交互模式中,最后被输出的表达式结果被赋值给变量 _
。
>>> a, b = 10, 20
>>> a + b
30
>>> print(_)
30
>>> _
30
>>> a - b
-10
>>> _
-10
>>> _ = a ** 2
>>> _
100
此处,_
为可读可写变量。
变量
python 中的变量不需要声明,每个变量在使用前都必须赋值,变量赋值后才会被创建。
在 python 中,变量就是变量,本身没有类型,我们所说的 “类型” 是变量所指向的内存中对象的类型。
常量
所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。
在 Python 中,通常用全部大写的变量名表示常量:
PI = 3.14159265359
但事实上 PI 仍然是一个变量,Python 根本没有任何机制保证 PI 不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量 PI 的值,也没人能拦住你。
isinstance
和 type
的区别
内置的 type
函数可以用来查询变量所指向的对象类型:
>>> a = 'hello world'
>>> type(a)
<class 'str'> #字符串
>>> a = 123
>>> type(a)
<class 'int'> #整型
>>> a = False
>>> type(a)
<class 'bool'> #布尔型
>>> a = 123.456
>>> type(a)
<class 'float'> #浮点型
>>> a = 4+3j
>>> type(a)
<class 'complex'> #复数型
还可以使用 isinstance
来判断:
>>> a = 123
>>> isinstance(a, int)
True
isinstance
和 type
的区别在于:
class A:
pass
class B(A):
pass
print(isinstance(A(), A)) #True
print(type(A()) == A) #True
print(isinstance(B(), A)) #True
print(type(B()) == A) #False
区别就是:
type()
不会认为子类是一种父类类型。isinstance()
会认为子类是一种父类类型。
小结
Python 支持多种数据类型,在计算机内部,可以把任何数据都看成一个 “对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来。
对变量赋值 x = y
是把变量 x
指向真正的对象,该对象是变量 y
所指向的。随后对变量 y
的赋值不影响变量 x
的指向。
注意:Python 的整数没有大小限制,而某些语言的整数根据其存储长度是有大小限制的,例如 Java 对 32 位整数的范围限制在-2147483648-2147483647
。
Python 的浮点数也没有大小限制,但是超出一定范围就直接表示为 inf
(无限大)。