首页 > 解决方案 > Python范围无法按预期使用变量作为步骤

问题描述

我在运行某个软件时遇到了一些麻烦。我需要做的是输入数字并判断它们是增加还是减少,从一个间隔开始,这意味着如果列表是[13,15,17,15,18]第一个集合,则为[13,15],然后[15,17],最后为[15,18]。第一个间隔部分工作得很好,但是当我增加ato以尝试增加 range 函数的步长时,它输出与 when is2相同的组。正确的输出应该是, ,a1a = 2[13,17][17,18][15,15]. 如果我复制粘贴它并将变量 a 替换为 2,程序确实会运行,但是它给了我不正确的增加和减少数量。我确定我忽略了一些简单的事情,但我已经盯着这个问题太久了,以至于它变得怪异了。我没有包含我所有的代码,但 prod_list 只是一个整数列表,它们都大于零。

a = 1
for i in range(0,len(prod_list),a):
    while(i-1 < 0):
        i +=1
    while(i > len(prod_list)):
        i -= 1
    if(prev != (prod_list[i-1],prod_list[i])):
        if((prod_list[i-1] - prod_list[i]) > 0):
            decr += 1
        elif((prod_list[i-1] - prod_list[i]) < 0):
            incr += 1
        elif((prod_list[i-1] == prod_list[i]) < 0):
            same += 1
        print(prod_list[i-1],prod_list[i])
        prev = (prod_list[i-1],prod_list[i])
        a += 1

标签: pythonlistrange

解决方案


Pythonfor是一个 for-eachin的迭代器。它不像 C 的int i=0; i<x; i+=afor 循环风格那样工作。如果您希望它在 Python 中那样工作,请改用while初始值高于 while 和i+=a循环内的更新。

如果迭代器碰巧是一个range()对象,你确实会从中得到整数,但迭代器本身在循环开始时已经构造好了。在您已经初始化对象a 之后进行更新range()不会改变它的状态。事实上,在构建范围之后,您甚至可以完全删除该a变量。它不会改变任何事情。a是对不可变 int 对象的引用。一旦range()拥有它,更改a指向的内容不会影响范围对象已经拥有的 int。

当您可以直接使用来自迭代器的值时,使用显式整数索引被认为是不符合标准的,但是在翻译教科书算法时,有时您必须从那里开始。

可以将参数发送回生成器函数,这将是yield表达式的值。range()并非旨在这样做(并且它的step属性是只读的),但是可以实现一个生成器,并使用它来更改步长。但是明显的实现将再次在while内部使用循环,所以我不确定这有多大帮助。


推荐阅读