ファイルをリストに解析する関数があります。他の関数で使用できるように、そのリストを返そうとしています。
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
私が間違っている簡単なことはありますか、グローバルを使用せずに関数間で変数を渡すより良い方法はありますか?
変数は、定義された関数のスコープ外ではアクセスできません。
これを行うだけです:
network = splitNet()
print network
戻り値をスコープ内の変数に割り当てていないことを前提としています。
すなわち。できません
splitNet()
print network
代わりに
network = splitNet()
print network
またはそのことについて
my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope
それ以外の場合は、splitNet関数の外部でネットワークを宣言し、グローバルにすることができますが、これは推奨されるアプローチではありません。
関数内の変数の名前は外部からは見えないため、次のように関数を呼び出す必要があります。
networks = splitNet()
print(networks)
その他の注意事項:
readlines
を呼び出す必要はありません。関数自体は反復子です。with
ステートメントを使用します。str.split
を使用できます。これはstring.split
より読みやすく、理解しやすいです。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)
関数はリストを返しているため、リストを変数に割り当ててから印刷する必要があります。
network = splitNet()
print network
例えば
>>> def mylist():
... myl = []
... myl.append('1')
... return myl
...
>>> my_list = mylist()
>>> my_list
['1']
>>>
実際に関数を呼び出しましたか?これは正常に動作します(Pythonインタープリター)
>>> def f():
... network = []
... network.append(1)
... network.append(2)
... network.append(3)
... return network
...
>>> network = f()
>>> print network
[1, 2, 3]
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
*t,=rl(L) #ll is in a Tuple
t
定義から項目またはリストを返したい場合は、事前に定義して、その定義の最初の作成時に変数として使用できます。定義内で定義する必要がない限り。この場合、最後に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.
次のように、リストに割り当てられた変数の名前をglobal
として宣言できます。
def get_list():
global destination_list
destination_list = []
destination_list.extend(('1','2','3'))
return destination_list
get_list()
print(destination_list)