基础数据类型
Python3.X中基础数据类型共分为4种:
- 整型(int)
- 浮点型(float)
- 布尔型(bool)
- 字符串 (str)
整型:int
整形数就是不包括小数部分的数值,分为整数、0和负数,Python提供了int用于表示现实中的整数。
Python为int类型提供了数学运算及运算符。
x = 4 + 7 * 2
print(x)
18
y = 19 + 99 / 33
print(y)
22.0
z = 108 - 39 + 2
print(z)
71
print(type(x))
<class 'int'>
print(type(y))
<class 'float'>
print(type(z))
<class 'int'>
由以上实列看出,运算规则与数学运算规则基本一致,只是在处理除法("/")时,返回的时float类型数据,在现实中有很多的复杂运算,也已添加括号、次幂、根等算法实现。
x = ((4+7) * 3 / (1 + 9)) + 9 ** 2
print(x)
84.3
int类型,可以与赋值运算相结合,还能够变化格式,其结果一样:
x = 4
x += 1
x
5
x -= 1
x
4
x *=1
x
5
x /= 1
x
5
x /= 2
x
2.5
赋值运算符,我们知道在通常一个数不可能"等于" 该数加一,但在编程语言中是一个合法的语句,它的涵义时将变量x指向的值加1之后再重新赋值给x本身,鉴于这种操作的频繁,Python包括其他语言提供这种 +=的简写形式。
x += 1
等价于 x = x + 1
浮点型:float
浮点型通常来说就是小数,float类型的数值与数学中的写法基本一致,允许小数点后没有任何数字(小数部分为0),如下列数值都是浮点类型。
3.1415926535898 -6.5 19.0 -5.0 0.5
Python同样也为浮点型数值提供了加减乘除等运算,运算符也跟整数类型一样,但是在Python3.X中,运算除法("/")时,是保留小数部分的,而Python2.X版本解释器则返回int(整数)类型。
x = 6 / 3
x
2.0
type(x) # Python3.X中
<class 'float'>
type(x) # Python2.X中
<class 'int'>
浮点型数据能够表示巨大的数值,能够进行高精度的计算,但由于浮点型数据在计算机内部是固定长度的二进制表示的,有些数值可能无法精确的表示,只能存储带有微小误差的近似值,栗子:
>>> 1.2 - 1.0 # 示例1
0.19999999999999996
>>> 2.2 - 1.2 # 示例2
1.0000000000000002
>>> 2.0 - 1.0 # 示例3
1.0
这个栗子可以看到,示例1的结果比0.2略小,而示例2比1.0略大,而示例3则算出了精确的结果,一般而言,这种微笑的误差不影响实际应用,但在一些精密计算的情况下,因为极小的误差,仍能导致出错。
1.2 - 1.0 == 0.2
False
2.0 - 1.0 == 1.0
True
上面的栗子,我们用运算符== 来比较表达式的真假,结果显示为布尔值的True和False,从上面的栗子中我们得出一个重要的经验;不要再浮点数中使用==来判断是否相等,而是通过计算两个浮点数的差值是否足够小,是的话,我们认为相等。
epsilon = 0.0000000000001 # 足够小的数
abs((2.2 - 1.2) - 1) <= epsilon
True
abs((1.2 - 1.0) - 0.2) <= epsilon
True
注:abs()函数返回一个数值的绝对值。
abs(-9)
9
abs(5.0)
5.0
Python用浮点型数值表示很大或很小的数值时,会自动采用科学计数法来表示。
1234.9999 ** 10
8.254090462291893e+30
1234.9999 ** -10
1.2115205237553605e-31
注意,从运算效率来说,float相对于int运算效率略低。所以,如果不是必须用到小数,一般应该采用整数类型。另外,不要用浮点数来通过运算符==
来判断是否相等这样的问题。
那么在Python中,我们可以用 == 和 is 做判断,那么二者是否是一个意思呢?举栗子:
a = 255
b = 1000
c = 255
d = 1000
a == c
True
a is c
True
b == d
True
>>> b is d
False
在解释之前,我们需要补充一点知识,Python为了实现对内存的有效利用,在对小整数-5~256
之内的整数会进行缓存,不在此范围内的则不缓存。那么,我们再来说上面的例子,通过各变量在内存中的id看到,a和b都指向同一个内存空间,所以,无论是is
还是==
都是True,那么我们再来看c和d,在内存中的id地址是不同的,但是两者的值是相同的,那么可以得出,==
比较的是值,而is
则是比较的是两个变量在内存中的id地址。
布尔类型:bool
在上一节,浮点型数据的示例中,判断两个数是否相等时,Python给我们返回了布尔类型的结果,那么什么是布尔类型呢?
python 中布尔值使用常量True 和 False来表示;注意大小写
比较运算符< > == 等返回的类型就是bool类型;布尔类型通常在 if 和 while 语句中应用
这边需要注意的是,python中,bool是int的子类(继承int),故 True==1 False==0 是会返回Ture的,有点坑,如要切实判断用 xxx is True,Python2.3 版本之前,Python用1和0来表示真、假,这个方法沿用至今。
if 1:
print("true")
else:
print("false")
true
用布尔表达式最常用的是判断两个表达式的数值大小关系。栗子:
[表达式] [运算符] [表达式]
>>> 9 == 9
True
但在判断字符串的时候,布尔表达式就不是那么简单了,栗子:
'hold' == 'hold'
True
'hold' == 'HOLD'
False
在Python中,字符串是按字典的顺序进行比较的,也就是说是基于字母顺序比较,而字母顺序是按照ASCII编码顺序排列的。所以,不管是大小写字母,标点符号,阿拉伯数字以及各种字符也是要按照ASCII编码来确定大小。
字符串:str
什么是序列?
指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。
为了更形象的认识序列,可以将它看做是一家旅店,那么店中的每个房间就如同序列存储数据的一个个内存空间,每个房间所特有的房间号就相当于索引值。也就是说,通过房间号(索引)我们可以找到这家旅店(序列)中的每个房间(内存空间)。
在 Python 中,序列类型包括字符串、列表、元组、集合和字典,这些序列支持通过索引取值、切片、相加、相乘等通用通用的操作。但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作。
字符串也是一种常见的序列,它也可以直接通过索引访问字符串内的字符。
Python为序列中的每个元素分配一个序号,即元素的位置,也叫做索引,序列中的第一个元素索引为0,第二个索引为1,依此类推。
注意:Python中序列编号机制是从0开始的,其他大部分的语言都是如此设计。另外,这里的序列如无特指,一律为有序序列。
字符串可以说是Python中最受欢迎的数据类型了。字符串在表示方面也更为灵活多变。
字符串的创建
Python语言用引号来创建(界定)字符串。一般的通过引号(单引号,双引号),三引号(单、双三引号)都可以标识字符串,英文用str函数表示。
s1 = '我是单引号表示的字符串'
s2 = "我是双引号表示的字符串"
s3 = '''我是3个单引号表示的字符串'''
s4 = """我是3个双引号表示的字符串"""
print(s1, type(s1)) # 我是单引号表示的字符串 <class 'str'>
print(s2, type(s2)) # 我是双引号表示的字符串 <class 'str'>
print(s3, type(s3)) # 我是3个单引号表示的字符串 <class 'str'>
print(s4, type(s4)) # 我是3个双引号表示的字符串 <class 'str'>
通常,我们使用引号(单、双都行)来创建字符串。也是程序中最常用的形式,三引号(单、双都行)允许字符跨越多行,并在输出时保持原来的格式,字符串中可以包含换行符、制表符、及其他特殊字符。主要用于一些特殊格式,如文档型的字符串,也用来对代码进行注释。但需要注意的是,只要不是三引号,就只能在一行内表示(你肯定会说那我加个换行符不就行了么!好吧,你成功的骗了自己,但Python解释器显然不这么认为)。
转义字符反斜杠
一般的,Python中用单引号还是双引号并没有区别,但有些情况单双引号的结合使用更方便,比如我们会碰到如下的情况。
'I'm Ning'
Python解释器在读取字符串的时候,碰到第二个单引号就已经解释成字符串了,但又无法解释后面的字符串导致报错,你可能会想到,用双引号来创建字符串。
"I'm Ning"
OK,问题解决!
但是碰到下面这样的情况呢?
'"I'm Ning" he said'
这时候就要用字符串之转义字符反斜杠。
s5 = '"I\'m Ning",he said'
print(s5)
"I'm Ning",he said
因为上面的单引号被当做界定符,所以字符串内部的单引号要用字符\
来转变意义为普通字符,才能被解释器正常解释执行。下面的\
和\
一样,被当成普通的字符了。
s6 = "\"I'am Ning\", he said"
print(s6)
"I'am Ning", he said
原生(始)字符串
有时候,我们会打印一些特殊的字符串,而不希望反斜杠被当成特殊字符如打印一个路径。
print('C:\\software') # C:\software
结果已经不是我们想要的样子了,这是,你可能说加反斜杠,没错,是这样的。
print ('C:\\\\software')
C:\\software
在实际情况中,很少有这样短的路径,都是类似于这样的,需要加很多反斜杠做转义。
print("C:\\\\Users\\\\Anthony\\\\AppData\\\\Roaming\\\\Microsoft\\\\Windows\\\\Start Menu\\\\Programs")
这里还有一种方法,使用原生字符串(或称原始字符串)来解决这个问题,在字符串前加一个r
,原生字符串不会将反斜杠视为特殊字符,原生字符串中的每个字符都会原封不动的输出。
print(r'C:\\nowhere')
C:\\nowhere
print(r'C:\\Users\\Anthony\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs')
C:\\Users\\Anthony\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs