百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

python代码的12个最佳使用技巧(python代码复制100个的方法)

itomcoil 2025-03-14 18:07 26 浏览

0x01面向对象

Python 是一门面向对象语言,因此我们有必要熟悉面向对象的一些设计原则。

单一职责原则是指一个函数只做一件事,不要将多个功能集中在同一个函数中,不要大而全,要小而精。这样,当有需求变化时,我们只需要修改对应的部分即可,程序应对变化的能力明显提升。

开放封闭原则是指对扩展开放,对修改关闭。

写程序的都知道,甲方是善变的,今天说用这种方式实现,明天可能就变卦了,这太正常了。所以我们写程序时一定要注意程序的可扩展性,当甲方改动需求时,我们尽可能地少改动或者不改动原有代码,而是通过添加新的实现类来扩展功能,这意味着你系统的原有功能是不会遭到破坏的,则稳定性有极大提升。

接口隔离原则是指调用方不应该依赖其不需要的接口,接口间的依赖关系应当建立在最小功能接口原则之上。

单一职责和接口隔离都是为了提高类的内聚性,降低他们之间的耦合性。这是面向对象封装思想的完美体现。

0x02对文件对象使用with语句

当在一个项目上工作时,我们经常会对文件进行读写操作。最常见的方法是使用open()函数打开一个文件,它会创建一个我们可以操作的文件对象,然后作为一个习惯的做法,我们应该使用close()关闭该文件对象。

f = open('dataset.txt', 'w')
f.write('new_data')
f.close()

这很容易记住,但有时写了几个小时的代码,我们可能会忘记用f.close()关闭f文件。这时,with语句就派上了用场。with语句将自动关闭文件对象f,形式如下:

with open('dataset.txt', 'w') as f:
    f.write('new_data')

有了这个,我们可以保持代码的简短。

你不需要用它来读取CSV文件,因为你可以用pandas的 pd.read_csv()轻松地读取,但在读取其他类型的文件时,这仍然很有用。例如,从pickle文件中读取数据时经常使用它。

import pickle 
# 从pickle文件中读取数据集
with open(‘test’, ‘rb’) as input:
    data = pickle.load(input)

0x03生成器

我们都知道通过列表生成式可以直接创建一个新的列表,但受机器内存限制,列表的容量肯定是有限的。如果列表里面的数据是通过某种规律推导计算出来的,那是否可以在迭代过程中不断地推算出后面的元素呢,这样就不必一次性创建完整个列表,按需使用即可,这时候生成器就派上用场了。

0x04迭代工具

和collections库一样,还有一个库叫itertools,对某些问题真能高效地解决。其中一个用例是查找所有组合,他能告诉你在一个组中元素的所有不能的组合方式

from itertools import combinations
teams = ["Packers", "49ers", "Ravens", "Patriots"]
for game in combinations(teams, 2):
    print game
>>> ('Packers', '49ers')
>>> ('Packers', 'Ravens')
>>> ('Packers', 'Patriots')
>>> ('49ers', 'Ravens')
>>> ('49ers', 'Patriots')
>>> ('Ravens', 'Patriots')

0x05使用列表理解法

清洗和处理数据的一个常见步骤是修改现有的列表。比如,我们有以下需要大写的列表:

words = ['california', 'florida', 'texas']

将words列表的每个元素大写的典型方法是创建一个新的大写列表,执行一次 for 循环,使用.title(),然后将每个修改的值附加到新的列表中。

capitalized = []
for word in words:
    capitalized.append(word.title())

然而,Pythonic的方法是使用列表理解来做到这一点。列表理解有一种优雅的方法来制作列表。

你可以用一行代码重写上面的for循环:

capitalized = [word.title() for word in words]

由此我们可以跳过第一个例子中的一些步骤,结果是一样的。

0x06从字典中获取元素

我承认try/except代码并不雅致,不过这里有一种简单方法,尝试在字典中查找key,如果没有找到对应的alue将用第二个参数设为其变量值。

