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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Python

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

Q&A

解決済

1回答

2495閲覧

f-stringの変数化

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/04/17 23:17

編集2019/04/18 02:56

f-stringの変数化

下記のようにf-stringを用いて複数の変数を表示するのですが、同じコードを条件分岐などで複数回使います。

print(f"{month:5d} {starting:16.2f} {interest:15.2f} {principal:16.2f} {monthly_payment:7.2f} {remaining:14.2f}")

長く読みづらいので"formatted_output"として定義して再利用できないかと試してみたのですが、どのような形でprintに入れても上手くいきません。

formatted_output = f"{month:5d} {starting:16.2f} {interest:15.2f} {principal:16.2f} {monthly_payment:7.2f} {remaining:14.2f}" # 上手くいかず # print(formatted_output) # print(f"formatted_output") # print(f"{formatted_output}")

f-stringのコードを変数として定義することはできないのでしょうか?

追記

プログラムは、リボ払いでの各月の金利や支払額を表のように出力するものです。
month, startingなどはprintするごとに変化します。

# Compute a payment schedule DISCOUNT_RATE = 0.1 ANNUAL_INTEREST_RATE = 0.12 MONTHLY_INTEREST_RATE = ANNUAL_INTEREST_RATE / 12 MONTHLY_PAYMENT_RATE = 0.05 original_price = float(input("Enter the purchase price: ")) discounted_price = original_price * (1 - DISCOUNT_RATE) # The price for members month = 1 starting = discounted_price # The current total balance owed monthly_payment = ( discounted_price * MONTHLY_PAYMENT_RATE ) # the sum of interest and principal for that manth interest = discounted_price * MONTHLY_INTEREST_RATE principal = monthly_payment - interest remaining = starting - principal # The balance remaining after payment # display the titles of a table print( "\n" "Month Starting Balance Interest to Pay Principal to Pay Payment Ending Balance\n" "-----------------------------------------------------------------------------------" ) # Display the info of the first month print( f"{month:5d} {starting:16.2f} {interest:15.2f} {principal:16.2f} {monthly_payment:7.2f} {remaining:14.2f}" ) # Display the info of the second month and later while monthly_payment <= remaining: month += 1 starting = remaining interest = starting * MONTHLY_INTEREST_RATE principal = monthly_payment - interest remaining = starting - principal print( f"{month:5d} {starting:16.2f} {interest:15.2f} {principal:16.2f} {monthly_payment:7.2f} {remaining:14.2f}" ) # Evaluate the remaining and display the info of the last month if monthly_payment >= remaining: month += 1 starting = remaining interest = 0 principal = starting monthly_payment = starting remaining = 0 print( f"{month:5d} {starting:16.2f} {interest:15.2f} {principal:16.2f} {monthly_payment:7.2f} {remaining:14.2f}" )

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

f-stringは即時評価されてしまうので、

python

1s = "{month:5d} {starting:16.2f} {interest:15.2f} {principal:16.2f} {monthly_payment:7.2f} {remaining:14.2f}" 2 3print(s.format(month=...))

というように、テンプレートとしての文字列sを一個作って、あとから必要な場所で.formatメソッドを呼ぶ形にすればテンプレートsを使いまわすことができます。


追記

print部分を短くするだけなら次のような方法があります。

位置引数を使う場合。

Python

1s = "{:5d} {:16.2f} {:15.2f} {:16.2f} {:7.2f} {:14.2f}" 2 3values = [1, 2.0, 3.0, 4.0, 5.0, 6.0] 4print(s.format(*values))

キーワード引数を利用する場合。

Python

1s = "{month:5d} {starting:16.2f} {interest:15.2f} {principal:16.2f} {monthly_payment:7.2f} {remaining:14.2f}" 2 3kv = { 4 "month": 1, 5 "starting": 2.0, 6 "interest": 3.0, 7 "principal": 4.0, 8 "monthly_payment": 5.0, 9 "remaining": 6.0 10} 11print(s.format(**kv))

キーワード引数を使う場合だと、例えば一つの変数info(dictクラス)に情報を集約しておく、などですかね。

Python

1# Compute a payment schedule 2 3DISCOUNT_RATE = 0.1 4ANNUAL_INTEREST_RATE = 0.12 5MONTHLY_INTEREST_RATE = ANNUAL_INTEREST_RATE / 12 6MONTHLY_PAYMENT_RATE = 0.05 7 8original_price = float(input("Enter the purchase price: ")) 9discounted_price = original_price * \ 10 (1 - DISCOUNT_RATE) # The price for members 11 12info = { 13 "month": 1, 14 "starting": discounted_price, # The current total balance owed 15 # the sum of interest and principal for that manth 16 "monthly_payment": discounted_price * MONTHLY_PAYMENT_RATE, 17 "interest": discounted_price * MONTHLY_INTEREST_RATE, 18} 19info["principal"] = info["monthly_payment"] - info["interest"] 20# The balance remaining after payment 21info["remaining"] = info["starting"] - info["principal"] 22 23# display the titles of a table 24print( 25 "\n" 26 "Month Starting Balance Interest to Pay Principal to Pay Payment Ending Balance\n" 27 "-----------------------------------------------------------------------------------" 28) 29 30 31# Display the info of the first month 32s = "{month:5d} {starting:16.2f} {interest:15.2f} {principal:16.2f} {monthly_payment:7.2f} {remaining:14.2f}" 33print(s.format(**info)) 34 35 36# Display the info of the second month and later 37while info["monthly_payment"] <= info["remaining"]: 38 info["month"] += 1 39 info["starting"] = info["remaining"] 40 info["interest"] = info["starting"] * MONTHLY_INTEREST_RATE 41 info["principal"] = info["monthly_payment"] - info["interest"] 42 info["remaining"] = info["starting"] - info["principal"] 43 44 print(s.format(**info)) 45

投稿2019/04/17 23:29

編集2019/04/18 03:32
tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/04/18 00:48

なるほど、f-stringは即時に評価されるのですね。 print()内を極端に短く書く方法はないのでしょうか? もしformat( )メソッド以外のやり方もご存知でしたら教えていただければ嬉しいです。
退会済みユーザー

退会済みユーザー

2019/04/18 02:55

度々すみません。 質問文に追記したようにprint()の内容は毎回変化するのですが、その場合はどのように位置引数やキーワード引数を使えば良いでしょうか?
退会済みユーザー

退会済みユーザー

2019/04/18 03:41

なるほど、dictクラスを使ってまとめればprint()内をすっきりさせられるんですね。 自分では思いつきませんでした。 繰り返しお付き合い下さって、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問