• Day7 python基础


    一,集合

           集合时无序的,不重复的数据集合,它里面的元素时可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:

      1.去重:把一个列表变成集合,就自动去重了。

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

    1.集合的创建:

    #第一种:
    set1 = {'alex', 'wusir'}
    #第二种
    set2 = set({'alex', 'wusir'})

    2.集合的增删:

    #增
    set1 = {'alex','wusir','ritian','egon','barry'}
    set1.add('女神')
    print(set1)
    
    set1.updata('abc')  #相当于extend,迭代增
    print(set1)
    #
    set1.remove('alex')   #根据元素删除,若需要删除的元素不存在,则报错
    print(set1)
    
    set1.pop()  #随机删除一个元素,返回被删除元素,若集合为空则报错
    print(set1)
    
    set1.clear()  #清空集合
    print(set1)
    
    del set1    #从内存级别上删除集合
    print(set1)

    3.集合的关系测试

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    # 交集
    print(set1 & set2)
    print(set1.intersection(set2))
    
    # 并集
    print(set1 | set2)
    print(set1.union(set2))
    
    # 反交集
    
    print(set1 ^ set2)
    print(set1.symmetric_difference(set2))
    
    # 差集
    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
     print(set1 - set2)
     print(set1.difference(set2))
    
    set1 = {1,2,3}
    set2 = {1,2,3,4,5,6}
    # 子集
    print(set1 < set2)  # True
    print(set1.issubset(set2))
    
    # 超集
    print(set2 > set1)
    print(set2.issuperset(set1))

    集合转换为不可变数据类型:

    #冻集合
    set1 = {1,2,3}
    set3 = frozenset(set1)
    print(set3) # 不可变的数据类型。 ***

    常见的集合面试题:

    # 面试题:list去重  *****
    l1 = [1,1,2,3,4,4,5,6,7,8]
    set1 = set(l1)
    l2 = list(set1)
    print(l2)

    二,深浅拷贝

    # 赋值运算
    l1 = [1,2,3]
    l2 = l1     #l2,l1指向的内存地址一样
    l1.append(666)
    print(l2)
    print(id(l1))  
    print(id(l2))

    浅拷贝:第一 层在内存中是独立的,从第二层开始以及更深的层数,都是使用同一个

    l1 = [1,2,3]
    l2 = l1.copy()
    l1.append(666)
    print(l2)
    l1 = [1,2,3,[22,]]
    l2 = l1.copy()
    l1[-1].append('taibai')
    print(id(l1))
    print(id(l2))
    print(id(l1[-1]))
    print(id(l2[-1]))

    深拷贝:完全独立互不影响

    import copy
    l1 = [1,2,3,[22,]]
    l2 = copy.deepcopy(l1)
    l1[-1].append('太白')
    print(l2)

    应用场景:

      浅copy:如果一份数据(列表)第二层时,你想与原数据进行公用

      深copy:完全独立的copy一份数据,与原数据没有关系。

    常见的深浅拷贝面试题:

    1.解释深浅copy

    2.切片是属于深copy还是浅copy

    # 切片属于浅copy
    l1 = [1,2,3,[22,33]]
    l2 = l1[:]
    l1.append(666)
    l1[-1].append(666)
    print(l2)

    三,基础数据类型的补充知识

    # 元组
    # 如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。 tu1 = (1,) tu2 = ('alex') #str字符型 tu3 = ([1,2,3],) print(tu1,type(tu1)) print(tu2,type(tu2)) print(tu3,type(tu3))
    # 列表
    
    # 列表与列表可以相加
    l1 = [1,2,3]
    l2 = ['alex','wusir']
    l3 = l1 + l2
    print(l3)
    
    # 在循环一个列表时,如果对列表中的某些元素进行删除,那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。
    # 在循环一个列表时,最好不要对此列表进行改变大小(增删)的操作。
    
    例:将列表中索引为奇数的元素,全部删除
    l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    # 方法一:切片+步长删除
    del l1[1::2]
    print(l1)
    
    #方法二:
    l2 = []
    for i in range(len(l1)):
        if i % 2 == 0:
            l2.append(l1[i])
    print(l2)
    l1 = l2
    print(l1)
    
    # 方法三:倒着删除
    for index in range(len(l1)-1, -1, -1):
        if index % 2 == 1:
            l1.pop(index)
    print(l1)
    # 字典
    
    # fromkeys()
    # dic1 = dict.fromkeys([1,2,3],'alex')
    # print(dic1)

    常见的字典面试题:

    描述创建字典的几种方式

    #第一种
    dic = {'name':'alex'}
    #第二种
    dic = dict({'name':'alex'})
    print(dic)
    #第三种
    使用romkeys()函数创建一个字典

    字典 fromkeys函数的陷阱

    # 陷阱:
    dic1 = dict.fromkeys([1,2,3],[])
    print(dic1)
    dic1[1].append('alex')
    print(dic1)
    print(id(dic1[1]))
    print(id(dic1[2]))
    print(id(dic1[3]))
    # dictionary changed size during iteration: 在循环一个字典时,不能改变字典的大小
    
    例:将 dic的键中含有k元素的所有键值对删除。
    dic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'}
    l1 = []
    for key in dic:
        if 'k' in key:
            l1.append(key)
    print(l1)
    for key in l1:
        dic.pop(key)
    print(dic)
    
    #错误示范
    # for key in dic:
    #     if 'k' in key:
    #         dic.pop(key)

    数据类型的转换

    #str与list互相转换
    
    # str ---> list
    s1 = 'alex wusir taibai'
    l1 = s1.split()
    print(l1)
    
    # list  ---> str  此list中的元素全部是str类型,否则报错
    l1 = ['alex', 'wusir', 'taibai']
    s2 = ' '.join(l1)
    print(s2)
    #tuple与list互相转换
    
    # tuple <--- list
    l1 = [1,2,3]
    tu1 = tuple(l1)
    print(tu1)
    
    # tuple ---> list
    tu2 = (0,2,3)
    l1 = list(tu2)
    print(l1)
    #str与bytes互相转换
    
    编码:encode
    str --->bytes
    s1 = 'alex'
    b1 = s1.encode('utf-8')
    
    解码:decode
    bytes ---> str
    s2 = b1.decode('utf-8')  #s2为unicode编码
    #字典转换为列表
    #dict.keys() dict.values() dict.items()  list()
    
    dic1 = {'name': 'alex', 'age': 1000}
    l1 = list(dic1)
    print(l1)
    #布尔值为False的数据类型
    int型:0
    str型:''         #空字符
    list型:[]        #空列表
    dict型:{}      #空字典
    tuple型:()       #空元组
    set型:set()    #空集合
  • 相关阅读:
    如何修改Linux命令提示符
    HTTP 状态码及对应字符串详解
    Java 获取键盘输入
    Java中的IO整理完整版(一)
    清除代码异味
    报告称当前Linux人才抢手 高薪也难觅
    QT修改程序图标
    java中的io系统详解
    如果AntlrWorks的Debug报错“当前端口已被占用”,可能是防火墙的原因
    报表引擎 - 研究润乾报表的实现
  • 原文地址:https://www.cnblogs.com/lianyeah/p/9456634.html
Copyright © 2020-2023  润新知