循环增量问题

时间:2015-06-19 19:56:01

标签: python while-loop

现在我正在尝试创建一个简单的程序来分离网站的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

3 个答案:

答案 0 :(得分:1)

就个人而言,我会让它变得更加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

的返回值

答案 1 :(得分:1)

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

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

在每项功能中,我将以Sku()为例,您在parseData上呼叫input(虽然这是一个非常糟糕的命名,但请使用更好的名称,使用此名称,您将覆盖内置的input函数,稍后您无法调用input()从用户处获取输入数据

input始终包含您输入的整个字符串,因此它包含所有.jpg个名称,当parseData通过它时,它始终只会获取第一个。< / p>

我们不应该在每个函数中使用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函数。

答案 2 :(得分:0)

你有太多的功能可以互相调用,并且需要模糊的要求。很难看到什么返回什么,打印什么,等等。例如,您的CleanInput来电ParseDataOutputOutput来电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