☆☆ 新着記事 ☆☆

2018年11月8日木曜日

Python 関数 引数と戻り値,変数の引き渡しを中心に

Pythonの関数を引数と戻り値を中心に書き留めます。


◆引数のある関数(基本)

def func(a,b):
    print(a*b)

func(2,3)
#Output: 6

又は

def func(a,b):
    c=a*b
    print(c)

func(2,3)
#Output: 6


◆戻り値(Return Value)

*戻り値がないとエラーとなる記述
def func(a,b):
    c=a*b

print(func(2,3))
#Output: None

a*bを計算してもreturn値を使って値を戻さなかった為、
「この関数からは何も戻らない」というNoneがcに代入されてしまった。

*こう書く

test.py
===============================
def func(a,b):
    c=a*b
    return c

print(func(2,3))
#Output: 6
===============================
def func(a,b):
    c=a*b
    d=a/b
    return (c,d)

def func2():
    e = func(2,3)
    print(e)
    return e
func2()
#Output:(6, 0.6666666666666666)


◆戻り値の無い関数を別の関数内で起動

===============================
def func1():
    a = 3
    b = 6
    c = a* b
    print(c)

def func2():
    func1()

func2()
===============================

#Output: 18



◆2つの関数間での戻り値の引き渡し
test.py
================================
def func1():
    a=2
    b=3
    c=a*b
    return c    # returnの記述は必須

def func2():
    d=func1()*3 #func1() を引きつかずに、変数 'c' だけを直接書いたらエラーになる。
          #他関数内で定義された変数(Local Variable)は別の変数に引き継げない。
    print(d)

func2()
#Output: 18
===============================


◆2つの関数間でのリストの引き渡し

* リストは関数内でローカル変数として定義している場合

test.py
================================
def func1():
    ret=[]
    ret.append([1,2])
    print(ret)
    return ret

def func2():
    ret2=func1() #関数 func1()の実行結果の ret の値が代入されている。
    print(ret2)
    ret2.append(2)
    print(ret2)

func2()
#Output:
[[1, 2]]
[[1, 2]]
[[1, 2], 2]
===============================

*random化してリストの例が分かり易いか?
================================
import random
def func1():
    ret=[]
    for i in range(0,4):
        ret.append(i)
    print(ret)
   
    random_ret=random.sample(ret,len(ret))
    print(random_ret)
    return random_ret
def func2():
    a=func1()
    print(a)
    a.append(5)
    print(a)
func2()
output:
[0, 1, 2, 3]
[2, 1, 3, 0]
[2, 1, 3, 0]
[2, 1, 3, 0, 5]
===============================

◆2つの関数間での2つの戻り値の引き渡し

1)基本
================================
def plus_minus(x,y):
    a = x+y
    b = x-y
    return(a,b) #Pythonでは1つの関数に複数の戻り値を取得できる。

print(plus_minus(30,10))

Output:
(40, 20)
================================

2) Pythonが得意な2つの戻り値の受け渡し

================================
def func1():
    ret=[]
    for i in range(0,4):
        ret.append(i)
    print(ret)
    message='Ret is: '
    return (message,ret)

def func2():
    a=func1()
    print(a)

func2()

#Output:
[0, 1, 2, 3]
('Ret is: ', [0, 1, 2, 3])

returnはTuple形式で格納されているので、
func1()内で   print(a[0])なら('Ret is:)がprintされる。

================================

**2つの戻り値はTupple形式で格納されているので、勿論、その中の1つだけを
 別の関数に引き渡すことも可能。

def func1():
    a = 1+2
    b = 3+4
    return a,b
result= func1()

print(result)
print(result[0])
print(type(result[0]))

def func2():
    c = result[0]
    d = c * 2
    return d

result2 = func2()
print(result2)




◆(参考)グローバル変数

================================
ret =[]
def func1():
   
    for i in range(0,4):
        ret.append(i)
    print(ret)# <--print(3)
    return ret

def func2():
    print(ret)  # <--print(1)
    x=ret.append(10)
    print(ret) # <--print(2)
    a=func1()
    print(a)# <--print(4)

func2()

#Output
[]# <--print(1)
[10]# <--print(2)
[10, 0, 1, 2, 3]# <--print(3)
[10, 0, 1, 2, 3]# <--print(4)
================================

*ちょっと難しいので簡単な例を

(参照渡し)
Pythonの関数に引数として渡されるオブジェクトは基本的に参照渡しになります。
つまり、関数の内部で、そのオブジェクトに変更を加えたら、その関数を抜けても
その変更した後のオブジェクトが残ることになります。

================================
a =[1,2,3]
def add_M(x):
    x.append('M')
    return x

def add_N(x):  <--callされ aが代入される
    y = x
    y.append('N')
    return y

add_N(a)
print(a)

Output:
[1, 2, 3,  'N']
================================


比較してね、

================================

a =[1,2,3]

def add_M(x): <--最初にcallされ aが代入される
    x.append('M')
    return x <--この段階のaは、[1,2,3]にMが追加されている

def add_N(x):<--次にcallされ a[1,2,3,'M']が代入される
    y = x
    y.append('N')
    return y

print(a)

add_M(a)
print(a)

add_N(a)
print(a)
Output:
[1, 2, 3]
[1, 2, 3, 'M']
[1, 2, 3, 'M', 'N']
================================


*変数の 値を変更したくない場合は,
 import copy
def add_M(x):
y = copy.deepcoy(x)

として、
y.append('M')のように、yを変更する。

◇ Python 別ファイルの関数を読み込む

Pythonでは、別のファイルで記述した関数を読み込めます。
importすれば良いんですね。 記述方法は以下の通り、普通にimport。
(これを発展させるとObject Oriented Programの考え方になるのだろうけど、今はやらない。)

# quick.py

from add import add
def index():
    result_from = add()
    print(result_from)
    final_num = result_from * 3
    print(final_num)
    return result_from,final_num
index()
#add.py
def add():
    a = 2+3
    return a
quick.py実行結果
5
15

0 件のコメント:

コメントを投稿