注册 登录

清河洛

Python的数据类型和转换

qingheluo2016-12-16清河洛310
Python和php一样,也是弱类型语言,声明或定义某个变量时不需要声明数据类型。type(object):获得对象的直接所属类名,不考虑继承关系isinstance(object,type_class_name) :判断对象是否属于指定类名或者指定类名的子类1、数字类型:在Python中有4种类型的数:整数(int),python2中范围-2147483648到2147483647,所以更小的或更大的数会用长整数类型(long),需要在整数后加L或l(小写的L,由于和数字1很像,一般为了程序的清楚,使用大写的L)来标注该数字为长整数,如a=12L,在python3中int类型不限制大小...

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

type(object):获得对象的直接所属类名,不考虑继承关系

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

1、数字类型:

在Python中有4种类型的数:

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

可以使用十六进制和八进制来代表整数
number = 0xA0F # 十六进制,number值为十进制的2575
number = 0o37  # 八进制,number值为十进制的31

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

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

2、字符串类型(str)

字符串可以使用单引号(''),双引号("")和三引号('''字符串'''或"""字符串""")来指示字符串

三引号可以用来包含多行字符串

1>自然字符串,在输出时不需要特殊处理字符串中出现的转义符,通过给字符串加上前缀r或R来指定字符串为自然字符串
2>Unicode字符串:Unicode是书写国际文本的标准方法,Python可以处理非英文语言的字符串,需要给字符串加上前缀u或U

3、布尔值

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

4、列表(list)

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

list(range(n,m,i))快速创建一个列表,range()创建一个r生成器,使用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']
两层循环,三层和三层以上的循环就很少用到了

也可以使用两个变量来生成

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=()。

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

list、dict和set都有生成式(推导式)但是tuple是没有的

生成式:(计算表达式 for循环语句1 for循环语句2 ... 判断条件)返回的不是tuple对象,是一个generator(生成器)对象,可以使用netx()方法连续的获取下一个值。

来看一个“可变的”tuple:

t = ('a', 'b', ['A', 'B'])
t[2][0] = 'X'
t[2][1] = 'Y'
print(t)
('a', 'b', ['X', 'Y'])

不是说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>字典生成式(推导式):

{计算表达式 for循环语句1 for循环语句2 ... 判断条件}

a={i:i%2==0 for i in range(1,6)}
print(a)
{1: False, 2: True, 3: False, 4: True, 5: False}

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

7、集合(set)

数据类型和dict类似,是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的值

要创建一个set,可以直接通过大括号创建s={'a','b','c','d'},也可以通过工厂函数set(list)

打印set时的显示顺序也不表示set是有序的

集合生成式(推导式):{计算表达式 for循环语句1 for循环语句2 ... 判断条件}

a={i*i for i in [1,2,3,4,3,2,1,4,5]}
print(a)
{1, 4, 9, 16, 25}

通过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) :八进制整数(前缀0o)  bin(x) :二进制整数(前缀0b)

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

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

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

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

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

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



网址导航