数字の1-1000
入ったリストを作ろうとしています。明らかに、これは書き込み/読み取りが面倒なので、範囲を指定してリストを作成しようとしています。Python 2ではそれはようです:
some_list = range(1,1000)
うまくいきましたが、Python 3の範囲はxrange
Python 2の範囲と似ていますか?
誰かがこれについて何らかの洞察を提供できますか?
数字の1-1000
入ったリストを作ろうとしています。明らかに、これは書き込み/読み取りが面倒なので、範囲を指定してリストを作成しようとしています。Python 2ではそれはようです:
some_list = range(1,1000)
うまくいきましたが、Python 3の範囲はxrange
Python 2の範囲と似ていますか?
誰かがこれについて何らかの洞察を提供できますか?
回答:
rangeオブジェクトからリストを作成するだけです:
my_list = list(range(1, 1001))
これは、python2.xのジェネレーターでも同様です。my_list[i]
より効率的に(i + 1
)の値を取得できるため、通常はリストは必要ありませんが、反復するだけの場合は、に頼ることができますrange
。
また、python2.xでは、xrange
まだ索引付け可能1です。これは、range
python3.xでも同じプロパティ2があることを意味します
1print xrange(30)[12]
はpython2.xで動作します
2 python3.xの1と同様のステートメントがprint(range(30)[12])
あり、これも機能します。
list(arg)
コンストラクタ呼び出しと他の言語で理解されているlist
クラスを。実際、これはPythonのケースでもあります。(C ++の場合のように)構築中にオブジェクトが入力されるのか、それとも(Python __init__()
メソッドのように)最初に自動的に呼び出されるメソッドの間にのみオブジェクトが入力されるのかについての議論は、基本的な抽象概念を変更できません。私の見解では、リスト・コンストラクターはイテレーターを取り、リストに戻り値を入れます。
'range' object is not callable
Pythonが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)
、リテラル構文であり、関数呼び出しが含まれていないため、実行速度が速くなります。ゴルフをコーディングする必要がある場合は、文字数も少なくなります:-)
[*range(10)]
ます。をrange
初期化する以外の目的でが必要ない場合に問題なく機能しますlist
。補足:展開の一般化の私のお気に入り(大丈夫ですが、実際にはそうではありません)は、空set
のにはリテラル構文{*()}
、または私が言うところの片目モンキーオペレーターがあるということです。;-)
Python 3.xでは、range()
関数は独自の型を持ちました。この場合、イテレータを使用する必要があります
list(range(1000))
list(range(1000))()
Python3に範囲リストを直接取得する機能がないのは、元のPython3デザイナーがPython2の初心者だったからです。彼range()
はforループでの関数の使用のみを検討したため、リストを展開する必要はありません。実際、range()
リストを作成して関数に渡すために、関数を使用する必要があることがよくあります。
したがって、この場合、Python3はPython2に比べて便利ではありません。
xrange()
とrange()
;range()
、list(range())
それでも、この方法でリストの拡張を使用できます。
[*range(N)]
list
それが行うには間違ったことは、通常だから、。100のユースケースのうち99の場合、実際の作成はほとんどすべての点で不変シーケンスのように動作し、場合によってはより効率的に起動するため(たとえば、の包含テストはとの比較です)list
、非効率で無意味です。Python 2では、ほとんどの場合より優れたオプションでしたが、人々はデフォルトで使用する傾向がありました。Python 3では、誤った名前を使用して誤って取得するのではなく、明示的ににオプトインできます。range
int
O(1)
O(n)
list
range
xrange
list
リストで1〜1000の数字を使用する必要はありません。しかし、なんらかの理由でこれらの数値が本当に必要な場合は、次のようにすることができます。
[i for i in range(1, 1001)]
一言で理解をリストします:
上記のリストの理解は次のように変換されます。
nums = []
for i in range(1, 1001):
nums.append(i)
これは2.xからのものですが、単なるリスト内包構文です。私はこれがPython 3で動作することを知っていますが、アップグレードされた構文があるかどうかはわかりません
範囲は、最初のパラメーターを含めて開始します。しかし、最大、終了を含まない(;最初のパラメータはオフに残っている場合、それは「0」で始めます2つのパラメータを供給する場合)2番目のパラメータは、
range(start, end+1)
[start, start+1, .., end]
list(range(1000))
list()
、iterableでコンストラクタを呼び出しています。list()
コンストラクタは、任意の反復可能なオブジェクトを与えられたときに、新しいリストを作成する方法を知っています。
list(range(1000))
python3でもpython2と同じようlist(xrange(1000))
に機能します
実際には、1〜1000(両端を含む)が必要な場合は、range(...)
関数をパラメーター1と1001 で使用しますrange(1, 1001)
。これは、range(start, end)
関数が開始から(終了1)まで含まれるためです。
Python 3で範囲を使用します。
以下は、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の両方で非効率な多数の要素を反復するために、多くの初心者による範囲関数の使用のみを考慮したためです。しかし、彼らは数のリストを作成するためにrange関数の使用を無視しました。今、彼らがすでに元に戻すのは遅すぎます。
私がPython3のデザイナーになるとしたら、
それが最適なはずです。
some_list[i] == i+1
なので、とにかくリストは本当に必要ないでしょう。