原则:可读性第一(效率固然重要,除非非常明显的效率差异,否则可读性优先)
学习炫技巧,更多为了读懂他人代码,自己开发过程中,相似代码量(可读性),建议使用通俗写法。反对为炫而炫。
可直接运行的 zip 包
有 Python 包,居然可以以 zip 包进行发布,并且可以不用解压直接使用。
这个zip 是如何制作的呢,请看下面的示例。
1 | [root@localhost ~]# ls -l demo |
制作完成后,我们可以执行用 python 去执行它
1 | [root@localhost ~]# python demo.zip |
懒人必备技能:使用 “_”
大家对于他的印象都是用于 占位符,省得为一个不需要用到的变量,绞尽脑汁的想变量名。
今天要介绍的是他的第二种用法,就是在 console 模式下的应用。
示例如下:
1 | >>> 3 + 4 |
它可以返回上一次的运行结果。
但是,如果是print函数打印出来的就不行了。
1 | >>> 3 + 4 |
最快查看包搜索路径的方式
1 | python3 -m site |
and 和 or 的取值顺序
当一个 or 表达式中所有值都为真,Python会选择第一个值
当一个 and 表达式 所有值都为真,Python 会选择第二个值。
示例如下:
1 | >>>(2 or 3) * (5 and 7) |
访问类中的私有方法
1 | # 调用私有方法,以下两种等价 |
一行代码实现FTP服务器
python3 -m http.server 8888
for else逻辑
for else 和 try else 相同,只要代码正常走下去不被 break,不抛出异常,就可以走else。(所以和去掉else,直接写后面没区别?)
优点在于,可以识别正常退出还是break退出(一般业务含义不同)
嵌套上下文管理的另类写法
with test_context(‘aaa’), test_context(‘bbb’):
print(‘========== in main ============’)
连接多个列表最极客的方式
1 | >>> b = [3,4] |
另外几种连接列表的方式
1 | >>> list01 + list02 + list03 |
在程序退出前执行代码的技巧
使用 atexit 这个内置模块,可以很方便的注册退出函数。
如果clean()函数有参数,那么你可以不用装饰器,而是直接调用atexit.register(clean_1, 参数1, 参数2, 参数3=’xxx’)。
合并字典的几种方法
1 | profile.update(ext_info) |
条件语句的几种写法
1 | <on_true> if <condition> else <on_false> |
让我爱不释手的用户环境
当你在机器上并没有 root 权限时,如何安装 Python 的第三方包呢?
可以使用 pip install –user pkg 将你的包安装在你的用户环境中,该用户环境与全局环境并不冲突,并且多用户之间相互隔离,互不影响。
with 与 上下文管理器
样例:
1 | import contextlib |
在 linux 上看 json 文件
cat test.json | python -m json.tool
sh,最优雅的命令调用方式
1 | >>> sh.glob("/etc/*.conf") |
判断是否包含子串的七种方法
1 | 1. 使用 in 和 not in |
operator模块是python中内置的操作符函数接口,它定义了一些算术和比较内置操作的函数。operator模块是用c实现的,所以执行速度比 python 代码快。
在 operator 中有一个方法 contains 可以很方便地判断子串是否在字符串中。
1 | >>> import operator |
使用json.dumps打印字典
打印中文在 json.dumps 这里,却只要加个参数就好了
具体的代码示例如下:
1 | >>> import json |
slots
JIT即时编译器,当虚拟机发现某个方法或代码块运行特别频繁时,就会把这些代码认定为热点代码,为了提高热点代码的运行效率,在运行时,虚拟机将会把这些代码编译成与本地平台的相关带代码,并进行各层次的优化。
正如上面所说的,默认情况下,Python的新式类和经典类的实例都有一个dict来存储实例的属性。这在一般情况下还不错,而且非常灵活,
乃至在程序中可以随意设置新的属性。但是,对一些在”编译”前就知道有几个固定属性的小class来说,这个dict就有点浪费内存了。
当需要创建大量实例的时候,这个问题变得尤为突出。一种解决方法是在新式类中定义一个slots属性。
slots声明中包含若干实例变量,并为每个实例预留恰好足够的空间来保存每个变量;这样Python就不会再使用dict,从而节省空间。
stateful service 排障
来个真的有点高(黑)级(暗)的技巧吧,开发一个 stateful service 的时候怎么排障?比如出现死锁了,或者某个线程意外退出。这个时候可以从
gc.get_objects()
掏出所有活着的对象,其中当然就包括活着的线程。
例如,打印出所有 Greenlet 的 stack:
1 | import os |
x入参
1 | def testa(*v): |
内存占用
下面的代码块可以检查变量 variable 所占用的内存。
1 | import sys |
n = 2;
s =”Programming”;
print(s * n);
ProgrammingProgramming
1 | ## 解包 |
array = [[‘a’, ‘b’], [‘c’, ‘d’], [‘e’, ‘f’]]
transposed = zip(*array)
print(transposed)
[(‘a’, ‘c’, ‘e’), (‘b’, ‘d’, ‘f’)]
1 | ## 链式函数调用 |
def add(a, b):
return a + b
def subtract(a, b):
return a - b
a, b = 4, 5
print((subtract if a > b else add)(a, b)) # 9
1 | ## 回文序列 |
def palindrome(string):
from re import sub
s = sub(‘[\W_]’, ‘’, string.lower())
return s == s[::-1]
palindrome(‘taco cat’) # True
1 | ## 不使用 if-else 的计算子 |
import operator
action = {
“+”: operator.add,
“-“: operator.sub,
“/“: operator.truediv,
“*”: operator.mul,
“**”: pow
}
print(action[‘-‘](50, 25)) # 25
```
参考
Python 黑魔法指南 50 例:python.iswbm.com/en/latest/c01/c01_10.html
Python 炫技操作:连接列表的八种方法:python.iswbm.com/en/latest/c01/c01_41.html
Python 炫技操作:判断是否包含子串的七种方法:python.iswbm.com/en/latest/c01/c01_40.html
Python 炫技操作:合并字典的七种方法:python.iswbm.com/en/latest/c01/c01_39.html
Python 炫技操作:条件语句的七种写法:python.iswbm.com/en/latest/c01/c01_37.html
每日一库:sh,最优雅的命令调用方式:python.iswbm.com/en/latest/c01/c01_34.html
Python 开发中有哪些高级技巧?:https://www.zhihu.com/question/23760468
python slots 详解(上篇):https://blog.csdn.net/sxingming/article/details/52892640
30段极简Python代码:这些小技巧你都Get了么:https://zhuanlan.zhihu.com/p/109016233
python进阶系列
python进阶01偏函数
python进阶02yield
python进阶03UnboundLocalError和NameError错误
python进阶04IO的同步异步,阻塞非阻塞
python进阶04IO的同步异步,阻塞非阻塞
python进阶05并发之一基本概念
python进阶05并发之一基本概念
python进阶06并发之二技术点关键词
python进阶07并发之三其他问题
python进阶08并发之四map, apply, map_async, apply_async差异
python进阶09并发之五生产者消费者
python进阶10并发之六并行化改造
python进阶11并发之七多种并发方式的效率测试
python进阶12并发之八多线程与数据同步
python进阶13并发之九多进程和数据共享
python进阶14变量作用域LEGB
python进阶15多继承与Mixin
python进阶16炫技巧
python进阶17正则表达式
python进阶18垃圾回收GC
python进阶19装饰器和闭包
python进阶20之actor
python进阶21再识单例模式