跳至主要內容

Python

LincZero大约 7 分钟

Python

目录

容器类型

可迭代对象泛操作

列表解析

也叫列表推导式

  • 适用

    • 使用:[值 for i in L]
  • 适用举例

    • [x^2 for x in range(10)]【Python特有】

      等价于list[map(lambda x: x**2, range(10))]

    • 复杂点的举例:[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

    • 嵌套的举例:[[row[i] for row in matrix] for i in range(4)]

  • 适用范围:列表/元组/集合/字典

    • (对于字典,要写完整的键值,例如{x: x**2 for x in (2, 4, 6)}

len

  • 使用举例
    • len(dict)返回可迭代对象的长度
  • 适用范围:列表/字典/元组/集合/字符串

[]

  • 使用举例
    • list[i]索引
  • 适用范围:列表/字典/元组/集合/字符串
    • (对于字典,中括号内容为键名,不可为序列)(本质是hash表)
    • (对于列表,i 内容除了可以是序列,也可以是切片表达)

del

  • 使用举例
    • del list[i],从列表删除元素、切片、全部
    • del dict['key'],从字典删除键值对、全部
  • 适用范围:列表/字典/集合
    • (对于可迭代对象,可以不加[]序列,删除整个对象)
    • (对于字典,中括号内容为键名
    • (对于列表,i 内容除了可以是序列,也可以是切片表达)
    • (对于字符串和元组,不可编辑元素)

循环

  • 适用举例
    • for i in list:
  • 适用范围:列表/字典/元组/集合/字符串
    • 对于字典,根据遍历对象的不同有不同写法,默认是遍历键
      • 遍历字典键for k in dict.keys():for k in dict:
      • 遍历字典值for v in dict.values():
      • 遍历字典键值对for k,v in dict.items():
    • 对于可迭代对象,根据遍历对象的不同也有不同的写法
      • 只遍历项for item in list: print(item)
      • 遍历序列for i in range(len(list)): print(i, list[i])
      • 遍历序列与值for i, v in enumerate(list): print(i, v)

顺序类(需要为线性序列对象)

  • list.sort(),对列表中的元素就地进行永久性排序,额外参数[reverse=False]
  • list.sorted(),对列表中的元素就地进行临时性排序,额外参数[reverse=False]
    • 一般临时性排序可用于循环序列中倒叙输出
  • list.reverse(),就地倒排序列表中的元素

对象类型 > 列表

简概

  • 性质
    • 可变:不像不可变的字符串,列表是可变的,它允许修改元素,故可以对索引或切片进行赋值
    • 任意类型:列表的元素不必是同一类型
  • 使用基础(背后原理)

使用

  • 字面量方式

    • 列表字面量:用方括号([])来表示列表,并用逗号分隔

    • 列表索引:就像字符串(以及其它所有内建的 序列open in new window 类型)一样,列表可以被索引和切片

    • 列表切片:就像字符串(以及其它所有内建的 序列open in new window 类型)一样,列表可以被索引和切片 所有的切片操作都会返回一个包含请求的元素的新列表,即返回列表一个新的(浅)拷贝副本

    • 列表拼接:列表也支持用+连接这样的操作

  • 对象方法open in new window(类方法)

    • list.append(X) ,在列表的末尾添加新的元素,相当于 a[len(a):] = [x]a.insert(len(a), x)
    • list.extend(L),将一个给定列表中的所有元素都添加到另一个列表中,相当于 a[len(a):] = L
    • list.insert(i,x),在指定位置添加插入一个元素
    • list.remove(x)删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误
    • list.pop([i=len]),从列表的指定位置删除元素,并将其返回。如果没有指定索引,返回最后一个元素
    • list.clear(),从列表中删除所有元素。相当于 del a[:]
    • list.index(x)返回列表中第一个值为 x 的元素的索引,相当于a[i],如果没有匹配的元素就会返回一个错误
    • list.count(x)返回 x 在列表中出现的次数
    • list.copy(),返回列表的一个浅拷贝。等同于 a[:]
  • 内置函数

    • len(list)返回列表长度
    • del list[i],从列表删除元素、切片、甚至全部
    • range(start,stop[,step]),快速创建等差数字列表,相当于[i for i in range(start,stop[,step])]
  • 技巧

    • 当堆栈用:使用append()pop()方法可以当堆栈用
    • 当队列用:效率不高,在头部插入和弹出很慢(因为,为了一个元素,要移动整个列表中的所有元素) 要实现队列,使用 collections.dequeopen in new window,它为在首尾两端快速插入和删除而设计
    • 遍历列表for i in list:
    • 拷贝:捋清楚:对象数据类型的赋值、浅拷贝和深拷贝三者的关系。具体详见其他笔记的编程术语一篇

原理

python的列表不仅不定长,而且还随意存储各种格式,存整型、浮点、字符串、甚至还可以嵌套list等其他容器。 在C++中如果想要实现相同的效果,可能需要用 Boost::any

原理

参考:https://cloud.tencent.com/developer/article/1820193

python中的容器open in new window对象真的不多,平常我们会很心安理得的根据需求来使用对应的容器,不定长数据用list,想去重用set,想快速进行匹配用dict,字符处理用str

简述

从细节上看,Python中的列表是由对其它对象的引用组成的连续数组

这意味着,每次添加或删除一个元素时,由引用组成的数组需要该标大小(重新分配),当然,实际使用的是指数分配的方式。

对象类型 > 元组(元素不可变)

简概

  • 性质
    • 不可变性:就是相当于不可变的列表,其他和列表差不多 (存储元组的变量可变,元组元素不可变,为区别于常量其更贴切的说法是元素不可变性

使用

  • 字面量方式

    • 元组字面量:用圆括号(())来表示元组,并用逗号分隔,也可以不加括号

      例如tuple = 123, 456, 'hello'

    • 创建包含零个或一个元素的元组:零个时不能省略圆括号,一个时可在后面加单个逗号

      例如empty_tuple = ()single_tuple = 'hello',

  • 技巧

    • 遍历元组for i in tuple:

对象类型 > 字典

简概

  • 性质
    • 无序:用for遍历时顺序完全随机

使用

  • 注意项
    • 关键字可以为任意不可变类型,适用范围:字符串、数值、只包含字符串和数字的元组
  • 字面量方式
    • 字典字面量{k1:b1, k2:v2}
    • 字典增加或修改dict[key]=value
  • 对象方法(类方法)
    • dict.items()返回键值对
    • dict.keys()返回
    • dict.values()返回
  • 内置函数
    • len(dict)返回字典长度
    • del dict['key'],从字典删除键值对
    • set(dict)返回不重复的集合

对象类型 > 集合

简概

  • 性质
    • 无序:用for遍历时顺序完全随机
    • 不重复

使用

  • 字面量方式
    • 集合字面量{}包裹,逗号隔开。也可以用set()方式创建
      • 但注意的是,如果创建空集合,只能用创建对象方式set(),例如a = set()
      • set()本质是对象构造函数,也是类型转换方法,即构造函数用作转换函数并重载)
  • 对象方法(类方法)
    • union,联合
    • intersection,交
    • difference,差
    • sysmmetric difference,对称差集
  • 符号方法
    • set_a - set_b,差集
    • set_a | set_b,并集
    • set_a & set_b,交集
    • set_a ^ set_b,非交集(交集的补集)
  • 补充
    • 集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算

对象类型 > 对象数据类型的嵌套

  • 嵌套:列表、元组、字典、集合均允许嵌套列表

  • 嵌套技巧

    • 列表\ni列表:嵌套分组
    • 列表\ni字典:有多种个体,每个个体有不同属性
    • 字典\ni列表:对象有多个属性,每个属性有多个选项
    • 字典\ni字典:对象有多个属性,每个属性有多个子属性
  • 内置函数

    • zip()

      • 打包(一维打包成多维)

      • questions = ['name', 'quest', 'favorite color']
        answers = ['lancelot', 'the holy grail', 'blue']
        for q, a in zip(questions, answers):
            print('What is your {0}?  It is {1}.'.format(q, a))
        

队列【外部类】

  • 导入:from collections import deque
  • 字面量方式
    • 定义:例如queue = deque(["2", "3", "4"])
  • 对象方法
    • queue.append(X),末尾增加
    • queue.popleft(),左侧弹出