[英]Not able to call a function within a function
我是python的初學者。 我正在制作一個折騰模擬器。 這是我的代碼:
import random
class TossSimulator():
heads = 0
tails = 0
def doFlip(self):
x = random.randint(0,1)
if(x == 0):
return True
else:
return False
def getScore(self, flip_function):
if flip_function is True:
self.heads+=1
else:
self.tails+=1
obj = TossSimulator()
obj.getScore(doFlip())
我收到的錯誤是:
NameError:名稱“ doFlip”未在第24行定義
您確實不需要為此上課,但是如果您只是想練習,那就練習好吧! 如注釋中所述,問題是在試圖調用它的范圍內不存在doFlip
。 將一些評論打包成一個說明一些不錯功能的解決方案:
import random
class TossSimulator():
def __init__(self, flip_function):
"""
Args:
flip_function: function that returns True (heads) or False (tails)
"""
self.heads = 0
self.tails = 0
self.flip = flip_function
def get_score(self):
if self.flip(): # call stored flip function
self.heads += 1
else:
self.tails += 1
print('Heads: {}\tTails: {}'.format(self.heads, self.tails))
def do_flip():
return random.randint(0, 1) == 0 # skip the middle man
obj = TossSimulator(do_flip)
obj.get_score() # prints the running total heads and tails
# Heads: 0 Tails: 1
進行了一些重要的更改。 首先,我添加了__init__
函數,它是Python對象的構造函數。 在這里,您可以定義任何成員變量,初始化事物等。使用這種方式定義的類,您可以創建TossSimulator
多個實例,並且每個實例都將記錄自己的得分:
obj1 = TossSimulator(do_flip)
obj2 = TossSimulator(do_flip)
obj1.getScore() # Heads: 1 Tails: 0
obj1.getScore() # Heads: 1 Tails: 1
obj2.getScore() # Heads: 0 Tails: 1 (scored separately)
obj2.getScore() # Heads: 0 Tails: 2
其次,我將flip_function
設置為傳遞給構造函數的參數。 現在,您可以在創建TossSimulator
每個實例時TossSimulator
定義一個特殊的翻轉函數,然后get_score
會在每次調用該實例時使用為該實例定義的翻轉函數:
def always_heads():
return True
obj1 = TossSimulator(do_flip)
obj2 = TossSimulator(always_heads)
obj1.getScore() # Heads: 0 Tails: 1
obj1.getScore() # Heads: 1 Tails: 1 (random flips)
obj2.getScore() # Heads: 1 Tails: 0
obj2.getScore() # Heads: 2 Tails: 0 (always will be heads)
第三,我清理了幾件事。 例如,您可以替換以下內容:
if x == y:
return True
else:
return False
return x == y
。 它們是完全一樣的,但其中一個更為簡潔(可能效率更高一點?)。 您還可以直接檢查函數返回的“真實性”,因此無需使用if self.flip() == True:
您可以只使用if self.flip():
您可以使最后一點更進一步,並直接檢查數字值的“真實性”。 在Python中,零為False
而所有其他整數為True
。 關於什么是真值,什么是假值的摘要可以在這里找到 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.