ตรวจสอบว่าจำนวนเต็มอยู่ระหว่างจำนวนเต็มสองตัวหรือไม่


397

ฉันจะตรวจสอบได้อย่างไรว่าจำนวนเต็มที่ให้นั้นอยู่ระหว่างจำนวนเต็มอื่น ๆ สองตัว (เช่นมากกว่า / เท่ากับ10000และน้อยกว่า / เท่ากับ30000)

ฉันใช้ 2.3 IDLE และสิ่งที่ฉันพยายามตอนนี้ไม่ทำงาน:

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

20
ตรวจสอบโอเปอเรเตอร์บูลีนของคุณแน่นอนว่าตัวเลขจะมากกว่า 10,000 ถ้ามากกว่า 30000 ดูรายละเอียดเล็ก ๆ น้อย ๆ แล้วคุณจะได้รับข้อผิดพลาดมากขึ้น
Kaili

2
การเปรียบเทียบสามารถถูกผูกมัดdocs.python.org/2/reference/expressions.html#comparisons
theBuzzyCoder

6
กรุณาเปลี่ยน> = 30000 ถึง <= 30000
Badiboy

คำตอบ:


1044
if 10000 <= number <= 30000:
    pass

207
Python ดีมาก :) และจะซ้ำซ้อน: สิ่งนี้เรียกว่า "การเปรียบเทียบช่วงเวลา"
Matt Montag

อะไรคือความแตกต่างของความเร็วระหว่างสิ่งนี้if number in range(10000, 30001)กับสิ่งที่แนะนำโดยโซลูชันอื่น ๆ ? นอกจากนี้มันเร็วขึ้นหรือช้าลงเมื่อใช้setแทนrange?
Sung Cho

15
@MikeC ด้วยการเปรียบเทียบช่วงเวลาเป็นครั้งแรกที่เมื่อเทียบกับnumber 10000หากมันน้อยกว่า10000นิพจน์นั้นจะลัดวงจรทันทีและการเปรียบเทียบที่สองจะไม่ถูกตรวจสอบ O(1)ความซับซ้อนเป็น in range(0, n)สร้างลำดับของตัวเลขทั้งหมดแทนจากนั้นวนซ้ำ O(n)ความซับซ้อนเป็น ความซับซ้อนของin set(range(0, n))ยังคงเป็นO(n)เพราะการสร้างชุดมีความซับซ้อนเวลาของO(n) ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
Paolo Moretti

5
@MikeC พยายามวิ่งในเปลือกของคุณ:> python -m timeit '10000 <= 10 <= 30000' > python -m timeit '10 in range(10000, 30001)' > python -m timeit '10 in set(range(10000, 30001))'
เปาโล Moretti

3
ดูเหมือนว่าใน python3.5.2 ช่วงจะช้ากว่าคำสั่ง if ประมาณ 10 เท่าโดยมีค่าคงที่ความเร็วที่เกี่ยวข้องกับค่าการตรวจสอบช่วง ...
amohr

78
>>> r = range(1, 4)
>>> 1 in r
True
>>> 2 in r
True
>>> 3 in r
True
>>> 4 in r
False
>>> 5 in r
False
>>> 0 in r
False

4
ว้าวฉันมักจะคิดว่าrange(หรือxrangeใน python2) ส่งคืนเครื่องกำเนิดไฟฟ้าดังนั้นคุณจึงไม่สามารถทดสอบซ้ำได้
yegle

24
มันสำคัญที่จะต้องจำไว้ว่า4 in range(1,4)เป็นเท็จ ดังนั้นควรใช้ให้ดีขึ้น1 >= r <= 4เนื่องจากจะหลีกเลี่ยงข้อผิดพลาดที่อาจเกิดขึ้นโดยผู้ใช้ใหม่
tripplet

50
1.5 in rให้Falseแม้ใน 3.4 คำตอบนี้ดีสำหรับจำนวนเต็มเท่านั้น
jpmc26

9
@tripplet คุณทำข้อผิดพลาดเดียวกับ OP !, ควรจะเป็น1 <= r <= 4
John La Rooy

