八、元组、字符串及中文乱码处理、字典、集合详解
元组:
元组也是一个列表
元组的内容不能修改
元组的内容不能修改这句话不严谨
-----------------------------------------------------------
#定义一个元组
#元组不支持修改:包括增加(没有方法)、不能修改、不能删除。是一个完全静态的列表
t = (1,"hello world",True)
#t[1] = "hello python" #内容不支持修改
#del t[1] #删除实则也是修改,不支持
t1 = (12,16)
print t1+t #该方式生成一个新的列表咯(是允许)
print t
#元组里面的除元组以外的别的容器是可以修改其内容,但不能重新赋值给新的容器 (注:除元组外)
y = (1,2,[12,16,18],True)
y[2][2] = "hello python" #可以
#y[2] = range(1,10) #不可以 range(1,10)会生成一个新对象即指针
print y
字符串:
字符串是一个列表,也是一个元组。把每一个字母当成元组的一个元素
字符串里面的内容不可以修改
字符串可以进行加法 、 乘法
字符串可以进行join
------------------------------------------------------------
#字符串
str1 = "hello world "
str2 = "python nice "
#str2[2] = "y" #不允许修改
print str2
print str1 + str2
print str2 * 2
x = ["hello","world","python"]
print " ".join(x) #"" 连接上该列表中的每一个元素
print " ".join(str2)
-----------------------------------------------------------------
字符串之中文乱码处理:
str 和 unicode : 两个都是python用来处理字符串的,python 3后只有unicode,str是字节串,不是字符串。unicode是字符串。
Ascll -> iso-8859-1 -> GB2312 -> GBK -> GB18030
:计算机并不识别字符串,它只识别01字节流,所以就需要引入编码规范,将字符转换成01的字节流,最早的编码规则是ASCLL,它是一个字符对应一个字节,八位,
但是它只用咯7位,所以ASCll将只能表示127种字符,因它主要编码英文等,所以完全足够;iso-8859-1也主要编码英文,它是ASCLL的扩展,它用咯8位,所以能表达
256种字符;在大陆我们使用较多的是GB系列,该系列都是一个字符对应两个字节,共收录6763汉字和682个全角字符;几乎的汉字都有,但是一些古汉语、名字等罕见字符
还是没有收录,这就导致咯GBK和GB18030的出现,他们很好的对GB2312进行咯扩展,GBK共收录咯汉字约21003个;GB18030是对GBK的扩展,共收录汉字70000余个。
但一般我们使用GB2312和DBK的较多。
unicode(ucs-2,ucs-4):由于西方每个国家编码都不一样,于是一堆人就开始琢磨琢磨弄一套全世界规范的编码,于是就有咯unicode,大家都遵循它的标准,它分两个字节和四个字节的,所以比较占用空间。
UTF-8 -> UTF-32 : 由于unicode所以又有utf-8来进行转换,节约存储空间和效率。
encode 编码:unicode转成成GBK
decode 解码:GBK转换成unicode
--------------------------------------------------------------------------------------------------------------------
#头痛的中文编码问题
##----------------定义一个从控制台接收的输入数据的语句
x = raw_input(u"请输入你的名字:")
print x #pycharm中运行没有问题,去cmd中运行试试?问题来咯,如下
#E:\PycharmProjects\WebCrawler\chinese>python ChineseDemo.py
#璇疯緭鍏ヤ綘鐨勫悕瀛?
##----------------上面的解决方案,你可以看cmd窗口(属性里面)的编码是GBK,所以编码。 你又会发现该方式再cmd可以咯,但又会在pycharm工具中出现问题??
x = raw_input(u"请输入你的名字:".encode('GBK'))
print x
##----------------回到正常,在pycharm工具中将其输入写入到文件中
x = raw_input(u"请输入你的名字:".encode('gbk'))
f = open('1.txt', 'w') #以写的形式打开文件
f.write(x) #将其写入到文件中
f.close() #关闭文件
##----------------在cmd中将输入写入到文件中,运行需要加encode() ,但是你会发现它又有问题咯??感觉永远都解决不了咯
x = raw_input(u"请输入你的名字:".encode('gbk')) #在cmd中运行需要加encode()
f = open('1.txt', 'w') #以写的形式打开文件
f.write(x) #将其写入到文件中
f.close() #关闭文件
##----------------永远解决各平台的中文编码问题。根据标准输入输出统一编码
import sys
print sys.stdin.encoding #cp936 就是utf-8
print sys.stdout.encoding
x = raw_input(u"请输入你的名字:".encode(sys.stdout.encoding)) #输出时根据标准输出编码
f = open('1.txt', 'w') #以写的形式打开文件
f.write(x.decode(sys.stdout.encoding).encode('utf-8')) #将其写入到文件中。本质是输入,则根据标准输出先解码,然后再编码
f.close() #关闭文件
字典:
键值对集合(key-value)
无序的,访问时以key为索引
key必须是不可变的对象(hash),对value没有要求
自定义的类要实现 __hash__方法才能做key
定义方式:{'key1':value,'key2':value}
用[key]可以访问元素
可以用key In dict来判断字典中是否包含该key
---------------------------------------------------------------------------------------
x = {'name':'liyadong','age':18,'sex':1}
y = dict(name='liyadong007',age=16,sex=2) #用工厂函数构建dict
print x,y
#看看那些能作为key
a = 'liyadong'
b = range(1,10)
print hash(a)
#print hash(b) #list不能作为key,因为不能hash
#取值
print x['name']
#print x['name1']
print 'name1' in x; #看key是否在disc中
#循环取字典中的值
for i in x :
if i in ('name','age','sex') :
print i,'=',x[i]
#dict中常见的操作:
for key,value in y.items() :
print key,'=',value
print '=================='
for i in x.keys() :
print i
for i in x.values() :
print i
print x.get('name1','not exists') #如果key不存在给默认值
x.setdefault('a',100) #添加键值对,
x.setdefault('a',200) #如果key存在,则不管,如果没有则加上该键值对??可以把a改成 b
print x
x.update(y) #将y中的key-value添加到x中,如果x中有相同的key,则更新为y中的对应的key的值
print x
x.clear() #清空
print x
集合:
集合是无序的
元素不重复
集合里的元素是不可变的(能够hash)
不支持索引和切片操作
set : 可变集合
frozenset : 不可变集合
集合运算
s|t : 并集
s&t : 交集
s-t : 差集
s^t : 对称差集,除开交集后的并集
s|=t : 把t的元素并入到s (好像不行)
s<t : s是否t的子集
s>t : s是否为t的超集
s.isdisjoint(t) : s和t是否有交集
交、并、差集的操作结果和左边的操作数有相同的类型
---------------------------------------------------
t = set(range(1,10))
s = set(range(7,17))
print t,s
print s|t
print s&t
print s-t
print s^t
#print s=|t
print s<t
print s>t
print s.isdisjoint(t)
-----------------------------------------------------
集合实例
对一个列表去重操作:将列表转换成集合即可
判断两个集合是否相等,无需关心数据
---------------------------------------------------
x = range(1,10)
y = range(1,17)
x += y
print x
z = set(x) #得到的是set
print z
z = list(set(x)) #得到的是列表
print z
-------------------------------------------------------
可变集合(set)的操作方法:
s.add(item)
s.clear()
s.discard(item) 没有item不会抛异常 s.remove(item) 没有会抛异常
s.update(t)
s.difference_update(t) 从s中删除和t交集的部分
--------------------------------------------------
#可变集合的方法
t = set(range(1,10))
s = set(range(7,17))
s.add(10)
print s
s.discard(20)
#s.remove(20) #会抛异常
print s
s.update(t)
print s
s.difference_update(t) #从s中删除t的部分
print s
----------------------------------------------------