পূর্ণসংখ্যাটি অন্য দুটি পূর্ণসংখ্যার মধ্যে রয়েছে কিনা তা নির্ধারণ করুন?


397

প্রদত্ত পূর্ণসংখ্যা দুটি অন্যান্য পূর্ণসংখ্যার (যেমন এর চেয়ে বড় / সমান 10000এবং এর চেয়ে কম / সমান 30000) কম কিনা তা আমি কীভাবে নির্ধারণ করব ?

আমি ২.৩ আইডিএল ব্যবহার করছি এবং এখন পর্যন্ত যা চেষ্টা করেছি তা কাজ করছে না:

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

20
আপনার বুলিয়ান অপারেটরগুলি পরীক্ষা করুন, অবশ্যই একটি সংখ্যা এটি 30000 এর চেয়ে বেশি হলে 10000 এর চেয়ে বেশি হবে the ছোট বিবরণটি দেখুন এবং আপনি আরও অনেক ভুল বুঝতে পারবেন।
কাইলি

2
তুলনাগুলি দস্তাবেজ
দ্য

6
Pls পরিবর্তন করুন> = 30000 থেকে <= 30000
বদিবয়

উত্তর:


1044
if 10000 <= number <= 30000:
    pass

207
পাইথন এত সুন্দর :)। এবং অপ্রয়োজনীয় হতে: একে বলা হয় "বিরতি তুলনা"।
ম্যাট মন্টাগ

এর মধ্যে এবং if number in range(10000, 30001)অন্যান্য সমাধানের পরামর্শ অনুসারে গতির পার্থক্য কী ? অতিরিক্তভাবে, setপরিবর্তে এটি ব্যবহার করার সময় rangeকি দ্রুত বা ধীর হয় ?
সুং চ

15
@ মাইকিসি বিরতির সাথে 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
পাওলো মোরেটি

5
@ মাইকিসি আপনার শেলটি চালানোর চেষ্টা করুন:> python -m timeit '10000 <= 10 <= 30000' > python -m timeit '10 in range(10000, 30001)' > python -m timeit '10 in set(range(10000, 30001))'
পাওলো মোরেটি

3
পাইথন ৩.৫.২-তে দেখে মনে হচ্ছে, রেফারেন্স চেক মানের ক্ষেত্রে গতি ধ্রুবক সহ, স্টেট স্টেটমেন্টের চেয়ে 10x ডলার ধীরে ধীরে ... সুতরাং ফাংশন ওভারহেডের কারণে সম্ভবত সম্ভাব্য পার্থক্য।
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পাইথন 2 এ) একটি জেনারেটর ফিরিয়ে দেয় সুতরাং আপনি তার উপর বারবার পরীক্ষা করতে পারবেন না।
ইগল করুন

24
এটি মনে রাখা উচিত যে 4 in range(1,4)এটি মিথ্যা important সুতরাং ভাল ব্যবহার 1 >= r <= 4যেমন নতুনদের সম্ভব ত্রুটি এড়াতে
tripplet

50
1.5 in rFalseএমনকি 3.4 এ দেয় । এই উত্তরটি শুধুমাত্র পূর্ণসংখ্যার জন্য ভাল।
jpmc26

9
@ ট্রিপলেট, আপনি ওপি হিসাবে একই ত্রুটি করেছেন! এটি হওয়া উচিত1 <= r <= 4
জন লা রুই

8
(১) খারাপ পারফরম্যান্স (যেমন অন্যরা এই সিনট্যাক্সটি ভাল দেখিয়েছে তবে এটি কার্যকর করতে দীর্ঘ সময় নিতে পারে কারণ এটি ও (এন) বনাম if a <= x <= b...) (২) floatপ্রকারের জন্য কাজ করে না (3) ।) পরিসীমা পরীক্ষাটি অন্তর্ভুক্ত নয় ... এতগুলি বিকাশকারী বাগগুলি প্রবর্তন করতে পারে কারণ তারা সমেত পরিসীমা আশা করে
ট্রেভর বয়েড স্মিথ

52

আপনার অপারেটরটি ভুল। হওয়া উচিত if number >= 10000 and number <= 30000:। অতিরিক্তভাবে, পাইথনের এই ধরণের জিনিসটির জন্য একটি শর্টহ্যান্ড রয়েছে if 10000 <= number <= 30000:,।


3
... এই ধরণের জিনিস সাধারণত বলা হয় চেইন তুলনা
নেকড়ে

30

আপনার কোড স্নিপেট,

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

সংখ্যাটি 10000 এবং 30000 উভয়ের চেয়ে বড় কিনা তা পরীক্ষা করে।

ধরে নিলেন যে আপনি এটি 10000 - 30000 এর মধ্যে রয়েছে তা পরীক্ষা করে দেখতে চান, আপনি পাইথন ব্যবধানের তুলনাটি ব্যবহার করতে পারেন:

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")

পাইথন আপনাকে কথায় কী বোঝাতে চাইছে কেবল তা লিখতে দেয়

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

পাইথন 3 এ আপনার rangeপরিবর্তে ব্যবহার করা উচিত xrange

