47758


プログラミング初心者なのですが今回Python3を使って関数間の引数を渡すことについて質問させていただきます。  
今回行いたい処理はmain関数にある変数aをcalc1関数に渡し足し算処理をした後、main関数を経由せずにcalc2関数に渡して掛け算をし、最後にmain関数に渡すという処理です

[code]

    def calc2(b):
        return b * 2
    
    def calc1(a):
        b = 0
        b = a + 2
        return b
    
    def main():
        a = 1
        print(calc2(b))
    
    main()
    
[/code]

このように書くと変数bは定義されてないと言われます。

下のようにmain関数を通せば動いたのですが（この表現が正しいかわからなかったので）

[code]

    def calc2(c):
        return c * 2
    
    def calc1(a):
        b = 0
        b = a + 2
        return b
    
    def main():
        a = 1
        c = calc1(a)
        print(calc2(c))
    
    main()
    
[/code]


CC BY-SA 4.0
2018-08-22T01:16:44.037
47710
2018-09-03T19:28:24.127
2018-08-23T09:15:31.387
76
26973
question
python python3
関数間の引数渡しについて質問です


上側のコードの

[code]

    def main():
        a = 1
        print(calc2(b))
    
[/code]

の部分を見ると、最初に変数aが定義されると共に値が代入されています。  
その後で、どこにも定義がない変数bをclac2の引数として使おうとしたから「変数bは定義されてない」と言われたのです。

calc1関数の定義の中で b=0 などとしていますが、こうした関数定義内部の変数はcalc1関数の外からアクセスすることが出来ないのです。

この問題の解決方法は、下側のコードで良いと思います。


CC BY-SA 4.0
2018-08-22T01:28:35.867
47711
2018-08-22T01:28:35.867
217
47710
answer


おそらく変数名が同じものはどこでも使えると勘違いされているかとおもいます。  
関数内で定義した変数名は、関数内だけで有効な名前になります。

最初のコードを例に上げると、

関数calc2では、変数bが仮引数として定義されています。  
関数calc1では、変数aが仮引数で定義。また代入によって変数bが定義されています。  
関数mainでは、変数aが代入によって定義されていますが、bは未定義なのに使用しているためにエラーになっています。

同じ変数名aであっても関数main内のaと、関数calc1の仮引数aは違うものなのでご注意ください。


CC BY-SA 4.0
2018-08-22T02:30:22.750
47715
2018-08-22T02:30:22.750
28626
47710
answer


>
> 行いたい処理はmain関数にある変数aをcalc1関数に渡し足し算処理をした後、main関数を経由せずにcalc2関数に渡して掛け算をし、最後にmain関数に渡す

以下のように `calc1` と `calc2` を書き換えてみました、理解の一助になれば幸いです。

[code]

    def double(number):    # calc2
        return number * 2
    
    
    def add_two(number):    # calc1
        return number + 2
    
    
    def main():
        first = 1
        print("first: ", first)
    
        second = add_two(first)
        print("second: ", second)
    
        third = double(second)
        print("third: ", third)
    
        # other pattern
        print("other: ", double(add_two(1)))
    
    if __name__ == '__main__':
        main()
    
[/code]

Output

[code]

    first:  1
    second:  3
    third:  6
    other: 6
    
[/code]


CC BY-SA 4.0
2018-08-23T06:56:56.793
47758
2018-08-23T06:56:56.793
29826
47710
answer