数字1-1000
を含むリストを作成しようとしています。明らかに、これは書き込み/読み取りが煩わしいので、範囲を指定してリストを作成しようとしています。 Python 2の場合:
some_list = range(1,1000)
うまくいくはずですが、Python 3では範囲はPython 2のxrange
に似ていますか?
誰でもこれについての洞察を提供できますか?
範囲オブジェクトからリストを作成するだけです:
my_list = list(range(1, 1001))
これは、python2.xのジェネレーターでも同様です。通常、リストは必要ありませんが、my_list[i]
の値をより効率的に取得できるため(i + 1
)、繰り返し処理する必要がある場合は、range
にフォールバックできます。
また、python2.xでは、xrange
は引き続きインデックス可能です。1。これは、python3.xのrange
にも同じプロパティがあることを意味します2
1print xrange(30)[12]
はpython2.xで動作します
2に類似した声明 1 python3.xではprint(range(30)[12])
であり、それも機能します。
python 3.xでは、range()
関数は独自の型を取得しました。この場合、イテレータを使用する必要があります
list(range(1000))
Pythons <= 3.4では、他の人が示唆したように、list(range(10))
を使用して範囲外のリストを作成できます(一般的に、反復可能)。
Pythonの3.5
にアンパックの一般化を導入した別の方法は、リストリテラル*
で[]
を使用することです。
>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
これはlist(r)
と同等ですが、リテラル構文であり、関数呼び出しが含まれていないという事実により、より高速に実行できます。ゴルフをコーディングする必要がある場合は、文字数も少なくなります:-)
Python3に範囲リストを直接取得する機能がない理由は、元のPython3デザイナーがPython2の初心者であったためです。彼はforループでのrange()関数の使用のみを考慮したため、リストを展開する必要はありません。実際、リストを作成して関数に渡すには、range()関数を使用する必要が非常に頻繁にあります。
したがって、この場合、Python3はPython2に比べてあまり便利ではありません。
それでも、この方法でリスト展開を使用できます。
[*range(N)]
リストで1〜1000の数字を使用する必要はありません。ただし、何らかの理由でこれらの数値が本当に必要な場合は、次のようにすることができます。
[i for i in range(1, 1001)]
簡潔にリスト内包表記:
上記のリストの理解は、次のように翻訳されます。
nums = []
for i in range(1, 1001):
nums.append(i)
これはリスト内包構文にすぎませんが、2.xからです。私はこれがPython 3で動作することを知っていますが、アップグレードされた構文もあるかどうかはわかりません
範囲は最初のパラメーターを含めて始まります。ただし、最後まで含まない 2番目のパラメーター(2つのパラメーターを指定した場合、最初のパラメーターを省略すると、「0」から始まります)
range(start, end+1)
[start, start+1, .., end]
Python 3では Range を使用します。
以下は、2つの数字から数字の間に戻る関数の例です。
def get_between_numbers(a, b):
"""
This function will return in between numbers from two numbers.
:param a:
:param b:
:return:
"""
x = []
if b < a:
x.extend(range(b, a))
x.append(a)
else:
x.extend(range(a, b))
x.append(b)
return x
結果
print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))
[5, 6, 7, 8, 9]
[5, 6, 7, 8, 9]
実際、これはPython2と比較したPython3のレトログラデーションです。確かに、range()とxrange()を使用するPython2は、それぞれlist(range())とrange()を使用するPython3よりも便利です。その理由は、Python3の元の設計者はあまり経験がなく、多くの初心者がメモリとCPUの両方が非効率な多数の要素を反復処理するために範囲関数を使用することのみを考慮したためです。しかし、彼らは数値リストを作成するために範囲関数の使用を無視しました。今、彼らがすでに元に戻すには遅すぎます。
私がPython3のデザイナーになる場合、次のことを行います。
それが最適なはずです。