zoukankan      html  css  js  c++  java
  • 小数据池与集合

    一、id 与 is

    查看id地址

    s = "alex"
    print(id(s))

    == 判断两个对象的值相同.

    i = 100
    i1 = 100
    print(i == i1)

    is 身份运算:判断的是两个对象的内存地址是否相同.

    i1 = 10
    i2 = 10
    print(i1 is i2)

    二、代码块

    i = 1
    i2 = 3
    i3 = 4

    一个文件就是一个代码块.函数,类都是一个代码块.
    交互方式每个命令都是一个代码块

    python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用.换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个.所以在你给出的例子中,文件执行时(同一个代码块)会把i1,i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同.

    同一个代码块:同一代码块的缓存机制,驻留机制
    驻留机制的目的:
    1.节省内存空间
    2.提升性能
    驻留机制针对的对象:int bool str 空元组

    int: 范围:任意数字
    bool: True和False
    str: 几乎所有的字符串都会复合缓存机制
    通过相乘的形式构建的字符串长度不能超过20满足同一代码块的驻留机制

    不同的代码块:小数据池
    小数据池是针对不同代码块之间的缓存机制!!!
    小数据池的目的:
    1.节省内存空间
    2.提升性能
    驻留机制针对的对象:int bool str 空元组


    int:范围:-5~256
    str:一定规则的字符串

    总结:
    如果在同一代码块下,则采用同一代码块下的缓存机制
    如果是不同代码块,则采用小数据池的驻留机制

    三、数据类型的补充

    1.数据类型之间的转换
    int bool str list tuple dict set
    int bool str 三者可以相互转化

    bool 可以与所有的数据类型进行转化
    所有为空的数据类型转化成bool都为False
    0 "" {} () [] None ---> False
    print(bool([])) # False

    str ---> list split 分割

    list ---> str join

    str ---> tuple partition

    tuple ---> str join

    list <---> tuple

    dict ---> list

    tuple: 如果元组中只有单个元素并且没有"," 则类型是元素本身的类型

    tu1 = (1)
    tu1 = ("alex",)
    print(tu1,type(tu1))

    dict

    dic = {"name": "alex", "age" : 73}
    dic["money"] = "10万"
    print(dic)

    dic = dict.fromkeys([1,2,3],"太白")
    print(dic)
    # 坑:如果你的值是一个可变的数据类型,他在内存中是一个.id相同
    dic = dict.fromkeys("abcd", [])
    dic["a"].append(666)
    print(dic)


    l1 = [11, 22, 33, 44, 55]
    # 将此列表索引为奇数位对应的元素全部删除
    # 方法一:
    del l1[1::2]
    print(l1)

    # 错误示例:
    # 循环一个列表时,不要改变列表的大小.
    for index in range(len(l1)):
    if index % 2 == 1:
    l1.pop(index)
    print(l1)
    # [11, 33, 44]

    # 方法二:
    new_1 = []
    for index in range(len(l1)):
    if index % 2 == 0:
    new_1.append(l1[index])
    l1 = new_1
    print(l1)

    # 方法三:
    for index in range(len(l1)-1,-1,-1):
    if index % 2 == 1:
    l1.pop(index)
    print(l1)

    总结:
    循环一个列表时,最好不要对原列表有改变大小的操作,这样会影响最终结果.

    dic = {"k1": "v1","k2": "v2","k3": "v3","name": "alex",}
    # 将字典中的key中含有k元素的所有键值对删除
    l1 = []
    for key in dic:
    if "k" in key:
    l1.appende(key)
    for key in l1:
    dic.pop(key)
    print(dic)

    总结:
    循环一个字典时,不能改变字典的大小,这样会报错.

    回顾:字典特点:

    1.key是唯一的.

    2.key必须是可以哈希的(不可变数据类型:字符串,元组,数值)

    3.key是无序的.

    3.6dict的元素有序是解释器的特点,不是python源码的特点.

    xxx.py

    Cpython -> 有序

    Jpython -> 无序

    集合:set

    实际上就是一种特殊的字典.

    所有value都是None的字典,就是集合.

    对比字典和集合的特点:

    字典

    集合

    Key唯一

    元素唯一

    Key可以哈希

    元素可以哈希

    Key无序

    元素无序

    如何获取集合?

    1.手动创建集合.

      1)创建空集合

      d = {}

      创建空集合,只有一种方式:调用set函数.

      S = set()

      2)创建带元素集合

      S = {1,2,3}

      从可迭代对象中(字符串,列表,元组,字典)创建集合.

      s = set(‘abc’)

      S = set([1,2,3])

      S = set((1,2,3))

      S = set({‘name’:’Andy’,’age’:10})

    2.通过方法调用

      -> str

      -> list

      -> set

    集合的操作:

    查看集合可用的方法:

    [x for x in dir(set) if not x.startswith(‘_’)]

    ['add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']

    :

    add:如果元素存在,没有做任何动作.

    :

    Pop() :依次从集合中弹出一个元素,如果集合为空,报错

    Discard(ele) :从集合中删除指定的元素,如果不存在,什么都不执行

    Remove(ele) :从集合中删除指定的元素,如果不存在,报错

    Clear() :清空

    集合的四大常用操作:

    并集:union

    交集:intersection

    差集:difference

    对称差:symmetric_difference

    (更新):

    Update :用二者的并集更新当前集合

    difference_update:用二者的差集更新当前集合

    intersection_update:用二者的交集更新当前集合

    symmetric_difference_update:用二者的对称差集更新当前集合

    判断功能:

    Isdisjoint:判断两个集合是否没有交集

    Issubset:判断当前集合是否是后者的子集

    Issuperset:判断后者是否是当前集合的子集

    集合基本没有单独取其中元素的需求.

    集合的使用场景:

    1.判断一个元素是否在指定的范围之内.

    2.方便数学上的集合操作.

    ,,,对称差

    有简化写法:

    :|

    :&

    :-

    对称差:^

    3.对序列数据类型中的重复元素进行去重

    如果想遍历集合中的元素,通常用for循环.

    frozenset:冻结的集合

    最大的特点:不可变.

    ['copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']

    少了添加,更新和删除的方法.

    s = frozenset() 

    s = frozenset('abcabc')

    s = frozenset([1,2,3])

    s = frozenset((1,2,3))

    s = frozenset({'name':'Andy','age':10})

    集合的四大方法:,,,对称差.

    set,frozenset是否可以混用?

    可以!

    总结:

    如果两种数据类型混用,方法的主调者的类型决定了最终结果的类型.

    frozenset应用场景:

    凡是使用到不可改变的数据的场景,都是可以使用frozenset.

    set集合的元素:必须是可以哈希的,set本身不是可以哈希.

    但是frozenset是不可变的数据.(可以哈希的),它是可以放到集合中.

    setfrozenset可以互相转换.














  • 相关阅读:
    POJ 1797 Heavy Transportation (Dijkstra算法变形)
    HDU 2883 kebab (最大流)
    HDU 3338 Kakuro Extension (最大流)
    简单的敏捷工具更受敏捷开发团队青睐
    让敏捷工具在敏捷开发中发挥高效作用
    看板工具和Scrum工具选择之惑!
    敏捷开发如何在创业公司实施
    八个垂手可得的Scrum敏捷开发工具
    那些我们常用的scrum工具、敏捷开发工具
    Scrum/Sprint敏捷开发方法.
  • 原文地址:https://www.cnblogs.com/yaoyanxin007/p/10491926.html
Copyright © 2011-2022 走看看