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”练习还是有任何实用的风格可以使用?

4

2 回答 2

2

如果Python 函数None没有 return 语句,则返回。否则,他们会返回您告诉他们的任何内容。

就约定而言,如果一个函数对传递给它的参数进行操作,那么让该函数返回是礼貌的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
于 2013-01-23T19:12:16.193 回答
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()

在这里,subplot 被传递给每个函数,因此应该在其上绘制数据,而不是替换您之前绘制的内容。

于 2013-01-23T19:23:37.077 回答