《python进阶编程》学习
程序员文章站
2022-06-04 09:02:06
...
python进阶
1 语法最佳实践
1.1 循环优化改进
1.1.1情形一
保存0-10之间的偶数
#常规写法(添加了计算时间的函数)
import time
start = time.clock()
even = []
for i in range(10):
if i % 2 == 0:
even.append(i)
print("even",even)
end = time.clock()
t=end-start
print("Runtime is :",t)
#输出结果:
#实际上在python3.7上此时会出现报错
even [0, 2, 4, 6, 8]
Runtime is : 8.397500000000002e-05
此时它会使程序的执行速度变慢
#改进写法
import time
start1 = time.clock()
even= [i for i in range(10) if i % 2 == 0]
print("even",even)
end1 = time.clock()
t=end1-start1
print("t",t)
#输出结果
even [0, 2, 4, 6, 8]
t1 4.805199999999288e-05
时间提高一倍
1.1.2 情形二
在某些操作中,我们要循环索引数,同时还要获取到列表中的元素。函数enumrate提供了获取索引的有效方式
#常规写法
import time
start = time.clock()
i = 0
sequence= ["one", "two", "three"]
for ele in sequence:
sequence[i] = '%d : %s' % (i,sequence[i])
i +=1
print("sequence",sequence)
end = time.clock()
t=end-start
print("Runtime is :",t)
#改进写法:
start1 = time.clock()
sequence= ["one", "two", "three"]
for i ,element in enumerate(sequence):
sequence[i] = '%d : %s' % (i, sequence[i])
print("even",sequence)
end1 = time.clock()
t1=end1-start1
print("t1",t1)
输出结果:
sequence ['0 : one', '1 : two', '2 : three']
Runtime is : 9.190600000000271e-05
even ['0 : one', '1 : two', '2 : three']
t1 4.94519999999915e-05
效果提升明显
更加优化的改进方法,for循环不作为一个独立的部分出现,而是像1.1.1中
start1 = time.clock()
def _treatment(pos,element):
return '%d:%s' % (pos,element)
seq=["one","two","three"]
a = [_treatment(i, el) for i,el in enumerate(seq)]
print(a)
end1 = time.clock()
t=end1-start1
print("t",t)
输出结果
['0:one', '1:two', '2:three']
t 3.778899999999641e-05
enumerate
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
enumerate(sequence, [start=0])
- sequence – 一个序列、迭代器或其他支持迭代对象。
- start – 下标起始位置。
1.2迭代器与生成器
1.2.1 迭代器
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。我们已经知道可以对list、tuple、str等类型的数据使用for…in……的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。
但是,是否所有的数据类型都可以放到for…in……的语句中,然后让for……in……每次从中取出一条数据供我们使用,即供我们迭代吗?并不是,例如整数。可以使用isinstance()判断一个对象是否是Iterable对象:
迭代器只不过是一个实现迭代器协议的容器对象。它基于两个方法:
- next 返回容器的下一个项目;
- _iter返回迭代器本身。
持续更新中
下一篇: solr文本分析