python数据类型包括:整数(Int)、浮点数(Float)、字符串(String)、布尔类型(Boolean)、空值(None)、列表(List)、元组(Tuple)、集合(Set)、字典(Dict)。
本文主要介绍几种基础数据类型:整数(Int)、浮点数(Float)、字符串(String)、布尔类型(Boolean)、空值(None)
1、整数(Int)
Python可以处理任意大小的整数,包括负整数。在python程序中整数的表示方法和数学上的写法一样,例如:1,-9,234,0
Python同时支持二进制、八进制以及十六进制的表示方法,例如:
二进制:
>>> 0b1111
15
八进制:
#python2
>>> 01111
585
>>> 0o1111
585
#python3
>>> 01111
File "<stdin>", line 1
01111
^
SyntaxError: invalid token
>>> 0o1111
585
十六进制:
>>> 0x1111
4369
其中对于八进制的表示,Python2支持'0'为前缀,而Python3不支持。
注意:在python中,注释以“#”开头,后面的文字直到行尾都算注释
# 这一行全部都是注释...
print 'hello' # 这也是注释
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,等等。
>>> 12.3e9
12300000000.0
>>> 1.23e10
12300000000.0
3、字符串(String)
字符串是以' '或" "括起来的任意文本,比如'abc',"xyz"等等。请注意,''或""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c这3个字符
>>> 'afv'
'afv'
>>> "afv"
'afv'
print语句支持对多个字符串进行输出,用','隔开就可以实现多个字符串的输出
>>>> 'hello','world'
('hello', 'world')
>>> print 'hello','world'
hello world</span>
如果字符串本身包含' ',则字符串用” “括起来
>>>> print I'm a student
File "<stdin>", line 1
print I'm a student
^
SyntaxError: EOL while scanning string literal
>>> print "I'm a student"
I'm a student</span>
如果字符串本身包含" ",则字符串用' '括起来
>>>> print Learn "Python"
File "<stdin>", line 1
print Learn "Python"
^
SyntaxError: invalid syntax
>>> print 'Learn "Python"'
Learn "Python"</span>
如果字符串既包含’ ‘又包含" ",就需要对字符串中的某些字符进行转义,Python用字符'\'进行转义,转义字符'\'不计入字符串内容。常用的转义字符还有:
\n 表示换行
\t 表示一个制表符
\\ 表示\本身
>>>> print "Bob said \"I\'m OK\"."
Bob said "I'm OK".
>>> print 'Bob said \"I\'m OK\".'
Bob said "I'm OK".
>>> print '"Thank you!"\n"You are welcome"'
"Thank you!"
"You are welcome"
>>> print '\t"Thank you!"'
"Thank you!"
>>> print '\\"Thank you"\\'
\"Thank you"\</span>
当一个字符串含有多个需要转义的字符,对每个字符进行转义就显得很麻烦。为了避免这个情况,可以在该字符串前面加个前缀“r”,表示这是一个raw字符串,里面的字符不需要转义了。
#python2
>>> r'\(~_~)/ \(~_~)/'
'\\(~_~)/ \\(~_~)/'
>>> print r'\(~_~)/ \(~_~)/'
\(~_~)/ \(~_~)/
#python3
>>> r'\(~_~)/ \(~_~)/'
'\\(~_~)/ \\(~_~)/'
>>> print (r'\(~_~)/ \(~_~)/')
\(~_~)/ \(~_~)/
但是raw字符串不能表示多行字符串,也不能表示包含' '和" "的字符串,如果要表示多行字符串,可以用'''...'''表示
#python2
>>> '''Line One
... Line Two
... Line Three'''
'Line One\nLine Two\nLine Three'
>>> print '''Line One
... Line Two
... Line Three'''
Line One
Line Two
Line Three
#Python3
>>> '''Line One
... Line Two
... Line Three'''
'Line One\nLine Two\nLine Three'
>>> print ('''Line One
... Line Two
... Line Three''')
Line One
Line Two
Line Three
还可以在多行字符串前面加添加r,把这个多行字符串也变成raw字符串,即r'''...'''形式。
>>> r'''Line One
... Line Two
... Line Three'''
'Line One\nLine Two\nLine Three'
字符串还有一个编码问题。因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是65,小写字母 z 的编码是122。
如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。
因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码,普通的字符串'ABC'在Python内部都是ASCII编码的。
Python在后来添加了对Unicode的支持,以Unicode表示的字符串用u'...'表示
>>> print u"中文"
中文
Unicode字符串除了多了一个u之外,与普通字符串没啥区别,转义字符和多行表示法仍然有效:
转义:
>>> u'中文\n日文\n韩文'
u'\u4e2d\u6587\n\u65e5\u6587\n\u97e9\u6587'
>>> print u'中文\n日文\n韩文'
中文
日文
韩文
多行:
>>> u'''第一行
... 第二行'''
u'\u7b2c\u4e00\u884c\n\u7b2c\u4e8c\u884c'
>>> print u'''第一行
... 第二行'''
第一行
第二行
raw+多行:
>>> ur'''Python的Unicode字符串支持"中文"
... "日文"
... "韩文"等多种语言'''
u'Python\u7684Unicode\u5b57\u7b26\u4e32\u652f\u6301"\u4e2d\u6587"\n"\u65e5\u6587"\n"\u97e9\u6587"\u7b49\u591a\u79cd\u8bed\u8a00'
>>> print ur'''Python的Unicode字符串支持"中文"
... "日文"
... "韩文"等多种语言'''
Python的Unicode字符串支持"中文"
"日文"
"韩文"等多种语言
如果中文字符串在Python环境下遇到 UnicodeDecodeError,这是因为.py文件保存的格式有问题。可以在第一行添加注释
# -*- coding: utf-8 -*-
目的是告诉Python解释器,用UTF-8编码读取源代码。然后用Notepad++ 另存为... 并选择UTF-8格式保存。
例如:
文件p.py内容为:
在命令行中输入python p.py 后提示错误:
SyntaxError: Non-ASCII character '\xe4' in file p.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
修改文件p.py内容为:
在命令行重新执行python p.py后正确显示执行结果:
中文
4、布尔类型(Boolean)
布尔值和布尔代数的表示一致,有True和False两个值,在Python中,可以直接用True和False表示(注意大小写)。
布尔值可以用and、or、not运算:
and:与运算,双目运算,只有两个值都为True时,计算结果才为True
or:或运算,双目运算,只有一个值为True时,计算结果就为True
not:非运算,单目运算,把True变成False,把False变成True
>>> 100<99
False
>>> not 100<99
True
>>> 100<99 and 0>1
False
>>> 100<99 or 0<1
True
布尔类型还可以与其他数据类型做 and、or和not运算
>>> True and 'a=T' or 'a=F'
'a=T'
python把0、空字符串‘ ’和None看成 False,其他数值和非空字符串都看成 True。
and 和 or 运算的一条重要法则:短路计算。
在计算a and b时,如果 a 是 False,则根据与运算法则,整个结果必定为 False,因此返回 a;如果 a 是 True,则整个计算结果必定取决与 b,因此返回 b。
在计算a or b时,如果 a 是 True,则根据或运算法则,整个计算结果必定为 True,因此返回 a;如果 a 是 False,则整个计算结果必定取决于 b,因此返回 b。
>>> a and 'a=T' or 'a=F'
'a=T'
>>> a and 'a=T' and 'a=F'
'a=F'
所以python解释器在做布尔运算时,只要能提前确定计算结果,它就不会往后算了,直接返回结果。
5、空值(None)
>>> None
6、整数和浮点数的运算
Python支持对整数和浮点数直接进行四则混合运算,运算规则和数学上的四则运算规则完全一致。
基本的运算:
>>> 1+2+3
6
>>> 4*5-6
14
>>> 7.5/8+2.1
3.0375
使用括号可以提升优先级,这和数学运算完全一致,注意只能使用小括号,但是括号可以嵌套很多层:
>>> (1+2)*3
9
>>> (2.2+3.3)/(1.5*(9-0.3))
0.42145593869731807
和数学运算不同的地方是,Python的整数运算结果仍然是整数,浮点数运算结果仍然是浮点数:
>>> 1+2
3
>>> 1.0+2.0
3.0
整数和浮点数混合运算的结果就变成浮点数了:
>>> 1+2.0
3.0
整数运算的结果永远是精确的,而浮点数运算的结果不一定精确,因为计算机内存再大,也无法精确表示出无限循环小数,比如1.0换成二进制表示就是无限循环小数。
python2中的整数除法,即使除不尽,结果仍然是整数,余数直接被扔掉。不过,python提供了一个求余的运算 % 可以计算余数:
#python2
>>> 11/3
3
>>> 11%3
2
#python3
>>> 11/3
3.6666666666666665
>>> 11%3
2
python3中的整数除法,如果除不尽,结果会是浮点数。
在python2中,如果我们要计算 11 / 4 的精确结果,按照“整数和浮点数混合运算的结果是浮点数”的法则,把两个数中的一个变成浮点数再运算就没问题了:
#python2
>>> 11/4
2
>>> 11.0/4
2.75
问题:计算 2.5 + 10 / 4 ,并解释计算结果为什么不是期望的 5.0 ?
>>> 2.5+10/4
4.5
>>> 2.5+10.0/4
5.0
其他几种数据类型:列表(List)、元组(Tuple)、集合(Set)以及字典(Dict)下次整理