2

いくつかのプロットを作成するメソッドを持つクラスがあります。1 つの図にさまざまなプロットを表示しようとしています。Figure のプロパティ (タイトル、凡例など) は、常に最後のプロットによって上書きされます。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

値を返すことは、呼び出し元 (この場合は__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 に答える
2

Python 関数Noneは、return ステートメントがない場合に戻ります。それ以外の場合、彼らはあなたが彼らに言うことを何でも返します。

規約上、渡された引数に対して関数が動作する場合、その関数に 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 に答える