質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.85%

  • Python

    5894questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    4423questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

関数について。 (コードの短縮)

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 112

xRein

score 1

 前提・実現したいこと

関数を使ったコードの短縮。
pythonの学習を始めたのですが書いたコードを関数を使って短くしたいと思ってもどうやればいいのか検討がつきません。どこで関数を使ったらいいか、などアドバイスを頂けたら幸いです。また、どこか改善点があればそれも教えていただけたらと思います。

 該当のソースコード

ソースコード

a=0
b=0.05
c=0.07
d=0.12
another = "y"

taxa = 0
taxb = 0
taxc = 0
taxd = 0

totala = 0
totalb = 0
totalc = 0
totald = 0
stpt = 0
while another == "y":
item_number = int(input("Please enter a Item Number:"))
q = int(input("Please enter quantity:"))
p = float(input("Please enter the price:"))
if item_number in range (100,200):
totala = totala + p*q
taxa = totala * a
total = totala + totalb + totalc + totald
tax = taxa + taxb + taxc + taxd
stpt = tax + total
print("Subtotal before Tax:$ %7.2f" %(total),
"Total tax:$ %7.2f" %(tax),
"Subtotal plus Tax:$ %7.2f" %(stpt))
another = input('Do you have another item?' + '(Enter y for yes, n for end):')
elif item_number in range (200,300):
totalb = totalb + p*q
taxb = totalb * b
total = totala + totalb + totalc + totald
tax = taxa + taxb + taxc + taxd
stpt = tax + total
print("Subtotal before Tax:$ %7.2f" %(total),
"Total tax:$ %7.2f" %(tax),
"Subtotal plus Tax:$ %7.2f" %(stpt))
another = input('Do you have another item?' + '(Enter y for yes, n for end):')
elif item_number in range (300,400):
totalc = totalc + p*q
taxc = totalc * c
total = totala + totalb + totalc + totald
tax = taxa + taxb + taxc + taxd
stpt = tax + total
print("Subtotal before Tax:$ %7.2f" %(total),
"Total tax:$ %7.2f" %(tax),
"Subtotal plus Tax:$ %7.2f" %(stpt))
another = input('Do you have another item?' + '(Enter y for yes, n for end):')
elif item_number in range (400,500):
totald = totald + p*q
taxd = totald * d
total = totala + totalb + totalc + totald
tax = taxa + taxb + taxc + taxd
stpt = tax + total
print("Subtotal before Tax:$ %7.2f" %(total),
"Total tax:$ %7.2f" %(tax),
"Subtotal plus Tax:$ %7.2f" %(stpt))
another = input('Do you have another item?' + '(Enter y for yes, n for end):')
else:
print("Invaild Item Number")
another = input('Do you have another item?' + '(Enter y for yes, n for end):')
print ("Total before Tax:$ %7.2f" %(total),
"Total tax:$ %7.2f" %(tax),
"Total plus Tax:$ %7.2f" %(stpt))
print ('end')

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2018/06/07 21:04

    とりあえず質問文の編集を開いて、<code>みたいなボタンを押して出てくるものでコードをくくってください(あと「ここに言語を入力」を「python」に書き換える)。今の表示だとインデントも見えないし、読めないです

    キャンセル

回答 1

checkベストアンサー

+5

想像・補完…

from collections import defaultdict
labels = list('abcd')
rates = {'a': 0, 'b': 0.05, 'c': 0.07, 'd':0.12}
taxes = defaultdict(float)
totals = defaultdict(float)

def get_input():
    item = int(input('Number'))
    q = int(input('Quantity'))
    p = float(input('price'))
    return item, p, q

def get_label(item):
    if 100 <= item < 200:
        return 'a'
    elif 200 <= item < 300:
        return 'b'
    elif 300 <= item < 400:
        return 'c'
    elif 400 <= item < 500:
        return 'd'
    else:
        return None

def get_total_tax(label, p, q):
    total = p*q
    tax = total*rates[label]
    return total, tax

def show():
    print(f'BeforeTax: {sum(totals.values())} Tax: {sum(taxes.values())}')

while True:
    item, p, q = get_input()
    label = get_label(item)
    if label is not None:
        total, tax = get_total_tax(label, p, q)
        taxes[label] += tax
        totals[label] += total
    else:
        print('Invalid Input')
    show()
    if input('Continue?') != 'y':
        break

コメント追加

from collections import defaultdict

