我有一个我在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')
答案 0 :(得分: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()
...
答案 1 :(得分: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。
答案 2 :(得分:0)
如果你不想a)使用全局或b)返回列表并传递它,那么你将不得不使用一个类并在那里保存你的列表。
班级路线最好
答案 3 :(得分:-2)
函数可以包含属性值(例如,请参阅question 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]