标签:
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.23
,3.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是Python内置的一种数据类型,使用”[]“表示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 = []
>>> l = [‘Jlan‘, ‘Bob‘, ‘Lanny‘] # l[0]=Jlan,l[1]=Bob,l[-1]=Lanny
>>> 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]
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的内部结构和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’了。
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
标签:
原文地址:http://my.oschina.net/jlan/blog/487705