2012-07-17 100 views
3

我對編程一般都很陌生,雖然我確信這看起來像作業,但它可能是有人,但我在教自己,所以它是「自我作業」?在python中,如何計算函數內滿足條件的次數?

無論如何,我想統計一隻烏龜離開窗戶的次數,因爲它隨機做出正方形。我也想在它離開屏幕的每一點上放一個點,但那只是爲了我自己的樂趣。

我知道我每次都設置爲0,但我不知道如何創建一個累加器模式(如果這是正確的事情)在這樣的函數內已經必須返回一個值。

這裏是我的代碼:

import random 
import turtle 

def isInScreen(w,t): 

    leftBound = - w.window_width()/2 
    rightBound = w.window_width()/2 
    topBound = w.window_height()/2 
    bottomBound = -w.window_height()/2 

    turtleX = t.xcor() 
    turtleY = t.ycor() 


    stillIn = True 
    outs = 0 

    if turtleX > rightBound or turtleX < leftBound: 
     t.dot() 
     t.right(180) 
     t.forward(50) 
     outs += 1 
     print(outs) 
     return outs 

    if turtleY > topBound or turtleY < bottomBound: 
     t.dot() 
     t.right(180) 
     t.forward(50) 
     outs += 1 
     print(outs) 
     return outs 

    if outs == 4: 
     stillIn = False 

    return stillIn 

t = turtle.Turtle() 
wn = turtle.Screen() 

t.shape('turtle') 
while isInScreen(wn,t): 
    coin = random.randrange(0,2) 
    if coin == 0: 
     t.left(90) 
    else: 
     t.right(90) 

    t.forward(50) 

wn.exitonclick() 

任何意見,將不勝感激。

回答

0

您可以返回一個列表對象,它具有'stillIn'值以及累加器的值。

3

要做到這一點,最簡單的方法是跟蹤你的龜在屏幕外跳過了多少次,但在你的while循環內。

而不是讓你的函數返回龜是否已經出去了四次,只是讓它返回,如果它在這一步出去。你必須改變你的函數看起來像:

def isScreen(w, t): 
    if turtleX > rightBound or turtleX < leftBound: 
     return True 
    if turtleY > topBound or turtleY < bottomBound: 
     return True 
    else: 
     return False 

然後你就可以跟蹤你有多少次你while循環出去:

outs = 0 
while outs < 4: 
    if isScreen: 
     outs += 1 
+0

對不起,但我似乎無法讓您的答案正常工作。繪圖循環在4之後結束,否則永不結束。 – theSchap 2012-07-18 00:32:53

0

一種方法是隻是讓outs一個全局變量(不推薦):

outs = 0 
def isInScreen(w,t): 
    ... 

一個稍微好一點的方式來封裝outs是使其屬性的功能本身。這樣,它的行爲就像一個全局變量。

def isInScreen(w,t): 

    leftBound = - w.window_width()/2 
    rightBound = w.window_width()/2 
    topBound = w.window_height()/2 
    bottomBound = -w.window_height()/2 

    turtleX = t.xcor() 
    turtleY = t.ycor() 


    stillIn = True 

    if turtleX > rightBound or turtleX < leftBound: 
     t.dot() 
     t.right(180) 
     t.forward(50) 
     isInScreen.outs += 1 
     print(isInScreen.outs) 
     return isInScreen.outs 

    # rest of the function 

isInScreen.outs = 0 

基本上,你isInScreen.outs更換outs整個函數體,對其進行初始化函數定義之後。 (不幸的是,您無法初始化函數內部的值,或者每次調用它時都會重置它。)

請注意,這不是一個常見的習慣用法。大多數情況下,您將有一個類爲outs作爲屬性,而isInScreen是更新屬性的方法。

+1

「不是一個普通的習慣用法」應該可能替換爲「必然會迷惑讀者」。正如PEP20所指出的那樣:「如果實施難以解釋,這是一個壞主意。」並且使用來自外部的函數名稱空間甚至很難向解釋器解釋(這就是爲什麼需要「不幸」的警告)。 – msw 2012-07-17 19:59:58

1

如何將變量引用到一個具體的東西到類?

class MyTurtle(object): 

    def __init__(self): 
     self.outs = 0 

    def isInScreen(self, w, t): 
     leftBound = - w.window_width()/2 
     rightBound = w.window_width()/2 
     topBound = w.window_height()/2 
     bottomBound = -w.window_height()/2 

     turtleX = t.xcor() 
     turtleY = t.ycor() 

     stillIn = True 

     if turtleX > rightBound or turtleX < leftBound: 
      t.dot() 
      t.right(180) 
      t.forward(50) 
      self.outs += 1 
      print(self.outs) 
      return outs 

     if turtleY > topBound or turtleY < bottomBound: 
      t.dot() 
      t.right(180) 
      t.forward(50) 
      self.outs += 1 
      print(self.outs) 
      return outs 

     if self.outs == 4: 
      stillIn = False 

     # for some reason i think this line was missing 
     return stillIn 
     # or this 
     return outs 


t = turtle.Turtle() 
wn = turtle.Screen() 

myThing = MyTurtle() 
t.shape('turtle') 

# now you know WHAT is located "in screen" 
# and you could now have lots of turtlely 
# things running off the screen too with a 
# little modification where each "myturtle" 
# keeps track of its own "outs" 

while myThing.isInScreen(wn, t): 
    coin = random.randrange(0,2) 
    if coin == 0: 
     t.left(90) 
    else: 
     t.right(90) 
    t.forward(50) 
wn.exitonclick() 
+0

而且它只有三行代碼,但方式更可擴展 – DevPlayer 2012-07-17 20:44:21

+0

謝謝!我得到了這個工作,並且我剛開始使用類,所以我發現使用它們很有趣。 唯一的問題是,我必須改變: 如果超過== 4: 到 如果self.outs == 4: 要定義它。 – theSchap 2012-07-18 00:33:24

+0

出錯== 4更新爲self.outs == 4; upticks是好的。 – DevPlayer 2012-07-18 01:04:18

相關問題