#変数名では抽象化できないので、定石通りラベルを用意して辞書で処理する
labels = list('abcd')
rates = {'a': 0, 'b': 0.05, 'c': 0.07, 'd':0.12}

# taxes = {k:0 for k in labels}と同じだが、気分でdefaultdictを使ってみた
taxes = defaultdict(float)
totals = defaultdict(float)

def get_input():
    '''
    データ入力を受け付ける
    3つの数字をゲットする
    それぞれ、整数、整数、実数
    例外処理があればこの中で処理する
    '''
    item = int(input('Number'))
    q = int(input('Quantity'))
    p = float(input('price'))
    return item, p, q

def get_label(item):
    '''
    商品IDを準備しておいたラベルに対応付ける
    想定外のIDはNoneを返す
    '''
    if 100 <= item < 200:
        return 'a'
    elif 200 <= item < 300:
        return 'b'
    elif 300 <= item < 400:
        return 'c'
    elif 400 <= item < 500:
        return 'd'
    else:
        return None

def get_total_tax(label, p, q):
    '''
    入力分の総額と税(?)を計算する
    レートはアイテムごとに異なるが、用意してあるものを引き出すためにラベルを使う
    '''
    total = p*q
    tax = total*rates[label]
    return total, tax

def show():
    '''
    出力はここにまとめる
    他に税込みも出力できるし、ファイルに書き出すこともできる
    '''
    print(f'BeforeTax: {sum(totals.values())} Tax: {sum(taxes.values())}')

while True:
    item, p, q = get_input() #入力ゲット
    label = get_label(item) #ラベルゲット
    if label is not None: #対応ラベルがある場合のみ総額と税を計算する
        total, tax = get_total_tax(label, p, q) #総額と税の計算
        taxes[label] += tax #総額を加算する
        totals[label] += total #税を加算する
    else: #対応するラベルがない場合はエラーと表示
        print('Invalid Input')
    show() #いずれにしろ暫定総額などを表示する
    if input('Continue?') != 'y': #入力がy出ない限り打ち切り
        break

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/07 22:47

    済みません。。。思わず、 + を付けてしまいました。
    (久々です、こういうコード見たのは)
    関数の意味、あるいは、用途の説明が必要な気がしますが、(自分には)難しい。

    キャンセル

  • 2018/06/07 23:54

    コメントを追記しました。

    コメントなしだとわかりにくい所があればシェアしていただけると幸いです。
    改善案を模索します。

    キャンセル

  • 2018/06/08 04:34

    該当のコードのみならずコメントまで丁寧にありがとうございます!少しづつ理解していこうと思います。本当にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    python

    for item in range(1,10):     x+item=input('enter: ')     xy+item=(5+10*(item-1))*x+item

  • 受付中

    Python3.4.3について。

    Pythonの勉強をしていて100回足し算をするプログラムを作ったのですがPython2.7系だと正常に動作するんですがPython3.4.3だとエラーは出ないんですが、正常に動い

  • 解決済

    Pythonのmultiprocessing.Processでのグローバル変数の共有について

    Pythonのmultiprocessing.Processクラスの挙動について質問させてください。 Processオブジェクトを作成してstart()で呼び出すと、指定したメソ

  • 解決済

    While文を抜けるには・・・

    Python(というかプログラミング)初心者です。よろしくお願いします。 FizzBuzzのコードなのですが、int以外が入力されたら、whileを抜けて 'Please ent

  • 解決済

    Jquery 計算方法について

    次のコードで 計算シートを作成しているのですが 各項目の構成率(合計額に対する割合)の部分が上手く動いてくれなくて行き詰ってしまいました。 このままのソースで動かした場合の結果

  • 受付中

    SQLの計算およびインサート

    SQL文で登録されているデータを計算し、 計算したデータを同じテーブルに登録するような処理を自動で行うことは可能でしょうか。 1つ目 2つ目 3つ目 10

  • 解決済

    Let’s Encrypt 複数ドメイン用に証明書を取得できない件です。

    前提 Let’s Encrypt で最初に証明書を取得したドメイン以外、証明書を取得することができませんでした。 Let's Encrypt 総合ポータル : https:

  • 解決済

    pythonで連続出力

    ループ処理でリストから一つずつ取り出して、それを変換したものを、 一行に2個、半角スペースで区切って表示したいのですが、どうしたら良いでしょうか。 入力サンプル 3 2 46 

同じタグがついた質問を見る

  • Python

    5894questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    4423questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。