সম্পাদনা: লোকেরা মাইক্রোবেঞ্চ চিহ্ন এবং কীভাবে শীতল শৃঙ্খলা পরিচালনার সাথে আরও উদ্বিগ্ন বলে মনে হচ্ছে। আমার উত্তরটি ডিফেন্সিভ (বাগের জন্য কম আক্রমণ পৃষ্ঠের) প্রোগ্রামিং সম্পর্কে।

মন্তব্যে দাবির ফলস্বরূপ, আমি পাইথন ৩.২.২ এর জন্য এখানে মাইক্রো বেঞ্চমার্ক যুক্ত করেছি

$ 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
দুর্ভাগ্যক্রমে পাইঞ্জন 3 এ এক্সরেঞ্জ অবচিত হয়েছে।
এপ্রিয়েটার

1
@ অ্যাপ্রেটর, হ্যাঁ পাইথন 3 এ ব্যবহার করুন range(10000, 30001)। এটি কোনও তালিকা তৈরি করে না
জন লা রুই

3
@ জেবিসি হোইনার্ড, আপনি একেবারে ভুল। পাইথন 2 xrangeবা rangeপাইথন 3 এ সদস্যপদ পরীক্ষা রয়েছে। বিশ্বাস না হলে নিজে চেষ্টা করে দেখুন। <=এটি কেবলমাত্র আরও কার্যকর কারণ এটি কোনও পরিসীমা অবজেক্ট তৈরি করে না। ও (1) হিসাবে উভয় উপায়। মুল বক্তব্যটি হল ওপি আপনার পথে এটি করার চেষ্টা করছিল এবং একটি বাগ দিয়ে শেষ হয়েছিল । দ্রুত কোড যা ভুল তা আরও খারাপ।
জন লা রোয়

2
একটি আই 5, (i) অজগর 3.5:% সময়সীমা 5 পরিসীমা (10000, 30000) 1000 লুপ, প্রতি লুপে 3: 451 µ এস সেরা। % টাইমিট 10000 <= 5 <= 30000 10000000 লুপ, লুপ প্রতি 3: 59.4 এনএস এর মধ্যে সেরা। যে 7000 উপর একটি ফ্যাক্টর
tback

1
@ পিছনে, যদি কোনও সুযোগ থাকে তবে এটি 7000 গুণ ধীর ছিল, আমি এটি প্রস্তাব করতাম না। সম্ভবত আপনি আবার পরীক্ষা চালানোর চেষ্টা করতে পারেন।
জন লা রোয়

8

সংখ্যার মধ্যে ব্যাপ্তি নির্ধারণ করুন:

r = range(1,10)

তারপরে এটি ব্যবহার করুন:

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

3
rangeআপনার ক্ষেত্রে সর্বশেষ মান 10 গণনা করে না । range(1,11)সঠিক, আপনার যদি 1 এবং 10 এর মধ্যে তুলনা করতে হয়
ikbel benabdessamad

6

আছে দুটি উপায়ে তিন পূর্ণসংখ্যার তুলনা এবং চেক কিনা মধ্যে একটি এবং :

if a < b < c:
    pass

এবং

if a < b and b < c:
    pass

প্রথমটি দেখতে আরও পঠনযোগ্য বলে মনে হচ্ছে, তবে দ্বিতীয়টি দ্রুত চলে

আসুন ডিস.ডিস ব্যবহার করে তুলনা করি :

    >>> 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
>>>

এবং সময়কাল ব্যবহার :

~$ 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 অ নেতিবাচক পূর্ণসংখ্যার আছে: a, b, এবং c। গাণিতিকভাবে ভাষী, যদি আমরা যদি তা নির্ধারণ করতে চান cমধ্যকার aএবং b, inclusively, এক এই সূত্র ব্যবহার করতে পারেন:

(সি - এ) * (বি - সি)> = 0

বা পাইথনে:

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

এটি ভুল, সাধারণ উদাহরণটি ধরুন a = 1, b = 2, c = 3 বা = 1 সি = 2 (বা) * (সিএ) = 1 * 2> = 0 সত্য => 3 1 এবং 2 এর মধ্যে
রিচার্ড আর্দেলিয়ান

আমি যে ভুল করেছি তার জন্য দুঃখিত। আমি আমার উত্তর @ রিচার্ডআরডিলিয়ান সম্পাদনা করেছি।
আনাস্তাসিয়া-রোমানোভা 秀

0

আপনি যদি আউটপুটটি প্রদত্ত বিবৃতিটি মুদ্রণ করতে চান এবং শুধুমাত্র যদি 10,000 এবং 30,000 এর মধ্যে নম্বর পড়ে।

কোড হওয়া উচিত;

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

3
এই উত্তর ইতিমধ্যে পরামর্শ দেওয়া হয়েছে। আপনার উত্তরটি প্রশ্নে কী যুক্ত করে?
জয়দীপ শেখর

0

শর্তটি হওয়া উচিত,

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

ব্যবহারের কারণ number == 10000হ'ল যদি সংখ্যার মান 50000 হয় এবং আমরা যদি ব্যবহার করি number >= 10000তবে শর্তটি পাস হয়ে যাবে, যা আপনি চান তা নয়।


যদিও এটি 10001 এর জন্য ব্যর্থ হবে। তিনি শুধুমাত্র সংখ্যা == 10000. কাজ করবে 10000 এবং 30000. তোমার শর্ত মধ্যে সংখ্যার চায়
guerreiro
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.