首页 > 其他学习 > python > Python的数据类型和转换
2016
12-16

Python的数据类型和转换

Python和php一样,也是弱类型语言,声明或定义某个变量时不需要声明数据类型。

type(object)可以打印出对象的直接所属类名。

isinstance(object,type_class_name) :判断对象是否属于指定类名或者指定类名的子类

type() 不会认为子类是一种父类类型,不考虑继承关系。isinstance() 会认为子类是一种父类类型,考虑继承关系。如果要判断两个类型是否相同推荐使用 isinstance()。

1、数字类型:在Python中有4种类型的数:

整数(int),python2中范围-2147483648到2147483647,所以更小的或更大的数会用长整数类型(long),需要在整数后加L或l(小写的L,由于和数字1很像,一般为了程序的清楚,使用大写的L)来标注该数字为长整数,如a=12L(a的值为12,L不是值的一部分,只是标注该变量的数值为长整型类型。),在python3中int类型不限制大小了,所以也就没有了long类型

浮点数(float),浮点型由整数部分与小数部分组成,也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)

复数(complex),在定义是后面加上小写的j标注该数值为复数类型。

我们可以使用十六进制和八进制来代表整数:
>>> number = 0xA0F # 十六进制
>>> number
2575
>>> number=0o37 # 八进制
>>> number
31

2、字符串类型(str):字符串可以使用单引号(''),双引号("")和三引号('''字符串'''或"""字符串""")来指示字符串,三引号可以用来包含多行字符串。

1>自然字符串,在输出时不需要特殊处理字符串中出现的转义符,通过给字符串加上前缀r或R来指定字符串为自然字符串,如:a=r"this is \n string"

2>Unicode字符串:Unicode是书写国际文本的标准方法,Python可以处理非英文语言的字符串,需要给字符串加上前缀u或U,如a=u"这是一个Unicode字符串"

3、布尔值:有True和False两个(注意首字母大写),布尔值可以用and、or和not运算。

4、列表(list) :列表通过中括号([])中用逗号分隔的元素定义,是一种有序的集合,可以随时添加和删除其中的元素。

list(range(n,m,i))可以快速创建一个列表,range()创建一个range类型的数据,使用list()转化为列表,n为开始的字符,m为结束的字符(生成的列表中包含n但是不包含m),i为步长,即每隔多少取一个值(可以省略,默认为1)

列表生成式:[计算表达式 for循环语句1 for循环语句2 ... 判断条件]

[x * x for x in range(1, 11) if x % 2 == 0]

[4, 16, 36, 64, 100]

创建一个1到10中偶数的平方组成的列表

[m + n for m in 'ABC' for n in 'XYZ']

['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

两层循环,三层和三层以上的循环就很少用到了。

列表生成式也可以使用两个变量来生成list:

d = {'x': 'A', 'y': 'B', 'z': 'C' }

[k + '=' + v.lower() for k, v in d.items()]

['y=b', 'x=a', 'z=c']

生成键值对并且值变成小写的列表

5、元组(tuple) :元组和列表类似,只不过元组和字符串一样是不可变的(元组重新给元素赋值会报错),元组通过圆括号中用逗号分隔的元素定义。如a=('name',25,'male'),定义一个单一元素的元组,最后要加一个逗号a=('name',)

列表的标志是中括号,而元组的标志并不是圆括号,而是逗号,如a=2,3也是创建一个元组,但是创建一个空的元组就和列表的方法一样了,用a=()。

列表的很多方法在元组中都是可以使用的,但是由于元组的不可变的特性,所以有些涉及到改变元组的元素或结构的方法不能使用。

最后来看一个“可变的”tuple:

>>> t = ('a', 'b', ['A', 'B'])

>>> t[2][0] = 'X'

>>> t[2][1] = 'Y'

>>> t

('a', 'b', ['X', 'Y'])

这个tuple定义的时候有3个元素,分别是'a','b'和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?

表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。

6、字典(dict):是python中唯一的映射类型(哈希表),字典中元素的值是可变的,但是字典的键必须使用不可变对象(数字和字符串)。

创建字典:

1>用花括号{},如a={'name':'myname','age':28,'gender':'male'}

2>使用工厂方法dice():

以键值对方式构造字典,键不能是数值且不需要加引号:a=dict(name='myname',age=28,gender='male')

以映射函数方式来构造字典:a=dict(zip(['name','age','gender'],['myname',28,'male']))

可迭代对象方式来构造字典:a=dict([('name','myname'),('age',28),('gender','male')])

复制一个字典的所有内容给另一个变量,两个变量不是一个内存地址,是相互独立的。b = dict(a)

3>使用字典的内建方法dict.fromkeys(key_list[,value]),创建返回一个新的字典,字典中的所有键都对应相同的值,这种方法适合字典中的元素具有相同的值,value可以省略,默认为None。
如:a=dict.fromkeys(['name','age','gender'],'zhi')

7、集合(set)数据类型和dict类似,是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的值。要创建一个set,可以直接通过大括号创建s={'a','b','c','d'},也可以通过工厂函数set(list):

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

>>> {1, 2, 3}

传入的参数[1,2,3]是一个list,而显示的{1,2,3}告诉你这个set内部有1,2,3这3个元素,显示顺序也不表示set是有序的。重复元素在set中自动被过滤:

通过add(key)方法可以添加key元素到set中,可以重复添加,但不会有效果:

通过remove(key)方法可以删除key元素:

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

>>> set([1, 2, 3]) & set([2, 3, 4])

>>> {2, 3}

>>> set([1, 2, 3]) | set([2, 3, 4])

>>> {1, 2, 3, 4}

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。

不可变集合有时候我们需要集合中的数据是不可变的,不能新增或删除,这时需要使用forzenset(list)(单词forzen表示冰冻的,冻结的)来创建。

执行类型之间的转换,使用类型作为函数名,如str(x)标识把x转换为字符串类型。常见的数据类型:

int :整数  float :浮点数  complex :复数  str :字符串

hex(x) :十六进制整数(前缀0x)  oct(x) :八进制整数(前缀0)  bin(x) :二进制整数(前缀0b)

repr : 返回一个对象的string格式  tuple :元组  list :列表  set :集合  frozenset :冻结集合

dict :字典(转换的必须是(键,值)元组序列)  bool :布尔值

数字类型、字符串类型和元组类型一旦创建是不可更改的

每当创建一个变量时,内存会在数据区开辟一个新的存储空间用来存储该值,使用函数id(变量)可以获取一个变量的内存存储地址

当重新给一个数字类型或字符串类型的变量赋值时,实质上是在内存的数据区再次重新开辟一个新的存储空间来存储新的值,原来存储空间的仍然存在并且存储的值没有改变,只不过把这个变量指向了新的存储空间。

元组在修改元素值或数据结构时直接报错。

最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。