Ваша настоящая проблема заключается в том, что у вас нет четкой отделки вашей программы, либо в вашем сознании, либо в программе.
Чтобы четко определить различные принципы, которые у вас есть:
- Получить действительный GTIN # от пользователя
- Поиск файла CSV для предоставленному ГНТП #
- Если GTIN # действительно, получить действительное количество от пользователя
- Если GTIN # недействительно, получить другой номер
- дисплея полной стоимости пользователя
- Разрешить перезагрузке пользователя.
Если вы пишете код, прежде чем у вас будет четкое представление о проблеме перед вами, вы закончите в маринованном растворе, в котором вы находитесь. В зависимости от вашей индивидуальности вы можете работать сверху вниз или снизу вверх. С этой проблемой я пойду с нисходящим решением. В самом широком смысле вы просто хотите запустить приложение, пока пользователь не скажет, что хочет выйти. Вот простая программа, которая делает это:
wants_to_continue = True
while wants_to_continue:
answer = input('Would you like to continue? [Y/n]: ')
if answer.lower() in ('n', 'no', 'nyet', 'non'):
wants_to_continue = False
Теперь в вашей программы вы получаете ГНТП от пользователя и делает два этапа проверки (или три, на самом деле). Вы сначала проверяете, выглядит ли он как действительный GTIN, а затем вы проверяете, действительно ли он найден. Но если вы вместо вместо загрузите действительные значения GTIN, тогда вы можете просто сделать все это одним махом.
Зная, что, то, я бы вновь сформулировать свои цели:
- Считывание данных из файла CSV и конвертировать его в удобном формате
- Попросите пользователя для действительного ГНТП #
- Попросите пользователя для действительного количества
- Compute и показать общую цену
- Попросите пользователя, если они хотели бы повторить
Зная, что мы будем загружать данные первыми, вот один из способов сделать это:
import csv
prices = {}
with open('prices.csv') as f: # or ChocolateCSV.csv
for row in csv.DictReader(f):
prices[row['GTIN']] = row
# You could replace this, and the prices = {} with
# a dict comprehension
# prices = {row['GTIN']:row for row in csv.DictReader(f)}
Если у вас есть массивного базы данных продукта (несколько сот тысяч наименований продукции - даже 100k будет прекрасно сделайте это на разумном компьютере), этот подход будет полностью прекрасен. Теперь, когда у вас есть данные, пришло время, чтобы получить GTIN # от пользователя и увидеть, если он существует:
# Assuming that the prices were loaded by this point
wants_to_continue = True
while wants_to_continue:
answer = input('Would you like to continue? [Y/n]: ')
if answer.lower() in ('n', 'no', 'nyet', 'non'):
wants_to_continue = False
else:
gtin = input('What product number would you like to order? ')
product = prices.get(gtin)
print(product)
С этого момента все, что вам нужно нужно сделать, это:
- дисплей ошибка если товар не найден (
if product is None:
не был найден)
- если товар is найдено, пожалуйста, спрашивайте у пользователя действительное количество.
- Произвести и отобразить итоговое итоговое значение.
Какую версию python вы используете? –
Дикая догадка: положите 'break' сразу после' gtinQuestion() 'в цикле' for row in ...'. В общем, когда вы управляете потоком, если несколько функций рекурсивно вызывают другие функции, возникают проблемы, когда функции, выше в стеке вызовов, не прерываются сразу после вызова другой функции. Если это звучит запутанно, это потому, что это так; тем более причина избежать такого дизайна. – Kevin
Здесь, похоже, много ненужного кода. Пожалуйста, уберите все, что не связано с вашей ошибкой. [mcve] – AndyG