这几个冷门但实用的 Python 技巧你还不知道?-程序员宅基地

这篇文章主要和大家分享一些 Python 不一样的技巧,感受 Python 带给你的乐趣吧。

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

大家知道 Python 中的信息打印函数 Print,一般我们会使用它打印一些东西,作为一个简单调试。

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

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

在控制台或者 Pycharm 运行这段代码之后你会得到结果。

Error:important

其中 Error 是红色加下划线的,important 为默认色

下面可以设置的参数:

说明:
前景色            背景色           颜色
---------------------------------------
30                40              黑色
31                41              红色
32                42              绿色
33                43              黃色
34                44              蓝色
35                45              紫红色
36                46              青蓝色
37                47              白色

显示方式           意义
-------------------------
0                终端默认设置
1                高亮显示
4                使用下划线
5                闪烁
7                反白显示
8                不可见

例子:
[1;31;40m    <!--1-高亮显示 31-前景色红色  40-背景色黑色-->

2.在 Python 中使用定时器

今天看到一个比较人性化的定时模块 schedule,目前 star 数为 6432,还是非常的受欢迎,这个模块也是秉承这 For Humans 的原则,这里推荐给大家。地址 https://github.com/dbader/schedule

1.通过 pip 即可安装。

pip install schedule

2.使用案例

import schedule
import time

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

schedule.every(10).minutes.do(job) 
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
schedule.every().minute.at(":17").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

从单词的字面意思,你就知道这是做什么的。schedule.every().monday.do(job)

3.实现一个进度条

from time import sleep

def progress(percent=0, width=30):
    left = width * percent // 100
    right = width - left
    print('
[', '#' * left, ' ' * right, ']',
          f' {percent:.0f}%',
          sep='', end='', flush=True)

for i in range(101):
    progress(i)
    sleep(0.1)

展示效果

640?wx_fmt=gif

别卧槽了,赶紧快试试吧。2_02.png

上面的代码中的 print 有几个有用的参数,sep 的作用是已什么为分隔符,默认是空格,这里设置为空串是为了让每个字符之间更紧凑,end 参数作用是已什么结尾,默认是回车换行符,这里为了实现进度条的效果,同样设置为空串。还有最后一个参数 flush,该参数的作用主要是刷新, 默认 flush = False,不刷新,print 到 f 中的内容先存到内存中;而当 flush = True 时它会立即把内容刷新并输出。

之前在Python 下载夏目友人帐中提到饿的 tqdm 模块,更好的实现一个进度条.

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

大家应该都有印象,在打印 json 字符串或者字典的时候,打印出的一坨东西根本就没有一个层次关系,这里主要说的就是输出格式的问题。

import json
my_mapping = {'a': 23, 'b': 42, 'c': 0xc0ffee}
print(json.dumps(my_mapping, indent=4, sort_keys=True))

大家可以自己试试只用 print 打印 my_mapping,和例子的这种打印方法。

import pprint
my_mapping = [{'a': 23, 'b': 42, 'c': 0xc0ffee},{'a': 231, 'b': 42, 'c': 0xc0ffee}]
pprint.pprint(my_mapping,width=4)

5.功能简单的类使用 namedtuple 和 dataclass 的方式定义

有时候我们想实现一个类似类的功能,但是没有那么复杂的方法需要操作的时候,这个时候就可以考虑下下面两种方法了。

from collections import namedtuple

# 以前简单的类可以使用 namedtuple 实现。
Car = namedtuple('Car', 'color mileage')

my_car = Car('red', 3812.4)
print(my_car.color)
print(my_car)

但是呢,所有属性需要提前定义好才能使用,比如想使用my_car.name,你就得把代码改成下面的样子。

from collections import namedtuple

# 以前简单的类可以使用 namedtuple 实现。
Car = namedtuple('Car', 'color mileage name')

my_car = Car('red', 3812.4,"Auto")
print(my_car.color)
print(my_car.name)

使用 namedtuple 的缺点很明显了。

所以现在更优的方案,那就是 Python3.7 加入到标准库的 dataclass。

from dataclasses import dataclass
@dataclass
class Car:
    color: str
    mileage: float

my_car = Car('red', 3812.4)
print(my_car.color)
print(my_car)

6.f-string 的 !r,!a,!s

f-string出现在Python3.6,作为当前最佳的拼接字符串的形式,看下 f-string 的结构

f ' <text> { <expression> <optional !s, !r, or !a> <optional : format specifier> } <text> ... '

其中'!s' 在表达式上调用str(),'!r' 调用表达式上的repr(),'!a' 调用表达式上的ascii()

class Comedian:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def __str__(self):
        return f"{self.first_name} {self.last_name} is {self.age}."

    def __repr__(self):
        return f"{self.first_name} {self.last_name} is {self.age}. Surprise!"

调用

>>> new_comedian = Comedian("Eric", "Idle", "74")
>>> f"{new_comedian}"
'Eric Idle is 74.'

>>> f"{new_comedian}"
'Eric Idle is 74.'
>>> f"{new_comedian!r}"
'Eric Idle is 74. Surprise!'

(2.!a的例子

>>> a = 'some string'
>>> f'{a!r}'
"'some string'"

等价于

>>> f'{repr(a)}'
"'some string'"

(3.!d的例子

类似2

pycon2019有人提出的一个展望!d的功能实现:

640?wx_fmt=jpeg

7.f-string 里"="的应用

在 Python3.8 里有这样一个功能

a = 5
print(f"{a=}")

打印之后的结果为

a=5

是不是很方便,不用你再使用f"a={a}"了。

8.海象运算符:=的是使用

a =6
if (b:=a+1)>6:
   print(b)

赋值的时候同时可以进行运算,和 Go 语言的赋值类似了。

b =7
if b>6:
   print(b)

怎么样是不是简单了不少,不过这个功能 3.8 开始才能用哦。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wade1203/article/details/100145487

智能推荐

使用FP-growth算法来高效发现频繁项集_三名狂客的博客-程序员宅基地

FP-growth算法是一种用于发现数据集中频繁模式的有效方法。可以使用FP-growth算法在多种文本档中查找频繁单词。FP-growth算法能够更加高效地发现频繁项集,但不能用于发现关联规则。 FP-growth算法的一般流程 (1)收集数据:使用任意方法。 (2)准备数据:需要离散的数据 (3)分析数据: 使用任意的方法 (4)

操作系统五六章作业答案_考虑下面的动态改变优先级_Zpadger的博客-程序员宅基地

习题 5.1为什么对调度程序而言,区分CPU约束程序和I/O约束程序很重要? 答:CPU的成功调度依赖于进程的如下属性:进程执行由CPU执行和I/O等待周期组成,进程在这两个状态之间切换。进程执行从CPU区间开始,在这之后是I/O区间,接着是另一个CPU区间,如此进行下去;最终,最后的CPU区间通过系统请求终止执行。这些CPU区间的长度呈现出指数或超指数形式的频率曲线,具有大量_考虑下面的动态改变优先级

2021机器学习研究风向是啥?MLP→CNN→Transformer→MLP!_人工智能与算法学习的博客-程序员宅基地

来源:专知就在2月份,Transformer还横扫CV和NLP各种task。但到了5月份,似乎一切变了。近来,谷歌、清华、Facebook相继发表了关于多层感知机(MLP)的工作,MLP→..._zhang等人(2021)提出了一种融合深度强化学习和多目标粒子群算法的mcv路径规划方法

GitHub 标星 2.7w+!超全大厂面试笔记整理!_GitHubDaily的博客-程序员宅基地

关注“GitHubDaily”设为 “星标”,每天带你逛 GitHub!本文转自新智元,作者大明、闻菲去年,在 GitHub 上有位 id 为 imhuay 的热心人带..._github 计算机面试笔记

vs2013+opencv3.4 应用程序无法启动,编译能通过,运行出现应用程序无法正常启动0xc000007b的错误_刘大望的博客-程序员宅基地

今天使用VS2013+Opencv2.4.11时,编译能通过,运行出现应用程序无法正常启动0xc000007b的错误解决方案:dll的问题又尝试了VS安装修复,结果依然没用。最后发现是环境变量的问题,没有添加E:\opencv2.4.11\build\x86\vc12\lib到环境变量中,以致于VS +win32模式用不了,添加完之后就好啦 如果1还是不能解决问题,还要把下图以下.d...

Unity解决:Deterministic compilation failed. You can disable Deterministic builds in Player Settings_WT阿莫的博客-程序员宅基地

Unity解决:Deterministic compilation failed. You can disable Deterministic builds in Player Settings_deterministic compilation failed. you can disable deterministic builds in pl

随便推点

安装mysql8.0.27_mysql8.9.27安装_清风不过万人关的博客-程序员宅基地

下载网址:https://dev.mysql.com/downloads/点击这里,开始下载安装配置解压安装包我这里解压到的d盘打开D:\mysql-8.0.27-winx64编写MySQL配置文件在解压目录下新建my.ini文件 [mysqld]# 设置3306端口port=3306# 设置mysql的安装目录 ----------是你的文件路径-------------basedir=D:\mysql-8.0.26-winx64\my..._mysql8.9.27安装

槽机制的第五个参数Qt::ConnectionType_漫天飞舞的雪花的博客-程序员宅基地

转载处:https://blog.csdn.net/kaida1234/article/details/79557348原来对QThread的理解,就是重写run(),曾经还一度搞不明白,到底它的槽属于主线程还是子线程。后来学了MFC,一度觉得MFC的机制比较人性化,起码有工作线程和界面线程的用法,而不像QThread只有run是真正活在子线程里面的。而直到今天再次研究QThread,发现...

oracle+11+rac+asm,如何获取Oracle11gRACasmspfile的位置_AnandaKrishnaDasi的博客-程序员宅基地

如何获取 Oracle 11g RAC asm spfile 的位置首页 → 数据库技术背景:阅读新闻如何获取 Oracle 11g RAC asm spfile 的位置[日期:2014-07-22]来源:Linux社区作者:lixora[字体:]如何获取 Oracle 11g RAC asm spfile 的位置方法一:[root@vmrac1 ~]# su - grid[grid@vmrac1...

解决ADAMS和ABAQUS共用证书不能同时使用的问题(持续更新)_abaqus 证书_Mr.YunLong的博客-程序员宅基地

ADAMS启动问题 ,打开aview卡在出现开始界面一直不动,以及ADAMS和ABAQUS的共用证书问题,一篇文章全部解决。(持续更新)_abaqus 证书

带参方法与返回值的几个例子_diling5240的博客-程序员宅基地

1.带一个参数的方法 1 package cn.happy3; 2 3 public class MyMain { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 //1.购买一台榨汁机...

<context:component-scan base-package=com.xxx.xxx/ >包扫描注解_Ethan_Fu的博客-程序员宅基地

扫描指定的包中的类上的注解,常用的注解有:@Controller 声明Action组件@Service 声明Service组件 @Service("myMovieLister") @Repository 声明Dao组件@Component 泛指组件, 当不好归类时. @RequestMapping("/menu") 请求映射@Resource 用于注

推荐文章

热门文章

相关标签