1

この Python ソース コードの要点を簡潔にするために、別の方法でコーディングできますか? このプログラムのポイントは、ユーザーの合計金額を取得し、それを送料に追加することです。送料は、国 (カナダまたは米国) と製品の価格によって決まります。カナダで $125.00 の製品の送料は $12.00 です。


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

while 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
4

2 に答える 2

3

コードを簡素化するためのコアは次のとおりです。米国での送料は $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

浮動小数点は decimal よりも少し小さいTrueため、私のシステムでは が返されます。81.8581.85

于 2013-01-31T04:46:04.937 に答える
1

コスト計算の基本的な戦略は次のとおりです。

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, inf) のようにかなり直線的に変化するということです。

最初のグループは、他のグループには下限が含まれていない 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. したがって、範囲 (0, 3] の数値に math.ceil を適用すると、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 に等しいかどうかを確認し、 is, using 0 as our shipping array index instead of the conversion our conversion to amount to determine the index. これは、次の式で Python の短絡and演算子 (Web にはこれに関する多くの情報があるはずです)を使用して実現できます。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

これで完了です。

于 2013-01-31T05:04:39.053 に答える