1、使用生成器还是使用列表推导式
它俩区别:列表推导将数据保存在内存中,而生成器则不这样做。
列表推导式使用场景:
当需要遍历多次列表,通过满足某些特定条件元素来创建子序列,并且你认为把数据保存在内存中不是问题时,你可以使用列表推导式。
列表式demo:
[x**2 for x in range(10)]
[x for x in vec if x >= 0]
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[num for elem in vec for num in elem]
[weapon.strip() for weapon in freshfruit]
[(x, x**2) for x in range(6)]
[str(round(pi, i)) for i in range(1, 6)]
[[row[i] for row in matrix] for i in range(4)]
list(zip(*matrix))
生成器使用场景:
文件太大,一次性从数据库中读取大量数据可能会影响内存,并让代码变慢,你需要重构代码为生成器逻辑版本。
生成器demo:
def read_file_line(file_name):
"""读取文件并返回文件的每一行.
@param file_name:文件的绝对路径.
@return: yiled line.
"""
with open(file_name) as fread:
for line in fread:
yield line
2、使用namedtuple作为返回值
如果Python基础还不错的童鞋,应该知道Python 在return 返回多个值得时候,默认是组成元组进行返回,我们通过返回namedtuple,让返回值更具有可读性,因为namedtuple是tuple元祖的子类,当然包含了它的全部特性,并且有一些元祖没有的额外特性。
namedtuple是继承自tuple的子类。namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性。用以构建只有少数属性但是没有方法的对象。用作返回值很是biu 丢 for !
User = collections.namedtuple('User', ['name', 'age'])
user = User('张三','18')
print(user.name) # 张三
print(user.age) # 18
return user # 可以作为对象进行返回,在传给其他函数的时候,也方便多了。
使用场景总结:返回多个值,并需要大量传递时,可以使用namedtuple,来减轻参数的数量,让代码可读性更好。如果初学Python不是很懂,代码数量达到一定级别时,回来在思考这个问题,参数的个数,命名,传递的频率,这里就会涉及到考虑升高可读性,扩展性等。
3、Python itertools 模块的应用、
介绍:使用它可以在纯Python中能创建简洁又高效的专用工具,本模块实现一系列 iterator(迭代器),迭代器用来表示一连串数据流的对象,比如视频流,特别大的文件流等等。
案例1:输出长度为3的所有子序列
import itertools as it
print(list(it.combinations('1245',3)))
# [('1', '2', '4'), ('1', '2', '5'), ('1', '4', '5'), ('2', '4', '5')]
案例2:输出长度为2的所有全排子序列
print(list(it.permutations('124',2)))
# [('1', '2'), ('1', '4'), ('2', '1'), ('2', '4'), ('4', '1'), ('4', '2')]
案例3:输出笛卡尔积
print(list(it.product([1,2,3],repeat=2)))
#[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
案例4:数据分组
使用场景,通过给复杂数据结数据,进行日期分组。
from operator import itemgetter
rows = [
{'address': '5412 N CLARK', 'date': '07/01/2012'},
{'address': '5148 N CLARK', 'date': '07/04/2012'},
{'address': '5800 E 58TH', 'date': '07/02/2012'},
{'address': '2122 N CLARK', 'date': '07/03/2012'},
{'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
{'address': '1060 W ADDISON', 'date': '07/02/2012'},
{'address': '4801 N BROADWAY', 'date': '07/01/2012'},
{'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]
for date,items in it.groupby(rows,key=itemgetter('date')):
print(date)
for i in items:
print(" ",i)
好的,今天就写到这里~~~~