Python编程进阶,常用8大技巧!

Python数据挖掘 数据预处理案例(以航空公司数据为例) 本文根据航空公司系统的客户基本信息数据(文末提供数据和代码),使用Python分别完成数据清洗、数据集成和数据可视化的操作,并给出了完整代码及图文说明,感兴趣的朋友可以进来详细了解。 阅读详情

3ddba63b731701f69d44fb76348b2383.png

选自medium,作者:Martin Heinz

机器之心编译

介绍 Python 炫酷功能(例如,变量解包,偏函数,枚举可迭代对象等)的文章层出不穷。但是还有很多 Python 的编程小技巧鲜被提及。因此,本文会试着介绍一些其它文章没有提到的小技巧,这些小技巧也是我平时会用到的的。让我们一探究竟吧!

整理字符串输入

整理用户输入的问题在编程过程中极为常见。通常情况下,将字符转换为小写或大写就够了,有时你可以使用正则表达式模块「Regex」完成这项工作。但是如果问题很复杂,可能有更好的方法来解决:

user_input = "This\nstring has\tsome whitespaces...\r\n"

character_map = {
    ord('\n') : ' ',
    ord('\t') : ' ',
    ord('\r') : None
}
user_input.translate(character_map)  # This string has some whitespaces...

在本例中,你可以看到空格符「\ n」和「\ t」都被替换成了单个空格,「\ r」都被删掉了。这只是个很简单的例子,我们可以更进一步,使用「unicodedata」程序包生成大型重映射表,并使用其中的「combining()」进行生成和映射,我们可以

迭代器切片(Slice)

如果对迭代器进行切片操作,会返回一个「TypeError」,提示生成器对象没有下标,但是我们可以用一个简单的方案来解决这个问题:

import itertools

s = itertools.islice(range(50), 10, 20)  # <itertools.islice object at 0x7f70fab88138>
for val in s:
    ...

我们可以使用「itertools.islice」创建一个「islice」对象,该对象是一个迭代器,可以产生我们想要的项。但需要注意的是,该操作要使用切片之前的所有生成器项,以及「islice」对象中的所有项。

跳过可迭代对象的开头

有时你要处理一些以不需要的行(如注释)开头的文件。「itertools」再次提供了一种简单的解决方案:

string_from_file = """
// Author: ...
// License: ...
//
// Date: ...
Actual content...
"""

import itertools

for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("\n")):
    print(line)

这段代码只打印初始注释部分之后的内容。如果我们只想舍弃可迭代对象的开头部分(本示例中为开头的注释行),而又不知道要这部分有多长时,这种方法就很有用了。

只包含关键字参数的函数 (kwargs)

当我们使用下面的函数时,创建仅仅需要关键字参数作为输入的函数来提供更清晰的函数定义,会很有帮助:

def test(*, a, b):
    pass

test("value for a", "value for b")  # TypeError: test() takes 0 positional arguments...
test(a="value", b="value 2")  # Works...

如你所见,在关键字参数之前加上一个「*」就可以解决这个问题。如果我们将某些参数放在「*」参数之前,它们显然是位置参数。

创建支持「with」语句的对象

举例而言,我们都知道如何使用「with」语句打开文件或获取锁,但是我们可以实现自己上下文表达式吗?是的,我们可以使用「__enter__」和「__exit__」来实现上下文管理协议:

class Connection:
    def __init__(self):
        ...

    def __enter__(self):
        # Initialize connection...

    def __exit__(self, type, value, traceback):
        # Close connection...

with Connection() as c:
    # __enter__() executes
    ...
    # conn.__exit__() executes

这是在 Python 中最常见的实现上下文管理的方法,但是还有更简单的方法:

from contextlib import contextmanager

@contextmanager
def tag(name):
    print(f"<{name}>")
    yield
    print(f"</{name}>")

with tag("h1"):
    print("This is Title.")

上面这段代码使用 contextmanager 的 manager 装饰器实现了内容管理协议。在进入 with 块时 tag 函数的第一部分(在 yield 之前的部分)就已经执行了,然后 with 块才被执行,最后执行 tag 函数的其余部分。

