初学python(二)数据类型

据说python里有6个标准的数据类型:

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Sets(集合)
  • Dictionaries(字典)

Numbers(数字)

python3 支持int、float、bool、complex
还可以通过一个叫type()的函数来输出类型,自己测试了一下

Python 3.4.0 (default, Apr 11 2014, 13:05:18) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a,b,c,d = 10,2.5,True,4+3j
>>> print(type(a),type(b),type(c),type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
>>> 

还有运算:

>>> 1 + 1 #加
2
>>> 1 - 1 #减
0
>>> 1 × 1 #乘
  File "<stdin>", line 1
    1 × 1 #乘
      ^
SyntaxError: invalid character in identifier
>>> 1 * 1 #乘
1
>>> 3 / 2 #浮点数除
1.5
>>> 3 // 2 #整除
1
>>> 3 % 2 #取模
1
>>> 2 ** 4 #幂
16
>>> pow(2,4) #幂
16

String(字符串)

这个没什么好说的,上一节感觉熟练了一下。
可以用*来重复字符串,用+来拼接字符串,用string[index]来取字符,或者用string[-index]来倒着取字符。和ruby一样一样的。
还有字符串分割string[index_x:index_y]
但是不能通过string[index] = x进行赋值,因为字符串是不可改变的。

List(列表)

先说列表的赋值吧,一个列表中可以扔进任何一个类型的数据,不用在意类型。例如

>>> a = ['him', 25, 100, 'her']
>>> print(a)
['him', 25, 100, 'her']

它还支持拼接、修改、分割操作,

>>> a = [1, 2, 3, 4, 5]
>>> a + [6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> a = [1, 2, 3, 4, 5, 6]
>>> a[0] = 9
>>> a[2:5] = [13, 14, 15]
>>> a
[9, 2, 13, 14, 15, 6]
>>> a[2:5] = []   # 删除
>>> a
[9, 2, 6]

(元组)

元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号里,元素之间用逗号隔开。
例如:

>>> a = (1991, 2014, 'physics', 'math')
>>> print(a, type(a), len(a))
(1991, 2014, 'physics', 'math') <class 'tuple'> 4

元组与字符串类似,可以被索引且下标索引从0开始,也可以进行截取/切片(看上面,这里不再赘述)。
其实,可以把字符串看作一种特殊的元组。

>>> tup = (1, 2, 3, 4, 5, 6)
>>> print(tup[0], tup[1:5])
1 (2, 3, 4, 5)
>>> tup[0] = 11  # 修改元组元素的操作是非法的

虽然tuple的元素不可改变,但它可以包含可变的对象,比如list列表。
构造包含0个或1个元素的tuple是个特殊的问题,所以有一些额外的语法规则:

tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号

另外,元组也支持用+操作符:

>>> tup1, tup2 = (1, 2, 3), (4, 5, 6)
>>> print(tup1+tup2)
(1, 2, 3, 4, 5, 6)

Sets(集合)

集合(set)是一个无序不重复元素的集。
好熟悉的结构,哈哈哈。
基本功能是进行成员关系测试和消除重复元素。
可以使用大括号 或者 set()函数创建set集合,注意:创建一个空集合必须用 set() 而不是 { },因为{ }是用来创建一个空字典。
下面来个例子吧:

>>> set_text = {'item0','item1','item2','item3','item4','item5','item6'}
>>> print(set_text)
{'item1', 'item4', 'item3', 'item2', 'item6', 'item5', 'item0'}
>>> #果然是无序的
... 
>>> 'item3' in set_text #成员测试?
True
>>> 'item7' in set_text #成员测试?
False
>>> #据说还可以进行集合运算
... 
>>> a = set(sadfdsafsdfas)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sadfdsafsdfas' is not defined
>>> a = set('sadfdsafsdfas')
>>> b = set('sdlifjxz')
>>> a
{'d', 'a', 'f', 's'}
>>> b
{'z', 'd', 'l', 'f', 'x', 'j', 's', 'i'}
>>> b-a    #差
{'x', 'l', 'j', 'i', 'z'}
>>> a | b    #并
{'z', 'd', 'f', 'l', 'x', 'j', 'a', 's', 'i'}
>>> a & b    #交
{'d', 'f', 's'}
>>> a ^ b    #a和b中不同时存在的元素
{'z', 'l', 'x', 'j', 'a', 'i'}

Dictionaries(字典)

这应该就是在C里用的map吧,一个映射类型。其中的key必须是不可变类型,listtuple就不行了。
基本操作:添删改查

>>> dic = {} #空字典
>>> dic
{}
>>> dics = {'tom':1,'jerry':10,'cat':11}
>>> dics
{'jerry': 10, 'cat': 11, 'tom': 1}
>>> dics['tom'] #查
1
>>> dics['toms'] #查空
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'toms'
>>> del dics['tom'] #删
>>> dics
{'jerry': 10, 'cat': 11}
>>> dics['mouse'] = 100 #添
>>> dics
{'mouse': 100, 'jerry': 10, 'cat': 11}
>>> dics['mouse'] = 101 #改
>>> dics
{'mouse': 101, 'jerry': 10, 'cat': 11}

进阶操作:

>>> list (dics.keys()) #返回所有key组成的list
['mouse', 'jerry', 'cat']
>>> list (dics.values()) #返回所有value组成的list
[101, 10, 11]
>>> sorted (dics.keys()) #按key排序
['cat', 'jerry', 'mouse']
>>> 'cat' in dics #成员测试?
True
>>> 'cats' in dics #成员测试?
False

奇葩的构造方式,从sequence中构建

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'jack': 4098, 'sape': 4139, 'guido': 4127}
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
>>> dict(sape=4139, guido=4127, jack=4098)
{'jack': 4098, 'sape': 4139, 'guido': 4127}