Tidak mungkin mengurangi loop dengan Python?


94

Saya bisa saja salah (beri tahu saya dan saya akan menghapus pertanyaannya) tetapi tampaknya python tidak mau merespons

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

Saya mencoba menggunakan xrange dan tidak berhasil juga. Bagaimana saya bisa menerapkan itu?


Karena penasaran, apakah Anda menggunakan ini untuk sesuatu? Agak jarang membutuhkan fungsi ini!
Katriel

@katrielalex Saya menggunakannya untuk mengulang matriks dari kanan ke kiri. apakah ada cara lain yang Anda sarankan agar saya melakukannya?
Gal

Anda dapat mencoba for i in reversed(mat):meskipun itu mungkin lebih lambat
Katriel

Silakan lihat di Print a list in reverse order with range , Ini menawarkan beberapa informasi berguna lainnya.
RF

1
Silakan lihat Cetak daftar dalam urutan terbalik dengan kisaran , jawaban yang diterima menjelaskannya dengan sangat jelas.
RF

Jawaban:


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

20
Betcha OP sebenarnya ingin range(5,-1,-1). Meskipun dia mungkin bisa mengetahuinya dari trial and error.
kojiro

42

Ini sudah sangat terlambat, tetapi saya hanya ingin menambahkan bahwa ada cara yang lebih elegan: menggunakan reversed

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

memberikan:

4
3
2
1
0

1
Apa yang elegan tentang itu? Anda menghabiskan waktu untuk membalik daftar alih-alih membuatnya seperti yang Anda inginkan.
alexis

5
@alexis tidak ada biaya apapun. Anda dapatkan reversed(range)secara gratis karena range_reversepengoptimalan yang bagus dibangun ke dalam CPython. Saya melakukan beberapa tolok ukur cepat dan tidak dapat menemukan perbedaan biaya yang signifikan antara step=-1dan reversed()di Python 2.7 dan 3.3. Perlu diketahui juga bahwa idiom ini digunakan di heapq .
kojiro

Terima kasih, @kojiro, itu menarik. Tetapi kecuali Anda menggunakan xrangedalam pengujian Python 2.7 Anda, reverseakan beroperasi pada daftar biasa yang sudah dibuat, bukan pada objek jangkauan; jadi apakah Anda mengatakan daftar apa pun dapat secara efisien dibalik, atau hanya range/xrangeobjek? (kode heapq yang Anda tautkan melibatkan objek rentang Python 3).
alexis

@alexis Saya tidak akan terlalu berani untuk menyarankan bahwa daftar apa pun dapat dibalik secara efisien - itu adalah pernyataan yang terlalu tidak memenuhi syarat untuk saya jawab. Itu mengatakan, meskipun, bahwa kode heapify berubah dari step=-1ke reversed()antara Python 2.3 dan 2.4
Kojiro

1
reversed(range(10))tidak mungkin 4keluar 0. Mungkin maksudmu range(5)?
Abhijit Sarkar

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

Ini akan memberimu 6,5,4,3,2,1

Adapun

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

akan memberimu 5,4,3,2,1,0




2

0 adalah nilai kondisional jika kondisi ini benar, loop akan terus berjalan. 10 adalah nilai awal. 1 adalah pengubah dimana mungkin pengurangan sederhana.

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

1

Terlambat ke pesta, tetapi bagi siapa pun yang ditugasi membuat sendiri atau ingin melihat cara kerjanya, berikut fungsi dengan bonus tambahan untuk mengatur ulang nilai start-stop berdasarkan kenaikan yang diinginkan:

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

Kenaikan negatif:

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

Atau, dengan start-stop terbalik:

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

Keluaran:

10
9
8
7
6
5
4
3
2
1

Kenaikan reguler:

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

Keluaran:

1
2
3
4
5
6
7
8
9

Kenaikan nol:

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

Keluaran:

'Error! Please enter nonzero increment value!'

0

Untuk python3 di mana -1menunjukkan nilai yang akan dikurangi di setiap langkah for n in range(6,0,-1): print(n)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.