python 元组、字符串及中文乱码处理、字典、集合详解

2021年6月19日 3点热度 0条评论 来源: Aidon-东哥博客

八、元组、字符串及中文乱码处理、字典、集合详解

元组

元组也是一个列表

元组的内容不能修改

元组的内容不能修改这句话不严谨

 

-----------------------------------------------------------

#定义一个元组

#元组不支持修改:包括增加(没有方法)、不能修改、不能删除。是一个完全静态的列表

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后只有unicodestr是字节串,不是字符串。unicode是字符串。

Ascll -> iso-8859-1 -> GB2312 -> GBK -> GB18030

:计算机并不识别字符串,它只识别01字节流,所以就需要引入编码规范,将字符转换成01的字节流,最早的编码规则是ASCLL,它是一个字符对应一个字节,八位,

但是它只用咯7位,所以ASCll将只能表示127种字符,因它主要编码英文等,所以完全足够;iso-8859-1也主要编码英文,它是ASCLL的扩展,它用咯8位,所以能表达

256种字符;在大陆我们使用较多的是GB系列,该系列都是一个字符对应两个字节,共收录6763汉字和682个全角字符;几乎的汉字都有,但是一些古汉语、名字等罕见字符

还是没有收录,这就导致咯GBKGB18030的出现,他们很好的对GB2312进行咯扩展,GBK共收录咯汉字约21003个;GB18030是对GBK的扩展,共收录汉字70000余个。

但一般我们使用GB2312DBK的较多。

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) : st是否有交集

交、并、差集的操作结果和左边的操作数有相同的类型

 

---------------------------------------------------

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

----------------------------------------------------

    原文作者:Aidon-东哥博客
    原文地址: https://blog.csdn.net/u010839779/article/details/77278450
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。