簡體   English   中英

無法在函數內調用函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM