2015-06-19 2 views
0

Прямо сейчас я пытаюсь сделать простую программу для разделения ссылок на JavaScript на веб-сайте, но у меня возникают проблемы с циклом while.While Loop increment issue

Вот бы пример ввода:

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, так как мой вывод s imilar к:

001 Usa Wool 
001 Usa Wool 
001 Usa Wool 
+0

попробуйте выполнить следующие действия по очистке: 'for elem in clean:' ... – Pynchia

+0

Как вы вводите ввод в программу? Вы даете полный ввод, который вы указали в начале вопроса в целом, для функции 'input()'? –

+0

Да, я вставляю '001_usa_wool.jpg002_china_silk.jpg003_canada_cotton.jpg004_france_wool.jpgdone' как весь ввод – TheChosenWong

ответ

1

Вопрос не совсем в вашем while цикле, но в ваших функциях - Output(), Sku(), Material() и Country().

В функции Output(), вы печатаете значения путем прямого вызова Sku() и т.д.

В каждой функции, я возьму один, как пример - Sku(), вы звоните parseData на input (Хотя это очень плохой нейминг, пожалуйста, используйте лучшее название, с этим именем вы перезапись встроенный 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') 

И в то время цикла отправить в текущем значении для печати в качестве параметра 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 с этим.

1

Лично я хотел бы сделать его более вещий:

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

0

У вас слишком много функций, которые называют друг друга и принимают неопределенные требования. Трудно понять, что возвращает что-то, что печатает и так далее.Например, ваши CleanInput звонки ParseData и Output, но Output звонки Sku, Country и Material, каждый из которых также звонит 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