Không thể giảm vòng lặp trong Python?


93

Tôi có thể sai (chỉ cần cho tôi biết và tôi sẽ xóa câu hỏi) nhưng có vẻ như python sẽ không trả lời

for n in range(6,0):
    print n

Tôi đã thử sử dụng xrange và nó cũng không hoạt động. Làm thế nào tôi có thể thực hiện điều đó?


Vì tò mò, bạn đang sử dụng cái này để làm gì? Thật không bình thường khi cần chức năng này!
Katriel

@katrielalex Tôi sử dụng nó để lặp lại ma trận từ phải sang trái. có cách nào khác mà bạn đề nghị tôi nên làm không?
Gal

bạn có thể thử for i in reversed(mat):mặc dù điều đó có thể chậm hơn
Katriel

Vui lòng xem In danh sách theo thứ tự ngược lại với phạm vi , Nó cung cấp một số thông tin hữu ích khác.
RF

1
Hãy xem In một danh sách theo thứ tự ngược lại với phạm vi , câu trả lời được chấp nhận giải thích nó rất rõ ràng.
RF

Câu trả lời:


214
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]

20
Betcha OP thực sự muốn range(5,-1,-1). Mặc dù anh ta có thể tìm ra điều đó từ thử và sai.
kojiro

42

Điều này là rất muộn, nhưng tôi chỉ muốn nói thêm rằng có một cách thanh lịch hơn: sử dụng reversed

for i in reversed(range(10)):
    print i

cho:

4
3
2
1
0

1
Điều đó có gì thanh lịch? Bạn dành thời gian đảo ngược danh sách thay vì tạo nó theo cách bạn muốn.
alexis

5
@alexis nó không tốn kém gì cả. Bạn nhận được reversed(range)miễn phí vì tính năng range_reversetối ưu hóa tốt được tích hợp trong CPython. Tôi đã thực hiện một số điểm chuẩn nhanh và không thể tìm thấy sự khác biệt đáng kể về chi phí giữa step=-1reversed()trong cả Python 2.7 và 3.3. Cũng xin lưu ý rằng thành ngữ này được sử dụng trong heapq .
kojiro

Cảm ơn, @kojiro, thật thú vị. Nhưng trừ khi bạn đã sử dụng xrangetrong các bài kiểm tra Python 2.7 của mình, reversesẽ hoạt động trên một danh sách thông thường, đã được tạo sẵn, không phải trên một đối tượng phạm vi; vậy bạn có nói rằng bất kỳ danh sách nào cũng có thể được đảo ngược một cách hiệu quả hay chỉ range/xrangecác đối tượng? (mã heapq mà bạn liên kết liên quan đến đối tượng phạm vi Python 3).
alexis

@alexis Tôi sẽ không mạnh dạn đề xuất rằng bất kỳ danh sách nào cũng có thể được đảo ngược một cách hiệu quả - dù sao thì đó cũng là một tuyên bố không đủ tiêu chuẩn để tôi trả lời. Nó nói, mặc dù, rằng mã heapify thay đổi từ step=-1đến reversed()giữa Python 2.32.4
Kojiro

1
reversed(range(10))không thể xuất 4thông qua 0. Có lẽ ý bạn là range(5)?
Abhijit Sarkar

12
for n in range(6,0,-1)

Điều này sẽ cung cấp cho bạn 6,5,4,3,2,1

Đối với

for n in reversed(range(0,6))

sẽ cho bạn 5,4,3,2,1,0




2

0 là giá trị điều kiện khi điều kiện này đúng, vòng lặp sẽ tiếp tục thực hiện. 10 là giá trị ban đầu. 1 là bổ ngữ, nơi có thể là giảm đơn giản.

for number in reversed(range(0,10,1)):
print number;

1

Đến muộn, nhưng đối với bất kỳ ai được giao nhiệm vụ tạo của riêng họ hoặc muốn xem điều này sẽ hoạt động như thế nào, đây là chức năng với phần thưởng bổ sung là sắp xếp lại các giá trị bắt đầu dựa trên gia số mong muốn:

def RANGE(start, stop=None, increment=1):
    if stop is None:
        stop = start
        start = 1

    value_list = sorted([start, stop])

    if increment == 0:
        print('Error! Please enter nonzero increment value!')
    else:
        value_list = sorted([start, stop])
        if increment < 0:
            start = value_list[1]
            stop = value_list[0]
            while start >= stop:
                worker = start
                start += increment
                yield worker
        else:
            start = value_list[0]
            stop = value_list[1]
            while start < stop:
                worker = start
                start += increment
                yield worker

Tăng âm:

for i in RANGE(1, 10, -1):
    print(i)

Hoặc, với start-stop bị đảo ngược:

for i in RANGE(10, 1, -1):
    print(i)

Đầu ra:

10
9
8
7
6
5
4
3
2
1

Tăng đều:

for i in RANGE(1, 10):
    print(i)

Đầu ra:

1
2
3
4
5
6
7
8
9

Tăng số 0:

for i in RANGE(1, 10, 0):
    print(i)

Đầu ra:

'Error! Please enter nonzero increment value!'

0

Đối với python3, nơi -1chỉ ra giá trị được giảm trong mỗi bước for n in range(6,0,-1): print(n)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.