8
(1. ) ประสิทธิภาพที่ไม่ดี (อย่างที่คนอื่น ๆ ได้ชี้ให้เห็นว่าไวยากรณ์นี้ดูดีแต่อาจใช้เวลานานในการดำเนินการเพราะเป็น O (n) การดำเนินการเทียบกับif a <= x <= b... ) (2. ) ไม่ทำงานสำหรับfloatประเภท (3) .) การทดสอบแบบไม่รวม ... นักพัฒนาจำนวนมากอาจแนะนำข้อผิดพลาดเพราะพวกเขาคาดว่าช่วงรวม
เทรเวอร์บอยด์สมิ ธ

52

ผู้ให้บริการของคุณไม่ถูกต้อง if number >= 10000 and number <= 30000:ควรจะเป็น นอกจากนี้ Python ยังมีบทสรุปสำหรับสิ่งนี้, if 10000 <= number <= 30000:.


3
... เรียงของสิ่งนี้มักจะเรียกว่าการเปรียบเทียบถูกล่ามโซ่
Wolf

30

ข้อมูลโค้ดของคุณ

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

ตรวจสอบว่าหมายเลขมีขนาดใหญ่กว่าทั้ง 10,000 และ 30000 จริงหรือไม่

สมมติว่าคุณต้องการตรวจสอบว่าตัวเลขอยู่ในช่วง 10,000 ถึง 30000 คุณสามารถใช้การเปรียบเทียบช่วง Python:

if 10000 <= number <= 30000:
    print ("you have to pay 5% taxes")

คุณลักษณะงูใหญ่นี้จะอธิบายต่อไปในเอกสารหลาม



8

ปัญหาของการเปรียบเทียบคือพวกมันอาจจะยากที่จะทำการดีบั๊กเมื่อคุณใส่>=ที่ที่ควรมี<=

#                             v---------- should be <
if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

Python ให้คุณเขียนความหมายของคำ

if number in xrange(10000, 30001): # ok you have to remember 30000 + 1 here :)

ใน Python3, คุณจำเป็นต้องใช้แทนrangexrange

แก้ไข: คนดูเหมือนจะกังวลมากขึ้นกับเครื่องหมาย microbench และวิธีการดำเนินการผูกมัดเย็น คำตอบของฉันเกี่ยวกับการตั้งโปรแกรมป้องกัน

จากการอ้างสิทธิ์ในความคิดเห็นฉันได้เพิ่มการวัดขนาดเล็กที่นี่สำหรับ Python3.5.2

$ python3.5 -m timeit "5 in range(10000, 30000)"
1000000 loops, best of 3: 0.266 usec per loop
$ python3.5 -m timeit "10000 <= 5 < 30000"
10000000 loops, best of 3: 0.0327 usec per loop

หากคุณกังวลเกี่ยวกับประสิทธิภาพคุณสามารถคำนวณช่วงหนึ่งได้

$ python3.5 -m timeit -s "R=range(10000, 30000)" "5 in R"
10000000 loops, best of 3: 0.0551 usec per loop

2
xrange เลิกใช้แล้วใน Python 3 โชคไม่ดี
apraetor

1
@apraetor ใช่ใช้range(10000, 30001)ใน Python3 มันไม่ได้สร้างรายการ
John La Rooy

3
@JBChouinard คุณไม่ถูกต้องอย่างแน่นอน xrangeใน Python2 หรือrangeใน Python3 มีการทดสอบความเป็นสมาชิก ลองด้วยตัวคุณเองถ้าคุณไม่เชื่อ <=มีประสิทธิภาพมากกว่าเท่านั้นเพราะไม่ได้สร้างวัตถุช่วง ทั้งสองวิธีเป็น O (1) จุดคือสหกรณ์ได้รับการ พยายามที่จะทำมันด้วยวิธีของคุณและจบลงด้วยข้อผิดพลาด รหัสด่วนที่ผิดนั้นแย่กว่า
John La Rooy

2
บน i5, (i) python 3.5:% timeit 5 ในช่วง (10,000, 30000) 1,000 ลูป, ดีที่สุดคือ 3: 451 µs ต่อลูป % timeit 10000 <= 5 <= 30000 10000000 ลูปที่ดีที่สุดคือ 3: 59.4 ns ต่อวง นั่นเป็นปัจจัยกว่า 7000
tback

