• 締切済み

python: def関数での記述arg=

python: def関数での()記述内にarg=を書く意味と働き pythonで、defで関数定義をする際、引数を並べるやり方は理解したのですが、arg = と記述する意味ができずにいます 図のAでは実行すると100を出力します 5行目 f(arg = i)の ”arg =” の文法というか、これがはたしている役割がよくわかりません ためしにBのように arg= を撤去して、引数をiたった1つにすると9行目でエラーになります ( f(i)とするとエラーにならない) Cがエラー出ない理由もわかります 質問: 1) Bにおいて、5行目で arg = の果たしている役割を教えてください 2) Bにおいて9行目でf()では関数を呼び出せていないのは、arg = の不在と関係あると想像できますが、そのロジックを教えてください 【回答上のご注意】 回答は、解答(答え)を求めています わたしはプログラマーではないので、昭和的な「自分で考えろ」的なものは求めていません わからなければ答えない自由もあなたにはあります 不明点があれば説明いたします

この投稿のマルチメディアは削除されているためご覧いただけません。

みんなの回答

回答No.3

> このサイトは持っているテキスト本より参考になります 公式サイトですからね。 なるたけ、公式サイトで情報を検索出来るようにすべきです。 (とは言っても、「単語」、例えば「キーワード引数」とか知らないと検索出来ませんが) Pythonチュートリアル(公式サイト): https://docs.python.org/ja/3/tutorial/ あと、通読するには向かないけど、該当項目を索引から引きやすいWeb書籍(無料)として、次のようなブツがあります。 Think Python: https://cauldron.sakura.ne.jp/thinkpython/thinkpython/ThinkPython2.pdf なお、問題を見ましたが、ぶっちゃけ「試験の為だけの問題」であって、悪問の類です。 そもそもキーワード引数に与えるのは「実値」であって、グローバル変数を参照させるべきではない。 つまり、この問題は「プログラムを綺麗に書くためのスタイル」には則ってなく、単に知識を問うだけの問題で、こういうのは「悪問」でしょう。 プログラムを書く際のスタイルとしては何の役にも立ちゃしない。 んで、どこかは知らないけど、「Python資格試験」の類ってのはこういうのが多いんですよ。 しかも「資格試験」とか言っても「公的資格」でも何でもないんです。国家資格の「情報処理技術者」みたいなヤツを保証するわけでもない。 んで「資格試験」を行う側も、実は単なる利潤団体だったりするんで、問題も役に立たない、資格も結果役に立たなかったりするんです。

ketae
質問者

お礼

ありがとうございます わたしは書いたようにプログラマーではないのですが、バグチケットに修正したコードのスクリーンショットを海外のプログラマーが貼ることがあり、すこしでも読めたほうがいいかなと思い、空いた時間にpythonチュートリアル本を読むようになりました 別の質問もみかけましたらよろしくお願いします

全文を見る
すると、全ての回答が全文表示されます。
回答No.2
ketae
質問者

お礼

ありがとうございます 引数の要素数の使い方がわからなかったのですが、 必須引数 とオプション引数という概念を知らなかったので助かりました このサイトは持っているテキスト本より参考になります

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8533/19397)
回答No.1

Aの def f(arg = i) は、関数fの引数はargで、引数を省略して呼び出した時のデフォルト値はiです、という意味です。 引数は「arg」の方で、「i」は「引数ではなく、省略時の初期値」なので、間違わないように。 ですので def f(arg = i) print(i) と定義した時、引数に何を指定しても、常に「100」と表示されます。グローバルに定義した「i」をプリントしていて、引数をプリントしていませんから、最初の「i = 100」で代入した「100」が必ずプリントされます。50を引数に指定しても50とはプリントされません。 これは def f(arg = i) print(arg) と書かないと、引数を持つように定義した意味がありません。 def f(arg = i) print(i) と書くと def f(arg = i) print(100) と書いたのと同じになってしまいます。 Aは関数fを定義した時に「引数省略時はiになります」と定義しているので f() のように「引数を省略して呼び出す事が可能」です。 Bの def f(i) は、関数fの引数はiで、省略不可です、という意味です。 Bは関数fを定義した時に「引数は1つで必須です」と定義しているので f() のように「引数を省略して呼び出すとエラー」です。 Cは引数を2つ持った関数fを定義しています。 なので、呼び出す時も f(100, 23) のように、引数を2つ指定する必要があります。 引数が2つになっているだけで、Bと同じです。

ketae
質問者

お礼

