Могу ли я написать другой код, чтобы уменьшить смысл этого исходного кода Python? Смысл программы также состоит в том, чтобы получить общую сумму пользователей и добавить к ней стоимость доставки. Стоимость доставки определяется как страной (Канада или США), так и ценой продукта. Стоимость доставки продукта в Канаде составляет 125 долларов США, стоимость доставки составляет 12 долларов США.


input ('Please press "Enter" to begin')

В то время как True: print ('Это рассчитает стоимость доставки и ваш общий итог.')

totalAmount = int(float(input('Enter your total amount: ').replace(',', '').replace('$', '')))
Country = str(input('Type "Canada" for Canada and "USA" for USA: '))

usa = "USA"
canada = "Canada"
lessFifty = totalAmount <= 50
fiftyHundred = totalAmount >= 50.01 and totalAmount <= 100
hundredFifty = totalAmount >= 100.01 and totalAmount <= 150
twoHundred = totalAmount

if Country == "USA":
    if lessFifty:
        print('Your shipping is: $6.00')
        print('Your grand total is: $',totalAmount + 6)
    elif fiftyHundred:
        print('Your shipping is: $8.00')
        print('Your grand total is: $',totalAmount + 8)
    elif hundredFifty:
        print('Your shipping is: $10.00')
        print('Your grand total is: $',totalAmount + 10)
    elif twoHundred:
        print('Your shipping is free!')
        print('Your grand total is: $',totalAmount)

if Country == "Canada":
    if lessFifty:
        print('Your shipping is: $8.00')
        print('Your grand total is: $',totalAmount + 8)
    elif fiftyHundred:
        print('Your shipping is: $10.00')
        print('Your grand total is: $',totalAmount + 10)
    elif hundredFifty:
        print('Your shipping is: $12.00')
        print('Your grand total is: $',totalAmount + 12)
    elif twoHundred:
        print('Your shipping is free!')
        print('Your grand total is: $',totalAmount)

endProgram = input ('Do you want to restart the program?')
if endProgram in ('no', 'No', 'NO', 'false', 'False', 'FALSE'):
    break
1
JordanDevelop 31 Янв 2013 в 08:38

2 ответа

Лучший ответ

Вот основная стратегия для расчета стоимости:

import math

amount = int(totalAmount)
assert amount >= 0
shipping = { 
  'USA': [6, 8, 10],
  'Canada': [8, 10, 12]
}
try:
    surcharge = shipping[country][amount and (math.ceil(amount / 50.0) - 1)]
except IndexError:
    surcharge = 0
total = amount + surcharge

Ключевым понятием здесь является то, что диапазоны стоимости доставки следуют по довольно линейной прогрессии: [0-50], (50-100], (100-150], (150, инф.)

Обратите внимание, что первая группа немного забавна, так как включает нижнюю границу 0, где другие группы не включают нижнюю границу (они представляют собой открытый интервал внизу). Итак, в дальнейшем мы будем рассматривать первую группу следующим образом: 0 или (0-50]

Мы хотим преобразовать сумму, которую пользователь предоставляет в индекс, в списки стоимости доставки [6, 8, 10] и [8, 10, 12]. Списки имеют длину 3, поэтому индексы равны 0, 1 и 2. Обратите внимание, что если мы разделим любое число в диапазоне (0, 150) на 50,0 (мы добавляем от 0 до 50, чтобы получить реальное число обратно - 1 / 50 == 0 но 1 / 50.0 == 0.02 - для следующего шага) мы получаем число в диапазоне (0 и 3].

Теперь поймите, что math.ceil округляет действительное число до ближайшего целого числа, которое больше, чем или равно самому себе - например. math.ceil(.001) == 1.0, math.ceil(1.5) == 2.0, math.ceil(2) == 2.0. Поэтому, применяя math.ceil к числам в диапазоне (0, 3], мы предоставим либо 1.0, 2.0, либо 3.0. Приведите эти числа к int (int(2.0) == 2), и мы получим значения 1, 2 и 3. Вычтем 1 из этих значений мы получим 0, 1, 2. Вуаля! Эти числа соответствуют индексам в нашем массиве доставки.

Вы можете выразить это преобразование с помощью Python: int(math.ceil(amount / 50.0) - 1)

Мы почти на месте. Мы обработали любую сумму в диапазоне (0, 150]. Но что, если количество равно 0. math.ceil(0) == 0.0 и 0.0 - 1 == -1.0 Это не будет правильно индексировать в наш массив. Поэтому мы обрабатываем 0 отдельно, проверяя сначала если количество равно 0, и если это так, используя 0 в качестве индекса массива доставки вместо применения нашего преобразования к количеству для определения индекса. Это может быть выполнено с помощью оператора Python для короткого замыкания and (Интернет должен есть много информации об этом) в следующем выражении: amount and int(math.ceil(amount / 50.0) - 1)

Обратите внимание, что любое значение выше 150 будет уменьшено до индекса больше 2, и применение этого индекса к массиву доставки приведет к ошибке IndexError. Но любое значение больше 150 имеет бесплатную доставку, поэтому мы можем поймать IndexError и применить доплату 0:

try:
    surcharge = shipping[country][amount and int(math.ceil(amount / 50.0) - 1)]
except IndexError:
    surcharge = 0

И мы сделали!

1
Loren Abrams 31 Янв 2013 в 16:43

Вот ядро для упрощения вашего кода. Он печатает стоимость доставки за 100,00 $ в США.

totalAmount = 100

chargeCode = (int(100*(totalAmount+0.001))-1)/5000 #0 -- <=50, 1 -- 50.01-100, etc
if chargeCode > 3: chargeCode = 3

shipping = {}
shipping[("USA", 0)] = 6
shipping[("USA", 1)] = 8
shipping[("USA", 2)] = 10
shipping[("USA", 3)] = 0
shipping[("Canada", 0)] = 8
shipping[("Canada", 1)] = 10
shipping[("Canada", 2)] = 12
shipping[("Canada", 3)] = 0

print shipping[("USA", chargeCode)]

totalAmount+0.001 используется, чтобы избежать забавы с числами с плавающей точкой:

int(100*(81.85)) == 8184

Возвращает True в моей системе, потому что точка плавания 81.85 немного меньше десятичной 81.85.

3
Yevgen Yampolskiy 31 Янв 2013 в 05:24