记录python相关的知识或使用技巧。
LEGB规则
LEGB含义解释:
L-Local(function):函数内的名字空间
E-Enclosing function locals:外部嵌套函数的名字空间(例如closure)
G-Global(module):函数定义所在模块(文件)的名字空间
B-Builtin(Python):Python内置模块的名字空间
yield 语句
1 | def consumer(): |
将列表中的元素,依次每 k 个分作一组
1 | def group_each(a, size: int): |
偏函数
1 | from functools import partial |
多 dict 的去重
1 | # a = [{'a': 1}, {'a': 1}, {'b': 2}] |
1 | import json |
str 的 startswith 和 endswith 两个函数的参数可以是元组
1 | "/opt/gts.tar.gz" file = |
交互环境下的”_”操作符
在 Python 控制台,不论何时我们测试一个表达式或者调用一个方法,结果都会分配给一个临时变量: _(一个下划线) 。
1 | 2 + 3 |
开启文件分享
Python 允许运行一个 HTTP 服务器来从根路径共享文件,下面是开启服务器的命令:(python3环境)
1 | python3 -m http.server |
上面的命令会在默认端口也就是 8000 开启一个服务器,你可以将一个自定义的端口号以最后一个参数的方式传递到上面的命令中。
重置递归限制
1 | import sys |
检查一个对象的内存使用
1 | import sys |
使用slots来减少内存开支
1 | import sys |
将中文转为unicode编码
1 | "编码".encode("unicode_escape") |
创建多级目录
1 | import os |
打印日期序列
1 | import pandas as pd |
查看当前系统编码方式
1 | import locale |
序列过滤
1 | >>> import random |
命名元组
1 | import collections |
实现tail
和head
功能
1 | # -*- coding: utf-8 -*- |
实现轮询调度器
实现下述需求
1 | ['ABC', 'D', 'EF'] --> ['A', 'D', 'E', 'B', 'F', 'C'] |
方式一:可以通过在 deque 中放入迭代器来实现。
值从当前迭代器的位置0被取出并暂存(yield)。 如果这个迭代器消耗完毕,就用 popleft() 将其从对列中移去;否则,就通过 rotate() 将它移到队列的末尾
1 | from collections import deque |
耗时测试:
1 | >>> import timeit |
方式二:通过zip_longest实现。
1 | >>> import functools |
耗时测试:
1 | >>> import timeit |
python 在函数内部获取函数名
方式一:sys._getframe().f_code.co_name
1 | import sys |
方式二:用inspect模块中的inspect.stack()
1 | import inspect |
python获取当前进程所在的文件名
- sys._getframe().f_code.co_filename
- __file__
re中的\1\2\3问题
1 | >>> import re |
简析Python中的四种队列
参考:https://www.jianshu.com/p/55243999aa56
spark 中文文档
http://spark-cn.cn/rdd-programming-guide.html
Apache Spark 2.2.0 官方文档中文版
Python 中关于 round 函数的小坑
round的结果跟python版本有关:
1 | Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32 |
1 | Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32 |
阅读一下python的文档,里面是这么写的:
在python2.7的doc中,round()的最后写着,”Values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done away from 0.” 保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一样远,则保留到离0远的一边。所以round(0.5)会近似到1,而round(-0.5)会近似到-1。
但是到了python3.5的doc中,文档变成了”values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice.” 如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。
python 求最小公倍数
1 | # -*- coding:utf-8 -*- |
python求两数的最大公约数
- 使用 math.gcd 方法
1 | >>> import math |
- 欧几里德算法
欧几里德算法又称辗转相除法, 用于计算两个整数a, b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a, b) = gcd(b, a mod b) (a > b)
证明:
a可以表示成a = kb + r, 则r = a mod b
假设d是a, b的一个公约数, 则有 d|a, d|b, 而r = a - kb, 因此d|r。
因此,d是(b, a mod b)的公约数。
加上d是(b,a mod b)的公约数,则d|b, d|r, 但是a = kb + r,因此d也是(a, b)的公约数。
因此,(a, b) 和(a, a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
1 | # -*- coding:utf-8 -*- |
python中开n次方根
利用 pow(a, b)
函数即可。需要开a的r次方则 pow(a, 1/r)
‘ascii’ codec can’t encode characters in position 0-6: ordinal not in range(128)
1 | 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128) |
方式一 在文件开头添加:
1 | import sys |
方式二:
1 | import sys |
Python2.x 和 Python3.x 中 raw_input( ) 和 input( ) 区别
Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型。
Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获取控制台的输入。
raw_input() 将所有输入作为字符串看待,返回字符串类型。而 input() 在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型( int, float )。
注意:input() 和 raw_input() 这两个函数均能接收 字符串 ,但 raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收)。而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError 。
除非对 input() 有特别需要,否则一般情况下我们都是推荐使用 raw_input() 来与用户交互。
注意:python3 里 input() 默认接收到的是 str 类型。
python 垃圾回收机制
https://www.cnblogs.com/pinganzi/p/6646742.html
检查一个进程是否存在
1 | def check_pid(pid): |
删除一个文件
1 | os.unlink(file_path) |
python 控制台输出中文设置
1 | os.environ["PYTHONIOENCODING"] = "UTF-8" |
处理 Django admin.py Unknown command: ‘collectstatic’
在settings.py
文件的INSTALLED_APPS中添加django.contrib.staticfiles
python 格式化输出json文件
1 | [root@master01 ~]# python -m json.tool /etc/docker/key.json |