python - Python范围无法按预期使用变量作为步骤
问题描述
我在运行某个软件时遇到了一些麻烦。我需要做的是输入数字并判断它们是增加还是减少,从一个间隔开始,这意味着如果列表是[13,15,17,15,18]
第一个集合,则为[13,15]
,然后[15,17]
,最后为[15,18]
。第一个间隔部分工作得很好,但是当我增加a
to以尝试增加 range 函数的步长时,它输出与 when is2
相同的组。正确的输出应该是, ,a
1
a = 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
解决方案
Pythonfor
是一个 for-eachin
的迭代器。它不像 C 的int i=0; i<x; i+=a
for 循环风格那样工作。如果您希望它在 Python 中那样工作,请改用while
初始值高于 while 和i+=a
循环内的更新。
如果迭代器碰巧是一个range()
对象,你确实会从中得到整数,但迭代器本身在循环开始时已经构造好了。在您已经初始化对象a
之后进行更新range()
不会改变它的状态。事实上,在构建范围之后,您甚至可以完全删除该a
变量。它不会改变任何事情。a
是对不可变 int 对象的引用。一旦range()
拥有它,更改a
指向的内容不会影响范围对象已经拥有的 int。
当您可以直接使用来自迭代器的值时,使用显式整数索引被认为是不符合标准的,但是在翻译教科书算法时,有时您必须从那里开始。
可以将参数发送回生成器函数,这将是yield
表达式的值。range()
并非旨在这样做(并且它的step
属性是只读的),但是可以实现一个生成器,并使用它来更改步长。但是明显的实现将再次在while
内部使用循环,所以我不确定这有多大帮助。
推荐阅读
- typescript - 打字稿在可选链接上出现“无索引签名”错误
- php - WPAllImport - 多个供应商 - 相同的产品
- azure - 更新 Azure 应用服务 web.config 以加载 .ttf 字体文件
- sql - Oracle SQL - 读取分隔符
- c++ - 使用自动 lambda 参数设置外部变量的类型
- node.js - Octopus Deploy API - 无论保留期如何,都可以进行部署
- windows - 无法在 Windows 10 上启动 Kafka - 准备关闭 (kafka.server.KafkaServer) java.nio.file.AccessDeniedException
- opengl - OpenGL:在单个 VAO 中存储组合网格(每个对象多个网格)?
- c - 如何将 _Generic 与 C 中 typedef-ed 的结构一起使用?
- java - ECLIPSE PHOTON June 2018 (OEPE) + Weblogic server 12.2.1.4 + Spring Webapp Deployment issue