Python基础--day07

一、enumerate() 枚举

对于一个可迭代或者是可遍历的对象,enumerate将其组成一个索引序列,可以同时获取索引值和值

li = ['alex','银角','女神','egon','太白']
for i in enumerate(li):
    print(i)#取出列表中的每个元素,并且在前面加上索引

结果:

可以设置索引的开始值

for index,i in enumerate(li,1):
    print(index,i)#可以改变索引的开始值,往后是+1
for index,i in enumerate(li,100):
    print(index,i)

结果:

二、不同的编码方式之间如何转换

三、基础数据类型的补充(一些常见的坑)

1.元组() 

特殊情况:对于()里面的元素,如果只有一个元素且没有逗号,元素是什么数据类型,该变量就是什么数据类型,只要有逗号,就是元组数据类型

 2、列表

(1)列表之间可以进行相加,和extend() 功能一样,迭代的添加进去

(2)面试题:删除下面列表的索引值为奇数的元素,最后打印输出结果

li = [11,22,33,44,55,66,77,88,99]

上面打印输出的结果不是正确的

错误解法二:

上面报错:IndexError: pop index out of range  索引超过范围

上述报错可以使用debug进行调试查看,debug的调试方法。

上面的原因都是因为:我们在使用pop()进行删除列表中的元素时,列表的长度改变了,导致索引的减少和索引对应的值不再是之前的

正取的解法:一共有三种思路

注意:在对列表进行循环操作时,应避免对一个列表进行改变大小的操作。

(3)字典dict

fromkeys(iterable,value)  该方法是类dict中的一个方法,调用的时候使用dict.fromkeys() 【类名.方法名()】

def fromkeys(*args, **kwargs): # real signature unknown
        """ Returns a new dict with keys from iterable and values equal to value. """
        """返回一个字典:keys是第一个参数(可迭代的对象),所有的keys的value就是第二个value'''
        pass

注意:fromkeys()的值value为容器类的对象如字典,列表时,内存地址值是一样的,改动一个则全都修改

面试题:

创建字典的方法有几种?

方法一:直接创建

方法二:使用dict进行初始化创建

方法三:使用dict类中的方法fromkeys()

需求:删除下面字典中键含有k的元素 dic = {"key1":"value1","key2":"value2","k3":"v3","name":"lucy"}

上述解法报错:RuntimeError: dictionary changed size during iteration 在进行迭代操作的时候改变了字典的大小

正确解法:先找出含有字典中还有“k"的键组成一个新的列表。然后对列表进行循环,然后再去字典中根据键进行删除。避免对字典进行直接的删除操作

注意:对字典进行循环操作时,避免改变字典的大小,否则会报错

(4)数据类型之间的转换

int str bool的相互转换 int() str() bool()         str的必须是纯数字才能转换为int类型

str与bytes的相互转换 encode() decode()

str与list的相互转换 split() join() 使用join() 前提,列表的元素必须全部是字符串

dict中的keys() values() items() 转换成列表 使用list()
tuple与list的相互转换 tuple() list()
dict 与 list的转换:dict ----> list 使用dict(list),是将dict中key转换成列表

0 "" () [] {} set() None------> bool False

四、集合set()

(1)j集合的含义:{}括起来,集合要求里面的元素是不可变(可哈希)的数据类型(int,str,bool,tuple),但是集合本身是可变的数据类型,集合里面的元素

不重复,所以具有天然的去重功能,集合里面的元素是无序的。

主要的用途:1)去重  2)关系测试

(2)集合的创建

方法一:直接创建

方法二:使用set进行初始化创建

面试题:对列表进行去重:

方法一:使用set()集合操作

方法二:使用算法

(3)集合的基本操作

1)增 add() update()

add(element) 添加一个元素,这个元素已经存在没有影响

用法:set.add(element)

参数:element   ------->添加的参数

返回值:无返回值

 update(iterable) 迭代的增加

用法:set.update(iterable) 

参数:iterable  ----------> 可迭代的对象

返回值:无返回值

2)删 pop()  remove() clear() del

pop() 随机删除某个元素

用法:set.pop()

参数:无参数

返回值:有返回值  ,随机删除的元素

remove(element)  按照元素删除

用法:set.remove(element) 

参数:element ---------------->要删除的元素,必须是set中的一员,否则会报错

返回值:无返回值

clear() 清空集合

用法:set.clear()

参数:无参数

返回值:无返回值

del  删除内存中的集合

用法:del set

报错的不存在这个集合

3)关系测试

&    intersection() 两个集合的交集
|     union() 两个集合的并集
^     symmetric_difference() 两个集合的反交集
-     difference() 两个集合的差集
<     issubset() 判断一个集合是否是另一个集合的子集
>     issuperset() 判断一个集合是否是另一个集合的超集

4)frozenset() 把可变数据类型的集合转变成不可变数据类型的集合,可以做字典的键,是python的一个内置函数

 用法:frozenset(set)

五、深浅copy()

(1)赋值运算:得到的是同时指向一个内存地址值的,同时改变

(2)浅copy():外面的内存地址值是不一样的,但是里面的列表、字典的内存地址值是一样的,对外面的进行改变,不会改变另一个,但是改变里层的内容会一起改变

l1 = [11,22,33,44,["name"]]
l2 = l1.copy()

(3)深copy() :copy.deepcopy() 外层和内层的地址值都不一样,改变的不会同时改变

import copy
l1 = [1,2,3.["name"]]

面试题:解释深浅copy()

浅copy() :在进行浅copy之后得到的另一个对象,外层的内存地址值是不一样的,但是里面的可迭代对象的内存地址值一样,对外层进行操作没有影响,里层的操作会同时改变

深copy():使用的是类copy中的方法:deepcopy() 。得到的另一个对象,外层和内层的内存地址值都不一样,改变一个对另一个是没有影响的

补充:切片[:]之后获得的对象 ,是浅copy()

猜你喜欢

转载自www.cnblogs.com/yangshier/p/9457056.html