今天在开发项目的时候有一个地方在计算的时候需要生成指定区间内的数值序列,最开始的时候没有太多精度的要求,我是直接使用的range关键字方法生成的,但是需要划分的粒度更细生成小数序列的时候就出现了问题了,因为range方法没有办法生成小数序列。
range报错如下:
TypeError: 'float' object cannot be interpreted as an integer
那么想要生成指定间隔内的浮点序列数值可以怎么操作呢?可以直接使用numpy内置的arange方法,性质与range一样的,只不过功能更加强大。
这里没有什么难度需要讲解,我用不同的方式进行了实现,封装成了不同的函数方便后续在不同的项目中可以直接使用,这里一并分享出来,完整代码实现如下:
#!usr/bin/env python
# encoding:utf-8
from __future__ import division
"""
__Author__: 沂水寒城
功能: 基于Python生成指定区间内等间隔数字序列
"""
import numpy as np
def intSequenceFor(start=10, end=100, delta=1):
"""
整数序列-使用for循环实现
"""
num_list = [start]
for i in range(int((end - start) / delta)):
start += delta
num_list.append(start)
print("intSequenceFor num_list: ", num_list)
return num_list
def intSequenceWhile(start=10, end=100, delta=1):
"""
整数序列-使用while实现
"""
num_list = [start]
while start < end:
start += delta
if start <= end:
num_list.append(start)
print("intSequenceWhile num_list: ", num_list)
return num_list
def intSequenceList(start=17, end=20, delta=1):
"""
整数序列-使用列表推导式实现
"""
length = int((end - start - ((end - start) % delta)) / delta)
num_list = [start + x * delta for x in range(length)]
if num_list[-1] + delta > end:
pass
else:
num_list.append(num_list[-1] + delta)
print("intSequenceList num_list: ", num_list)
return num_list
def intSequenceRange(start=10, end=100, delta=1):
"""
整数序列-使用range实现
"""
num_list = list(range(start, end, delta))
print("intSequenceRange num_list: ", num_list)
return num_list
def floatSequenceArange(start=17, end=20, delta=0.25):
"""
浮点小数序列-使用arange实现
"""
num_list = np.arange(start, end, delta).tolist()
if num_list[-1] + delta > end:
pass
else:
num_list.append(num_list[-1] + delta)
print("floatSequenceArange num_list: ", num_list)
return num_list
def floatSequenceList(start=17, end=20, delta=0.25):
"""
浮点小数序列-使用列表推导式实现
"""
length = int((end - start) / delta)
num_list = [start + x * (end - start) / length for x in range(length)]
if num_list[-1] + delta > end:
pass
else:
num_list.append(num_list[-1] + delta)
print("floatSequenceList num_list: ", num_list)
return num_list
def floatSequenceFor(start=17, end=20, delta=0.25):
"""
浮点小数序列-使用列表推导式实现
"""
num_list = [start]
times = int((end - start) / delta)
deltas = (end - start) / times
for i in range(times):
start += deltas
num_list.append(start)
if num_list[-1] + delta > end:
pass
else:
num_list.append(num_list[-1] + delta)
print("floatSequenceFor num_list: ", num_list)
return num_list
def floatSequenceWhile(start=17, end=20, delta=0.25):
"""
浮点小数序列-使用while实现
"""
num_list = [start]
times = int((end - start) / delta)
deltas = (end - start) / times
while start < end:
start += deltas
if start <= end:
num_list.append(start)
if num_list[-1] + delta > end:
pass
else:
num_list.append(num_list[-1] + delta)
print("floatSequenceWhile num_list: ", num_list)
return num_list
if __name__ == "__main__":
intSequenceFor(start=10, end=100, delta=7)
intSequenceWhile(start=10, end=100, delta=7)
intSequenceRange(start=10, end=100, delta=7)
intSequenceList(start=10, end=100, delta=7)
print("=" * 100)
floatSequenceArange(start=17, end=20, delta=0.25)
floatSequenceList(start=17, end=20, delta=0.25)
floatSequenceFor(start=17, end=20, delta=0.25)
floatSequenceWhile(start=17, end=20, delta=0.25)
运行结果如下:
对于整数序列和浮点小数序列生成各自实现了四种计算方式,主要就是:range关键字、for循环、while和列表推导式。
当然了在部分场景的使用中还是会出现结果不一致的问题的,这个如果仔细看过代码的实现原理的话相信就能明白了,核心的问题就是结果的取整保留准则不一致。
对于整数序列生成的话倒是没有影响,因为这里生成的数据序列都是整数没有小数,也就不牵涉到结果四舍五入取证保留的问题了,这里主要就是分为:delta可以整除和delta不可以被整除两种情况,我放在一起验证一下:
结果如下所示:
对于小数来说,如果delta不能被整除的话几种方法的计算结果是有差异的,这里差异的产生的原因是因为我没有对其结果进行取整保留的操作,如果设定保留精度位数的话结果也是一致的了。
不做精度保留位数操作,结果如下所示:
可以根据自己的需要修改我提供的代码,来设定自己的保留精度位数。