2013-01-23 85 views
2

我有一個類的方法來建立一些情節。我嘗試在一個圖上顯示不同的圖。圖形的屬性(標題,圖例......)總是被最後一幅圖覆蓋。我預計如果我在我的方法中有return,那麼行爲會與沒有它的方法有所不同,但似乎並非如此。繪圖需要返回的方法嗎?

我想知道有什麼區別使return。說明我的問題的代碼是:

import matplotlib.pyplot as plt 
import numpy as np 

class myClass1(object): 
    def __init__(self): 
     self.x = np.random.random(100) 
     self.y = np.random.random(100) 

    def plotNReturn1(self): 
     plt.plot(self.x,self.y,'-*',label='randNxy') 
     plt.title('Plot No Return1') 
     plt.legend(numpoints = 1) 
    def plotNReturn2(self): 
     plt.plot(self.y,self.x,'-x',label='randNzw') 
     plt.title('Plot No Return2') 
     plt.legend(numpoints = 2) 

    def plotWReturn1(self): 
     fig = plt.plot(self.x,self.y,'-*',label='randWxy') 
     fig = plt.title('Plot With Return1') 
     fig = plt.legend(numpoints = 1) 
     return fig 
    def plotWReturn2(self): 
     fig = plt.plot(self.y,self.x,'-x',label='randWzw') 
     fig = plt.title('Plot With Return2') 
     plt.legend(numpoints = 3) 
     return fig 


if __name__=='__main__': 
    f = myClass1() 
    p = plt.figure() 

    p1 = p.add_subplot(122) 
    p1 = f.plotWReturn1() 
    p1 = f.plotWReturn2() 
    print 'method with return: %s: ' % type(p1) 

    p2 = p.add_subplot(121) 
    p2 = f.plotNReturn1() 
    p2 = f.plotNReturn2() 
    print 'method without return: %s: ' % type(p2) 

    plt.show() 

我發現唯一的區別是輸出的類型,但我不知道這意味着什麼在實踐中。

method with return: <class 'matplotlib.text.Text'>: 
method without return: <type 'NoneType'>: 

僅僅是關於「pythonic」練習還是有什麼實際的使用任何風格?

回答

2

返回的值只具有直接的影響來電者,在這種情況下您的__main__塊。如果您不需要重用某個函數計算出的某個值,則在您分配給p1或p2的情況下,返回對行爲沒有任何影響。

此外,一系列賦值,像

p1 = call1() 
p1 = call2() 
p1 = call3() 

是不好的代碼風格的指標,因爲只有分配到P1的最後一個值將是在他們之後可用。

無論如何,我認爲要在次要情節繪製,而不是主要情節,就像這樣:

import matplotlib.pyplot as plt 
import numpy as np 

class myClass1(object): 
    def __init__(self): 
     self.x = np.random.random(100) 
     self.y = np.random.random(100) 

    def plotNReturn1(self, subplot): 
     subplot.plot(self.x,self.y,'-*',label='randNxy') 
     subplot.set_title('Plot No Return1') 
     subplot.legend(numpoints = 1) 
    def plotNReturn2(self, subplot): 
     subplot.plot(self.y,self.x,'-x',label='randNzw') 
     subplot.set_title('Plot No Return2') 
     subplot.legend(numpoints = 2) 


if __name__=='__main__': 
    f = myClass1() 
    p = plt.figure() 

    p1 = p.add_subplot(122) 
    f.plotNReturn2(p1) 

    p2 = p.add_subplot(121) 
    f.plotNReturn2(p2) 

    plt.show() 

這裏,插曲被傳遞到每個功能,所以數據應該就可以被繪製,而不是取代你之前繪製的東西。

2

如果Python函數沒有返回語句,則返回None。否則,他們會回報你告訴他們的任何東西。

根據約定,如果函數對傳遞給它的參數進行操作,那麼使該函數返回None是禮貌的。這樣,用戶就知道這些參數是混亂的。 (一個例子是list.append - 它修改列表並返回None)。

a = [1,2,3] 
print a.append(4) #None 
print a #[1, 2, 3, 4] 

如果你的功能是不會與傳遞給它的東西亂七八糟,那麼它是非常有用的它返回的東西:

def square(x): 
    return x*x 
+0

是的,我明白,謝謝。在應該顯示一些圖的方法中是否有使用'return'的任何一點? – tomasz74

+1

@ tomasz74 - 如果目的是*顯示*圖,我會讓它返回'None'來表示你正在爲副作用調用函數。 – mgilson

相關問題