Python学习(四) —— 编码

一、枚举

  enumerate,for i in enumerate(可迭代对象),返回元组,内容是(序列号,可迭代的每一个元素)

            for i,j in enumerate(可迭代对象,开始序列号),返回序列号,可迭代的每一个元素

a = 'abc'
b = {'a':1,'b':2}
for i in enumerate(a):
    print(i)
#输出:
#(0, 'a')
#(1, 'b')
#(2, 'c')

for i,j in enumerate(a,1):
    print(i,j)
#输出:
#1 a
#2 b
#3 c

 

二、内存地址:id()

  ==比较的是值,is 比较的是内存地址

  小数据池:int:-5~256

       str:1.不能有空格  

            2.长度不能超过20  

            3.不能有特殊字符

a = []
b = []
print(a == b,a is b)  #True False

a = 'abc'
b = 'abc'
print(a == b,a is b)  #True True

a = '-6'
b = '-6'
print(a == b,a is b)  #True False

 

三、编码

  在python3中,str的表现形式为字符串,bytes的表现形式为b字符串,str的实际编码方式是unicode,bytes的编码方式是utf-8、gbk、gb2312...

  在python3中,unicode:1个字符(无论中文、英文、数字),都用4个字节表示

          utf-8:用最少的字节表示一个字符,英文占1个字节,欧洲文字占2个字节,亚洲文字占3个字节

          gbk:英文占1个字节,中文占2个字节

  在python3中,字符串存在内存中是unicode编码方式,不能直接传输或者存储在硬盘,要转成bytes类型,unicode转bytes:a.endode('编码方式'),bytes转unicode:a.decode('编码方式')

          utf-8和gbk、gb2312等编码方式互不识别,如果要转化,要先解码(decode)成unicode方式,再编码(encode)成对应的方式。

a = 'abc'
b = a.encode('utf-8')
print(b,type(b))  #b'abc' <class 'bytes'>

a = '你好'
b = a.encode('utf-8')
print(b,type(b))  #b'\xe4\xbd\xa0\xe5\xa5\xbd' <class 'bytes'>
c = b.decode()
print(c,type(c))  #你好 <class 'str'>
d = c.encode('gbk')
print(d,type(d))  #b'\xc4\xe3\xba\xc3' <class 'bytes'>

 

四、集合(set)

  集合用{}表示,集合是无序、不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希。

  特点:去重,把一个列表变成集合,就自动去重了;

        关系测试,测试两组数据之前的交集、差集、并集等关系;

  1、增:add(),update()(迭代着增加)

set1 = {1,2,3}
set1.add('abc')
print(set1)  #{1,2,3,'abc'}

set1 = {1,2,3}
set1.update('abc')
print(set1)  #{1,2,3,'a'.'b'.'c'}

 

  2、删:remove('元素')、pop():随机删除一个元素,并返回这个元素、clear():清空集合

set1 = {1,2,3,'a','b','c'}
set1.remove(1)  #删除一个元素
print(set1)  #{2,3,'a','b','c'}

set1.pop()  #随机删除一个元素
print(set1)  #{3,'a','b','c'}

set1.clear()  #清空集合
print(set1)  #set()

 

  3、集合的其它操作

    3.1、交集(& 或者 intersection)

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 & set2)  # {4, 5}
print(set1.intersection(set2))  # {4, 5}

 

    3.2、并集(| 或者 union)

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7,8}
print(set2.union(set1))  # {1, 2, 3, 4, 5, 6, 7,8}

 

    3.3、差集(- 或者 difference)

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 - set2)  # {1, 2, 3}
print(set1.difference(set2))  # {1, 2, 3}
print(set2 - set1)  #{8, 6, 7}
print(set2.difference(set1))  #{8, 6, 7}

 

    3.4、反交集(^ 或者 symmetric_difference)

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}
print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8}

 

    3.5、子集: < 或者 issubset  超集: > 或者 issuperset

set1 = {1,2,3}
set2 = {1,2,3,4,5,6}

print(set1 < set2)  # True
print(set1.issubset(set2))  # True

print(set2 > set1)  # True
print(set2.issuperset(set1))  # True

 

  5、frozenset:不可变集合,让集合变成不可变类型

s = frozenset('barry')
print(s,type(s))  # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>

 

五、深浅copy

  1、赋值运算

l1 = [1,2,3,['a','b']]
l2 = l1

l1[0] = 111
print(l1)  # [11, 2, 3, ['a','b']]
print(l2)  # [11, 2, 3, ['a','b']]

l1[3].append('c')
print(l1)  # [11, 2, 3, ['a','b','c']]
print(l2)  # [11, 2, 3, ['a','b','c']]

  对于赋值,指向的是同一个列表,所以更改l1的时候,l2也随之改变

 

  2、浅拷贝:copy()

l1 = [1,2,3,['a','b']]
l2 = l1.copy()

l1[0] = 111
print(l1)  # [111, 2, 3, ['a','b']]
print(l2)  # [1, 2, 3, ['a','b']],1没有改变

l1[3].append('c')
print(l1)  # [111, 2, 3, ['a','b','c']]
print(l2)  # [1, 2, 3, ['a','b','c']],列表里面的列表变了

  对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。

 

  3、深拷贝:copy.deepcopy(),pycharm需要import copy

import copy
l1 = [1,2,3,['a','b']]
l2 = copy.deepcopy(l1)

l1[0] = 111
print(l1)  # [111, 2, 3, ['a','b']]
print(l2)  # [1, 2, 3, ['a','b']],1没有改变

l1[3].append('c')
print(l1)  # [111, 2, 3, ['a','b','c']]
print(l2)  # [1, 2, 3, ['a','b']],列表里面的列表也没有发生改变                                 

  对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变

 

posted @ 2017-10-29 18:23  Coufusion  阅读(249)  评论(0编辑  收藏  举报