python 如何在这个循环中增加一个整数值?

lpwwtiir  于 2023-04-04  发布在  Python
关注(0)|答案(3)|浏览(138)

尝试增加整数值
所以基本上我尝试增加“e”,所以每次我输入一个新行时,它都会变成0,1等
我的输入看起来像这样

example1
example2
def no(paths: str):
    e = 0
    for path in paths.split(" "):
        print("            ItemListData(" + str(e) + ")=(ItemDefination=" + path + '")')
        e = e + 1

while True:
    paths = input()
    no(paths)

当我这样做的时候,我得到了这个:

ItemListData(0)=(ItemDefination=example1")
ItemListData(0)=(ItemDefination=example2")

我想要的是这个

ItemListData(0)=(ItemDefination=example1")
ItemListData(1)=(ItemDefination=example2")
ars1skjm

ars1skjm1#

首先,让我先说这是一个非常基本的问题,你真的应该学习一些基本的调试技巧。

代码跟踪

为了找出问题所在,我们需要首先理解代码,所以让我们跟踪它,看看到底发生了什么。

  1. "example1"存储在paths
  2. paths"example1")被传入no()函数
  3. e设置为0
  4. paths"example1")被空格分割
  5. "example1"中没有空格,因此split返回["example1"]
    1.我们迭代["example1"]的元素
  6. ["example1"]中只有一个元素,即"example1"
  7. ItemListData(0)=(ItemDefination=example1")已打印
    1.循环结束,因为paths中只有一个元素
    1.我们留下no()函数
  8. "example2"存储在paths
  9. paths"example2")被传入no()函数
  10. e设置为0
  11. paths"example2")被空格分割
  12. "example1"中没有空格,因此split返回["example2"]
    1.我们迭代["example2"]的元素
  13. ["example2"]中只有一个元素,即"example2"
  14. ItemListData(0)=(ItemDefination=example2")已打印
    1.循环结束,因为paths中只有一个元素

溶液

注意第3步和第13步很重要。每次调用no()时,e都被设置为0。但我们不希望发生这种情况,对吗?我们希望跟踪您输入路径的次数。如果我们再次查看堆栈跟踪,我们将看到处理路径输入位置的循环是no()函数外部的while循环。因此解决方案是将e = 0,和e = e + 1围绕while循环,而不是for循环。

def no(paths: str, e: int):
    for path in paths.split(" "):
        print("            ItemListData(" + str(e) + ")=(ItemDefination=" + path + '")')

e = 0
while True:
    paths = input()
    no(paths, e)
    e = e + 1

约定

  1. no()应该重命名为number_paths(),因为no是一个在英语中有其他意思的单词。
    1.索引通常应该使用i变量而不是e
  2. ItemDefinition拼写错误。
    1.除非有一个很好的理由,请不要手动打印一堆空格。使用"\t"来切换。print("\t\t ItemListData(" + str(i) + ")=(ItemDefinition=" + path + '")')
    1.使用f字符串格式化字符串. print(f'\t\t ItemListData({i})=(ItemDefinition="{path}")')
    1.使用i += 1代替i = i + 1
    常规固定代码:
def number_paths(paths: str, i: int):
    for path in paths.split(" "):
        print(f'\t\t ItemListData({i})=(ItemDefinition="{path}")')

i = 0
while True:
    paths = input()
    number_paths(paths, i)
    i += 1
2j4z5cfb

2j4z5cfb2#

如果你想让函数本身修改它的内部状态,你可以全局声明它。
但是因为在你的例子中,e只有作为函数no的属性才有意义...为什么不把它变成一个 * 属性 * 呢?

def no(paths: str):
    for path in paths.split(" "):
        print("            ItemListData(" + str(no.e) + ")=(ItemDefination=" + path + '")')
        no.e += 1

no.e = 0

for example in ["example1", "example2"]:
    no(example)

在这种情况下,no.e也是全局声明的(它可以被其他函数访问,例如print(no.e))。
注意,因为no是声明的(在它自己的def中),所以即使no.e还没有声明,也不会得到UnboundLocalError,但是如果在使用它之前忘记声明它,就会得到AttributeError
它是函数属性的may be considered and abuse,但在我看来,它在这里是合理的,因为它明确了e只有作为no的一部分才有意义。

def no(paths: str):
    global E
    for path in paths.split(" "):
        print("            ItemListData(" + str(E) + ")=(ItemDefination=" + path + '")')
        E += 1

E = 0

while True:
    paths = input()
    no(paths)

顺便说一下,nofor/while循环之外似乎没有意义,因为它假设值e需要更新。而您的while循环只不过是调用no。真的有必要将这两者分离吗?
你可以

e = 0
while True:
    paths = input()
    for path in paths.split(" "):
        print("            ItemListData(" + str(e) + ")=(ItemDefination=" + path + '")')
        e = e + 1

(Or把所有这些都放在一个函数中)

ie3xauqp

ie3xauqp3#

假设你想让值e在每次执行函数时都增加,你可以这样做:

def no(paths: str, e: int):
    for path in paths.split(" "):
        print("            ItemListData(" + str(e) + ")=(ItemDefination=" + path + '")')

e = 0
while True:
    paths = input()
    no(paths, e)
    e += 1

输出的前两行,输入如下:
x一个一个一个一个x一个一个二个x
注意,你有一个无限循环。为了不有无限循环,你可以把循环条件改为类似while e < x的东西,让循环内容执行x次。

相关问题