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 = https://www.tz-job.com/b/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 = https://www.tz-job.com/b/{‘user’: 1, ‘name’: ‘Max’, ‘three’: 4}
try:
is_admin = data[‘admin’]
except KeyError:
is_admin = False
替换成这样
data = https://www.tz-job.com/b/{‘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代码的速度,而其他人会把它搞砸 。你必须了解不同数据结构的时间复杂性 。Python有内置的数据结构,如列表(list)、元组(tuple)、set和字典(dictionary) 。人们习惯于使用列表 。但在某些情况下,元组或字典比列表工作得好得多 。
- 马岱制胜绝技是什么 马岱是怎么死的
- 幼儿英语好处与坏处 幼儿学英语的好处和重要性
- 突然吃姜吃到上瘾是怎么回事
- 睡觉梦见死人好不好 为什么做梦总能梦见早以死去的人 梦见死人是什么意思
- 藏红花泡水喝的正确方法和时间
- 燕窝炖出来是一根一根的吗
- 燕窝炖完一丝一丝的好还是粘粘的好
- 燕窝炖出来是稀的还是粘稠的好
- 燕窝炖好后是脆的还是粘稠的
- 燕窝蒸好是什么样子 吃燕窝的注意事项 燕窝蒸好是什么样子