data = {'user': 1, 'name': 'Max', 'three': 4}
try:
   is_admin = data['admin']
except KeyError:
   is_admin = False

替换成这样

data = {'user': 1, 'name': 'Max', 'three': 4}
is_admin = data.get('admin', False)

0x07获取列表的子集

有时,你只需要列表中的部分元素,这里是一些获取列表子集的方法。

x = [1,2,3,4,5,6]
#前3个
print x[:3]
>>> [1,2,3]
#中间4个
print x[1:5]
>>> [2,3,4,5]
#最后3个
print x[3:]
>>> [4,5,6]
#奇数项
print x[::2]
>>> [1,3,5]
#偶数项
print x[1::2]
>>> [2,4,6]

除了python内置的数据类型外,在collection模块同样还包括一些特别的用例,在有些场合Counter非常实用。如果你参加过在这一年的Facebook HackerCup,你甚至也能找到他的实用之处。

from collections import Counter
print Counter("hello")
>>> Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})

0x08多重赋值

你是否曾想减少用于创建多个变量、列表或字典的代码行数?那么,你可以用多重赋值轻松做到这一点。

# 原始操作
a = 1
b = 2
c = 3
# 替代操作
a, b, c = 1, 2, 3
# 代替在不同行中创建多个列表
data_1 = []
data_2 = []
data_3 = []
data_4 = []
# 可以在一行中创建它们的多重赋值
data_1, data_2, data_3, data_4 = [], [], [], []
# 或者使用列表理解法
data_1, data_2, data_3, data_4 = [[] for i in range(4)]

0x09尽量减少使用for循环

很难避免使用for循环。但专家说,只要你有机会预防,你就会去做。For循环在python中是动态的。它的运行时间比while循环要长。嵌套的for循环更耗时。两个嵌套的for循环将在一个for循环中占用时间的平方。

#code1
for i in big_it:
    m = re.search(r'\d{2}-\d{2}-\d{4}', i)
    if m:
        ...

#code2
date_regex = re.compile(r'\d{2}-\d{2}-\d{4}')

for i in big_it:
    m = date_regex.search(i)
    if m:
        ...

在这种情况下,最好使用合适的替代品。此外,如果不可避免要使用for循环,则将计算移出循环。这样可以节省很多时间。我们可以从上面的例子中看到这一点。在这里,第二个代码比第一个代码快,因为计算是在循环之外完成的。

0x10计数时使用Counter计数对象

这听起来显而易见,但经常被人忘记。对于大多数程序员来说,数一个东西是一项很常见的任务,而且在大多数情况下并不是很有挑战性的事情——这里有几种方法能更简单的完成这种任务。

Python的collections类库里有个内置的dict类的子类,是专门来干这种事情的:

>>> from collections import Counter
>>> c = Counter('hello world')

>>> c
Counter({'l': 3, 'o': 2, ' ': 1, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})

>>> c.most_common(2)
[('l', 3), ('o', 2)]

0x11使用内置库和函数

Python有大量的库函数和模块。它们是由专业的开发人员编写的,并经过了多次测试。因此,这些函数是非常高效的,并有助于加速代码——如果函数在库中已经可用,则不需要编写代码。在这方面,我们举一个简单的例子。

#code1
newlist = []
for word in oldlist:
    newlist.append(word.upper())

#code2
newlist = map(str.upper, oldlist)

在这里,第二段代码比第一段代码快,因为使用了库函数map()。这些函数对初学者来说很方便。谁不想编写更快、更简洁、更小的代码呢?因此,尽可能多地使用库函数和模块。

0x12正确的数据结构在正确的位置

使用适当的数据结构将减少运行时。在开始之前,您必须考虑将在代码中使用的数据结构。一个完美的数据结构会加快python代码的速度,而其他人会把它搞砸。你必须了解不同数据结构的时间复杂性。Python有内置的数据结构,如列表(list)、元组(tuple)、set和字典(dictionary)。人们习惯于使用列表。但在某些情况下,元组或字典比列表工作得好得多。

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...