1
@tback หากมีโอกาสที่จะช้ากว่า 7000 ครั้งฉันจะไม่แนะนำ บางทีคุณอาจลองทำการทดสอบอีกครั้ง
John La Rooy

8

กำหนดช่วงระหว่างตัวเลข:

r = range(1,10)

จากนั้นใช้:

if num in r:
    print("All right!")

3
rangeไม่นับค่าสุดท้าย10ในกรณีของคุณ range(1,11)ถูกต้องถ้าคุณต้องการเปรียบเทียบระหว่าง 1 และ 10
ikbel benabdessamad

6

มีสองวิธีในการเปรียบเทียบสามจำนวนเต็มและตรวจสอบว่าbอยู่ระหว่างaและc :

if a < b < c:
    pass

และ

if a < b and b < c:
    pass

คนแรกที่ดูเหมือนว่าอ่านได้มากขึ้น แต่อีกคนหนึ่งวิ่งได้เร็วขึ้น

มาเปรียบเทียบการใช้dis.dis :

    >>> dis.dis('a < b and b < c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 COMPARE_OP               0 (<)
              6 JUMP_IF_FALSE_OR_POP    14
              8 LOAD_NAME                1 (b)
             10 LOAD_NAME                2 (c)
             12 COMPARE_OP               0 (<)
        >>   14 RETURN_VALUE
>>> dis.dis('a < b < c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 DUP_TOP
              6 ROT_THREE
              8 COMPARE_OP               0 (<)
             10 JUMP_IF_FALSE_OR_POP    18
             12 LOAD_NAME                2 (c)
             14 COMPARE_OP               0 (<)
             16 RETURN_VALUE
        >>   18 ROT_TWO
             20 POP_TOP
             22 RETURN_VALUE
>>>

และใช้timeit :

~$ python3 -m timeit "1 < 2 and 2 < 3"
10000000 loops, best of 3: 0.0366 usec per loop

~$ python3 -m timeit "1 < 2 < 3"
10000000 loops, best of 3: 0.0396 usec per loop

นอกจากนี้คุณอาจใช้ช่วงตามที่แนะนำไว้ก่อนหน้านี้ แต่จะช้ากว่ามาก


0

สมมติว่ามี 3 integers เชิงลบ: a, และb cการพูดทางคณิตศาสตร์ถ้าเราต้องการตรวจสอบว่าcอยู่ระหว่างaและbรวมอย่างใดอย่างหนึ่งสามารถใช้สูตรนี้:

(c - a) * (b - c)> = 0

หรือใน Python:

> print((c - a) * (b - c) >= 0)
True

นี่เป็นสิ่งที่ผิดลองใช้ตัวอย่างง่ายๆ a = 1, b = 2, c = 3 ba = 1 ca = 2 (ba) * (ca) = 1 * 2> = 0 True => 3 อยู่ระหว่าง 1 ถึง 2
Richard Ardelean

ขออภัยสำหรับความผิดพลาดที่ฉันทำ ฉันได้แก้ไขคำตอบของฉัน @RichardArdelean
Anastasiya-Romanova 秀

0

คุณต้องการให้ผลลัพธ์ที่พิมพ์คำสั่งที่กำหนดหากและถ้าจำนวนอยู่ระหว่าง 10,000 ถึง 30,000

รหัสควรเป็น;

if number >= 10000 and number <= 30000:
    print("you have to pay 5% taxes")

3
คำตอบนี้ได้รับการแนะนำแล้ว คำตอบของคุณเพิ่มไปยังคำถามคืออะไร?
Jaideep Shekhar

0

เงื่อนไขควรจะเป็น

if number == 10000 and number <= 30000:
     print("5% tax payable")

เหตุผลในการใช้number == 10000คือถ้าค่าของตัวเลขคือ 50,000 และถ้าเราใช้number >= 10000เงื่อนไขจะผ่านซึ่งไม่ใช่สิ่งที่คุณต้องการ


สิ่งนี้จะล้มเหลวสำหรับ 1,0001 ตัวอย่างเช่น เขาต้องการตัวเลขระหว่าง 10,000 ถึง 30000 เงื่อนไขของคุณจะใช้ได้เฉพาะกับตัวเลข == 10,000
guerreiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.