在python中围绕一个值生成10个值

Jud*_*udi 5 python numpy generator

我正在尝试写一个快速的模拟程序.作为第一步,我想接受一个输入并执行以下操作:

  1. 使用此输入从dict中查找相应的值,比如说我29.0在我的示例中.
  2. 我现在想要在左边生成3个值,在右边生成3个值.理想情况下,输出应该是27.5, 28.0, 28.5, 29.0, 29.5, 30, 30.5

这是我的程序 - 这部分解决了我的问题.

#!/usr/bin/python
def getids(tk):
    tk=tk.lower()
        r=map(lambda x:x/10.0,range(0,6))   
    val={'PPP':29}
    val={k.lower():v for k,v in val.items()}
    if tk in val:
        stk_price=val[tk]   
    for i in r:
        stk_price=stk_price + i
        print(stk_price)
getids('PPP')
Run Code Online (Sandbox Code Playgroud)

输出是

29.0
29.1
29.3
29.6
30.0
30.5
Run Code Online (Sandbox Code Playgroud)

是否可以使用numpy并在数字周围生成值?感谢任何帮助.

Mad*_*ist 6

首先是关于设计的几点注意事项:

  1. 你的字典应该存在于函数之外,否则每次都会重新创建,这是毫无意义和低效的.
  2. 如果您具有获取范围的功能,请使其返回范围.如果要打印范围或使用它执行其他操作,请在功能外部执行此操作.

你可能正在寻找np.arange或者np.linspace.对于您的简单应用,它们基本上是等效的.这尤其正确,因为步进增量为0.5时没有舍入误差.

对于给定的x,例如29,您可以执行以下任一操作:

step = 0.5
price_range = np.arange(x - step * 3, x + step * 4, step)
Run Code Online (Sandbox Code Playgroud)

要么

step = 0.5
price_range = np.linspace(x - step * 3, x + step * 3, 7)
Run Code Online (Sandbox Code Playgroud)

我个人觉得这里linspace更容易理解,因为你只是给它限制和点数.因为arange,您必须记住止损是独占的,因此您必须添加保证金x + step * 3.

我建议像这样重写你的程序:

stocks = {
    'PPP': 29,
}
# Notice that this only runs once instead of once per function call now
# casefold is the more generalized unicode version of lower
stocks = {key.casefold: value for key, value in stocks}

def getids(tk, margin=3, step=0.5):
    tk = tk.casefold()
    if tk in val:
        price = val[tk]
        return np.linspace(price - margin * step,
                           price + margin * step, 2 * margin + 1)
    return []

print(getids('PPP'))
Run Code Online (Sandbox Code Playgroud)

如果您想要之前的确切输出,只需使用换行符加入元素:

print('\n'.join(map(str, getids('PPP'))))
Run Code Online (Sandbox Code Playgroud)

或等效地,

print('\n'.join(str(x) for x in getids('PPP')))
Run Code Online (Sandbox Code Playgroud)