숫자 1-1000
가 있는 목록을 만들려고 합니다. 분명히 이것은 쓰기 / 읽기를 귀찮게 할 것이므로 범위가있는 목록을 만들려고합니다. 파이썬 2에서는 다음과 같습니다.
some_list = range(1,1000)
작동했지만 Python 3에서는 범위가 xrange
Python 2 와 비슷 합니까?
누구든지 이것에 대한 통찰력을 제공 할 수 있습니까?
숫자 1-1000
가 있는 목록을 만들려고 합니다. 분명히 이것은 쓰기 / 읽기를 귀찮게 할 것이므로 범위가있는 목록을 만들려고합니다. 파이썬 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
클래스를. 실제로, 그것은 또한 파이썬 사례입니다. 생성하는 동안 (C ++의 경우와 같이) 객체가 채워지는지 또는 첫 번째 자동 호출 된 메소드 (파이썬의 경우와 같은 경우)만이 __init__()
기본 추상 아이디어를 변경할 수 없는지에 대한 토론 . 내 견해로는 목록 생성자가 반복자를 가져 와서 반환 된 값으로 목록을 채 웁니다 .
'range' object is not callable
파이썬 <= 3.4에서는 다른 사람들이 제안한 것처럼 list(range(10))
목록을 범위 (일반적으로 반복 가능)에서 벗어나게 만들기 위해 사용할 수 있습니다 .
3.5
압축 풀기 일반화와 함께 Python에 도입 된 또 다른 대안 *
은 목록 리터럴 을 사용 하는 것입니다 []
.
>>> 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에 비해 Python3이 덜 편리합니다.
xrange()
및 range()
;range()
하고list(range())
그럼에도 불구하고 여전히 다음과 같은 방법으로 목록 확장을 사용할 수 있습니다.
[*range(N)]
list
그것이 할 수있는 잘못된 일이 보통이기 때문에. 99 (100) 중 사용 사례를 들어, 실제 만들기 list
때문에, 비효율적이고 무의미 range
자체가 부팅 때로는 더 효율적으로, 거의 모든면에서 불변의 순서와 같은 역할 (예 : 봉쇄 시험 int
의는 O(1)
, 대 O(n)
를위한 list
s) 등이 있습니다. 파이썬 2에서는 사람들이 range
기본적 으로 사용 하는 경향이 있지만 xrange
거의 항상 더 나은 옵션이었습니다. Python 3에서는 list
실수로 잘못된 이름을 사용하여 얻지 않고을 명시 적으로 선택할 수 있습니다 .
실제로 목록에서 숫자 1-1000을 사용할 필요는 없습니다. 그러나 어떤 이유로 든이 숫자가 실제로 필요한 경우 다음을 수행 할 수 있습니다.
[i for i in range(1, 1001)]
간단히 말하면 이해력을 나열하십시오.
위의 목록 이해는 다음과 같이 번역됩니다.
nums = []
for i in range(1, 1001):
nums.append(i)
이것은 2.x부터의 목록 이해 구문 일뿐입니다. 파이썬 3에서 작동한다는 것을 알고 있지만 업그레이드 된 구문이 있는지 확실하지 않습니다.
범위는 첫 번째 매개 변수를 포함하여 시작합니다. 두 번째 매개 변수를 포함하지 않고 위로 끝납니다 (2 매개 변수를 제공 할 때; 첫 번째 매개 변수가 꺼져 있으면 '0'에서 시작합니다)
range(start, end+1)
[start, start+1, .., end]
list(range(1000))
list()
iterable로 생성자를 호출합니다 . list()
생성자는 반복자 객체를 주어진 경우 새 목록을 만드는 방법을 알고있다.
list(range(1000))
와 같이 python3에서도 작동합니다list(xrange(1000))
파이썬 3에서 범위 를 사용하십시오 .
다음은 두 숫자에서 숫자 사이를 반환하는 함수 예제입니다.
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
어쨌든 실제로 목록이 필요하지 않을 수도 있습니다.