欢迎大家来到IT世界,在知识的湖畔探索吧!
0x01面向对象
Python 是一门面向对象语言,因此我们有必要熟悉面向对象的一些设计原则。
单一职责原则是指一个函数只做一件事,不要将多个功能集中在同一个函数中,不要大而全,要小而精。这样,当有需求变化时,我们只需要修改对应的部分即可,程序应对变化的能力明显提升。
开放封闭原则是指对扩展开放,对修改关闭。
写程序的都知道,甲方是善变的,今天说用这种方式实现,明天可能就变卦了,这太正常了。所以我们写程序时一定要注意程序的可扩展性,当甲方改动需求时,我们尽可能地少改动或者不改动原有代码,而是通过添加新的实现类来扩展功能,这意味着你系统的原有功能是不会遭到破坏的,则稳定性有极大提升。
接口隔离原则是指调用方不应该依赖其不需要的接口,接口间的依赖关系应当建立在最小功能接口原则之上。
单一职责和接口隔离都是为了提高类的内聚性,降低他们之间的耦合性。这是面向对象封装思想的完美体现。
0x02对文件对象使用with语句
当在一个项目上工作时,我们经常会对文件进行读写操作。最常见的方法是使用open()函数打开一个文件,它会创建一个我们可以操作的文件对象,然后作为一个习惯的做法,我们应该使用close()关闭该文件对象。
f = open('dataset.txt', 'w') f.write('new_data') f.close()
欢迎大家来到IT世界,在知识的湖畔探索吧!
这很容易记住,但有时写了几个小时的代码,我们可能会忘记用f.close()关闭f文件。这时,with语句就派上了用场。with语句将自动关闭文件对象f,形式如下:
欢迎大家来到IT世界,在知识的湖畔探索吧!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生成器
我们都知道通过列表生成式可以直接创建一个新的列表,但受机器内存限制,列表的容量肯定是有限的。如果列表里面的数据是通过某种规律推导计算出来的,那是否可以在迭代过程中不断地推算出后面的元素呢,这样就不必一次性创建完整个列表,按需使用即可,这时候生成器就派上用场了。
欢迎大家来到IT世界,在知识的湖畔探索吧!
0x04迭代工具
和collections库一样,还有一个库叫itertools,对某些问题真能高效地解决。其中一个用例是查找所有组合,他能告诉你在一个组中元素的所有不能的组合方式
欢迎大家来到IT世界,在知识的湖畔探索吧!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(),然后将每个修改的值附加到新的列表中。
欢迎大家来到IT世界,在知识的湖畔探索吧!capitalized = [] for word in words: capitalized.append(word.title())
然而,Pythonic的方法是使用列表理解来做到这一点。列表理解有一种优雅的方法来制作列表。
你可以用一行代码重写上面的for循环:
capitalized = [word.title() for word in words]
由此我们可以跳过第一个例子中的一些步骤,结果是一样的。
0x06从字典中获取元素
我承认try/except代码并不雅致,不过这里有一种简单方法,尝试在字典中查找key,如果没有找到对应的alue将用第二个参数设为其变量值。
欢迎大家来到IT世界,在知识的湖畔探索吧!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获取列表的子集
有时,你只需要列表中的部分元素,这里是一些获取列表子集的方法。
欢迎大家来到IT世界,在知识的湖畔探索吧!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多重赋值
你是否曾想减少用于创建多个变量、列表或字典的代码行数?那么,你可以用多重赋值轻松做到这一点。
欢迎大家来到IT世界,在知识的湖畔探索吧!# 原始操作 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类的子类,是专门来干这种事情的:
欢迎大家来到IT世界,在知识的湖畔探索吧!>>> 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)。人们习惯于使用列表。但在某些情况下,元组或字典比列表工作得好得多。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/116693.html