zoukankan      html  css  js  c++  java
  • python初学-笔记1(廖雪峰)

    一、注意事项

    1. 动态语言:给变量赋值时不用指定数据类型,且可以将同一变量多次赋值
    2. 静态语言:定义变量时必须指定变量类型,如果赋值的时候类型不匹配
    3. 字符串前加r防止字符转义

    二、常量与变量

    1. 通常用全部大写的变量名表示常量
    2. 常量就是不能变的变量

    三、占位符

    %d  #整数

    %f  #浮点数

    %s  #字符串

    %x  #十六进制整数

    %%  #%用于转义

    四、列表与元祖

    1. list:列表是一种有序的集合(append追加、、pop通过索引删除指定的元素,默认最后一位元素、insert插入、通过索引重新赋值替换、通过索引查看)
    2. list的元素可以是字符串、数值、布尔值以及list
    3. tuple:元祖一旦初始化就不能修改(指向的内存地址不变)
    4. tuple只有1个元素的tuple定义时必须加一个逗号,,来消除歧义
    5. tuple的元素可以是字符串、数值、布尔值以及list(list是可以修改的)

    五、字典

    1. 通过key直接计算出value的内存地址
    2. 通过定义新的key-value对增加,若key已存在则会替换之前的value的值
    3. 通过“in”或“get”判断dict中是否存在key
    4. pop(key)删除指定的key-value对
    5. dict的key必须是不可变对象(list无法作为key使用,但是value可以是key)
    6. 列表与字典对比:
      1)字典查找和插入的速度极快,不会随着key的增加而变慢;
      2)要占用大量的内存,内存浪费多
      3)即使用内存空间换区了查询的速度

    六、集合(可以用来为list去重)

    1. 无序和无重复元素的集合
    2. 多个集合可以进行“交集”、“并集”、“差集”

    七、变量引用及回收机制

    1. 变量到对象的连接,我们称之为引用,以内存中的指针形式实现。因此直白的说,在内部,变量事实上是到对象内存空间的一个指针,而且指向的对象可以随着程序赋值语句而不断变化
    2. 变量名没有类型,只有对象才有类型,变量只是引用了不同类型的对象而已
    3. 每一个对象都包含了两个头部信息,一个是类型标志符,标识这个对象的类型,以及一个引用的计数器,用来表示这个对象被多少个变量名所引用,如果此时没有变量引用他,那么就可以回收这个对象
    4. 每当一个变量名被赋予了一个新的对象,那么之前的那个对象占用的空间就会被回收,前提是如果他没有被其他变量名或者对象引用。这种自动回收对象空间的机制叫做垃圾收集机制
    5. 注意:给一个变量赋一个新的值,并不是替换原始的对象,而是让这个变量去引用完全不同的另一个对象,而原来的对象的引用计数会随之减1

    补充:

    1. list和tuple其实是用链表顺序存储的,也就是前一个元素中存储了下一个元素的位置,这样只要找到第一个元素的位置就可以顺藤摸瓜找到所有元素的位置,所以list的名字其实就是个指针,指向list的第一个元素的位置。list的插入和删除等可以直接用链表的方式进行,比如我要在第1个元素和第2个元素中间插入一个元素,那么直接在链表的最后面(我们假设这个list只有两个元素,那么也就是在第3个元素的位置上)插入这个元素,然后把第一个元素指针指向这个元素(第3个位置),然后再把新插入的元素的指针指向原来的第2个元素,这样插入操作就完成了。读取这个list的时候,先用list的名字(就是个指针,指向第1个元素的位置)找到第一个元素,然后用第1一个元素的指针找到第2个元素(位置3),然后用第2个元素的指针找到第3个元素(位置2),以此类推。所以list的顺序和内存中的实际顺序其实不一定完全对应。这种存储方式不会浪费内存,但查找起来特别费时间,因为要按照链表一个一个找下去,如果你的list特别大的话,那么要等好久才会找到结果
    2. dict则为了快速查找使用了一种特别的方法,哈希表。哈希表采用哈希函数从key计算得到一个数字(哈希函数有个特点:对于不同的key,有很大的概率得到的哈希值也不同),然后直接把value存储到这个数字所对应的地址上,比如key='ABC',value=10,经过哈希函数得到key对应的哈希值为123,那么就申请一个有1000个地址(从0到999)的内存,然后把10存放在地址为123的地方。类似的,对于key='BCD',value=20,得到key的哈希值为234,那么就把20存放在地址为234的地方。对于这样的表查找起来是非常方便的。只要给出key,计算得到哈希值,然后直接到对应的地址去找value就可以了。无论有几个元素,都可以直接找到value,无需遍历整个表。不过虽然dict查找速度快,但内存浪费严重,你看我们只存储了两个元素,都要申请一个长度为1000的内存
    3. 现在你知道为啥key要用不可变对象了吧?因为不可变对象是常量,每次的哈希值算出来都是固定的,这样就不会出错。比如key='ABC',value=10,存储地址为123,假设我突发奇想,把key改成'BCD',那么当查找'BCD'的value的时候就会去234的地址找,但那里啥也没有,这就乱套了
    4. 你看我们上面有一句话:对于不同的key,有很大的概率得到的哈希值也不同。那么有很小的概率不同的key可以得到相同的哈希值了?没错,比如对于我们的例子来说,哈希值只有3位,那么只要元素个数超过1000,就一定会有至少两个key的哈希值相同(鸽笼原理),这种情况叫“冲突”,设计哈希表的时候要采取办法减少冲突,实在冲突了也要想办法补救。不过这是编译器的事情,况且对于初学者的我们来说碰到的冲突的概率基本等于零,就不用操心了
  • 相关阅读:
    Treap
    P1650 田忌赛马
    wqs二分
    P3810 【模板】三维偏序(陌上花开)(CDQ分治)
    UVA1205 Color a Tree
    P2887 [USACO07NOV]Sunscreen G
    Snowflake Snow Snowflakes
    P1613 跑路
    P5018 [NOIP2018 普及组] 对称二叉树
    装模作样的停课记录
  • 原文地址:https://www.cnblogs.com/jayce9102/p/12144495.html
Copyright © 2011-2022 走看看