type
status
date
slug
summary
tags
category
icon
password
*args 和 **kwargs
- *是必要的, 后面的变量可以变换
- *args 是用来发送一个非键值对的可变数量的参数列表给一个函数.
- **kwargs允许你将不定长度的键值对, 作为参数传递给一个函数.
- 如果你想在函数里同时使用所有这三种参数
生成器(Generators)
- yield
- 生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。
- 你通过遍历来使用它们,要么用一个“for”循环,要么将它们传递给任意可以进行迭代的函数和结构。
- 许多Python 2里的标准库函数都会返回列表,而Python 3都修改成了返回生成器,因为生成器占用更少的资源。
Map, Filter, Reduce
- Map: 会将一个函数映射到一个输入列表的所有元素上。
- Filter: 过滤列表中的元素,并且返回一个由所有符合要求的元素所构成的列表
- Reduce: 当需要对一个列表进行一些计算并返回结果时使用
Set数据结构
- set与列表(list)的行为类似,区别在于set不能包含重复的值.
- 检查列表中是否包含重复的元素
- 交集(intersection): 你对比两个集合的交集(两个集合中都有的数据)
- 差集(difference): 找出无效的数据,相当于用一个集合减去另一个集合的数据
- 创建集合可以用{}, 不用set()
三元运算符
装饰器
- 原始版本
- 装饰器版本
- 存在问题, 不显示原函数名
- wrap 日志: 日志是装饰器运用的另一个亮点
- 还有详细logit构建, 发邮件啥的
添加 @wraps(a_func) (@wraps接受一个函数来进行装饰,并加入了复制函数名称、注释文档、参数列表等等的功能。)
对象变动 Mutation
- 不可变(immutable)对象
- int, string, float, tuple
- 可变(mutation)对象
- dict, list, set
slots
- 默认情况下Python用一个字典来保存一个对象的实例属性。这非常有用,因为它允许我们在运行时去设置任意的新属性。
- 然而,对于有着已知属性的小类来说,它可能是个瓶颈。这个字典浪费了很多内存。
- 使用__slots__来告诉Python不要使用字典,而且只给一个固定集合的属性分配空间。
虚拟环境(virtualenv)
- 如果你想让你的virtualenv使用系统全局模块
- 退出虚拟环境
容器 Collections
- defaultdict
- 与dict不同, 你不需要检查key是否存在.
- 当你在一个字典中对一个键进行嵌套赋值时,如果这个键不存在,会触发keyError异常。 defaultdict允许我们用一个聪明的方式绕过这个问题。
- counter
- Counter是一个计数器,它可以帮助我们针对某项数据进行计数。
- 统计文件
- deque
- deque提供了一个双端队列,你可以从头/尾两端添加或删除元素.
- 可以像list一样用
- 你还可以从任一端扩展这个队列中的数据:
- 命名元组 (namedtuple)
枚举 Enumerate
对象自省
- dir: 返回一个列表,列出了一个对象所拥有的属性和方法。
- type: 返回一个对象的类型
- id: 返回任意不同种类对象的唯一ID, 内存地址.
- inspect: 获取活跃对象的信息
列表推导式, 字典推导式, 集合推导式
- list
- dict
- squared
异常
- try except
- finally从句: 包裹到finally从句中的代码不管异常是否触发都将会被执行.
- try/else从句: 没有触发异常时运行
lambda表达式
for-else
- else从句会在循环正常结束时执行
使用C扩展
Open函数
- 读取一个文件,检测它是否是JPG(提示:这些文件头部以字节FF D8开始)
函数缓存
- 设置最多缓存最近多少个返回值
- 缓存多的话, 可重复调用的值, 节省运行时间
- cache_info() 用于查看缓存信息
上下文管理器
- 当异常发生时,with语句会采取哪些步骤。
- 它把异常的type,value和traceback传递给__exit__方法
- 它让__exit__方法来处理异常
- 如果__exit__返回的是True,那么这个异常就被优雅地处理了。
- 如果__exit__返回的是True以外的任何东西,那么这个异常将被with语句抛出。
bisect 数组二分查找算法
这个模块对有序列表提供了支持,使得他们可以在插入新数据仍然保持有序。对于长列表,如果其包含元素的比较操作十分昂贵的话,这可以是对更常见方法的改进。
bisect.
bisect_left
(a, x, lo=0, hi=len(a), *, key=None)在 a 中找到 x 合适的插入点以维持有序。参数 lo 和 hi 可以被用于确定需要考虑的子集;默认情况下整个列表都会被使用。如果 x 已经在 a 里存在,那么插入点会在已存在元素之前(也就是左边)。如果 a 是列表(list)的话,返回值是可以被放在
list.insert()
的第一个参数的。
返回的插入点 i 将数组 a 分成两半,使得 all(val < x for val in a[lo : i])
在左半边而 all(val >= x for val in a[i : hi])
在右半边。
key 指定带有单个参数的 key function 用来从数组的每个元素中提取比较键。 为了支持搜索复杂记录,键函数不会被应用到 x 值。
如果 key 为 None
,则将直接进行元素比较而不需要中间的函数调用。
在 3.10 版更改: 增加了 key 形参。python中的特殊方法
python中的特殊方法被python解释器调用, 我们一般不会亲自调用.
我们可以使用内置函数来使用. eg: __len()__实现后, 使用len()即可.
也有特殊方法的调用是隐式的. eg: for i in x, 使用的是内置函数iter(x).
详细见:
特殊(魔术)方法汇总一览表
