การลดลูปใน Python เป็นไปไม่ได้หรือ


96

ฉันคิดผิด (แจ้งให้เราทราบแล้วฉันจะลบคำถาม) แต่ดูเหมือนว่า python จะไม่ตอบสนอง

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

ฉันลองใช้ xrange แล้วก็ไม่ได้ผลเช่นกัน ฉันจะใช้สิ่งนั้นได้อย่างไร


ด้วยความอยากรู้อยากเห็นคุณใช้สิ่งนี้เพื่ออะไร? เป็นเรื่องแปลกที่ต้องใช้ฟังก์ชันนี้!
Katriel

@katrielalex ฉันใช้มันเพื่อวนซ้ำบนเมทริกซ์จากขวาไปซ้าย มีวิธีอื่นที่คุณแนะนำว่าควรทำหรือไม่
กัล

คุณสามารถลองfor i in reversed(mat):แม้ว่ามันอาจจะช้าลง
ก็ตาม

โปรดดูที่พิมพ์รายการตามลำดับย้อนกลับโดยมีช่วงซึ่งมีข้อมูลที่เป็นประโยชน์อื่น ๆ
RF

1
โปรดดูพิมพ์รายการตามลำดับย้อนกลับพร้อมช่วงคำตอบที่ยอมรับอธิบายได้ชัดเจนมาก
RF

คำตอบ:


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

20
Betcha OP range(5,-1,-1)ต้องการจริง แม้ว่าเขาอาจจะคิดได้จากการลองผิดลองถูก
kojiro

44

นี่มันสายไปแล้ว แต่ฉันแค่อยากจะเพิ่มว่ามีวิธีที่หรูหรากว่านี้คือการใช้ไฟล์ reversed

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

ให้:

4
3
2
1
0

1
สวยหรูอะไรประมาณนั้น คุณใช้เวลาในการย้อนกลับรายการแทนที่จะสร้างตามที่คุณต้องการ
alexis

5
@alexis ไม่มีค่าใช้จ่ายใด ๆ คุณได้รับreversed(range)ฟรีเนื่องจากการrange_reverseเพิ่มประสิทธิภาพที่ดีใน CPython ฉันได้ทำการเปรียบเทียบอย่างรวดเร็วและไม่พบความแตกต่างของต้นทุนที่มีนัยสำคัญระหว่างstep=-1และreversed()ใน Python 2.7 และ 3.3 นอกจากนี้ยังโปรดทราบว่าสำนวนนี้ใช้ใน heapq
kojiro

ขอบคุณ @kojiro ที่น่าสนใจ แต่ถ้าคุณไม่ใช้xrangeในการทดสอบ Python 2.7 ของคุณreverseจะทำงานในรายการปกติที่สร้างขึ้นแล้วไม่ใช่ในวัตถุช่วง คุณกำลังบอกว่ารายการใด ๆสามารถย้อนกลับได้อย่างมีประสิทธิภาพหรือเป็นเพียงrange/xrangeวัตถุ? (รหัสฮีพที่คุณเชื่อมโยงเกี่ยวข้องกับวัตถุช่วง Python 3)
alexis

@alexis ฉันจะไม่กล้าที่จะแนะนำว่ารายการใด ๆ สามารถย้อนกลับได้อย่างมีประสิทธิภาพนั่นเป็นคำสั่งที่ไม่มีเงื่อนไขสำหรับฉันที่จะตอบ แม้ว่ามันจะบอกว่ารหัสฮีพไฟต์เปลี่ยนจากstep=-1เป็นreversed()ระหว่าง Python 2.3และ2.4
kojiro

2
reversed(range(10))ไม่อาจเอาท์พุทผ่าน4 0บางทีคุณอาจหมายถึงrange(5)?
Abhijit Sarkar




2

0 คือค่าตามเงื่อนไขเมื่อเงื่อนไขนี้เป็นจริงลูปจะดำเนินการต่อไป 10 คือค่าเริ่มต้น 1 คือตัวปรับแต่งที่อาจลดลงอย่างง่าย

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

1

สายไปงานปาร์ตี้ แต่สำหรับใครก็ตามที่ได้รับมอบหมายให้สร้างของตัวเองหรือต้องการดูว่าจะทำงานอย่างไรต่อไปนี้เป็นฟังก์ชันที่มีโบนัสเพิ่มเติมในการจัดเรียงค่าเริ่มต้นใหม่ตามการเพิ่มที่ต้องการ:

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

การเพิ่มเชิงลบ:

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

หรือเมื่อย้อนกลับจุดเริ่มต้น - หยุด:

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

เอาท์พุต:

10
9
8
7
6
5
4
3
2
1

เพิ่มขึ้นปกติ:

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

เอาท์พุต:

1
2
3
4
5
6
7
8
9

เพิ่มขึ้นเป็นศูนย์:

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

เอาท์พุต:

'Error! Please enter nonzero increment value!'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.