2013-02-03 44 views
0

我有一個我在function1內部創建的列表。我希望能夠在function2中訪問和修改它。我如何在沒有全局變量的情況下做到這一點?從外部函數訪問列表

這兩個函數都嵌套在另一箇中,我需要能夠推廣這個在多個函數中的多個列表。

我希望能夠在其他功能中訪問word_listsentence_starter

def Markov_begin(text): 
    print create_word_lists(text) 
    print pick_starting_point(word_list) 
    return starting_list 


def create_word_lists(filename): 
    prefix_dict = {}  
    word_list = [] 
    sub_list = [] 
    word = '' 

    fin = open(filename) 
    for line in fin: 
     the_line = line.strip() 
     for i in line: 
      if i not in punctuation: 
       word+=(i) 
      if i in punctuation: 
       sub_list.append(word) 
       word_list.append(sub_list) 
       sub_list = [] 
       word = '' 
     sub_list.append(word) 
     word_list.append(sub_list) 
    print 1 
    return word_list 

def pick_starting_point(word_list): 
    sentence_starter = ['.','!','?'] 
    starting_list = [] 
    n = 0 
    for n in range(len(word_list)-1): 
     for i in word_list[n]: 
      for a in i: 
       if a in sentence_starter: 
        starting_list += word_list[n+1] 
    print 2     
    return starting_list 



def create_prefix_dict(word_list,prefix_length): 
    while prefix > 0: 
     n = 0 
     while n < (len(word_list)-prefix): 
      key = str(''.join(word_list[n])) 
      if key in prefix_dict: 
       prefix_dict[key] += word_list[n+prefix] 
      else: 
       prefix_dict[key] = word_list[n+prefix] 
      n+=1 
     key = '' 
     prefix -=1 

print Markov_begin('Reacher.txt') 

回答

4

你應該重構此爲一類:

class MyWords(object): 
    def __init__(self): 
    self.word_list = ... #code to create word list 

    def pick_starting_point(self): 
    # do something with self.word_list 
    return ... 

使用

words = MyWords() 
words.pick_starting_point() 
... 
2

您可以簡單地使用第一函數創建的第二個函數的參數列表:

def some_list_function(): 
    # this function would generate your list 
    return mylist 

def some_other_function(mylist): 
    # this function takes a list as an argument and process it as you want 
    return result 

some_other_function(some_list_function()) 

但是,如果你需要使用在多個地方(由多個功能正在處理),則列表將它作爲變量存儲並不是一件壞事 - 更重要的是,如果您的列表生成函數執行一些計算來生成列表,那麼您只需計算一次即可節省CPU。

+0

我不確定我完全理解。請參閱我希望能更好地解釋我的問題的新增代碼。謝謝你的幫助。 – ben

+0

只需將一個調用傳遞給一個函數,即將您的列表生成爲一個參數(而不是全局變量),然後調用函數來處理您想要生成的列表。 – SpankMe

-2

函數可以有屬性值(例如,見question 338101。)

在目前情況下,你可以保存並參考像prefix_dict,word_list,sub_listword這樣的項目作爲單個項目無論哪個函數計算它們的屬性,如以下示例所示。但是,正如其他答案中所建議的那樣,使用一個班級從長遠來看更有可能被理解和維護。

例如:

In [6]: def fun1(v): 
    fun1.li = range(v,8) 
    return v+1 
    ...: 

In [7]: def fun2(v): 
    fun2.li = range(v,12) + fun1.li 
    return v+2 
    ...: 

In [8]: fun1(3) 
Out[8]: 4 

In [9]: fun2(6) 
Out[9]: 8 

In [10]: fun2.li 
Out[10]: [6, 7, 8, 9, 10, 11, 3, 4, 5, 6, 7] 
+0

-1:一個python初學者的可怕建議。這就好比建議編寫一個元類,它返回一個生成lambda表達式的生成器,每個生成一個列表理解,導致映射列表。好吧,不是那樣,但認真... – gahooa

+0

@gahooa,廢話,功能屬性很容易使用和易於理解,並提出了一個合理的替代方案,給出了問題的措辭。另外,我指出「使用一個類......更可能在長期內是可以理解和維護的。」 –

0

如果你不想一)使用全局或b)返回列表,並通過它有關,那麼你將不得不使用一個類,並保持在那裏,你的列表。

班級路線最好

+0

你能解釋我將如何去'返回'路線。謝謝。 – ben

+0

gahooa的解決方案使用一個類是最好的。但是,您可以在「Makov_begin」函數中將您的列表保存在本地字典變量中。 然後在調用函數時傳遞字典中的字典或特定列表。例如'dictOfLists ['wordlist'] = create_word_lists(text,dictOfLists)' –