私は、Python 3.5を使用していますし、これは私が現時点で扱ってるコードです:Pythonどのようにエレガントに異なるデータ構造の使用を処理するには?
def is_odd_number(n):
"""states if n is an odd number"""
return n % 2 == 1
def collatz_next(n):
"""returns the successor to n in Collatz sequence"""
return 3*n + 1 if is_odd_number(n) else n//2
def collatz_seq_sum(seq):
"""returns the sum of all elements to a given Collatz sequence"""
return sum(seq)
def collatz_seq(n):
"""returns the Collatz sequence to n"""
l = []
l.append(n)
current = n
while current != 1:
next_one = collatz_next(current)
l.append(next_one)
current = next_one
return l
def collatz_seqs(lower_limit=1, upper_limit=10):
"""returns Collatz sequences from lower_limit to upper_limit"""
return {i: collatz_seq(i) for i in range(lower_limit, upper_limit+1)}
私は、単一のこのCollatzシーケンスを扱うときに、そのタイプlist
がベストだと思います。だから、collatz_seq
がリストを返します。しかし、複数のパラメータn
を連続して扱う場合、この特定のシーケンスがどのように発展するかを観察することは興味深いことです。だからこそ私はcollatz_seqs
を作成しました。
非常に単純な理由から私はcollatz_seq_sum
が好きではありません。パラメータseq
のタイプがlist
の場合にのみ正しく動作します。私の意見では、collatz_seq_sum
は、実際のパラメータが適切であることを確認する責任はありません。この場合は、list
は自然数です。私の意見では、collatz_seq_sum
への発信者は、正しいパラメータが提供されていることを確認する必要があります。
collatz_sum_seq
は、単一シーケンスと複数シーケンスで動作します。 collatz_seq
はlist
を返し、collatz_seqs
はdict
を返します。したがって、私の質問:seq
のcollatz_seq_sum
が常に正しいデータ型を取得できるようにするうまい方法は何ですか? collatz_seq_sum
が正常に動作するためには、collatz_seq_sum
のパラメータのデータタイプを気にする必要があります。seq
?私の最初のアイデアはcollatz_seq
をlist
の代わりにdict
を返し、dict
を処理するためにcollatz_seq_sum
を変更するように変更することでした。しかし、単一の配列を扱うときにはdict
が欲しくないので、私はこのアプローチが嫌いです。
解決策はありますか?事前にどうもありがとうございました。
[mypy](https://github.com/python/mypy)静的型検査ライブラリは、[decorator](https://jeffknupp.com/blog/2013/11/29/improve-your- python-decorators-described /)を使って、あなたが望む多態性を許すような 'overload'を作成します:http://mypy.readthedocs.io/en/latest/function_overloading.html。私に有望に見えます。 –
[functools.singledispatch](https://docs.python.org/3/library/functools.html#functools.singledispatch)は役に立ちますか? – wwii