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

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

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

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

Q&A

解決済

1回答

1482閲覧

【Python】関数内での変数の処理のされ方

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

1クリップ

投稿2015/05/09 08:40

Pythonの関数の勉強のために、
「myname("yamada")」
と入力すると、
「My name is yamada」
と表示される関数(myname)を下記のように書いてみました。

方法1

lang

1from string import Template 2def myname(myname): 3 s= Template("My name is $who") 4 s.substitute(who = myname) 5 print(s)

しかし、方法1の場合は、
「myname("yamada")」
と書いても、
何も表示されませんでした。

一方で、
方法2

lang

1from string import Template 2def myname(myname): 3 s = Template("My name is $who") 4 print(s.substitute(who = myname))

と書いた場合は、
「My name is yamada」
と表示されますので、うまくいきました。

方法1ではうまくいかない理由は何でしょうか。
方法1で「s.substitute(who = myname)」を経た後の「s」には、
既に「My name is yamada」が入っているのかと思っていたのですが、
そういうわけではないのでしょうか。
お分かりになる方、ご教示頂ければ幸いです。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

・sはTemplateクラスであり文字列ではない。
・Templateクラスのsubstituteメソッドは文字列置換した文字列を返す。

つまり

方法1で「s.substitute(who = myname)」を経た後の「s」には、
既に「My name is yamada」が入っているのかと思っていたのですが、
そういうわけではないのでしょうか。

この通りです。

投稿2015/05/09 09:14

編集2015/05/09 09:18
ozwk

総合スコア13521

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

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

退会済みユーザー

退会済みユーザー

2015/05/09 10:11

ご回答頂き、ありがとうございました。 つまり、「s.substitute(who = myname)」とした時点では、 sの中に「My name is yamada」 というデータが入っているわけではなく、 sの$whoをmynameとして解釈するという指示を出したにとどまるということですね。 そして、print(s.substitute(who = myname))として初めて、 sの中に「My name is yamada」が入るということですね。 ちなみに、 def myname(myname): s = Template("Myname is $who") s = s.substitute(who = myname) print(s) という関数にしたところ、「My name is yamada」は表示されました。 これは、s = s.substitute(who = myname)とした時点で、 sに「My name is yamada」という文字列が入ったからなんですね。
ozwk

2015/05/09 10:34

>sの$whoをmynameとして解釈するという指示を出したにとどまるということですね。 >そして、print(s.substitute(who = myname))として初めて、 >sの中に「My name is yamada」が入るということですね。 細かいようですが違います。 sは再代入しない限り、首尾一貫してTemplate("My name is $who")のままです。
massakai

2015/05/09 12:16

Pythonでは名前を指定して引数に値を渡すことができます。 例えば、myname("yamada") は myname(myname="yamada") と書くことができます。 s.substitute(who=myname) は substitute() の引数 who に myname を渡して、 $who を myname に置き換えた文字列を返しますが、 $who が myname であることを s の内部に保存しません。
退会済みユーザー

退会済みユーザー

2015/05/09 12:24

ozwkさん、massakaiさん、コメントありがとうございました。 たしかに、下記のとおり試してみたらそのとおりでした。 >>> def myname(myname): ... s = Template("Myname is $who") ... print(s.substitute(who = myname)) ... >>> myname("yamada") Myname is yamada >>> s <string.Template object at 0x008607B0> 上記のとおり、sには何も入っていませんでした。 名前を指定して代入しない限り、引数には値は入らないということが、よく分かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問