web-dev-qa-db-ja.com

Python関数からリストを返す

ファイルをリストに解析する関数があります。他の関数で使用できるように、そのリストを返そうとしています。

def splitNet():
    network = []
    for line in open("/home/tom/Dropbox/CN/Python/CW2/network.txt","r").readlines():
        line = line.replace("\r\n", "")
        line = string.split(line, ',')
        line = map(int, line)
        network.append(line)
    return network

関数の外でリストを印刷しようとすると(デバッグ用)このエラーが発生します。

NameError: name 'network' is not defined

私が間違っている簡単なことはありますか、グローバルを使用せずに関数間で変数を渡すより良い方法はありますか?

35
Thomas Mitchell

変数は、定義された関数のスコープ外ではアクセスできません。

これを行うだけです:

network = splitNet()
print network
45
Alex Coplan

戻り値をスコープ内の変数に割り当てていないことを前提としています。

すなわち。できません

splitNet()
print network

代わりに

network = splitNet()
print network

またはそのことについて

my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope

それ以外の場合は、splitNet関数の外部でネットワークを宣言し、グローバルにすることができますが、これは推奨されるアプローチではありません。

14
sberry

関数内の変数の名前は外部からは見えないため、次のように関数を呼び出す必要があります。

networks = splitNet()
print(networks)

その他の注意事項:

  • yield を使用して、関数をイテレータに変換できます。
  • readlinesを呼び出す必要はありません。関数自体は反復子です。
  • 関数がファイルハンドルをリークしている可能性があります。 withステートメントを使用します。
  • str.splitを使用できます。これはstring.splitより読みやすく、理解しやすいです。
  • ファイルはCSVファイルのように見えます。 csvモジュール を使用します。

要約すると、これはコードがどのように見えるかです。

import csv
def splitNet():
    with open("/home/tom/Dropbox/CN/Python/CW2/network.txt") as nf:
        for line in csv.reader(nf, delimiter=','):
            yield map(int, line)
network = list(splitNet())
print (network)
6
phihag

関数はリストを返しているため、リストを変数に割り当ててから印刷する必要があります。

network = splitNet()
print network

例えば

>>> def mylist():
...    myl = []
...    myl.append('1')
...    return myl
...
>>> my_list = mylist()
>>> my_list
['1']
>>>
4
RanRag

実際に関数を呼び出しましたか?これは正常に動作します(Pythonインタープリター)

 >>> def f():
 ...   network = []
 ...   network.append(1)
 ...   network.append(2)
 ...   network.append(3)
 ...   return network
 ...
 >>> network = f()
 >>> print network
 [1, 2, 3]
2
Chris Taylor
L=[1, 2, 3]

def rl(l): 
    return l

[*ll] = rl(L) # ll is in a list

ll
# >>> [1, 2, 3]

*t, = rl(L)   # ll is in a Tuple

t
# >>> [1, 2, 3]
L=[1,2,3]
def rl(l): return l

[*ll]=rl(L) #ll is in a list
ll

アウト[45]:[1、2、3]

*t,=rl(L) #ll is in a Tuple
t

アウト[47]:[1、2、3]

定義から項目またはリストを返したい場合は、事前に定義して、その定義の最初の作成時に変数として使用できます。定義内で定義する必要がない限り。この場合、最後にreturnコマンドを記述する必要はありません。

network = []

def splitNet(network):
    for line in open("/home/tom/Dropbox/CN/Python/CW2/network.txt","r").readlines():
        line = line.replace("\r\n", "")
        line = string.split(line, ',')
        line = map(int, line)
        network.append(line)

print network # Will print the list you've appended. But it is now a usable object. 
0
Lord Pantaloon

次のように、リストに割り当てられた変数の名前をglobalとして宣言できます。

def get_list():
    global destination_list
    destination_list = []
    destination_list.extend(('1','2','3'))
    return destination_list

get_list()
print(destination_list)
0
Victor