While循环增量问题

While Loop increment issue

现在我正在尝试制作一个简单的程序来分隔网站的 javascript 链接,但我 运行 遇到了 while 循环的问题。

这是一个输入示例:

001_usa_wool.jpg
002_china_silk.jpg
003_canada_cotton.jpg
004_france_wool.jpg
done

我的代码的简化版本只有 3 个部分如下:

def ParseData(input):
    data = input.split('_')

    d = {}
    d['sku'] = data[0]
    d['country'] = data[1].capitalize()
    d['material'] = data[2].capitalize()
    return d

def Sku():
    myData = ParseData(input)
    sku = myData['sku']
    return sku

def Country():
    myData = ParseData(input)
    country = myData['country']
    return country

def Material():
    myData = ParseData(input)
    material = myData['material']
    return material

def Output():
    print (Sku()+'\t'+
           Country()+'\t'+
           Material()+'\t'+
           '\n')

下面是我尝试逐行阅读它的方式:

def CleanInput(input):
    clean = input.split('.jpg')
    count = 0
    while (clean[count] != 'done'):
        ParseData(clean[count])
        Output()
        count = count+1

input = input('Enter your data: ')
CleanInput(input) 

我相信我没有实施 while 循环更正,因为我的输出类似于:

001   Usa   Wool
001   Usa   Wool
001   Usa   Wool

就我个人而言,我会让它更像 pythonic:

def CleanInput(input):
    clean = input.split('.jpg')
    for count, elem in enumerate(clean):
        if elem == 'done':
            break
        ParseData(elem)
        Output()
    return count

input_data = input('Enter your data: ')
how_many = CleanInput(input_data)

假设您确实需要 count。顺便说一句:您没有使用 ParseData

的 return 值

问题不完全出在您的 while 循环中,而是出在您的函数中 - Output()Sku()Material()Country()

在函数 Output() 中,您通过直接调用 Sku() 等来打印值

在每个函数中,我将以一个为例 - Sku() ,你在 input 上调用 parseData (虽然这是一个非常糟糕的命名,请使用更好的名字,用这个名字你会覆盖内置的 input 函数,以后你不能调用 input() 来接受用户的输入)

input 总是包含您输入的整个字符串,因此它包含所有 .jpg 名称,当 parseData 通过它时,它总是只选择第一个.

不是在每个函数中使用 input,我们应该使函数参数化并将需要打印的值作为参数发送,就像您对 parseData 所做的那样。和示例代码-

def Sku(toprint):
    myData = ParseData(toprint)
    sku = myData['sku']
    return sku
.
.
.
def Output(toprint):
    print (Sku(toprint)+'\t'+
           Country(toprint)+'\t'+
           Material(toprint)+'\t'+
           '\n')

然后在 while 循环中将要打印的当前值作为参数发送到 Output() -

def CleanInput(input):
    clean = input.split('.jpg')
    count = 0
    while (clean[count] != 'done'):
        ParseData(clean[count])
        Output(clean[count])
        count = count+1

另外,请不要使用 input 作为变量的名称,它会导致问题,正如我之前所说,因为您正在用它覆盖内置的 input 函数。

您有太多相互调用的功能,并且具有模糊的要求。很难看到什么 returns 东西,打印什么,等等。例如,您的 CleanInput 调用 ParseDataOutput,但 Output 调用 SkuCountryMaterial,每个这也称为 ParseData。哦,大写变量应该保留给 类 - 对函数使用 snake_case

>>> s = "001_usa_wool.jpg002_china_silk.jpg003_canada_cotton.jpg004_france_wool.jpgdone"
>>> print(*("{}\t{}\t{}".format(*map(str.capitalize, item.split('_')))
... for item in s.split('.jpg') if item != 'done'), sep='\n')
001     Usa     Wool
002     China   Silk
003     Canada  Cotton
004     France  Wool