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

上面代码中我们分别定义了一个可变对象和一个不可变对象,并且对他们进行修改,打印修改前后的对象标识可以发现,对可变对象进行修改,变量对其引用不会发生变化,对不可变对象进行修改,变量引用发生了变化。

Python 1-05 数字_Python


上图是一个可变对象,当修改对象时,假如删除列表中的一个元素,实际上把其中一个元素从对象中移除,对象本身的标识是不发生变化的。

Python 1-05 数字_浮点数_02


改变一个不可变对象时,例如给一个 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

Python 1-05 数字_字符串_03


2、8、16 进制的数字可以在代码中用 0b/0B 、 0o/0O 、 0x/0X 前缀来表示。进制为 0 将安照代码的字面量来精确解释,最后的结果会是 2、8、10、16 进制中的一个。

Python 十进制转二进制、八进制、十六进制

bin()  转2进制方法
oct()  转8进制方法
hex()  转16进制方法
int()  转10进制方法

Python 1-05 数字_字符串_04


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)

注释:

  1. 这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。
  2. 这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。
  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 数字