python代码的12个最佳使用技巧
2026/9/1 17:19:02 网站建设 项目流程

0x01面向对象

存在着一门语言, 这门语言是面向对象的那种, 所以呢, 于我们而言, 具备熟悉面向对象的一些诸如设计原则之类内容的必要性。

单一职责原则所表达的是, 一个函数应当仅仅去做一件事情, 而不要把好多不同的功能都集中落实在同一个函数里面, 不要追求大而全这套, 应该追求搞小而精, 如此一来, 当出现需求产生变化这种情况的时候, 我们仅仅只需要去修改与之对应的那部分就行, 程序面对变化所具备的能力会显著得到提升。

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

做程序编写工作的人都清楚, 甲方的想法是极易改变的, 今儿讲要以这种途径达成, 明儿大概就反悔了, 这实在是极为平常的事儿。因而咱们在编写程序之际务必要留意程序具备可扩展性, 当甲方修正需求之时, 我们要尽可能减少对原有代码的改动或者根本不做改动, 而是借助增加新的实现类来拓展功能, 这表明你系统最初的功能是不会受到损害的, 进而稳定性会有极大程度的提高。

遵循接口隔离原则就意味着, 调用方不可以、不应当去依赖那些其自身并不需要的接口, 并且, 接口之间所形成的依赖关系一定得是基于最小功能接口原则进而建立起来的。

把单一职责用于提高类的内聚性, 将接口隔离针对降低它们之间的耦合性, 那两者都是在对面向对象封装思想进行完美体现。

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文件, 鉴于你能够借助pd.()轻松达成读取操作, 然而于读取别样类型文件之际, 其仍旧具备相当的用途, 比如在从文件里读取数据之时常常会用到它。

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

0x03生成器

我们都清楚, 借助列表生成式能够直接构建一个全新的列表, 然而, 受到机器内存的约束, 列表的容量必然是存在一定限制的。要是列表当中的数据是依据某种规律推导计算而得来的, 那么, 是否能够在迭代的进程里持续地推算出后续的元素呢? 如此一来, 便无需一次性将整个列表创建完成, 而是依据需求使用就行, 在这个时候, 生成器就发挥作用了。

0x04迭代工具

和库相同, 并且存在另一个库, 它对于某些问题切实能够高效地予以解决。其中存在一个用例是查找所有组合, 它可以向你告知在一个组中元素所具有的全部不能够的组合方式。

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())

若是这样, 其方式乃是借助列表理解达成此事。列表理解存在一种优雅的办法铸就列表。

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

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

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

0x06从字典中获取元素

我承认, 尝试代码, 它并不雅致, 不过, 这里存在一种简单方法, 去尝试, 在字典之中查找键, 如果没有找到对应的数值, 将会把第二个参数设置为该变量的值。

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]

除了内置的数据类型之外, 在模块当中同样还涵盖一些特别的用例, 在某些场合是非常实用的, 要是你参加过处于这一年的, 你甚至也能够找寻到它的实用之处。

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循环处于中的状态是动态的, 它的运行时长相比于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计数时使用计数对象

这听着明显得很, 可常常被人忘掉。对多数程序员来讲, 数某个东西是个挺常见的任务, 并且在多数情形下算得上不算十分有挑战性的事儿——这儿存在几种能更简便完成这类任务的办法。

的类库里有个内置的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使用内置库和函数

存在着数量极大的库函数以及模块, 这些库函数和模块是由具备专业能力的开发人员所编撰的, 并且经历了许多次的测试, 所以, 这些函数具备相当高的效率, 并且有利于加快代码运行速度——要是函数在库里面已然是可用状态, 那么就无需去编写代码, 在这个方面, 我们列举出一个简易的例子。

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

在这个地方, 第二段代码相较于第一段代码而言速度更快, 这究竟是为何? 原来是因为运用了库函数 map()。并且, 这些函数对于初学者来讲是颇为便利的。话说回来, 哪个人会不想要去编写那种速度更快、表达更简洁以及所占空间更小的代码? 所以, 要尽可能多地去运用库函数以及模块。

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

将适当的数据结构加以使用, 能够使运行时实现减少。在一开始着手之前, 你务必要针对会于代码里运用的数据结构展开考虑。一种堪称完美的数据结构, 会让代码的速度得以加快, 然而别的人却会把它弄糟。你得对不同数据结构的时间复杂性有所了解。存在着诸如列表(list)、元组(tuple)、集合(set)以及字典(dict)这样的内置数据结构。人们惯常于使用列表。可是在某些情形之下, 元组或者字典比列表的工作表现要好得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询