2012-11-23 68 views
1

僅僅5天到Python,通過Code Academy學習。我沒有任何其他語言的知識(對Ruby很少了解)。Python中的奇異多元返回值

我在做什麼錯這個代碼?


問:一個數是否爲3和"False"否則整除寫功能,by_three,調用第二函數,cube, 。你應該 然後返回你從cube得到的結果。至於cube,該函數 應返回從by_three傳遞的數字的立方體。 (立方 數字與提升到第三力量相同)。

因此,例如,by_three應採取9,確定它的均勻 被3整除,並將它傳遞給立方體,誰返回729(的 9 ** 3的結果)。如果by_three得到4,但是,它應該返回False並且離開 它。

最後,在11,12和13三條分開的線路上撥打by_three

ANS:

def by_three(n): 
    orig_num = n 
    if (isinstance(orig_num, int) and orig_num%3 == 0): 
     cube(orig_num) 
    else: 
     print "False" 

def cube(orig_num): 
    cube = orig_num**3 
    print cube 
    return 

by_three(11) 
by_three(12) 
by_three(13) 

當我運行上面的代碼,這裏是我得到的。爲什麼這些值以這種方式出現?

False 
1728 
False 
==> None 
False 
False 
1728 
Oops, try again. 
+1

不應該爲函數和內部變量使用相同的名稱。 – madth3

+0

@ madth3謝謝。做了相應的變化,結果仍然相同! 高清by_three(N): \t如果(isinstance(N,int)和N%3 == 0): \t \t立方體(N) \t其他: \t \t打印 「假」 \t 高清立方體(米): \t立方體= M ** 3 \t打印立方體 \t返回 by_three(11) by_three(12) by_three(13) – user1846641

+0

它看起來利您可能在這裏有一些其他代碼(例如,Python不會說'糟糕,再試一次':))。雖然你所擁有的並不完全符合純粹從「返回」角度來看的要求,但它在運行時會返回正確的結果。 – RocketDonkey

回答

1

我不能說你爲什麼看到奇怪的結果。當我將你的代碼複製到口譯員中時,我看到:

>>> def by_three(n): 
...  orig_num = n 
...  if (isinstance(orig_num, int) and orig_num%3 == 0): 
...   cube(orig_num) 
...  else: 
...   print "False" 
... 
>>> def cube(orig_num): 
...  cube = orig_num**3 
...  print cube 
...  return 
... 
>>> by_three(11) 
False 
>>> by_three(12) 
1728 
>>> by_three(13) 
False 

雖然我覺得這個問題比你做的要簡單得多。這很難說,因爲這個問題是相當寫得不好,但是這將是我的答案:

def by_three(n): return False if n % 3 else cube(n) 

def cube(n): return n**3 

by_three(11) 
by_three(12) 
by_three(13) 

這是什麼樣子的解釋:

>>> def by_three(n): return False if n % 3 else cube(n) 
... 
>>> def cube(n): return n**3 
... 
>>> by_three(11) 
False 
>>> by_three(12) 
1728 
>>> by_three(13) 
False 
+0

精湛!謝啦。對於「寫得不好」的問題,我感到抱歉。這就是它被放在「練習」中的方式。但是,謝謝! :) – user1846641

+0

請不要使用isinstance() - 代替TypeError。 – Tadeck

+0

@Tadeck我沒有......我只是引用OP的代碼。 –

1

首先,你需要改變cube函數實際返回cube。你甚至可以簡化您的cube方法,通過剛剛返回cube而不存儲臨時結果: -

def cube(orig_num): 
    return orig_num**3 # Just return the cube 

然後在你的by_three功能,而非打印的「假」,你應該回到它。此外,返回由cube函數返回的value: -

def by_three(n): 
    if (isinstance(n, int) and n % 3 == 0): 
     return cube(n) # Added return here 
    else: 
     return False #Changed print to return. 

你也可以簡化這個方法只是一個single線return語句。您應該使用,而不是與isinstance檢查實例try-except塊,如果你在你的function傳遞一個值: -

def by_three(n): 
    try: 
     return cube(n) if n % 3 == 0 else False 
    except TypeError, e: 
     return False 

然後,當你調用該方法,打印得到的結果: -

print by_three(11) 
print by_three(12) 
print by_three(13) 
+0

謝謝!它的工作原理也是我學到的。 :) – user1846641

+0

@ user1846641 ..不客氣:) :) –

+0

而不是isinstance()你應該使用try-except語句捕獲TypeError。在類似的情況下,在Python中檢查傳遞值的類型被認爲是不好的做法。 – Tadeck

0

在你的cube方法中,你實際上並不是返回什麼。與返回塊中最後一條語句的Ruby不同,您必須明確指出要返回的內容。也不需要創建價值的防禦性副本。此外,您不能重複使用名稱cube,否則會破壞您的方法定義。

def cube(orig_num): 
    return orig_num ** 3 

接下來,您將不得不返回調用方法中的值。我會把它作爲你的練習 - 不應該太棘手,不能從這裏弄清楚。

第三,如果數字是一個int或一個浮點數,您(不)需要擔心。雖然浮點數不準確,但這些值不能完全被3整除。