簡體   English   中英

Python從函數返回列表

[英]Python return list from function

我有一個將文件解析為列表的函數。 我正在嘗試返回該列表,以便我可以在其他功能中使用它。

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)

其他幾點說明:

  • 您可能希望使用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)

您的函數返回一個列表,因此您必須將其分配給變量,而不是嘗試打印它。

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]

您可以將分配給列表的變量的名稱聲明為global ,如下所示:

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

get_list()
print(destination_list)

如果要從定義中返回項目或列表,可以事先定義它並在初始寫入所述定義期間將其用作變量。 除非必須在定義中定義。 在這種情況下,您不需要在結尾處寫入返回命令。

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. 
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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM