私がこれを持っている場合:
_def oneFunction(lists):
category=random.choice(list(lists.keys()))
Word=random.choice(lists[category])
def anotherFunction():
for letter in Word: #problem is here
print("_",end=" ")
_
以前にlists
を定義したので、oneFunction(lists)
は完全に機能します。
私の問題は、6行目でWord
を呼び出すことです。同じWord=random.choice(lists[category])
定義で最初の関数の外側でWord
を定義しようとしましたが、それはWord
になりますoneFunction(lists)
を呼び出しても常に同じです。
最初の関数を呼び出してから2番目の関数を呼び出すたびに、異なるWord
を使用できるようにします。
Word
をoneFunction(lists)
の外側に定義せずにこれを行うことはできますか?
はい。クラスで関数を定義することと、Wordをメンバーにすることの両方を検討する必要があります。これはきれいです
class Spam:
def oneFunction(self,lists):
category=random.choice(list(lists.keys()))
self.Word=random.choice(lists[category])
def anotherFunction(self):
for letter in self.Word:
print("_",end=" ")
クラスを作成したら、それをオブジェクトにインスタンス化し、メンバー関数にアクセスする必要があります。
s = Spam()
s.oneFunction(lists)
s.anotherFunction()
別のアプローチは、oneFunction
でWordを返すようにして、oneFunction
でWordの代わりにanotherFunction
を使用できるようにすることです。
>>> def oneFunction(lists):
category=random.choice(list(lists.keys()))
return random.choice(lists[category])
>>> def anotherFunction():
for letter in oneFunction(lists):
print("_",end=" ")
そして最後に、anotherFunction
を作成し、oneFunction
を呼び出した結果から渡すことができるパラメーターとしてWordを受け入れることもできます。
>>> def anotherFunction(words):
for letter in words:
print("_",end=" ")
>>> anotherFunction(oneFunction(lists))
pythonのすべてがオブジェクトと見なされるため、関数もオブジェクトです。このメソッドも使用できます。
def fun1():
fun1.var = 100
print(fun1.var)
def fun2():
print(fun1.var)
fun1()
fun2()
print(fun1.var)
最も簡単なオプションは、グローバル変数を使用することです。次に、現在のWordを取得する関数を作成します。
current_Word = ''
def oneFunction(lists):
global current_Word
Word=random.choice(lists[category])
current_Word = Word
def anotherFunction():
for letter in get_Word():
print("_",end=" ")
def get_Word():
return current_Word
この利点は、関数が異なるモジュールにあり、変数にアクセスする必要がある可能性があることです。
def anotherFunction(Word):
for letter in Word:
print("_", end=" ")
def oneFunction(lists):
category = random.choice(list(lists.keys()))
Word = random.choice(lists[category])
return anotherFunction(Word)