码迷,mamicode.com
首页 > 编程语言 > 详细

Python的数据类型

时间:2015-08-04 19:29:12      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

Python的数据类型包括基本的数据类型,如:整型,浮点型,字符串,字符串和高级数据类型,如列表,元组,字典,Set,Forzensets。

一.整型

Python可以处理任意大小的整数,包括负整数。
在python 2.x中,有两种整数类型,一般的32位整数和长整数,长整数都是以L或者l表示,超过32位后会自动转换为长整形。在python 3.x中,只有一种类型,没有长度限制。

在Python 2.x中,表示八进制有两种方式,一是和其他的编程语言一样,直接在数字前加0,比如010, 另外是加0o开头(0和小写字母o),如0o10。在Python 3.x中,表示八进制的方式只有一种,就是0o开头。

十六进制表示方法是以0x开头,如0x10。

 

二.浮点数

浮点数就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23×10^9和12.3×10^8是相等的。浮点数可以用数学写法,如1.233.14-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23×10^9就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。

整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。

 

三.字符串

字符串是以‘‘""括起来的任意文本,比如‘abc’“xyz”等等。

另外,字符串可以标识在一对儿三引号中:””” 或 ”’。三引号中,不需要行属转义,它们已经包含在字符串中:

print("""\            
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

得到如下输出:

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

可以使用反斜杠为行结尾的连续字符串,它表示下一行在逻辑上是本行的后续内容

>>> a="""aaa... bbb
... ccc
... """
>>> print a
aaabbb
ccc

>>>

字符串提供了许多内置的函数,这些在很多Python程序中很有用处,它们包括:
endswith() – 检查字符串是否以给定字符串结尾
startswith() – 检查字符串是否以给定字符串开始
upper() – 将字符串所有字符变成大写
lower() – 将字符串所有字符变成小写
isupper()/islower() – 检测字符串是否全是大写/小写
len() – 检测字符串长度

>>> print("abc".endswith(‘c‘))
True
>>> print("abc".startswith(‘c‘))
False
>>> print("abc".startswith(‘a‘))
True
>>> print(‘a‘.upper())
A
>>> print(a.isupper())
False
>>> print(len("abc"))
3

四.布尔值

布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False,在Python中,可以直接用True、False表示布尔值(请注意大小写),也可以通过布尔运算计算出来。

布尔值可以用and、or和not运算。
and运算是与运算,只有所有都为True,and运算结果才是 True。
or运算是或运算,只要其中有一个为True,or运算结果就是 True。
not运算是非运算,它是一个单目运算符,把True变成False,False变成True。

五.空值

空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

六.list

list是Python内置的一种数据类型,使用”[]“表示list是一种有序的集合,可以随时添加和删除其中的元素。

1.创建list

构造list非常简单,直接用[ ]把list的所有元素都括起来,就是一个list对象。通常,我们会把list赋值给一个变量,这样,就可以通过变量来引用list:

>>> classmates = [‘Jlan‘, ‘Bob‘, ‘Lanny‘]
>>> classmates # 打印classmates变量的内容
[‘Jlan‘, ‘Bob‘, ‘Lanny‘]

也可以使用列表构造函数list()来建立我们的列表,如:
>>> list(‘a’)
[‘a’]
>>> values = (1,2,3,4)      #values是一个元组
>>> list(values)
[1,2,3,4]

由于Python是动态语言,所以list中包含的元素并不要求都必须是同一种数据类型,我们完全可以在list中包含各种数据:

>>> L = [‘Jlan‘, 170 , 65]

一个元素也没有的list,就是空list:

>>> empty_list = []

2.索引操作

>>> l = [‘Jlan‘, ‘Bob‘, ‘Lanny‘]   # l[0]=Jlan,l[1]=Bob,l[-1]=Lanny

3.切片操作

>>> l=range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[0:3]
[0, 1, 2]
>>> l[:3]
[0, 1, 2]
>>> l[:]                            #只用一个”:“表示从头到尾
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[1:]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[::2]                          #第三个参数表示每N个取一个
[0, 2, 4, 6, 8]
>>> l[:5:2]
[0, 2, 4]
>>> l[-1]
9
>>> l[-5:-1]
[5, 6, 7, 8]
>>> l[-5:-1:2]
[5, 7]

4.添加删除和修改数据

list的append()方法,总是把新的元素添加到 list 的尾部:

>>> L = [‘Jlan‘, ‘Bob‘, ‘Lanny‘]
>>> L.append(‘Paul‘)
>>> print L
[‘Jlan‘, ‘Bob‘, ‘Lanny‘, ‘Paul‘]

append()的参数还可以为一个list,如:

>>> L1=[1,2,3]
>>> L2=[4,5,6]
>>> L1.append(L2)                          >>>L1.extend(L2)         #注意append和extend的区别
[1, 2, 3, [4, 5, 6]]                       [1,2,3,4,5,6]

如果要添加到指定的位置,是用list的insert()方法,它接受两个参数,第一个参数是索引号,第二个参数是待添加的新元素:

>>> L = [‘Jlan‘, ‘Bob‘, ‘Lanny‘]
>>> L.insert(0,‘Paul‘)
>>> print L
[‘Paul‘, ‘Jlan‘, ‘Bob‘, ‘Lanny‘]

list.pop(n)删除当前list中的第n+1个元素,并且返回list[n+1]
list.remove(key)删除list中的值key

删除list中的重复元素
比较容易记忆的是用内置的set

l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘]
l2 = list(set(l1))
print l2

还有一种据说速度更快的

l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘]
l2 = {}.fromkeys(l1).keys()
print l2

这两种都有个缺点,去除重复元素后排序变了:

[‘a‘, ‘c‘, ‘b‘, ‘d‘]

如果想要保持他们原来的排序:
用list类的sort方法

l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘]
l2 = list(set(l1))
l2.sort(key=l1.index)
print l2

或者

l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘]
l2 = sorted(set(l1),key=l1.index)
print l2

也可以用遍历

l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘]
l2 = []
for i in l1:
    if not i in l2:
        l2.append(i)
print l2

上面的代码也可以这样写

l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘]
l2 = []
[l2.append(i) for i in l1 if not i in l2]
print l2

这样就可以保证排序不变了:

[‘b‘, ‘c‘, ‘d‘, ‘a‘]

七.元组

元组(tumple)是python中的另一种有序列表,只是元组的值不可改变,元组用”()”表示

>>> t=(‘Jlan‘,‘Bob‘,‘Lanny‘)
>>> t
(‘Jlan‘, ‘Bob‘, ‘Lanny‘)
>>> t[1]=‘Hary‘
Traceback (most recent call last):
  File "", line 1, in 
TypeError: ‘tuple‘ object does not support item assignment

前面我们看到了tuple一旦创建就不能修改,现在我们来看一个“可变”的tuple:

>>> t = (‘a‘, ‘b‘, [‘A‘, ‘B‘])      #t有3个元素:‘a‘,‘b‘和一个list:[‘A‘, ‘B‘]
>>> L = t[2]
>>> L[0] = ‘X‘                      #然后,把list的两个元素改一下
>>> L[1] = ‘Y‘
>>> print t                         #再看看tuple的内容
(‘a‘, ‘b‘, [‘X‘, ‘Y‘])

当元组的元素个数只有一个时,要加一个”,” ,否则元组会被视为一个数值或字符串,如:

>>> t=(1)
>>> t
1
>>> t=(1,)
>>> t
(1,)

八.字典

python中字典用”{key1:value1,key2:value2,……}”的格式来表示,其中key不可变,各对key-value之间没有顺序。
dict在python很常用,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象,最常用的key十字符串。
在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。

>>> grade={‘Jlan‘:100,‘Lanny‘:99,‘Bob‘:98,‘Hary‘:96,‘Alan‘:80}
>>> print grade
{‘Bob‘: 98, ‘Lanny‘: 99, ‘Alan‘: 80, ‘Hary‘: 96, ‘Jlan‘: 100}
>>> grade[‘Bob‘]
98
>>> print grade.get(‘Alan‘)                 #python3中已没有这种用法
80
>>>print grade.get(‘Jlan‘,-1)              #若‘Jlan‘在grade中,则返回grade[‘Jlan‘];若不在则返回None或自定义的值
100
>>> grade[‘Rob‘]=60                            #添加元素
>>>grade.pop(‘Bob‘)                           #删除元素,list.pop是一个函数,所以要用‘()‘,而不是‘[]‘
>>> grade
{‘Rob‘: 60, ‘Alan‘: 80, ‘Jlan‘: 100, ‘Hary‘: 96, ‘Lanny‘: 99}

字典的遍历:

grade={‘Jlan‘:100,‘Lanny‘:99,‘Bob‘:98,‘Hary‘:96,‘Alan‘:80}
for key in grade:
    print key+‘:‘,grade[key]Bob: 98
Lanny: 99
Alan: 80
Hary: 96
Jlan: 100

九.set

set的内部结构和dict很像,唯一区别是不存储value,因此,判断一个元素是否在set中速度很快。
set存储的元素和dict的key类似,必须是不变对象,因此,任何可变对象是不能放入set中的。
最后,set存储的元素也是没有顺序的。
要创建一个set,需要提供一个list作为输入集合:

>>> s = set([1, 2,3, 3])
>>> s
set([1, 2, 3])

#set会自动过滤重复元素
>>>s.add(4)                    #add(key)添加元素
>>>print s
set([1, 2, 3, 4,]
>>>s.remove(1)            #remove(key)删除元素
>>>s
set([2, 3, 4]

十.再议不可变对象

上面我们讲了,str,tumple是不变对象,而list是可变对象。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:

>>> a = [‘c‘, ‘b‘, ‘a‘]
>>> a.sort()
>>> a
[‘a‘, ‘b‘, ‘c‘]

而对于不可变对象,比如str,对str进行操作呢:

>>> a = ‘abc‘
>>> a.replace(‘a‘, ‘A‘)
‘Abc‘
>>> a
‘abc‘

虽然字符串有个replace()方法,也确实变出了’Abc’,但变量a最后仍是’abc’,应该怎么理解呢?
我们先把代码改成下面这样:

>>> a = ‘abc‘
>>> b = a.replace(‘a‘, ‘A‘)
>>> b
‘Abc‘
>>> a
‘abc‘

要始终牢记的是,a是变量,而’abc’才是字符串对象!有些时候,我们经常说,对象a的内容是’abc’,但其实是指,a本身是一个变量,它指向的对象的内容才是’abc’。
当我们调用a.replace(‘a’, ‘A’)时,实际上调用方法replace是作用在字符串对象’abc’上的,而这个方法虽然名字叫replace,但却没有改变字符串’abc’的内 容。相反,replace方法创建了一个新字符串’Abc’并返回,如果我们用变量b指向该新字符串,就容易理解了,变量a仍指向原有的字符 串’abc’,但变量b却指向新字符串’Abc’了。
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。


Python的数据类型

标签:

原文地址:http://my.oschina.net/jlan/blog/487705

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!