どちらがよりパイソンですか?
whileループ:
count = 0
while count < 50:
print "Some thing"
count = count + 1
Forループ:
for i in range(50):
print "Some thing"
編集:これはどちらがより明確であるかを決定するための答えを持っているので、重複しないでください、対「i」なしで範囲を実行する方法-それが最もエレガントであることになったとしても
どちらがよりパイソンですか?
whileループ:
count = 0
while count < 50:
print "Some thing"
count = count + 1
Forループ:
for i in range(50):
print "Some thing"
編集:これはどちらがより明確であるかを決定するための答えを持っているので、重複しないでください、対「i」なしで範囲を実行する方法-それが最もエレガントであることになったとしても
回答:
個人的に:
for _ in range(50):
print "Some thing"
必要ない場合i
。Python <3を使用していて、ループを何度も繰り返したいxrange
場合は、事前にリスト全体を生成する必要がないため、を使用してください。
i
ます。
i
ますか?
forループは、Pythonの高レベルの組み込み機能を使用して、実行していることをより明確かつ簡潔に伝えるため、間違いなくよりPython的です。rangeとxrangeのオーバーヘッド、および未使用のi
変数の割り当ては、Verilogのrepeat
ステートメントのようなステートメントがないことに起因します。for rangeソリューションに固執する主な理由は、他の方法がより複雑であるということです。例えば:
from itertools import repeat
for unused in repeat(None, 10):
del unused # redundant and inefficient, the name is clear enough
print "This is run 10 times"
ここで範囲の代わりに繰り返しを使用することは、関数としてあまり知られていないためあまり明確ではなく、インポートする必要があるためより複雑です。参照が必要な場合の主なスタイルガイドは、PEP 20-PythonのZenおよびPEP8-Pythonコードのスタイルガイドです。
また、for rangeバージョンは、言語リファレンスとチュートリアルの両方で使用される明示的な例ですが、その場合は値が使用されます。これは、フォームがCスタイルのforループのwhile拡張よりも馴染みのあるものになるはずであることを意味します。
for s in repeat('This is run 10 times', 10): print s
か。
range()
twitter.com/raymondh/status/1144527183341375488
int
反復ごとに異なるオブジェクトを検索または作成する必要がないため、実際に高速です。ただし、プログラマーの時間は実行時間よりも価値がある場合があります。
ループ内で発生する副作用が必要な場合は、個人的にrange()
アプローチを選択します。
ループ内で呼び出す関数の結果が気になる場合は、リスト内包表記またはmap
アプローチを使用します。このようなもの:
def f(n):
return n * n
results = [f(i) for i in range(50)]
# or using map:
results = map(f, range(50))
どうですか?
while BoolIter(N, default=True, falseIndex=N-1):
print 'some thing'
またはもっと醜い方法で:
for _ in BoolIter(N):
print 'doing somthing'
または、最後にキャッチしたい場合:
for lastIteration in BoolIter(N, default=False, trueIndex=N-1):
if not lastIteration:
print 'still going'
else:
print 'last time'
どこ:
class BoolIter(object):
def __init__(self, n, default=False, falseIndex=None, trueIndex=None, falseIndexes=[], trueIndexes=[], emitObject=False):
self.n = n
self.i = None
self._default = default
self._falseIndexes=set(falseIndexes)
self._trueIndexes=set(trueIndexes)
if falseIndex is not None:
self._falseIndexes.add(falseIndex)
if trueIndex is not None:
self._trueIndexes.add(trueIndex)
self._emitObject = emitObject
def __iter__(self):
return self
def next(self):
if self.i is None:
self.i = 0
else:
self.i += 1
if self.i == self.n:
raise StopIteration
if self._emitObject:
return self
else:
return self.__nonzero__()
def __nonzero__(self):
i = self.i
if i in self._trueIndexes:
return True
if i in self._falseIndexes:
return False
return self._default
def __bool__(self):
return self.__nonzero__()
何かを繰り返す本当にパイソン的な方法はありません。ただし、それはより良い方法です。
map(lambda index:do_something(), xrange(10))
インデックスを渡す必要がある場合は、次のようにします。
map(lambda index:do_something(index), xrange(10))
結果をコレクションとして返すことを考慮してください。したがって、結果を収集する必要がある場合は、それが役立ちます。