用「__slots__」节省内存

如果你曾经编写过一个创建了某种类的大量实例的程序,那么你可能已经注意到,你的程序突然需要大量的内存。那是因为 Python 使用字典来表示类实例的属性,这使其速度很快,但内存使用效率却不是很高。通常情况下,这并不是一个严重的问题。但是,如果你的程序因此受到严重的影响,不妨试一下「__slots__」:

class Person:
    __slots__ = ["first_name", "last_name", "phone"]
    def __init__(self, first_name, last_name, phone):
        self.first_name = first_name
        self.last_name = last_name
        self.phone = phone

当我们定义了「__slots__」属性时,Python 没有使用字典来表示属性,而是使用小的固定大小的数组,这大大减少了每个实例所需的内存。使用「__slots__」也有一些缺点:我们不能声明任何新的属性,我们只能使用「__slots__」上现有的属性。而且,带有「__slots__」的类不能使用多重继承。

限制「CPU」和内存使用量

如果不是想优化程序对内存或 CPU 的使用率,而是想直接将其限制为某个确定的数字,Python 也有一个对应的库可以做到:

import signal
import resource
import os

# To Limit CPU time
def time_exceeded(signo, frame):
    print("CPU exceeded...")
    raise SystemExit(1)

def set_max_runtime(seconds):
    # Install the signal handler and set a resource limit
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
    resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
    signal.signal(signal.SIGXCPU, time_exceeded)

# To limit memory usage
def set_max_memory(size):
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    resource.setrlimit(resource.RLIMIT_AS, (size, hard))

我们可以看到,在上面的代码片段中,同时包含设置最大 CPU 运行时间和最大内存使用限制的选项。在限制 CPU 的运行时间时,我们首先获得该特定资源(RLIMIT_CPU)的软限制和硬限制,然后使用通过参数指定的秒数和先前检索到的硬限制来进行设置。最后,如果 CPU 的运行时间超过了限制,我们将发出系统退出的信号。在内存使用方面,我们再次检索软限制和硬限制,并使用带「size」参数的「setrlimit」和先前检索到的硬限制来设置它。

控制可以/不可以导入什么

有些语言有非常明显的机制来导出成员(变量、方法、接口),例如在 Golang 中只有以大写字母开头的成员被导出。然而,在 Python 中,所有成员都会被导出(除非我们使用了「__all__」):

def foo():
    pass

def bar():
    pass

__all__ = ["bar"]

在上面这段代码中,我们知道只有「bar」函数被导出了。同样,我们可以让「__all__」为空,这样就不会导出任何东西,当从这个模块导入的时候,会造成「AttributeError」。

实现比较运算符的简单方法

为一个类实现所有的比较运算符(如 __lt__ , __le__ , __gt__ , __ge__)是很繁琐的。有更简单的方法可以做到这一点吗?这种时候,「functools.total_ordering」就是一个很好的帮手:

from functools import total_ordering

@total_ordering
class Number:
    def __init__(self, value):
        self.value = value

    def __lt__(self, other):
        return self.value < other.value

    def __eq__(self, other):
        return self.value == other.value

print(Number(20) > Number(3))
print(Number(1) < Number(5))
print(Number(15) >= Number(15))
print(Number(10) <= Number(2))

这里的工作原理究竟是怎样的呢?我们用「total_ordering」装饰器简化实现对类实例排序的过程。我们只需要定义「__lt__」和「__eq__」就可以了,它们是实现其余操作所需要的最小的操作集合(这里也体现了装饰器的作用——为我们填补空白)。

结语

并非本文中所有提到的功能在日常的 Python 编程中都是必需或有用的,但是其中某些功能可能会不时派上用场,而且它们也可能简化一些原本就很冗长且令人烦恼的任务。还需指出的是,所有这些功能都是 Python 标准库的一部分。而在我看来,其中一些功能似乎并不像标准库中包含的标准内容,所以当你使用 Python 实现本文提到的某些功能时,请先参阅 Python 的标准库,如果你不能找到想要的功能,可能只是因为你还没有尽力查找(如果真的没有,那它肯定也存在于一些第三方库)。