ありがとうございます! めちゃくちゃわかりやすいです 引数がargで、「i」は省略時の初期値 資格問題が問うていることがわかりました 大変たすかりました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Pythonでの関数呼び出し

    現在pythonでのプログラミングをしています。 例えば下のように関数を作るとglobal errorが発生します。 pythonでは引数で関数名を受け取らずに関数内から他の関数を呼び出すことはできないのでしょうか? よろしくお願いします。 ***************************************** def a():   b() def b():   print "test" a() *****************************************

  • VBで、関数を関数の引数にするは?

    VBで関数の引数に、関数を呼ぶにはどのようにすればいいでしょうか?  例えば以下のようなイメージです   DEF FUNC1(X)=X^2   DEF FUNC2(F,a,b)=F(a)+F(b)     関数FUNC2では、関数Fを引数にする     つまりFUNC2(FUNC1,1,2)は     FUNC1(1)+FUNC1(2)=1^2+2^2=5 こんな感じです。 お教えください。

  • python:関数が複数globalを読むロジック

    pythonの次のコードがあります #------------------------------------ #code default_name = "Ichiro" def kyodai1(name=default_name): return f"Hello {name}," def kyodai2(name=None): if name is None: name = default_name return f"Hello {name}." default_name = "Jiro" print(kyodai1(), kyodai2()) # 出力 # Hello Ichiro, Hello Jiro. #----------------------------------- kyodai2()関数では、 name = default_name とあり、default_nameは最初の行の"Ichiro"を呼ぶかと思ったら、関数の下にある"Jiro"を読みに行っています default_nameはglobal変数として default_name = "Ichiro" があるのに、def kyodai2()関数だけ default_name = "Jiro" を読みに行った理由がわからずにいます このロジックを3つのAIにコードを読ませて説明させたところ、うち1つが 「(kyodai2スコープ内で)default_nameが定義されていません。この場合、default_name = "Ichiro"ではなく、default_name = "Jiro"を参照します」 と答えました 質問: この説明が正しいかどうかもわからないのですが、なぜkyodai2()関数は、最初のIchiroではなくJiroを読みにいくのでしょうか? Tutolialで該当箇所がわからずにいます 【回答上のご注意】 回答は、解答(答え)を求めています わたしはプログラマーではないので、昭和的な「自分で考えろ」的なものは求めていません わからなければ答えない自由もあなたにはあります 不明点があれば説明いたします

  • pythonの関数内での関数の定義について

    Python Cookbook 3rd の2章6節の内容でわからないことがあります。 コード import re #サンプルテキスト text = 'UPPER PYTHON, lower python, Mixed Python' #正規表現で文字のケースに合わせて置換する def matchcase(word) .....def replace(m): ..........text = m.group() ..........if text.isupper(): ...............return word.upper() ..........elif text.islower() ...............return word.lower() ..........elif text[0].isupper(): ...............return word.capitalize() ..........else: ..............return word .....return replace #実行分 re.sub('python', matches('snake'), text, flags=re.IGNORECASE) #実行結果 >>>'UPPER SNAKE, lower snake, Mixed Snake' このサンプルコードのmatchcase内のreplace関数に引数を渡していないと思うのですが、どのような仕組みでこのコードは動いているのでしょうか? m.group()とあるので実行分のre.sub(...)でのマッチしたという情報がreplace(m)のmに渡されているだろうとは思うのですが、なぜ引数を指定せずにそのようなことが起こるのかが理解できません。 何卒よろしくお願いします。

  • Pythonの関数について

    Pythonの関数について質問です。以下の関数はどのような処理を行なっていますか? intents = json.loads(open('data/Common.json', encoding='utf-8').read()) def getResponse(ints, intents_json): tag = ints[0]['intent'] list_of_intents = intents_json['intents'] for i in list_of_intents: if(i['tag']== tag):    #ランダムに要素を1つだけ抽出 result = random.choice(i['responses']) break else: result = "You must ask the right questions" return result

  • pythonのエラーについて教えて下さい。

    pythonの勉強をおこなっている超初心者です。 ネットでみた。以下のサンプルコードを実行しようとしました。 # -*- coding: utf-8 -*- print u'モジュールのロード' def test(): print u'関数:testを呼び出しました' if __name__ == '__main__': print 'python-izm' # print 'パイソンイズム' test() しかし、以下の様なエラーとなってしまいます。 File ”test02.py"、line 9 print ’python-izm'  ^ indentionError:expected an indented block ネット調べてみたとことpythonのインデントのエラーだとわかりました。 pythonはインデントで実行範囲を認識するので、 そこがうまく記述できていないであろうとは思うのですが、何回か試したのですが うまく動いてくれません。 どなたか御指南下さい。

  • Ruby インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶ

    #!/usr/bin/ruby def foo(arg) arg.upcase end def bar(arg) arg.upcase end class Foo attr_reader :foo def initialize(arg) @foo = foo(arg) #@foo = bar(arg)とすれば期待した結果が得られる end end f=Foo.new("hoge") puts f.foo 上記実行するとエラーになります。 Class Fooの中のでfooといえば、インスタンス変数@fooであって、関数のfooではないって事なのでしょうか。 インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶことはできないのでしょうか?

  • 関数を呼んだら、その中の関数も自動実行される?

    ・関数の実行タイミングが分からないので教えてください ・下記で、どうして引数が渡るのでしょうか? ・portal関数を呼んだら、gooプロパティに無名関数が格納される(?)と思うのですが、=関数実行になるのでしょうか? ・無名関数だから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);  } } obj.portal("あ"); ・自分的には、portal関数を呼んで変数gooに無名関数を格納(?)した後、明示的にgoo();と呼ぶ必要があると思うのですが… ・下記でTypeErrorエラーになるのは、gooプロパティが2回呼ばれるから? ・明示的に呼んだ2回目は引数が渡らないから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);   goo();  } } obj.portal("あ"); //TypeError: undefined is not a function

  • 任意の数の引数をとる関数

    gccでprintfのように、任意の数の引数をとる関数を作りたいのですが、MS-VCでは hoge(arg1, arg2, ...) という書式のようですが、gccではエラーでした。 どうすればいいのでしょうか?

  • Pythonの命令文について教えてください

    Pythonを勉強中です。 Pythonの命令文で a = x // b + 1 と記述された文を見かけますが、どのような意味でしょうか? また、Pythonを勉強するにあたり、おすすめの技術書があれば教えてください。 よろしくお願いします。