Python3 基本数据类型
1、万物皆对象
Python 中有一个非常重要的概念——万物皆对象,无论是一个数字、字符串,还是列表、字典、集合、元组,在 Python 中都会以一个对象的形式存在。
a = 123
对于上面这行代码,在 Python 看来就是创建一个 PyObject 对象,值为 123,然后定义一个相当于指针 a,a 指向这个 PyObject 对象。
2、可变对象和不可变对象
可变数据类型:value值改变,id值不变;不可变数据类型:value值改变,id值也随之改变。 id() 函数用于获取对象的内存地址。
Python 中的对象分为两种类型,可变对象和不可变对象,例如:
a = [1, 2, 3]
print(id(a)) # 2587116690248
a += [4]
print(id(a)) # 2587116690248
b = 1
print(id(b)) # 2006430784
b += 1
print(id(b)) # 2006430816
上面代码中我们分别定义了一个可变对象和一个不可变对象,并且对他们进行修改,打印修改前后的对象标识可以发现,对可变对象进行修改,变量对其引用不会发生变化,对不可变对象进行修改,变量引用发生了变化。
上图是一个可变对象,当修改对象时,假如删除列表中的一个元素,实际上把其中一个元素从对象中移除,对象本身的标识是不发生变化的。
改变一个不可变对象时,例如给一个 int 型加 2,语法上看上去是直接修改了 i这个对象,但是如前面所说,i 只是一个指向对象 73 的一个变量,Python 会将这个变量指向的对象加 2 后,生成一个新的对象,然后再让i指向这个新的对象。
3、Python 内置函数
https://www.runoob.com/python/python-built-in-functions.html
Python dir() 函数
dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
Python id() 函数
id() 函数返回对象的唯一标识符,标识符是一个整数。
CPython 中 id() 函数用于获取对象的内存地址。
Python type() 函数
type() 函数如果你只有第一个参数则返回对象的类型,三个参数返回新的类型对象。
isinstance() 与 type() 区别:
• type() 不会认为子类是一种父类类型,不考虑继承关系。
• isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
Python bool() 函数
bool() 函数用于将给定参数转换为布尔类型,如果没有参数,返回 False。
bool 是 int 的子类。
sys.getrefcount() 函数,可以查看一个变量的引用次数。
标准数据类型
Python3 中有六个标准的数据类型:
• Number(数字)
• String(字符串)
• List(列表)
• Tuple(元组)
• Set(集合)
• Dictionary(字典)
Python3 的六个标准数据类型中:
• 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
• 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
一、数字类型 Number
Python3 支持 int、float、bool、complex(复数)。
当你指定一个值时,Number 对象就会被创建:
var1 = 1
var2 = 10
您也可以使用del语句删除一些对象引用。
del语句的语法是:
del var1[,var2[,var3[....,varN]]]
您可以通过使用del语句删除单个或多个对象。例如:
del var
del var_a, var_b
数字类型是不可变类型。数字1和2分别代表两个不同的对象,对变量重新赋值一个数字类型,会新建一个数字对象。
Python的变量和数据类型的关系,变量只是对某个对象的引用或者说代号、名字、调用等等,变量本身没有数据类型的概念。
1、整数 (int)
Python可以处理任意大小的整数,当然包括负整数。
>>> id(-1)
1868280832
>>> id(0)
1868280864
>>> id(1)
1868280896
>>> id(2)
1868280928
从上面的空间地址看,地址之间正好差 32。Python 在初始化环境的时候就在内存里自动划分了一块空间,专门用于整数对象的存取。当然,这块空间也不是无限大小的,能保存的整数是有限的,所以你会看到 id(0) 和 id(10000) 之间的地址差别很大。
>>> id(0)
1456976928
>>> id(10000)
45818192
小整数对象池:
Python 初始化的时候会自动建立一个小整数对象池,方便我们调用,避免后期重复生成!这是一个包含 262 个指向整数对象的指针数组,范围是 -5 到 256。也就是说比如整数 10,即使我们在程序里没有创建它,其实在 Python后台已经悄悄为我们创建了。
为什么要这样呢?在程序运行时,包括 Python 后台自己的运行环境中,会频繁使用这一范围内的整数,如果每需要一个,你就创建一个,那么无疑会增加很多开销。创建一个一直存在,永不销毁,随用随拿的小整数对象池,无疑是个比较实惠的做法。
下面我们来验证一下小整数对象池的存在。
>>> id(-6)
45818128
>>> id(-5)
1456976768
>>> id(-4)
1456976800
>>> id(255)
1456985088
>>> id(256)
1456985120
>>> id(257)
45818128
从 id(-6) 和 id(257) 的地址,我们能看出小整数对象池的范围,正好是 -5 到256。
除了小整数对象池,Python 还有整数缓冲区的概念,也就是刚被删除的整数,不会被真正立刻删除回收,而是在后台缓冲一段时间,等待下一次的可能调用。
>>> a = 1000000
>>> id(a)
45818160
>>> del a # 删除变量a
>>> b = 1000000
>>> id(b)
45818160
上面,我给变量 a 赋值了整数 1000000,看了一下它的内存地址。然后我把 a删了,又创建个新变量 b,依然赋值为 1000000,再次看下b的内存地址,和以前 a 存在的是一样的。
这一段内容,可能感觉没什么大用,但它对于理解 Python 的运行机制有很大帮助。
2、浮点数(float)
浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x10 的9次方 和 12.3x10 的8次方 是完全相等的。
浮点数可以用数学写法,如 1.23,3.14,-9.01,但是对于很大或很小的浮点数,就必须用科学计数法表示,把 10 用 e 替代,1.23x10 9 就是1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5,即:使用字母 e 或E 作为幂的符号,以 10 为基数,格式如:
<a>e<b> 表示 a*10b
浮点数取值范围和小数精度都存在限制,但常规计算可忽略,取值范围数量级约 -10 的307次方 至 10 的308次方,精度数量级 10 -16。
3、复数(complex)
复数由实数部分和虚数部分构成,可以用 a + bj,或者 complex(a,b) 表示,复数的实部 a 和虚部 b 都是浮点型。关于复数,不做科学计算或其它特殊需要,通常很难遇到。
4、数字类型转换
有时候,我们需要对数字的类型进行转换。Python 为我们提供了方便的内置的数据类型转换函数。
https://docs.python.org/zh-cn/3/library/functions.html
2、8、16 进制的数字可以在代码中用 0b/0B 、 0o/0O 、 0x/0X 前缀来表示。进制为 0 将安照代码的字面量来精确解释,最后的结果会是 2、8、10、16 进制中的一个。
Python 十进制转二进制、八进制、十六进制
bin() 转2进制方法
oct() 转8进制方法
hex() 转16进制方法
int() 转10进制方法
int():函数用于将一个字符串或数字转换为整型。
int([x])
int(x, base=10)
返回一个基于数字或字符串 x 构造的整数对象,或者在未给出参数时返回 0。
对于浮点数,它将向零舍入。
如果 x 不是数字,或者有 base 参数,x 必须是字符串、bytes、表示进制为 base 的 整数字面值 的 bytearray 实例。
x – 字符串或数字。
base – 进制数,默认十进制。
返回整型数据。
实例
以下展示了使用 int() 方法的实例:
>>>int() # 不传入参数时,得到结果0
>>> int(3) # 3
>>> int(3.6) # 3
>>> int(0x12) # 18
>>> int('12',16) # 如果是带参数base的话,12要以字符串的形式进行输入,12 为 16进制 18
>>> int('a',16) # 10
>>> int('0xa',16) # 10
>>> int('0xa',0) # 10
>>> int('10',8) # 8
float(x):将x转换到一个浮点数。
complex(x):将x转换到一个复数,实数部分为 x,虚数部分为 0。
complex(x, y):将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。
转换过程中如果出现无法转换的对象,则会抛出异常,比如 int(“haha”),你说我把字符串 “haha” 转换为哪个整数才对?
5、数学函数
以下是 math 模块 pow() 方法的语法:
import math
math.pow( x, y )
内置的 pow() 方法
pow(x, y[, z])
函数是计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效于pow(x,y) %z
注意:pow() 通过内置的方法直接调用,内置方法会把参数作为整型,而 math 模块则会把参数转换为 float。
Python包含以下常用随机数函数:
choice(seq)
从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
randrange ([start,] stop [,step])
从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random()
随机生成下一个实数,它在[0,1)范围内。
seed([x])
改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst)
将序列的所有元素随机排序
uniform(x, y)
随机生成下一个实数,它在[x,y]范围内。
6、数学常量
pi 数学常量 pi(圆周率,一般以π来表示)
e 数学常量 e,e即自然常数(自然常数)。
二、布尔类型(bool)
在 Python 语言中,布尔类型只有两个值,True 与 False。是 int 的子类型。
age = 16
if age >= 18:
print("你是个成年人")
else:
print("你还未成年")
Python 内置的 bool() 函数可以用来测试一个表达式的布尔值结果。
下面一些例子的结果,可能让你感到惊讶,但事实就是如此,请坦然接受。
>>> True # True
>>> False # False
>>> 3 > 2 # True
>>> 3 > 5 # False
>>> 3 in [1,2,3] # True
>>> 3 == 9/3 # True
>>> 3 is "3" # False
为什么3 is "3"是错误的呢?因为一个是整数一个是字符串,is运算符比较的是对象,当然是错误的。
>>> bool(1) # True
>>> bool(0) # False
>>> bool([]) # False
>>> bool(()) # False
>>> bool({}) # False
>>> bool(-1) # True
>>> bool('') # False
>>> bool("False") # True
>>> bool("True") # True
>>> bool(0.0) # False
>>> bool(1.0) # True
>>> bool(-0.0) # False
0、0.0、-0.0、空字符串、空列表、空元组、空字典,这些都被判定为False。而-1、"False"也被判断为True。
布尔类型可以进行 and、or 和 not 运算。
and 运算是与运算,只有所有都为 True,and 运算的结果才是True:
>>> True and True # True
>>> True and False # False
>>> False and False # False
>>> 5 > 3 and 3 > 1 # True
or 运算是或运算,只要其中有一个为 True,or 运算结果就是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
再开下脑洞,布尔类型还能做别的运算吗?试试就知道了!
>>> True > False # True
>>> True < False # False
>>> True >=False # True
>>> True -1 # 0
>>> True + 1 # 2
>>> True *3 # 3
>>> False -1 # -1
真的可以!比较运算,四则运算都没有问题。并且在做四则运算的时候,明显把 True 看做 1,False 看做 0。
三、空值类型(NoneType)
空值是 Python 里一个特殊的值,用 None 表示(首字母大写)。None 不能理解为 0,因为 0 是整数类型,而 None 是一个特殊的值。None 也不是布尔类型,而是 NoneType。
>>> bool(None) # False
>>> type(None) # <class 'NoneType'>
我们平时最容易犯的错误就是获得了一个 None 值,却对它进行各种方法调用,例如:
list1 = ["a", "b", None]
for char in list1:
print(char.join("A"))
######################################
Traceback (most recent call last):
File "F:/Python/pycharm/201705/test.py", line 7, in <module>
print(char.join("A"))
AttributeError: 'NoneType' object has no attribute 'join'
内置常量
有少数的常量存在于内置命名空间中。 它们是:
False
bool 类型的假值。 给 False 赋值是非法的并会引发 SyntaxError。
True
bool 类型的真值。 给 True 赋值是非法的并会引发 SyntaxError。
None
NoneType 类型的唯一值。 None 经常用于表示缺少值,当因为默认参数未传递给函数时。 给 None 赋值是非法的并会引发 SyntaxError。
逻辑值检测
任何对象都可以进行逻辑值的检测,以便在 if 或 while 作为条件或是作为下文所述布尔运算的操作数来使用。
一个对象在默认情况下均被视为真值,除非当该对象被调用时其所属类定义了 bool() 方法且返回 False 或是定义了 len() 方法且返回零。
下面基本完整地列出了会被视为假值的内置对象:
• 被定义为假值的常量: None 和 False。
• 任何数值类型的零: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
• 空的序列和多项集: '', (), [], {}, set(), range(0)
产生布尔值结果的运算和内置函数总是返回 0 或 False 作为假值,1 或 True 作为真值,除非另行说明。 (重要例外:布尔运算 or 和 and 总是返回其中一个操作数。)
布尔运算 — and, or, not
这些属于布尔运算,按优先级升序排列:
x or y if x is false, then y, else x (1)
x and y if x is false, then x, else y (2)
not x if x is false, then True, else False (3)
注释:
- 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。
- 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。
- not 的优先级比非布尔运算符低,因此 not a == b 会被解读为 not (a == b) 而 a == not b 会引发语法错误。
练习
1、描述不正确的是:
A:Python 中的变量不需要声明 B:每个变量在使用前都必须赋值
C:Python 是静态语言 D:Python 是动态语言
2、语句不正确的是:
A:a = b = c = 1 B:x, y = "abc" C:a, b, c = 1, 2, "abc"。 D:a,b = b,a
3、描述不正确的是:
A:Python 中的一切都是对象 B:变量是对象的引用
C:a = "Jack", 其中 "Jack" 是一对象 D:执行语句 a=b="Jack",b="Tom",则 a也等于 "Tom"
4、描述不正确的是:
A:123 是不可变对象 B:"abc" 是可变对象
C:对可变对象进行修改,变量对其引用不会发生变化。 D:对不可变对象进行修改,变量引用发生了变化。
5、描述不正确的是:
A:dir(),id(),type()和strip() 都是内置函数
B:dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表。
C:type() 函数如果你只有第一个参数则返回对象的类型
D:id() 函数返回对象的唯一标识符,标识符是一个整数。
6、描述不正确的是:
A:a=123,str(a) 值是 "123" B:a,b=b,a 等价于 t=a;a=b;b=t
C:a="123",int(a) 值是 123 D:"123" 是数字类型
7、描述不正确的是:
A:Python中有六个标准的数据类型
B:1,"1",[1],(1),{1},{1:2}分别是 int, str, list, tuple, set, dict 类型
C:不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组)
D:可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
8、描述不正确的是:
A:Python 支持 int、float、bool、complex(复数)。
B:bool 不属于数字类型
C:Python 可以处理任意大小的整数
D:小整数对象池范围是 -5 到 256
9、描述不正确的是:
A:布尔类型只有两个值,true 与 false。
B:bool() 函数可以用来测试一个表达式的布尔值结果
C:整数是可以任意大小的
D:浮点数取值范围和小数精度都存在限制
10、描述不正确的是:
A:0、0.0、-0.0、空字符串、空列表、空元组、空字典,这些都被判定为False。
B:or 运算是或运算,只要其中有一个为 True,or 运算结果就是 True。
C:bool(-1) 为 Flase
D:and运 算是与运算,只有所有都为 True,and 运算的结果才是 True。
Python 教程说明Python 1-00 简介
Python 1-01 开发环境搭建
Python 1-02 基础语法
Python 1-03 输入与输出
Python 1-04 变量与常量
Python 1-05 数字