原文链接:https://medium.com/m/global-identity?redirectUrl=https%3A%2F%2Ftowardsdatascience.com%2Fpython-tips-and-trick-you-havent-already-seen-37825547544f

这是我开发的机器人公众号小号,目前增加了天气查询,955公司名单,关注时间查询;后面还会增加图片功能和每日送书抽奖送书活动,以及调戏功能,欢迎来体验,捧场。

一个机器人公众号已经上线,欢迎调戏


 
推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看B站我的视频!

Python 终极指南:进阶之路 如果你对数据科学、Web 开发、机器人或物联网感兴趣,那你一定要学 Python。由于 Python 被大量使用和广泛应用,它已经成为了增长最快的编程语言。 对于一个初学者或没有技术背景的人来说,学习 Python 是一个不错的选择。它的语法就像使用通俗英语说话和写作一样。以这个语法为例,它展示了和英语的相似性: print("Hello folks") 我们将在这篇教程中采用被广泛使用的Python3,大多数 Python 的框架和库都支持这个版本。 注意:任何高于 3.5.2... 阅读详情

相关推荐

27个实用Python实例

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。最后祝大家天天进步!

Trb601012的博客 2398

编程大神进阶之路:Python技巧小贴士

选自medium本文转自『机器之心』(almosthuman2014)整理字符串输入整理用户输入的问题在编程过程中极为常见。通常情况下,将字符转换为小写或大写就够了,有时...

机器学习算法与Python学习 504

麦克风声源定位原理_声源定位—如何定位到噪声根源?

前言TPA(传递路径分析)专题系列已经开篇。其遵循方法论:源(Source)——路径(Path)——响应(Receiver)有人说TPA好,它可以识别出路径处甚至源的载荷特征,可以量化各个路径的贡献量。有人说声源定位好,不管东西南北中,“源”自其中。但是,声源定位识别出来色彩丰富的一个结果,这结果被您拿来应付工作了,还是真正帮您解决了问题?声源定位定位到了噪声的根源了么?对于一些声源现,...

weixin_39943678的博客 3973

玩转python?一文总结Python入门到进阶的窍门和技巧!(建议收藏)

玩转python?一文总结Python入门到进阶的窍门和技巧!(建议收藏)

python03012的博客 763

别再纠结高边低边了!用TI BQ76952设计两轮车BMS,手把手教你选对架构(附电路图)

本文深度解析基于TI BQ76952芯片的电动两轮车BMS设计策略,涵盖高边/低边驱动选择、四种基础架构的电流路径分析及选型决策矩阵。通过实战案例分享,帮助工程师优化BMS架构,提升系统可靠性和成本效益,特别适合电摩和共享单车应用场景。

weixin_42665255的博客 514

C语言由scanf(“%d“,)非法输入字符造成的死循环及其解决方案

