Day06 代码块,数据池,元祖,编码本,深浅copy

01 昨日内容回顾

    字典:

        增:

            setdefault() 有责不变,无责添加

            dic['key'] = vaulue

        删:

            pop 按照key

                pop('key')

                pop('key',None)

            popitem() 删除最后一个

            clear 清空

            del dic['key']

        改:

            dic['key'] = 'v'

            update()

            dic1.update(dic) : dic的所有的键值对覆盖并添加到dic1中,dic不变

            dic1.update(name='alex')

        查:

            dic['key']

            dic.get('key')

            dic.get('key','设置返回值')

 

        for i in dic:

            print(i)

        dic.keys() dic.values() dic.items() 类似于列表的容器,没有索引但是可以for循环去遍历。

 

        a, b = [11, 22]

        a, b = 11, 22

        a, b = b, a

        创建字典的三种方式:

            dic = {'name': 'alex'}

            dic = dict()

                dic = dict(name='alex', age='12')

                dic = dict({'name': 'alex', 'age': 12})

            dict.fromkeys('abc','alex')

02 作业讲解

03 id is ==

1) is 判断的是两个对象的内存地址id是否相同。

2  )== 比较的两边的数据是否完全相同。

 

04 小数据池(了解)

# 代码块

# 代码全都是基于代码块去运行的(好比校长给一个班发布命令),一个文件就是一个代码块。

# 不同的文件就是不同的代码块。

# 终端:

# 两种优化机制: 小数据池,代码块内的缓存机制。

1) 代码块内的缓存机制

# Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在, 如果存在,会将其重用。换句话说:执行同一个代码块时, 遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。

# 所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,

# 满足缓存机制则他们在内存中只存在一个,即:id相同。

# 注意:

# 缓存机制只是在同一个代码块下!!!,才实行。

# 满足此机制的数据类型:int str bool。

# 优点:

# 1,节省内存。

# 2,提升性能。

 

2)小数据池

#  不同代码块之间的优化。

# 适应的数据类型:str bool int

# int: -5 ~256

# str: 一定条件下的str满足小数据池。

# bool值 全部。

# 优点:

# 1,节省内存。

# 2,提升性能。

# 总结:

# 如果你在同一个代码块中,用同一个代码块中的缓存机制。

# 如果你在不同代码块中,用小数据池。

 

05 数据类型的补充(总结) ***

int,str,bool,list,tuple,dict,set

# str -->list   split()

# list  --> str  join()

# bool : False   0 '' [] () {} set()  

# list  -->tuple  tuple(list)

   tuple --->list  list(tuple)

# dict --> list   list(dict)   返回键值 ['name','age']

# dict ----> tuple           返回键值('name','age')

 

元组中只有一个元素并且没有逗号,则他不是元组与元素数据类型相同

tuple1 = (1)      整数                tuple = (1,)   元组

tuple2 = ([1,2,3])  列表               tuple2 = ([1,2,3],)元组

 

补充一个坑:

list

在循环一个列表时,最好不要改变列表的大小,这样会影响你的最终结果。

 比如循环删除一个列表的时,列表里元素的索引值在发生变化

方法一:

new_l1 = []

for index in range(len(li)):

if index % 2 == 0:

new_l1.append(li[index])

li = new_l1

print(li)

方法二:

del li[1::2]

print(li)

方法三:

倒叙循环列表 删除索引为奇数的元素

for index in range(len(li)-1,-1,-1):

    if index % 2 == 1:

        li.pop(index)

print(li)

 for i in range(1,11):

     print(i)

 

    dict 在循环一个字典时,不能改变字典的大小,会报错。

    比如要循环删除一个键,会报错。解决办法:

    创建一个新列表,将要删除的键添加进去,在循环键,通过键找到值删除

 

 

06 四个编码本:

    1,不同的编码之间能否互相识别(报错或者出现乱码)。 不能!!

    2, 规定:文字通过网络传输,或者硬盘存储不能使用Unicode编码方式。

 

大前提:

    python3x环境:

    唯独str类型:他在内部编码方式是unicode

    所以 python3x中的字符串不能用于直接的网络传输 文件的存储   '中午请我去吃饭'

 

    补充一个数据类型:bytes类型 与str类型是海尔兄弟。

    为啥要有bytes

        bytes内部编码方式非unicode

 

    为啥还要有strbytes直接就解决了所有问题呀?

     bytes 英文:   b‘hahaha’     encode'gbk')  ### b'hahaha'

     bytes  中文:  b'你好'    encode'gbk')  ### b'\xc4\xe3\xba\xc3'

     bytes 中文是16进制表示,看不懂。

    英文:

        str

            表现形式:'alex'

            内部编码:unicode

 

        bytes

            表现形式:b'alex'

            内部编码:非unicode

 

    中文:

        str

            表现形式:'屌丝'

            内部编码:unicode

 

        bytes

            表现形式:b'\xe5\xb1\x8c\xe4\xb8\x9d''

            内部编码:非unicode

 

        bytes:当你需要网络传输数据,文件存储数据时要考虑到bytes

 

        str ---> bytes(gbk  utf-8)

        unicode ---> gbk  utf-8       

# unicode ---> gbk 字符串 ---> gbk编码方式的bytes

# b1 = s1.encode('gbk') # 编码

# s2 = b1.decode('gbk') # 解码

07 深浅copy

 

1) 浅copy     

      在内存中创建一个新的list(dict),但是新的列表里面的元素还是与原列表共用一个。

l1 = [1,'a',[11,22]]

l2 = l1.copy()

print(id(l1),id(l2))   ###   两个列表的id不相同  所以对列表的相互操作互不影响

print( id(l1[0]),id(l2[0] )  两个id还是相同的

print( id(l1[-1]),id(l2[-1] )  两个id还是相同的

 

 

    2)深copy

 copy会在内存中对原列表或(dict)以及列表里面的可变的数据类型重新创建一份,而 列表中不可变的数据类型还是沿用原来的。

l1 = [1,'a',[11,22]]

l2 = copy.deepcopy()

print(id(l1),id(l2))   ###   两个列表的id不相同

print( id(l1[-1]),id(l2[-1] )  两个id是不同的

print( id(l1[0]),id(l2[0] )  两个id还是相同的

     3)切片(浅copy

    4)赋值运算(既不是浅copy也不是深copy) 两个变量指向同一个列表

 

08 集合(了解)

    set1 = {‘alex’12‘wusir’}

    集合本身是一个可变的数据类型,它要求里面的元素是一个不可变的类型(可哈希)

    作用:

1)去重

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

posted @ 2018-12-26 22:22  addit  Views(96)  Comments(0)    收藏  举报