Python实用技巧(一)

1、print 打印带有颜色的信息

def esc(code=0):
    return f'\033[{code}m'

print(esc('1;31;43') + 'Error:'+esc()+'important')

执行后会输出

其中最主要的就是f’\033[{code}m’部分的设置。

这叫ANSI颜色序列格式,通过/033转义为控制颜色的命令。

其标准形式为

\033[n1 [;n2 [;…]] m

n1,n2,n3为设置的值。其含义为

以下参考了博客Linux终端和win32控制台文本颜色输出

编码 说明
0 关闭所有格式,还原为初始状态
1 粗体/高亮显示
2 模糊(
3 斜体(
4 下划线(单线)
5 闪烁(慢)
6 闪烁(快)(
7 交换背景色与前景色
8 隐藏(伸手不见五指,啥也看不见)(
30-37 前景色,即30+x,x表示不同的颜色(参见下面的“颜色表”)
40-47 背景色,即40+x,x表示不同的颜色(参见下面的“颜色表”)

注:(1)其中含有(※)标注的编码表示不是所有的终端仿真器都支持,只有少数仿真器支持。

​ (2)多个SGR参数可以组合使用,例如:echo -e “\x1b[31;4mRed Underline Text\e[0m”输出红色下划线字体“Red Underline Text”。

颜色表:

颜色值x 0 1 2 3 4 5 6 7
颜色 绿

这样的话\033[1;31;43m中1代表粗体高亮显示,31代表前景色为红色,43代表背景色为黄色。

另外

def esc(code=0):
    return f'\033[{code}m'

是将其封装了起来,只需要填入控制颜色的数字字符串就行,比如'1;31;43'

注:1、输入为字符串格式;2、每个数字之间用分号连接

然后,f'\033[{code}m'是什么意思呢?

  • 字符串前加 u表示后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。不过一般情况下Python默认编码是utf-8。支持中文字符,所以一般不用专门加u
  • 字符串前加 r表示不使用转义字符,比如’\n‘就是’\n‘,不转义为换行了。
  • 字符串前加 b,表示以bytes类型储存字符串。一般用来发送数据流。服务器和硬件开发可能用得到。
  • 字符串前加 f表示在字符串内支持大括号内的python 表达式

所以f'\033[{code}m'表示先执行code会输出code表示的字符串,(code默认为0,输出为字符串0),然后与其他部分拼接到一块,形成f'\033['1;31;43'm'

2、在Python中使用定时器

import schedule
import time

def job():
    print("I'm working...")

schedule.every(10).minutes.do(job) #每隔十分钟执行一次job
schedule.every(10).seconds.do(job)#每隔十秒钟执行一次job

schedule.every().hour.do(job)#每隔十秒钟执行一次job
schedule.every().day.at("10:30").do(job)#每天10:30执行一次job
schedule.every().monday.do(job)#每周一执行一次job
schedule.every().wednesday.at("13:15").do(job)#每周三13:15执行一次job
schedule.every().minute.at(":17").do(job)#每分钟的第17秒执行一次job



while True:
    schedule.run_pending()##执行到时间的任务
    time.sleep(1)#每隔一秒检测一次

3、实现一个进度条

from time import sleep

def progress(percent=0, width=30):
    left = width * percent // 100
    right = width - left
    print('\r[', '#' * left, ' ' * right, ']',#\r是转义字符回车
          f' {percent:.0f}%',
          sep='', end='', flush=True)#sep是分割字符(默认为空格),end是结尾字符(默认为换行)flush是刷新控制台的字符,这是实现进度条的核心所在

for i in range(101):
    progress(i)#从1%到100%
    sleep(0.1)

默认 flush = False,不刷新,print 到 f 中的内容先存到内存中;而当 flush = True 时它会立即把内容刷新并输出。

之前在Python 下载夏目友人帐中提到饿的 tqdm 模块,更好的实现一个进度条.(还有实现下载视频),抽空实现一下下载视频这种大文件。

4、优雅的打印嵌套类型数据

不一定用得到,就是为了好看而已。

#第一种实现方法
import json
my_mapping = {'a': 23, 'b': 42, 'c': 0xc0ffee}
print(json.dumps(my_mapping, indent=4, sort_keys=True))

#第二种实现方法
import pprint
my_mapping = [{'a': 23, 'b': 42, 'c': 0xc0ffee},{'a': 231, 'b': 42, 'c': 0xc0ffee}]
pprint.pprint(my_mapping,width=4)

本文主要参考了别再说学习无趣了,跟你分享这 8 条 Python 奇技淫巧!,其他我觉得并没什么用。所以不做过多陈述了

5. 极其有用的Jupyter notebook插件

安装扩展插件

pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install

然后激活自己想用的插件即可

参考Jupyter Notebook 五大效率插件 (qq.com) 和[Jupyter Notebook Extensions. How to get the most from the notebook… by Will Koehrsen Towards Data Science](https://towardsdatascience.com/jupyter-notebook-extensions-517fa69d2231)