声明:此文章仅作为C语言学习历程中的思路整理,用于解决入门阶段较为浅显的问题,如有错误还请指正。 现象描述: 代码要求实现用户输入1或2,通过scanf("%d",&a)读取这个值,从而判断分属于1或2的两种情况。输入非1,2的数字都应该返回"Invalid Number!",并且要求重新输入数字。 while(a!=1&&a!=2) { printf("Invalid Number!\n"); printf("Enter the number:"); scan

weixin_49764077的博客 8719

Python 编程进阶,常用 8 大技巧!

并非本文中所有提到的功能在日常的 Python 编程中都是必需或有用的,但是其中某些功能可能会不时派上用场,而且它们也可能简化一些原本就很冗长且令人烦恼的任务。还需指出的是,所有这些功能都是 Python 标准库的一部分。而在我看来,其中一些功能似乎并不像标准库中包含的标准内容,所以当你使用 Python 实现本文提到的某些功能时,请先参阅 Python 的标准库,如果你不能找到想要的功能,可能只是因为你还没有尽力查找(如果真的没有,那它肯定也存在于一些第三方库)。

大模型研究中心 104

告别重启烦恼:用WSL2让Docker和VMware在Win10上真正共存

本文详细介绍了如何在Windows 10系统上,借助WSL2实现Docker与VMware的真正共存,彻底告别以往需要反复重启切换的烦恼。通过启用Hyper-V兼容模式并进行正确配置,开发者无需重启即可同时高效运行容器和虚拟机,显著提升开发与测试工作流的连续性和效率。

salt9的博客 987

Python编程进阶,常用8大技巧!建议收藏!

并非本文中所有提到的功能在日常的 Python 编程中都是必需或有用的,但是其中某些功能可能会不时派上用场,而且它们也可能简化一些原本就很冗长且令人烦恼的任务。还需指出的是,所有这些功能都是 Python 标准库的一部分。而在我看来,其中一些功能似乎并不像标准库中包含的标准内容,所以当你使用 Python 实现本文提到的某些功能时,请先参阅 Python 的标准库,如果你不能找到想要的功能,可能只是因为你还没有尽力查找(如果真的没有,那它肯定也存在于一些第三方库)。

2301_78098637的博客 320

通俗傻瓜式理清光栅化渲染和光线追踪渲染的原理

用通俗语言傻瓜式的讲清楚光栅渲染和光线追踪渲染的原理,方便没有相关理论基础的朋友理解入门。

qq_37366618的博客 2万+

深度学习batch、batch_size、epoch、iteration以及小样本中episode、support set、query set关系

训练整个数据集是epoch、把数据集分为多少小块就是batch,每个小块(batch)多少个数据就是batch_size,整个数据集需要训练多少轮是iteration

qq_42740834的博客 1610

8个Python编程进阶常用技巧!

最后,如果 CPU 的运行时间超过了限制,我们将发出系统退出的信号。当我们定义了「__slots__」属性时,Python 没有使用字典来表示属性,而是使用小的固定大小的数组,这大大减少了每个实例所需的内存。我们只需要定义「__lt__」和「__eq__」就可以了,它们是实现其余操作所需要的最小的操作集合(这里也体现了装饰器的作用——为我们填补空白)。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

m0_59236602的博客 919

STM32F407硬件SPI驱动ADS1220避坑指南:从寄存器读不到数据到采样值异常的完整解决流程

本文详细解析了STM32F407硬件SPI驱动ADS1220的常见问题与解决方案,包括SPI配置、寄存器读取异常、采样值优化等关键环节。通过CubeMX配置技巧和Keil调试经验,帮助开发者快速排查从通信失败到数据异常的各种问题,实现高精度数据采集系统的稳定运行。

weixin_26878995的博客 158

Python编程进阶,常用8大教程!

并非本文中所有提到的功能在日常的 Python 编程中都是必需或有用的,但是其中某些功能可能会不时派上用场,而且它们也可能简化一些原本就很冗长且令人烦恼的任务。还需指出的是,所有这些功能都是 Python 标准库的一部分。而在我看来,其中一些功能似乎并不像标准库中包含的标准内容,所以当你使用 Python 实现本文提到的某些功能时,请先参阅 Python 的标准库,如果你不能找到想要的功能,可能只是因为你还没有尽力查找(如果真的没有,那它肯定也存在于一些第三方库)。

Icardi9的博客 851

yolov5 FPGA实现及verilog代码仿真

本文介绍了一种基于FPGA的卷积神经网络加速器设计,采用混合架构实现网络功能。该系统将训练和图像预处理等复杂计算保留在PC端执行,仅将主干网络部署在FPGA上。由于片上资源限制,建议通过外接DDR存储扩展容量。文章提供了完整的Verilog HDL源码,包括卷积单元(convUnit)、卷积层(convLayerSingle)和处理单元(processingElement)等核心模块,均已通过仿真验证。该设计采用流水线结构,使用浮点运算单元实现卷积计算,支持32x32图像输入和5x5卷积核处理。系统架构图中

QQ_778132974的博客 576

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python进阶常用的技巧及方法!

自定义异常可以用来处理特定的错误情况,使代码更具可读性和可维护性.pass")try:print(e)

m0_75067629的博客 1199

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 给Python初学者推荐的IDE!
下一篇: Pycharm那些隐藏的实用小技巧,最后一个是大招!
菜鸟学Python
博客等级 码龄9年 8061粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值