web-dev-qa-db-ja.com

Pythonで関数間で変数を共有するにはどうすればよいですか?

2つの関数_fun1_と_fun2_があり、それぞれ文字列と数値を入力として受け取ります。また、両方とも同じ変数aを入力として取得します。これはコードです:

_a = ['A','X','R','N','L']

def fun1(string,vect):
    out = []
    for letter in vect:
        out. append(string+letter)
    return out

def fun2(number,vect):
    out = []
    for letter in vect:
        out.append(str(number)+letter)
    return out

x = fun1('Hello ',a)
y = fun2(2,a)
_

関数は、いくつかの意味のない操作を実行します。私の目標は、変数aが関数間で共有されるようにコードを書き直して、変数aがそれを入力として使用しないようにすることです。

変数aを入力として削除する1つの方法は、関数自体の中で変数を定義することですが、残念ながらそれはあまりエレガントではありません。私の目標を達成するための可能な方法を教えていただけませんか?

関数は同じように動作する必要がありますが、入力引数は文字列と数値(fun1(string)fun2(number))のみにする必要があります。

8

オブジェクト指向プログラミングはここで役立ちます:

class MyClass(object):
    def __init__(self):
        self.a = ['A','X','R','N','L']  # Shared instance member :D

    def fun1(self, string):
        out = []
        for letter in self.a:
            out.append(string+letter)
        return out

    def fun2(self, number):
        out = []
        for letter in self.a:
            out.append(str(number)+letter)
        return out

a = MyClass()
x = a.fun1('Hello ')
y = a.fun2(2)
16
ospahiu

クラスを使用する代わりの方法:globalキーワードを使用して、関数の外部にある変数を使用できます。

a = 5
def func():
    global a
    return a+1

print (func())

これは6を印刷します

ただし、グローバル変数は可能な限り回避する必要があります

11
involtus

aが定義されているため関数の範囲外かつ以前関数が定義されているため、引数として渡す必要はなく、単にaを使用できます。 Pythonは、最初に変数が関数スコープで定義されているかどうかを調べ、定義されていない場合は、そのスコープの外を調べます。

a = ['A','X','R','N','L']

def fun1(string):
    out = []
    for letter in a:
        out.append(string+letter)
    return out

def fun2(number):
    out = []
    for letter in a:
        out.append(str(number)+letter)
    return out

x = fun1('Hello ')
y = fun2(2)

この場合、関数をよりエレガントなリスト内包に書き直すこともできます。

a = ['A','X','R','N','L']

def fun1(string):
    return [string+letter for letter in a]

def fun2(number):
    return [str(number)+letter for letter in a]

x = fun1('Hello ')
y = fun2(2)
5