0

の中に作成したリストがありfunction1ます。でアクセスして変更できるようにしたいfunction2。グローバル変数なしでこれを行うにはどうすればよいですか?

どちらの関数も他の関数内にネストされていないため、いくつかの関数の複数のリストに対してこれを一般化できる必要があります。

word_list他の機能にアクセスできるようにしたいと思いsentence_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

4 に答える 4

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()
...
于 2013-02-03T18:59:09.630 に答える
3

最初の関数が作成するリストを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を節約します。

于 2013-02-03T18:55:01.033 に答える
0

a)グローバルを使用したくない場合、またはb)リストを返して渡したくない場合は、クラスを使用してリストをそこに保持する必要があります。

クラスルートが最適です

于 2013-02-03T19:02:10.550 に答える
-2

関数は属性値を持つことができます(たとえば、質問338101を参照してください)。

prefix_dict現在のコンテキストでは、次の例に示すようにword_list、、、、sub_listなどのアイテムを保存してword、それらを計算する関数の個々の属性として参照できます。ただし、他の回答で示唆されているように、クラスの使用は、長期的に理解可能で維持可能である可能性が高くなります。

例えば:

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]
于 2013-02-03T19:01:23.293 に答える