数字类型
数字提供了标量贮存和直接访问。它是不可更改类型,也就是说变更数字的值会生成新的对象。
int(整型)
在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
long(长整型)
跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。
boolean(布尔值)
布尔值是特殊的整数。 尽管布尔值由常量 True 和 False 来表示, 如果将布尔值放到一个数值上下文环境中(比方将 True 与一个数字相加), True 会被当成整数值 1, 而False则会被当成整数值 0。 复数(包括-1 的平方根, 即所谓的虚数)在其它语言中通常不被直接支持(一般通过类来实现)
float(双精度浮点型)
浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。
decimal(十进制浮点型)
其实还有第六种数字类型, decimal, 用于十进制浮点数。不过它并不是内建类型, 你必须先导入 decimal 模块才可以使用这种数值类型。 由于需求日渐强烈, Python 2.4 增加了这种类型。举例来说, 由于在二进制表示中有一个无限循环片段,数字1.1 无法用二进制浮点数精确表示。因此, 运算1.1+2.2 实际上会被表示成:
>>> 1.1+2.2
3.3000000000000003
>>> from decimal import *
>>> print decimal.Decimal('1.1+2.2')
3.3
参考:http://www.th7.cn/Program/Python/201501/351749.shtml
complex(复数)
复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。
注:Python中存在小数字池:-5 ~ 257
序列类型
序列类型操作符
seq[ind]
获得下标为ind 的元素
seq[ind1:ind2]
获得下标从ind1 到ind2 间的元素集合
seq * expr
序列重复expr 次
seq1 + seq2
连接序列seq1 和seq2
obj in seq
判断obj 元素是否包含在seq 中
obj not in seq
判断obj 元素是否不包含在seq 中
序列内建函数
enumerate(iter)
接受一个可迭代对象作为参数,返回一个enumerate 对象(同时也是一个迭代器),该对象生成由iter 每个元素的index 值和item 值组成的元组(PEP 279)
len(seq)
返回seq 的长度
max(iter,key=None) or max(arg0,arg1...,key=None)b
返回iter 或(arg0,arg1,...)中的最大值,如果指定了key,这个key 必须是一个可以传给sort()方法的,用于比较的回调函数.
min(iter, key=None) or min(arg0, arg1.... key=None)b
返回iter 里面的最小值;或者返回(arg0,arg2,...)里面的最小值;如果指定了key,这个key 必须是一个可以传给sort()方法的,用于比较的回调函数.
reversed(seq)
接受一个序列作为参数,返回一个以逆序访问的迭代器(PEP 322)
sorted(iter,func=None,key=None,reverse=False)c
接受一个可迭代对象作为参数,返回一个有序的列表;可选参数func,key 和reverse 的含义跟list.sort()内建函数的参数含义一
样.
sum(seq, init=0)
返回seq 和可选参数init 的总和, 其效果等同于reduce(operator.add,seq,init)
zip([it0, it1,... itN])
返回一个列表,其第一个元素是it0,it1,...这些元素的第一个元素组成的一个元组,第二个...,类推.
1.字符串
Python 中字符串被定义为引号之间的字符集合。Python 支持使用成对的单引号或双引号,三引号(三个连续的单引号或者双引号)可以用来包含特殊字符。使用索引运算符( [ ] )和切片运算符( [ : ] )可以得到子字符串。字符串有其特有的索引规则:第一个字符的索引是 0,最后一个字符的索引是 -1加号( + )用于字符串连接运算,星号( * )则用于字符串重复。
每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。
字符串常用功能:
- 移除空白:strip(),常用于输入用户名是移除两侧空白
- 分割:split()
- 长度:len(str)
- 索引:str[index]
- 切片:[],[:],[::]
2.列表
如何定义一个列表?
li = []
或
li = list([])
li = list()
增
li.append(obj),添加对象obj
内容添加到列表中
li.insert(index,obj),把obj插入指定位置
删
li.pop(index=-1),删除并返回指定位置的对象,默认为最后一个对象
li.remove(obj),删除对象obj
li.clear(),清空列表
改
li.reverse(),原地反转
li.sort(func=None,key=None,reverse=False),以指定方式对列表成员进行排序,默认为归并排序
查
li.count(obj),返回obj出现的次数
li.index(obj,i=0,j=len(li)),返回第一个li[k]==obj的k值,并且i<=k<j,否则角标越界
复制
L = li.copy(),浅拷贝。
例
>>> s = [1,2,3,4,[5,6]]
>>> l = s.copy()
>>> s[4][0] = 7
>>> print(s)
[1, 2, 3, 4, [7, 6]]
>>> print(l)
[1, 2, 3, 4, [7, 6]]
3.元组
如何定义一个元组?
t=()
或
t = tuple(())
t = tuple()
查
t.count(obj),返回obj出现的次数
t.index(obj,i=0,j=len(t)),返回第一个li[k]==obj的k值,并且i<=k<j,否则角标越界
映射类型:字典
如何定义一个字典?
d = {}
或
d = dict({})
d = dict()
增
d[1] = 'element1'
d.update(d2),字典d和d2中没有相同的键则追加,有相同的键则更新
删
d.pop(k[,default]),删除d[k]==value的项并返回value,如果k不存在,并且没有给出返回默认值,则抛出KeyError错误
d.popitem(),删除由python决定的一项(任意的)并返回一个(k,v)二元组,如果d为空则抛出KeyError错误
改
d[1] = 'modify1'
d.update(d2),字典d和d2中没有相同的键则追加,有相同的键则更新
查
d.get(key)或d[key]
返回key对应的value,不建议用d[key],因为如果key不存在会报错
d.items()
返回一个dict_items对象(python2.x返回列表)
d.keys()
返回一个dict_keys对象(python2.x返回列表)
d.values()
返回一个dict_values对象(python2.x返回列表)
d.setdefault(k[,default])
返回d.get(k[,default]),如果k不存在,则设置d[k] =default,并返回default
for k in d:
print(key, d.get(key))
尽量用此法,效率较高
for k , v in d.items():
print(k,v)
此法先需要将字典转为一个对象。
创建一个新字典:
d.fromkeys(iterable, value=None, /),返回一个新字典,键的值从iterable取,所有的值默认为None
集合类型
无序不重复,利用不重复的特性可作为爬虫的容器
可变集合 set,可以添加、更新、删除元素,不可哈希,不能作为字典的键
不可变集合 frozenset,不能添加、更新、删除元素,可哈希,可作为字典的键
创建集合
创建可变集合
s = set('cheeseshop')
s = set()
或
s = {}
创建不可变集合
s = frozenset()
1.可变集合
增
s.add(obj),在集合s中添加对象obj
删
s.clear(),清空集合
s.discard(obj),从集合中删除对象obj,如果成员不存在,则什么也不做(更优)
s.pop(),删除集合中任意一个对象并返回它
s.remove(obj),从集合中删除对象obj,如果成员不存在,则抛出KeyError
例:
s = set('ab')
>>> s.discard('c')
>>> s
{'b', 'a'}
>>> s.remove('c')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'c'
改
s1.update(s2),等价于s1 = s1 | s2(求并集union)
s1.intersection_update(s2),等价于s1 = s1 & s2(求交集)
s1.difference_update(s2) ,等价于s1 = s1 - s2(求补集)
等价于s1 = s1 ^ s2(求对称差分)
查
有的话返回False,没有的话返回True
s1.issubset(s2) #s1是否是s2的子集,是的话返回True,否则False
s1.issuperset(s2) #s1是否是s2的超集,是的话返回True,否则False
其他(都会产生新的集合)
copy()
union()
intersection()
difference()
symmetric_difference()
2.不可变集合
查
s1.isdisjoint(s2) #s1,s2,是否有交集,有的话返回False,没有的话返回True
s1.issubset(s2) #s1是否是s2的子集,是的话返回True,否则False
s1.issuperset(s2) #s1是否是s2的超集,是的话返回True,否则False
其他(都会产生新的集合)
copy()
union()
intersection()
difference()
symmetric_difference()
深浅拷贝
一、数字和字符串
对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
二、其他基本数据类型
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
1、赋值
赋值,只是创建一个变量,该变量指向原来内存地址,如:
1 2 3 |
|
2、浅拷贝
浅拷贝,在内存中只额外创建第一层数据
1 2 3 4 5 |
|
3、深拷贝
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
1 2 3 4 5 |
|