python tricks - peter-xbs/CommonCodes GitHub Wiki

REF: Python高手之路

python 获取函数内的变量名称

python -c "from ab.keys.crypto import decrypt_to_memory; r=decrypt_to_memory.__code__.co_varnames;print(r)"

python 第三方package制作经验【使用模板】

# 使用cookiecutter
https://audreyr.gitbooks.io/new-library-sprint/content/index.html

python定时调度任务

# 使用schedule模块
https://zhuanlan.zhihu.com/p/23086148

Python获取第三方包源码

python -c "from requests import get;import inspect;r=inspect.getsource(get);print(r)" 

Python为用户设置资源限制方式

unlimit # 需admin权限的用户来设置其余用户的资源quota

Python函数式编程

● map/filter

map(func, inp_list) # return generator
filter(func, inp_list) # return generator

● first

from first import first
import operator
first([-1, 0, 1, 2], default=0, key=partial(operator.le, 0)) # return -1

Python itertools模块

● chain([iterator1, iterator2, ...]) 一次迭代多个iterables但并不会构造包含所有元素的中间列表 ● combinations(iterator, r) 从给定的iterable中生成所有长度为r的组合,相当于C! ● compress(data, selectors) 对data应用来自selectors的布尔掩码并从data中返回selectors中对应为真的元素 ● count(start, step) 创建一个无限的值的序列,从start开始,步长尾step ● cycle(iterator) 重复遍历iterator中的值 ● dropwhile(predicate, iterable) 过滤iterable中的元素,丢弃符合predicate描述的那些元素 ● groupby(iterator, keyfunc) 根据keyfunc函数返回的结果对元素进行分组并返回一个迭代器 ● permutations(iterator, r) 返回iterator中r个元素的所有组合,相当于A! ● product([iterator1, iterator2, ...]) 返回iterables的笛卡尔积的可迭代对象,但不使用嵌套的for循环 ● takewhile(predicate, iterable) 返回满足predicate条件的iterable中的元素 和dropwhile互为犄角

Python项目层级结构

etc -> 用来存放配置文件的样例 tools -> 用来存放与工具相关的shell脚本 bin -> 用来存放将被setup.py安装的二进制脚本 data -> 用来存放其它类型的文件,如媒体文件

Python项目版本号

● N[.N]+ 项匹配的版本被认为是最终版本 ● 1.2 等于 1.2.0;1.3.4等于1.3.4.0 ● 1.2.a1 表示是一个alpha版本,表示此版本不稳定或缺少某些功能 ● 1.2.b2 表示是一个beta版本,功能已完整,但可能仍有bug ● 0.4rc1 表示候选版本,表示除非有重大bug,否则很可能成为产品的最终发行版本 ● 1.4.post2 表示一个后续版本,通常用来解决发行过程中的细小问题 ● 2.3.4dev3 表示一个开发版本

Python必备标准库【不常用的部分补充】

● atexit 允许注册在程序退出时调用的函数

● bisect 为可排序的列表提供二分查找算法

● fnmatch 提供用于匹配Unix风格文件名模式的函数

● concurrent 提供异步计算

● sched 提供一个无须多线程的事件调度器

● select 提供对函数select()和poll()的访问,用于创建事件循环

● signal 提供用于处理POSIX信号的函数

● tempfile 提供用于创建临时文件和目录的函数

Python管理API变化

在构造API时很难一蹴而就,API需要不断演化,添加、删除或者修改所提供的功能。 旧接口不要立即删除,实际上,应该尽量长时间的保留旧接口。在维护成本实在太麻烦时再移除旧接口。 API变化需记录: ● 新的接口

● 废除的旧接口

● 记录如何升级到新街口

有两种方式

  1. warnings
import warnings

class Car(object):
    def turn_left(self):
        warnings.warn('turn_left is deprecated, use turn instead', DeprecationWarning)
        self.turn(direction='left')
    
    def turn(self, direction):
        pass
2. debtcollector
from debtcollector import moves

class Car(object):
    @moves.moved_method('turn', version='1.1')
    def turn_left(self):
        return self.turn(direction='left')
    
    def turn(self, direction):
        pass

打印统计表格信息

# pip install PrettyTable
import prettytable as pt
tb = pt.PrettyTable()
tb.field_names = ['xx', ...]
for line in rows:
    tb.add_row(['xx', ...])
    tb.add_column('col_name', ['xx', ...])
    
# tb.border = False
# tb.padding_width=2
print(tb)

pandas数据特征分析

https://pandas-profiling.ydata.ai/docs/master/index.html

https://pandas-profiling.ydata.ai/examples/master/titanic/titanic_report.html