0

単独で呼び出されるか、別の関数内で呼び出されるかに応じて、異なるものを返す関数をどのように作成しますか? 私の例は、関数 make_wave_snapshot(size,wavelength,phase) で、2次元配列を返し、グレースケール画像も表示します。もう 1 つの関数: make_wave_sequence(size,wavelength,nsteps) は、3 次元配列と、各ステップのグレースケール イメージを自動的に循環するグレースケール イメージも返します。

def make_wave_snapshot(size,wavelength,phase):
    waves_array = np.zeros((size,size),np.float)
        if size%2==0:
            for y in range(size):
                for x in range(size):
                    r = math.hypot((size/2 - x - 0.5),(size/2 - y - 0.5))
                    d = np.sin((2*math.pi*r/wavelength)-phase)/np.sqrt(r)
                    waves_array[y,x] = d
  !!!       # dp.display_2d_array(waves_array) #Shows visual representation
            return waves_array #Displays array showing values
        else:
            return 'Please use integer of size.'

def make_wave_sequence(size,wavelength,nsteps):
    waves_sequence = np.zeros((nsteps,size,size),np.float)
        if nsteps%1==0:
            for z in range(nsteps):
                waves_sequence[z] = make_wave_snapshot(size,wavelength,(2*math.pi*z/nsteps))
  !!!        #  dp.display_3d_array(waves_sequence)
                return waves_sequence #Displays array showing values
            else:
                return 'Please use positive integer for number of steps'

if name = mainを知っていて、おそらく答えになると思いますが、関数をチェックするのに適していると言われただけで、実際の関数にどのように適合させるかわかりません。ありがとうございました。

4

2 に答える 2

5

単独で呼び出されるか、別の関数内で呼び出されるかに応じて、異なるものを返す関数をどのように作成しますか?

あなたはそうしない。また、ユースケースには必要ありません。

これは、検査モジュールまたはスタック フレームをチェックする他の方法を使用することで理論的には可能ですが、非常に悪い考えです。関数は予測可能であり、呼び出された場所に関係なく同じことを行う必要があります。

__name__また、モジュール名 (または__main__スクリプトがエントリ ポイントの場合) が含まれており、関数が呼び出されるスコープとは関係がないため、チェックは役に立たないことに注意してください。

関数に 2 つの異なることをさせたい場合、1 つの方法は、デフォルトで を追加の引数として使用することです。この引数Noneは、関数が 2 番目のパスに従う必要があるかどうかを示すフラグとして使用します。

def example(a, b, do_b=None):
    if do_b is None:
        return a
    else:
        return b

あなたの場合(私が正しく理解していれば)、 のmake_wave_snapshot中で呼び出すときに画像を表示したくありませんmake_wave_sequence。これは戻り値とは関係なく、上記のように関数に追加の引数を追加することで解決できます。

def make_wave_snapshot(size,wavelength,phase,display=True):
    #your code here
    #...
    if display:
        dp.display_2d_array(waves_array) #Shows visual representation

Falseそして今、あなたは単に他の関数の中で余分にそれを呼び出します:

waves_sequence[z] = make_wave_snapshot(size,wavelength,(2*math.pi*z/nsteps), False)

ああ、ループの場合に行っているように、戻り値をエラー状態の指標として使用しないでください。elseここで C を書いているわけではありません。python は例外を持つ文明化された言語です。例外を使用してください。

于 2013-01-23T11:33:11.417 に答える
1

汚れた、しかし簡単な方法の 1 つは、関数にパラメーターを追加することです。ここで、必要に応じてその動作を切り替えます。コード内で関数を呼び出すのは自分であるという事実を考えると、スイッチを使用する (または使用しない) 場合によって異なります。どこでそれを呼び出しますか。完全な解決策ではありませんが、確かに機能し、実装も簡単です。

于 2013-01-23T11:25:43.950 に答える