Python 基本数据类型
。。。
今天没有想要写在开头的废话,,,好烦,要不破例直接开始吧。
变量与常量
变量
Python 是一门动态语言,这意味着 Python 变量本身的类型是不固定的。
在 Python 中使用变量前不用声明(不用写类似 int a;
的语句),在首次使用前为其赋初始值就行(直接用 a = 0
)。
常量
实际上,在 Python 语法中并没有定义常量。
但是 PEP 8 定义了常量的命名规范为大写字母和下划线组成。在实际应用中,这种“常量”首次赋值后,无法阻止其他代码对其进行修改或删除。
要使用真正的常量,可以自己实现一个,例如:constants-in-python。
空值
Python 中使用 None
来代表空值。
None
在交互式命令行中不会显示,但可以用 print()
打印出来:
>>> None
>>> a = None
>>> a
>>> print(a)
None
布尔值
Python 中有布尔值 True
和 False
。
真值问题
代表 ‘假’ 的值有:False
,None
,0
,''
,[]
,{}
,…;
其余值为真。
布尔值的相关的运算
逻辑运算符 | 相当于C中的 |
---|---|
and |
&& |
or |
|| |
not |
! |
⚠️【注意 and
的优先级高于 or
。
比较运算符 |
---|
< , > , == , != |
使用比较运算符得到的结果是布尔值(True
或 False
)。
使用逻辑运算符得到的结果未必是布尔值:
具体的运算情况可以参考下面这段程序生成的表:
# **注意,是第一列的值 and|or 第一行的值!**
li = ['and', 'or']
ls = [True, False, None, 0, 1, 2, '"abc"']
for opt in li:
# head
print('<%s>' % opt, end='\t')
for j in ls:
print(j, end='\t')
print('\n')
for i in ls:
# col
print(i, end='\t')
for j in ls:
# row
print(
eval('%s %s %s' % (i, opt, j)),
end='\t'
)
print('\n')
# end
print('\n-------\n')
从中可以看到,
and
的规则是:
前后两者 皆为真 ,返回 后 者;
前后两者 有一假 ,返回 假 者;
前后两者 皆为假 ,返回 前 者;
or
的规则是:
前后两者 皆为真 ,返回 前 者;
前后两者 有一真 ,返回 真 者;
前后两者 皆为假 ,返回 后 者;
此外,
not
的规则是:
若对象为 真 ,返回
False
若对象为 假 ,返回True
数字
int, float
数字 | 含义 | 表示范围 | 精度 |
---|---|---|---|
int | 整数 | 大小没有限制 | 始终是准确的 |
float | (基于二进制的)浮点数 | 有一定大小限制,超出后表示为inf | 和C一样,不准确 |
复数
Python 还内置了对 复数 的支持,使用后缀 j
或 J
表示虚数部分(例如,3+5j
)。
>>> a = 3 + 1j
>>> b = 3 - 1j
>>> a * b
(10+0j)
>>>
关于这部分详见官方文档。
其他数字类型
在标准库中,python 还有对 精确小数 Decimal(基于十进制的浮点数)和 分数 Fraction 等其他数字类型的支持。
Decimal (小数)
在 Python 的标准库中,decimal
库提供了 基于十进制的浮点数 Decimal 类型,这种数字类型修复了 float 的不准确问题,可以用 Decimal 实现更加精准的数学计算(但也不是绝对的准确,仍存在误差)。
>>> from decimal import *
>>> 0.1 + 0.1 + 0.1 - 0.3 # float
5.551115123125783e-17 # 这个结果是不精确的
>>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3) # decimal
Decimal('2.775557561565156540423631668E-17') # 较为精确
>>> getcontext().prec = 12 # 限制 Decimal 的小数位数
>>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3)
Decimal('1.11022302463E-17')
正如上例,要使用 Decimal
类型,
- 首先要
import decimal
; - 然后用
decimal.Decimal(Num)
来获取一个 Decimal 实例,这里的 Num 可以是如下几种:
>>> Decimal('3.14') # 内容是 float 的字符串
Decimal('3.14')
>>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent),得到的值是 (-1) * sign * digit_tuple 代表数字 * 10 ^ exponent
Decimal('3.14')
>>> Decimal(314) # int,float 都可以
Decimal('314')
>>> Decimal(Decimal(314)) # 另一个 decimal 实例
Decimal('314')
>>> Decimal(' 3.14 \\n') # 前后可以有空白字符
Decimal('3.14')
-
decimal.getcontext().prec 代表有效位数,
- 通过
print(decimal.getcontext().prec)
来查看当前值,默认是28位 - 通过
decimal.getcontext().prec = Places
来设置有效位数,这个精度的取值是[1, MAX_PREC]
,MAX_PREC取值在64位机器上是999999999999999999
,32位为425000000
(这是因为这个值要可以转化为C的整型,详见Python版的源码)!
- 通过
-
加减乘除运算入常
Fraction (分数)
在 fractions
库中,定义了 Fraction
类型,用以表达分数,加减乘除运算入常。
使用方法如下:
>>> from fractions import *
>>> Fraction(1.5) # 传入 float,会自动算出分数表示
Fraction(3, 2)
>>> Fraction(1, 3) # 传入 分子,分母
Fraction(1, 3)
>>> Fraction(2, 6) # 默认会有理化
Fraction(1, 3)
>>> Fraction(2, 6, _normalize=False) # 指定不有理化
Fraction(2, 6)
>>> Fraction(Fraction(1/11)) # 另一个 Fraction 实例,Decimal 实例也可以
Fraction(3275345183542179, 36028797018963968)
>>> Fraction(' 22/7 ') # 使用代表分数的字符串,注意 numerator/denominator,中间不可有空格,前后可有空白字符
Fraction(22, 7)
字符串
字符串的表示
Python 中,字符串可以用单引号 ('...'
) 或双引号 ("..."
) 标识单行内的字符串,
还可以使用连续三个单/双引号('''...'''
或 """..."""
)表示与格式化的多行字符。
Python没有单独的字符类型;一个字符就是一个简单的长度为1的字符串。
>>> st = '1\
... 2\
... 3\
... a'
>>> st
'123a'
>>> st = '''1
... 2
... 3
... a
... '''
>>> st
'1\n2\n3\na\n'
>>>
⚠️【注意】单引号可以包含双引号,'asd"123"fgh'
是允许的,同样 '''
中也可以包含 """
。
字符编码
首先,附上几种字符编码的比较:
编码 | 长度 | ‘A’ | ‘中’ |
---|---|---|---|
ASCII | 1 Byte | 01000001 | (无此字符) |
Unicode | 通常是2 Byte | 00000000 01000001 (ASCII前补零) | 01001110 00101101 |
UTF-8 | 可变(1~6 Byte) | 01000001 (UTF-8包含着ASCII) | 11100100 10111000 10101101 |
Python3.x 默认用 Unicode 编码字符串。
编码 <=> 字符 的函数:
ord()
:获取字符的整数表示;chr()
:把编码转换成对应的字符;
例如:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(20014)
'丮'
Python 的字符串类型是 str
。
str
在内存中以 Unicode 表示,一个字符对应若干字节。
在写入二级缓存(本地->硬盘 | 远程->网络)时,str
将变为bytes
。
bytes
以字节为单位。
Python 用带 b
前缀的单/双引号表示 bytes
。
str | bytes |
---|