zoukankan      html  css  js  c++  java
  • 小数据池、深浅拷贝、集合

    0、pycharm是代码块、黑窗口是小数据池、如下图:

    1、驻留机制(长得像的共用一个内存地址)分小数据池缓存机制:后期开发时能明确知道、为什么不能正常使用、把经常用的东西放入规则(黑窗口)里。

                数字是:-5-256(超范围后报错)。

                

                字符串:定义时内容(除去中文和特殊符号)、长度不限、内容相同、就进行驻留。

                    python3.6解释器字符串进行乘法时、总长度不能超过20。

                    python3.7解释器字符串进行乘法时、总长度不能超过4096。

                布尔值

    驻留机制的意义:节省内存、提高效率。

    图解如下:

            代码块缓存机制:一个py文件、一个函数、一个模块、一个类、交互模式下的每一行。

    执行顺序:        先执行代码块(pycharm)、后执行小数据池(黑窗口)。

    2、is(是)判断两边的内容是不是一个、is是通过内存地址进行判断的。

    3、==(判断等号两边的内容是否相同)

    赋值就是一个容器有多个标签、lst列表中有标签lst和标签lst1、两个标签同属于一个内存地址。

    lst2是新开辟的空间、浅拷贝只拷贝第一层元素、浅拷贝只把列表中记录的内存地址拿到一个新开辟列表中。

    lst2中没有添加9、是因为只拷贝了一层、浅拷贝把原列表中有的内存地址复制了一份放到新开辟的空间中、后期对原列表添加的内容新列表是不会有的。

    浅拷贝和深拷贝在最后列表的位置内存地址不一样、深拷贝是自己单独开辟了一个新的空间、修改原列表和新开辟的列表没有任何影响。

     

      • 赋值:
        • 两个或多个变量名指向同一个内存地址,有一个操作内存地址的值进行改变,其余的变量名在查看的时候都进行更改
      • 浅拷贝:
        • 只拷贝列表中第一层的内存地址,原列表修改了不可变数据类型,新开辟的列表不进行变动,因为只是在原列表中将内存地址进行修改了,新开辟的列表中的内存地址还是用的之前的内存地址
        • 原列表对可变数据类型进行了添加,新开辟的列表中存放就是可变数据类型的地址,在去查看的时候就发现进行更改了
      • 深拷贝:
        • 不管你修改原数据的不可变类型还是可变类型,新开辟的空间中都不会进行改变,因为可变数据类型新开辟了一个空间
        • 数字没有append方法

    赋值:多个变量名指向同一个内存地址。

    浅拷贝:只拷贝第一层的元素内存地址、可变和不可变的数据都是共用的。
    例一:

    a = [11,22,33,[44,55],66]
    c = a.copy()
    a.append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55], 66, 77]
       [11, 22, 33, [44, 55], 66]
    例二:
    a = [11,22,33,[44,55],66]
    c = a.copy()
    a[-2].append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55, 77], 66]
    [11, 22, 33, [44, 55, 77], 66]
    例三:
    a = [11,22,33,[44,55],66]
    c = a[:]
    a.append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55], 66, 77]
    [11, 22, 33, [44, 55], 66]
    例四:
    a = [11,22,33,[44,55],66]
    c = a[:]
    a[-2].append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55, 77], 66]
    [11, 22, 33, [44, 55, 77], 66]
    例五:
    import copy
    a = [11,22,33,[44,55],66]
    c = copy.copy(a)
    a.append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55], 66, 77]
    [11, 22, 33, [44, 55], 66]
    例六:
    import copy
    a = [11,22,33,[44,55],66]
    c = copy.copy(a)
    a[-2].append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55, 77], 66]
    [11, 22, 33, [44, 55, 77], 66]
    例七:
    a = [11,22,33,[44,55],66]
    c = a.copy()
    c.append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55], 66]
    [11, 22, 33, [44, 55], 66, 77]
    例八:
    a = [11,22,33,[44,55],66]
    c = a.copy()
    c[-2].append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55, 77], 66]
    [11, 22, 33, [44, 55, 77], 66]

    深拷贝:对于不可变的数据、元素是共用的、可变的数据、开辟新的空间、不管嵌套多少层。

    例一:

    import copy
    a = [11,22,33,[44,55],66]
    c = copy.deepcopy(a)
    a.append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55], 66, 77]
    [11, 22, 33, [44, 55], 66]
    例二:
    import copy
    a = [11,22,33,[44,55],66]
    c = copy.deepcopy(a)
    a[-2].append(77)
    print(a)
    print(c)
    结果:[11, 22, 33, [44, 55, 77], 66]
    [11, 22, 33, [44, 55], 66]

    ==:判断等号两边的值是否相同。

    is:判断两边的值内存地址是否相同。

    4、集合特点:去重、集合关系、

    5、空集合set()

    6、定义集合:S = {1,2,3,4}

    7、一行代码进行去重:

    lst = [11,11,11,22,33,44,55]
    print(list(set(lst)))      #去重并再此转换成列表
    结果:[33, 11, 44, 22, 55]
    8、集合就是一个没有值的字典。
    9、集合的元素是不可变的(可哈希)
    10、具有唯一特性
    11、集合是无序的、可变、可迭代。
    --------------------------------------增-----------------------------------------------
    12、集合迭代添加update:
    s = set()
    s.update("alex")
    print(s)
    结果:{'a', 'e', 'l', 'x'}
    13、集合add添加:
    s = set()
    s.add("alex")
    print(s)
    结果:{'alex'}
    -------------------------------------删----------------------------------------------
    14、pop随机删除并返回值:
    s = {"a","b",3,"c"}
    print(s.pop())
    print(s)
    结果: 3

          {'b', 'a', 'c'}

    15、remove指定元素删:
    s = {"a","b",3,"c"}
    s.remove("b")
    print(s)
    结果:{'a', 3, 'c'}
    16、clear清空后的显示方式:
    s = {"a","b",3,"c"}
    s.clear()
    print(s)
    结果:set()
    --------------------------------------改----------------------------------------------
    17、先删后加
      转换数据类型进行修改
    --------------------------------------查----------------------------------------------
    18、for循环
    --------------------------------------集合关系------------------------------------------
    19、并集|管道符:
    python = {"海绵","孙一帆","岳新力","大圣"}
    linux = {"海绵","大圣","meet","alex"}
    print(python | linux)
    结果:{'岳新力', 'alex', '海绵', 'meet', '孙一帆', '大圣'}
    交集&:
    python = {"海绵","孙一帆","岳新力","大圣"}
    linux = {"海绵","大圣","meet","alex"}
    print(python & linux)
    结果:{'大圣', '海绵'}
    差集-减号:
    python = {"海绵","孙一帆","岳新力","大圣"}
    linux = {"海绵","大圣","meet","alex"}
    print(python - linux)
    print(linux - python)
    结果:{'岳新力', '孙一帆'}

        {'meet', 'alex'}

    并集减去交集用上尖号^ 补集/反差集/对称集:

    python = {"海绵","孙一帆","岳新力","大圣"}
    linux = {"海绵","大圣","meet","alex"}
    print(python ^ linux)
    结果:{'岳新力', 'meet', 'alex', '孙一帆'}
    判断用超集/父集和子集:
    python = {"海绵","孙一帆","岳新力","大圣"}
    linux = {"海绵","大圣","meet","alex"}
    print(python > linux)
    结果:False
    作业题:
    # 1.有如下
    v1 = {'郭宝元','alex','海绵','王二麻子'}
    v2 = {'alex','王二麻子'}
    # 请得到 v1 和 v2 的交集并输出
    print(v1 & v2)
    # 请得到 v1 和 v2 的并集并输出
    print(v1 | v2)
    # 请得到 v1 和 v2 的 差集并输出
    print(v1 - v2)
    # 请得到 v2 和 v1 的 差集并输出
    print(v2 - v1)
    # 2.循环提示用户输入,并将输入内容追加到列表中(如果输入N或n则停止循环)
    li = []
    while True:
    a = input("请输入内容输入N或n就停止:")
    if a.upper() == "N":
    break
    li.append(a)
    print(li)
    # 3.写代码实现
    v1 = {'alex','武sir','黑哥'}
    v2 = []
    # 循环提示用户输入,如果输入的内容在v1中存在,则追加到v2中,如果v1中不存在,则添加到v1中。(如果输入N或n则停止循环)
    while True:
    a = input("请输入内容输入N或n就停止:")
    if a.upper() == "N":
    break
    if a in v1:
    v2.append(a)
    else:
    v1.add(a)
    print(v1)
    print(v2)
    # 4.通过观察判断以下值那个能做字典的key?那个能做集合的元素?
    1 #能
    -1 #能
    "" #能
    None #能
    [1,2] #不能
    (1,) #能
    {11,22,33,4} #不能
    {'name':'wupeiq','age':18} #不能
    # 5.is 和 == 的区别?
    # is是判断的内存地址、==是判断两边的内容
    # 6.type使用方式及作用?
    # 查看数据类型
    # 7.id的使用方式及作用?
    #查看内存地址
    # 8.看代码写结果并解释原因
    v1 = {'k1':'v1','k2':[1,2,3]}
    v2 = {'k1':'v1','k2':[1,2,3]}
    result1 = v1 == v2
    result2 = v1 is v2
    print(result1)
    print(result2)
    # 9.看代码写结果并解释原因
    v1 = {'k1':'v1','k2':[1,2,3]}
    v2 = v1
    result1 = v1 == v2
    result2 = v1 is v2
    print(result1)
    print(result2)
    # 10.看代码写结果并解释原因
    v1 = {'k1':'v1','k2':[1,2,3]}
    v2 = v1
    v1['k1'] = 'meet'
    print(v2)
    # 结果:{'k1': 'meet', 'k2': [1, 2, 3]}
    # 11.看代码写结果并解释原因
    v1 = '人生苦短,我用Python'
    v2 = [1,2,3,4,v1]
    v1 = "人生苦短,用毛线Python"
    print(v2)
    # 结果:[1, 2, 3, 4, '人生苦短,我用Python']
    # 12.看代码写结果并解释原因
    info = [1,2,3]
    userinfo = {'account':info, 'num':info, 'money':info}
    info.append(9)
    print(userinfo) #{'account':[1,2,3,9], 'num':[1,2,3,9], 'money':[1,2,3,9]}
    info = "题怎么这么多"
    print(userinfo) #{'account':[1,2,3,9], 'num':[1,2,3,9], 'money':[1,2,3,9]}
    # 13.看代码写结果并解释原因
    info = [1,2,3]
    userinfo = [info,info,info,info,info]
    info[0] = '不仅多,还特么难呢'
    print(info,userinfo) #['不仅多,还特么难呢'`,2,3],[['不仅多,还特么难呢',2,3],['不仅多,还特么难呢',2,3],['不仅多,还特么难呢',2,3],['不仅多,还特么难呢',2,3],['不仅多,还特么难呢',2,3]]
    # 14.看代码写结果并解释原因
    info = [1,2,3]
    userinfo = [info,info,info,info,info]
    userinfo[2][0] = '闭嘴'
    print(info,userinfo) #(['闭嘴',2,3],[['闭嘴',2,3],['闭嘴',2,3],['闭嘴',2,3],['闭嘴',2,3],['闭嘴',2,3]])
    # 15.看代码写结果并解释原因
    info = [1, 2, 3]
    user_list = []
    for item in range ( 10 ):
    user_list.append ( info )
    info[1] = "是谁说Python好学的?"
    print ( user_list )#[[1, '是谁说Python好学的?', 3], [1, '是谁说Python好学的?', 3], [1, '是谁说Python好学的?', 3], [1, '是谁说Python好学的?', 3], [1, '是谁说Python好学的?', 3], [1, '是谁说Python好学的?', 3], [1, '是谁说Python好学的?', 3], [1, '是谁说Python好学的?', 3], [1, '是谁说Python好学的?', 3], [1, '是谁说Python好学的?', 3]]
    # 16.看代码写结果并解释原因
    data = {}
    for i in range(10):
    data['user'] = i
    print(data)#{'user': 9}
    # 17.看代码写结果并解释原因
    data_list = []
    data = {}
    for i in range(10):
    data['user'] = i
    data_list.append(data)
    print(data_list)#[{'user': 9}, {'user': 9}, {'user': 9}, {'user': 9}, {'user': 9}, {'user': 9}, {'user': 9}, {'user': 9}, {'user': 9}, {'user': 9}]
    # 18.看代码写结果并解释原因
    data_list = []
    for i in range(10):
    data = {}
    data['user'] = i
    data_list.append(data)
    print(data_list)#[{'user': 0}, {'user': 1}, {'user': 2}, {'user': 3}, {'user': 4}, {'user': 5}, {'user': 6}, {'user': 7}, {'user': 8}, {'user': 9}]
    # 19.使用循环打印出一下效果:
    # 格式一
    # *
    # **
    # ***
    # ****
    # *****
    # 代码:for i in range(1,6):
    # print(i * "*")
    # 格式二
    # ****
    # ***
    # **
    # *
    #代码:for i in range(4,0,-1):
    # print(i * "*")
    # 格式三
    # *
    # ***
    # *****
    # *******
    # *********
    #代码:for i in range(1,10):
    # if i % 2 == 1:
    # print(i * "*")
    # 20.敲七游戏. 从1开始数数. 遇到7或者7的倍数(不包含17,27,这种数)要在桌上敲⼀下. 编程来完成敲七. 给出⼀个任意的数字n. 从1开始数. 数到n结束. 把每个数字都放在列表中, 在数的过程中出现7或 者7的倍数(不包含17,27,这种数).则向列表中添加⼀个'咣'
    # 例如, 输⼊10. lst = [1, 2, 3, 4, 5, 6, '咣', 8, 9, 10]
    lst = []
    num = input("请输入数字:")
    if num.isdecimal():
    num = int(num)
    for i in range(1,num + 1):
    if i % 7 == 0:
    lst.append("咣")
    else:
    lst.append(i)
    else:
    print("输入错误请输入数字")
    print(lst)
    # 21.模拟购物车
    # 要求:
    # 1,用户先给自己的账户充钱:比如先充3000元。
    # 2,有如下的一个格式:
    # goods = [{"name": "电脑", "price": 1999},
    # {"name": "鼠标", "price": 10},
    # {"name": "游艇", "price": 20},
    # {"name": "美女", "price": 998},]
    # 3,页面显示 序号 + 商品名称 + 商品价格,如:
    # 1 电脑 1999
    # 2 鼠标 10
    # 4,用户输入选择的商品序号,然后打印商品名称及商品价格,并将此商品,添加到购物车(自己定义购物车),用户还可继续添加商品。
    # 5,如果用户输入的商品序号有误,则提示输入有误,并重新输入。
    # 6,用户输入N为购物车结算,依次显示用户购物车里面的商品,数量及单价,若充值的钱数不足,则让用户删除某商品,直至可以购买,若充值的钱数充足,则可以直接购买。
    # 7,用户输入Q或者q退出程序。
    # 8,退出程序之后,依次显示用户购买的商品,数量,单价,以及此次共消费多少钱,账户余额多少,并将购买信息显示。
    goods = [
    {"name": "电脑", "price": 1999},
    {"name": "鼠标", "price": 10},
    {"name": "游艇", "price": 20},
    {"name": "美女", "price": 998},
    ]
    dic2 = [] #存储已经购买的商品
    dic = {} #存储未购买的商品
    shopping_money = 0 #初始消费金额
    money = input("请输入您要充值的金额:") #让用户输入充值金额
    if money.isdecimal() and int(money) > 0: #判断这个充值的金额是否是合法的
    insert_money = int(money) #记录一下充值的金额
    while True:
    for i in range(len(goods)): #拿到长度
    print(i + 1,goods[i]["name"],goods[i]["price"]) #通过下标找到商品名字和价格
    choose = input("请选择您要购买的商品序号(N结算|Q退出):") #要购买的商品序号
    if choose.isdecimal() and len(goods) >= int(choose) > 0: #判断用户输入的商品序号是否合法
    choose = int(choose) - 1 #自动减1是之前已经自动加1了
    print(goods[choose]["name"],goods[choose]["price"]) #打印用户输入序号的商品和价格
    # 获取到用户输入的商品序号对应的商品名字
    shopping_name = goods[choose]["name"]
    # 获取到用户输入的商品序号对应的商品价格
    shopping_price = goods[choose]["price"]
    #定义一个购物车的数据结构:{"电脑":{"money":1999,"num":1}}
    if goods[choose]["name"] in dic:
    #如果用户选择的商品序号对应的商品存在购物车中
    dic[shopping_name]["num"] += 1
    #将该商品绑定的数量进行加1
    else:
    #组成一个购物车的数据结构
    dic[shopping_name] = {"money":shopping_price,"num":1}
    #字典名[键] = 值
    elif choose.upper() == "Q":
    print("-----------购买清单-----------------")
    for item in dic2:
    for i in item:
    print(f"商品:{i} 单价:{item[i]['money']} 数量:{item[i]['num']}")
    print(f"消费金额:{insert_money - money} 余额:{money}")
    break
    elif choose.upper() == "N":
    print("-----------购物车中的商品列表-----------------")
    shopping_money = 0 #记录消费总金额
    for i in dic:
    print(f"商品:{i} 单价:{dic[i]['money']} 数量:{dic[i]['num']}")
    shopping_money += dic[i]["money"] * dic[i]["num"]
    #边展示边计算购物车中所有商品的价格
    if int(money) - shopping_money >= 0:
    #判断用户充值的金额是否大于消费金额
    money = int(money) - shopping_money
    #计算用户余额
    dic2.append(dic)
    #将已购的商品添加到已购的列表中
    dic = {}
    #清空购物车
    print("结算成功!")
    #提示用户结算成功
    else:
    print("-----------请选择您要删除的商品-----------------")
    for i in dic:
    print(f"商品:{i} 单价:{dic[i]['money']} 数量:{dic[i]['num']}")
    name = input("请选择要删除的商品名称:")
    if name in dic:
    if dic[name]["num"] == 1:
    del dic[name] #把整个商品信息删掉
    else:
    dic[name]["num"] -= 1 #对应删除商品对应的数量减1
    else:
    print("请正确输入")
    else:
    print("输入错误,亲重新输入!")
    else:
    print("请输入数字!")
  • 相关阅读:
    C51 使用端口 个人笔记
    C51 静态数码管 个人笔记
    C51 矩阵按键 个人笔记
    C51 蜂鸣器 个人笔记
    C51 独立按键 个人笔记
    C51 中断 个人笔记
    CC3200 TI 笔记
    iar修改包含路径的方法
    WCF绑定和行为在普通应用和SilverLight应用一些对比
    用批处理来自动化项目编译及部署(附Demo)
  • 原文地址:https://www.cnblogs.com/zhang-da/p/11594643.html
Copyright © 2011-2022 走看看