アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のプログラムで 
def say_hi(name, age = 80,address):
print("hi {0} ({1})({2})".format(name, age,address))

say_hi("tom", 23,"hatinohesi")
say_hi("bob",55,"akitasi")
say_hi("steve",90,"kuroisisi") 
say_hi(age = 18, name = "rick",address="otarusi")

ではエラーになって結果が表示されないが

def say_hi(name, age = 80,address=""): #address="" とした
print("hi {0} ({1})({2})".format(name, age,address))

say_hi("tom", 23,"hatinohesi")
say_hi("bob",55,"akitasi")
say_hi("steve",90,"kuroisisi")

say_hi(age = 18, name = "rick",address="otarusi")

hi tom (23)(hatinohesi)
hi bob (55)(akitasi)
hi steve (90)(kuroisisi)
hi rick (18)(otarusi)

と表示されるのは何故なんでしょうか

また  print("hi {0} ({1})({2})".format(name, age,address))の{0} ({1})({2})は
{0} {1}{2}ではどうしてだめなんでしょうか。

A 回答 (4件)

> エラーになって


> だめなんでしょうか

質問するときは、具体的に書きましょう。
・エラーが出ているのなら、そのメッセージを読みましょう。
エラーになった理由はそこに書いてあります。
質問する場合は、コピペしましょう(個人情報等は編集しましょう)
・何が「だめ」なのかを書きましょう。
 エラーになってしまう
  と
 思ってたのと違う
  とでは対処方法が違います。


○エラー
マニュアルを読みましょう。
https://docs.python.org/ja/3.9/reference/compoun …
> 1 つ以上の 仮引数 が parameter = expression の形を取っているとき、関数は "デフォルト引数値" を持つと言います。
> ある引数がデフォルト値を持っている場合、それ以降 "*" が出てくるまでの引数は全てデフォルト値を持っていなければなりません

def say_hi(name, age = 80,address):
は age=80 の形を取っているので、「デフォルト値を持っている」ことになります。
そのため、age=80「以降 "*" が出てくるまでの引数は全てデフォルト値を持っていなければなりません」
ですが、 address はデフォルト値を持っていません。
よって、エラーになります。

○だめ
https://docs.python.org/ja/3.9/library/stdtypes. …
フォーマット文字列.format(対応する値,...(
という形で使われ、フォーマット文字列内の {0}{1}... 等は、それぞれ「対応する値の0番=1つめ」「対応する値の1番=2つめ」... に対応します。
それ以外の文字は、そのまま使われます。

print("hi {0} ({1})({2})".format("tom", 23,"hatinohesi"))
だと
hi tom (23)(hatinohesi)
と出力されます
print("hi {0} {1}{2}".format("tom", 23,"hatinohesi"))
だと
hi tom 23hatinohesi
と出力されます。

・Pythonとしてはどちらも「正しい」ものです。
・「hi tom 23hatinohesi」という出力が、あなたが欲しい結果でなければ{0} {1}{2}では「だめ」です。
    • good
    • 0

>と表示されるのは何故なんでしょうか



書式文字列に忠実に出力されてるけど、
書式文字列の読み方を知りたいってこと?

>print("hi {0} ({1})({2})".format(name, age,address))の{0} ({1})({2})は
>{0} {1}{2}ではどうして駄目なんでしょうか?

何が駄目なのか解らない。
エラ―が起きるなら見えない不正な文字がソースに
紛れているのでしょう。

出力形式が気に入らないならどうしたいのか書こう。
年齢と住所を離したいなら {0} {1} {2} と適宜隙間を
入れればいい。
    • good
    • 0

SyntaxError: non-default argument follows default argument



と出てた筈だよ。

「既定値のある引数の後ろに既定値のない引数がある。」
    • good
    • 1

> エラーになって結果が表示されないが



少なくともどこでどういうエラーになってるかは確認しましょう。単にエラーで動きませんではどうしようもありません。

この場合はprint は全然関係なくて、ただ単に途中の引数だけに省略時引数を与えても駄目だと言う、それだけのことだと思いますよ。

print の括弧は、単に出力の形がどうなるかというだけの問題です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!