-
列表
-
使用deepcopy()复制所有内容
- deepcopy()能够处理深度嵌套列表、字典以及其他对象
-
使用zip()迭代多个序列
- 整体打包
-
使用推导式创建列表
-
简单形式:[expression for item in iterable]
- >>> number_list = [number for number in range(1,6)
- >>> number_list
- [1,2,3,4,5]
-
包含条件表达式:[expression for item in iterable if condition]
- >>> a_list = [number for number in range(1,6) if number % 2 == 1
- >>> a_list
- [1,3,5]
-
字典:dict
-
创建字典
- {Key:value)
-
dict()
- acme = dict(first='wile',middle='e',last='coy')
- 限制:参数名不能有空格与保留字
- dict()函数可以将双值序列转换为字典
-
修改字典:字典键必须是唯一
- [key]添加或修改字典项
-
{**a,**b} 合并字典
-
update() 合并字典:将一个字典的键和值复制到另一个字典
-
a.update(b)
- 将b字典中的键-值复制增加到字典a中
-
del语句删除字典项
-
del a['b']
- 删除字典a中b键及值
-
pop():返回字典项后将其删除
-
a.pop('b')
- 返回字典a中b键对应的值后将其删除,若该键不存在则产生异常
-
clear():删除所有字典
- a.clear()
-
copy():浅复制,适用于字典值不可变的情况
- a.copy()
-
deepcopy():深复制,复制所有内容
- import copy
- b = copy.deepcopy(a)
-
获取字典
- [key]
-
get()
-
键存在,得到可选值
- a.get('ba')
-
键不存在,得到可选值,并提前指定
- a.get('ba':'cv')
- 键不存在,提前未指定,返回None
-
keys():获取所有键
- a.keys()
-
values():获取所有值
- a.values()
-
items():获取所有‘键-值’对
- a.items()
-
len():获取‘键-值’个数
- len(a)
-
迭代字典
-
迭代字典会返回键
- for sth in a:
- for sth in a.keys():
-
迭代字典返回值
- for sth in a.values():
-
迭代字典以元组形式返回键-值
- for key,value in a.items():
- 返回元组:(key,value)
-
字典推导式
- {key:value for exp in ite}
- {key:value for exp in ite if con}
-
集合
-
创建集合(集合是无序的)
-
{} 创建集合
- {1,2,3}
-
set():创建集合
- empty_set = set()
- set():可将列表、字符串、元组、字典转换为字符串,重复的值会丢弃,当字典转换为集合时,只有键保留
-
frozenset():创建不可变集合
- frozenset(列表、元组、集合)
-
修改集合
-
len():获取集合元素个数
- len(a)
-
add():向集合后添加元素
- add('a')
-
remove():删除集合中的元素
- remove('a')
-
读取集合
-
迭代集合
- for a in b:
-
集合运算
-
交集运算:多个集合共有的元素
-
交集运算符:&
- a & b
-
a.intersection(b)
- 交集函数
-
并集运算:存在于任何一个集合中的元素
-
并集运算符:|
- a|b
-
a.union(b)
- 并集函数
-
差集运算:存在于第一个集合但不在第二个集合中的元素
-
差集运算符:-
- a-b
-
a.difference(b)
- 差集函数
-
异或集:元素仅在两个集合中出现一次
-
异或运算符:^
- a^b
-
a.symmetric_difference(b)
- 异或函数
-
检查一个集合是否为另一个集合的子集:第一个集合中的所有成员也出现在第二个集合中
-
子集运算符:<=
- a<=b
-
a.issbset(b)
- 子集函数
- 真子集判断:<
-
超集:
-
超集运算符:>=
- a>=b
-
a.issuperset(b)
- 超集函数
- 真超集判断:>
-
集合推导式
- {expression for expression in iterable}
-
带有条件测试:
- {expression for expression in iterable if condition}
-
函数
-
实参与形参
-
位置实参
- 实参值按顺序被依次复制到对应的形参。
-
关键字实参
-
按照其对应的形参名称指定实参,定义的顺序可以与定义函数时的顺序不同
- 同时也可以混用位置实参与关键字实参,但位置实参要放到最前面
-
指定默认形参值
- def fun(a,b,c='d'):
- 默认形参值是在定义函数时而不是在运行函数时计算的,不可使用可变数据类型指定,如列表或字典
-
使用*拆分/汇集位置实参
-
当在带有参数的函数内部使用*时,星号会将可变数量的位置实参汇集成单个形参元组
- 在函数之外,*args会将元组args拆分由逗号分隔的位置形参
-
在函数之内,*args会将所有的位置实参汇集成单个args元组
- *args在函数外部是膨胀效果,在函数内部是吸入效果,值要么被拆分,要么被汇集
-
使用**拆分/汇集关键字实参
-
将关键字实参汇集成一个字典,实参名是键,实参值是对应的值
- 在函数外部,**kwards会将字典kwards拆分为若干个形如name=value的实参
-
在函数内部,**kwards会将若干个name=value实参汇集成单个字典形参kwards
-
仅关键字形参
-
可以传入与位置形参同名的关键字实参,形参必须以name=value的形式提供,不能只按照位置提供值
-
文档字符串
-
通过在函数体起始部分添加字符串来为函数定义附加上文档
- 调用help(定义的函数名),打印函数的文档字符串
-
匿名函数:lambda
- lambda函数是一个可以表达为单语句形式的匿名函数,可以用它来代替普通的微型函数
-
lambda函数可以有0个或多个逗号分隔的参数,然后是冒号:,接着是函数定义
-
生成器
- 通过写一个生成器函数来生成自定义序列
-
注意其中获取返回值语句需要用yield而非renturn,同时,生成器只能运行一次
-
生成器推导式
-
装饰器:在原函数基础上,通过不修改原函数代码,增加相关功能
-
一个函数可以有多个装饰器,最接近函数的装饰器先运行
-
命名空间
-
主程序部分定义了全局命名空间,在其中定义的变量就是全局变量
- 可以在函数内部获取全局变量的值
-
不可以在函数内获取全局变量的值后并进行修改
-
不获取,只修改,也只是修改函数内部的变量值
-
要想在函数中访问全局变量而非局部变量,需要明确使用global关键字
-
访问命名空间中的内容
- locals()函数:会返回局部名称空间的内容目录
-
globals()函数:会返回全局名称空间的内容目录
-
变量名称中的__和__用法
-
以双下划线起止的名称是保留给python内部使用的,不要将自己的变量名称也带有双下划线__,相当于系统变量名称
- 系统变量 function.__name__ 保留函数名称
- 系统变量 function.__doc__ 保留文档字符串
-
递归:函数调用自身
- yield from表达式,让一个生成器把部分工作交给另一个生成器
-
异常
-
使用try和except代码块处理错误
- 可以编写不在标准库中定义好的自定义的异常
-
对象,类
- class 定义类
-
初始化 python对象初始化方法:__init__():
- __init__()是python特殊的方法名称,该方法用于在类定义中初始化对象
-
self参数指定了引用的是此对象本身
-
继承:从现有类创建新类
-
从父类继承
-
覆盖方法
-
添加方法:子类添加父类没有的方法
-
super() 获取父类属性:子类能够获得父类的属性,不用再次定义
-
多重继承:子类可以继承多个父类
-
辅助父类:mixin:不与其他父类共享任何方法,仅执行一些“辅助”任务,如日志记录等
-
特性(属性)访问
- 计算值属性
- 使用名称重整保护内部隐私
-
类和对象特性
- 可以为类设置各种特性,类的特性会被子对象继承
- 改变子对象特性并不会影响到类的特性
- 改变类的特性不会影响到已有子对象特性,但会影响新对象
-
方法的类型
- 实例方法:在类定义的方法中看到第一个参数是self,实例方法的第一个参数是self,当调用该方法时,python会将对象传入该方法。
-
类方法:影响整个类,第一个参数是cls。
-
用前置装饰器@classmethod指明接下来的函数是类方法,方法的第一个参数是类本身,python传统做法是将该参数命名为cls
-
静态方法:既不影响类,也不影响对象,使用@staticmethod作为前置装饰器,不需要self,cls等参数
-
鸭子方法:多态,根据方法的名称和参数将相同的操作用于不同的对象
-
魔术方法
-
聚合与组合
-
具名元组
-
数据类
-
使用数据类注意事项:
- 需要@dataclass装饰器
- 定义类特性要使用形如name:type或name:type = val的变量注解,type可以是包括类在内的任意python对象类型
- 创建数据类型时,要按照类中指定的顺序提供参数,或是使用具名参数
-
当创建复杂的数据结构时,由于字典的键必须是不可变的,因此列表、字典、集合都不能作为键,但元组可以。
- site = {(44.79,93.14,285):'my house',(38.79,-77.03,13):'the position'}
- 对于列表和元组,利用方括号[]访问单个元素,方括号内的值是整数偏移。对于字典,则是键。列表、元组、字典利用[]访问得到的都是值。对于集合,要么存在,要么不存在,不存在索引或键。