2016-05-14 4 views
0

私はある範囲の素数を見つけるプログラムを書こうとしています。私がしようとしていることの1つは、関数がすべての引数なしで呼び出されることを可能にすることです。必要な値の前に関数にデフォルト値を渡す

def find_primes(start=1, stop, primes=None): 

素数変数は、空白リストに初期化されます(私はプログラムを再帰的にするためにしようとしている):私は何をしたいか

はこのようなものです。

しかし、すべての必須値の前に引数にデフォルト値を使用できないため、エラーが発生します。

一つの方法は、私はこれをやって考えた:ストップは、範囲外の値が、デフォルトで推移した場合

def find_primes(start, stop=-1, primes=None): 
    if primes is None: 
     primes = [] 
    if stop = -1: 
     stop = start 
     start = 1 

基本的に、私は、変数を反転させることができます。しかし、これはかなりハッキリと思われ、私はこれを行うためのより良い方法があることを望んでいます。

range(stop) 

または

range(start, stop[, step]) 

を実現することが可能で、このされているように私はそれを呼び出すことができますので、

どこかに私はこれが実装されている知っているの例では、レンジ機能ですか?前もって感謝します。

EDIT:他の言語では、私は、関数のオーバーロードを使用することができます

def find_primes(stop): 
    return find_primes(1, stop) 
def find_primes(start, stop, primes=None) 
    #Code 

はPythonでこれが存在していますか?

+0

の可能性のある重複http://stackoverflow.com/questions/13366293/how-can-the-built-in-range-function-take-a-single-argument-or-three – jonrsharpe

+0

ああええ。ありがとう。投稿する前に解決策を探すときはもっと一般的であったはずです。 * argsメソッドは間違いなく動作します。 – ratorx

答えて

0

Rangeは組み込み関数ですが、Pythonで実装されている場合は、おそらく同じように "Hack"を使用します。 PythonにはC/Javaスタイルの関数がオーバーロードされていないので、実際にはPythonで*argsを使わずにこの "Hack"を達成する唯一の方法です。Noneをデフォルト値(任意の-1ではなく)慣用的な考慮す:

def find_primes(start_or_stop, stop_or_none=None, primes=None): 
    """ 
    find_primes([start], stop, [primes]) 
    """ 
    #^Communicate the semantics of the signature by the docstring, 
    # like `range` does. 
    if primes is None: 
     primes = [] 
    if stop_or_none is None: 
     start, stop = 1, start_or_stop 
    else: 
     start, stop = start_or_stop, stop_or_none 
関連する問題