কেন পরিসীমা (শুরু, শেষ) সমাপ্ত হয় না?


304
>>> range(1,11)

আপনি দেয়

[1,2,3,4,5,6,7,8,9,10]

কেন 1-11?

তারা কি কেবল এলোমেলোভাবে এটি করার সিদ্ধান্ত নিয়েছে বা এর কোনও মূল্য রয়েছে যা আমি দেখছি না?



11
মূলত আপনি অন্যগুলির জন্য অফ-বাই-এক বাগের সেট বেছে নিচ্ছেন। একটি সেট আপনার লুপগুলি তাড়াতাড়ি বন্ধ হয়ে যাওয়ার সম্ভাবনা বেশি, অন্যটি সম্ভবত একটি ব্যতিক্রম (বা অন্য ভাষায় বাফার ওভারফ্লো) হওয়ার কারণ হতে পারে। একবার আপনি একগুচ্ছ কোড লিখেছেন, আপনি দেখতে পাবেন যে আচরণের পছন্দটি range()আরও অনেক বেশি
অর্থবোধ করেছে

32
ডিজকস্ট্রার সাথে লিঙ্ক, ইডওডাউন 831: cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF
unutbu

35
@ ইউনতবু যে জিক্স্ট্রা নিবন্ধটি এই বিষয়টিতে রচিত হয়েছে তবে এখানে মূল্যবোধের কিছুই সরবরাহ করা হয় না, লোকেরা কর্তৃপক্ষের কাছে আবেদন হিসাবে এটি ব্যবহার করে। ওপির প্রশ্নের একমাত্র প্রাসঙ্গিক সিউডো-কারণ তিনি মনে করেন যে উপরের গণ্ডিটি নির্দিষ্ট ক্ষেত্রে "অপ্রাকৃত" এবং "কুরুচিপূর্ণ" হয়ে যায় যেখানে ক্রমটি খালি রয়েছে - এটি সম্পূর্ণ বিষয়গত অবস্থান এবং সহজেই তার বিরুদ্ধে তর্ক করা হয়েছিল, সুতরাং এটি টেবিলে তেমন কিছু নিয়ে আসে না। মেসার সাথে "পরীক্ষা-নিরীক্ষা" তাদের নির্দিষ্ট বাধা বা মূল্যায়নের পদ্ধতিগুলি না জেনেও তেমন মূল্যবান নয়।
সূন্দর - মনিকা পুনরায় ইনস্টল করুন

6
@andreasdr তবে প্রসাধনী যুক্তি বৈধ হলেও, পাইথনের পদ্ধতির দ্বারা পাঠযোগ্যতার নতুন সমস্যা চালু করা যায় না? সাধারণ ব্যবহারের মধ্যে ইংরেজি শব্দ "পরিসর" যে কিছু রেঞ্জ বোঝা থেকে কিছু করার কিছু - একটি বিরতি মত। সেই লেনটি (তালিকা (পরিসীমা (1,2%)) 1 এবং লেন (তালিকা (রেঞ্জ (2%)) প্রদান করে 2 হ'ল এমন জিনিস যা আপনাকে সত্যই হজম করতে শিখতে হবে।
আর্মিন

উত্তর:


245

কারণ কল করা আরও সাধারণ যেটি 10 ​​টি সমান সমান উপাদান রয়েছে এমন range(0, 10)রিটার্ন দেয় । মনে রাখবেন প্রোগ্রামাররা 0-ভিত্তিক সূচক পছন্দ করে।[0,1,2,3,4,5,6,7,8,9]len(range(0, 10))

এছাড়াও, নিম্নলিখিত সাধারণ কোড স্নিপেট বিবেচনা করুন:

for i in range(len(li)):
    pass

আপনি দেখতে পাচ্ছেন যে যদি range()ঠিকঠাক দিকে যায় len(li)তবে এটি সমস্যাযুক্ত হবে? প্রোগ্রামারকে স্পষ্টভাবে বিয়োগ করতে হবে ১। এটি প্রোগ্রামারদের for(int i = 0; i < 10; i++)বেশি পছন্দ করা সাধারণ ট্রেন্ড অনুসরণ করে for(int i = 0; i <= 9; i++)

আপনি যদি ঘন ঘন 1 টির সাথে শুরুতে পরিসীমা কল করে থাকেন তবে আপনি নিজের ফাংশনটি সংজ্ঞায়িত করতে চাইতে পারেন:

>>> def range1(start, end):
...     return range(start, end+1)
...
>>> range1(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

48
যদি সেই যুক্তিটি পরামিতিগুলি না হত range(start, count)?
মার্ক রান্সম

3
@ শোগুন শুরুর মানটি ডিফল্ট হয় 0 এর range(10)সমান range(0, 10)
মoinনুদিন

4
আপনার range1ধাপের চেয়ে আলাদা ধাপের রেঞ্জগুলির সাথে কাজ করবে না 1
dimo414

6
আপনি ব্যাখ্যা করেছেন যে ব্যাপ্তিটি (x) 0 দিয়ে শুরু হওয়া উচিত এবং x হবে "ব্যাপ্তির দৈর্ঘ্য"। ঠিক আছে. তবে আপনি কেন ব্যাপ্তিটি (x, y) x দিয়ে শুরু করতে হবে এবং y-1 দিয়ে সমাপ্ত হবে তা ব্যাখ্যা করেন নি। প্রোগ্রামার যদি আমার 1 থেকে 3 অবধি লুপটি চায় তবে তাকে স্পষ্টভাবে 1 যোগ করতে হবে এটি কি সুবিধার জন্য?
আর্মিন

7
for i in range(len(li)):বরং এন্টিপ্যাটার্ন। এক ব্যবহার করা উচিত enumerate
হ্যান্স

27

যদিও এখানে কিছু দরকারী অ্যালগরিদমিক ব্যাখ্যা রয়েছে, তবে আমি মনে করি যে এটি কেন এইভাবে কাজ করে তা নিয়ে কিছু সাধারণ 'বাস্তব জীবন' যুক্তি যুক্ত করতে সহায়তা করতে পারে, যা তরুণ নবীনদের বিষয় প্রবর্তন করার সময় আমি দরকারী বলে মনে করেছি:

'পরিসীমা (1,10)' এর মতো কিছু নিয়ে বিভ্রান্তি দেখা দিতে পারে যে পরামিতিগুলির জুড়ি "শুরু এবং শেষ" উপস্থাপন করে।

এটি আসলে শুরু এবং "স্টপ"।

এখন, যদি এটি তখন "শেষ" মান হত তবে হ্যাঁ, আপনি আশা করতে পারেন যে এই সংখ্যাটি অনুক্রমের চূড়ান্ত প্রবেশ হিসাবে অন্তর্ভুক্ত করা হবে। তবে এটি "শেষ" নয়।

অন্যরা ভুল করে সেই পরামিতিটিকে "গণনা" হিসাবে ডাকে কারণ আপনি যদি কেবল 'রেঞ্জ (এন)' ব্যবহার করেন তবে অবশ্যই এটি 'এন' বার পুনরাবৃত্তি করে। আপনি শুরু করার প্যারামিটারটি যুক্ত করার পরে এই যুক্তিটি ভেঙে যায়।

সুতরাং মূল বিষয়টির নামটি মনে রাখা: " থামুন "। তার মানে এটি সেই বিন্দু যেখানে পৌঁছে গেলে পুনরাবৃত্তি অবিলম্বে বন্ধ হবে stop Point দফার পরে নয় ।

সুতরাং, "স্টার্ট" প্রকৃতপক্ষে অন্তর্ভুক্ত হওয়ার জন্য প্রথম মানটিকে উপস্থাপন করে, "স্টপ" মান পৌঁছানোর পরে এটি 'ব্রেক' হয় না বরং প্রক্রিয়া চালিয়ে যাওয়ার আগে 'ব্রেক' করে দেয়।

বাচ্চাদের কাছে এটি ব্যাখ্যা করার জন্য আমি যে একটি উপমা ব্যবহার করেছি তা হ'ল, হাস্যকরভাবে, এটি বাচ্চাদের চেয়ে ভাল আচরণ করা হয়! এটি অনুমিত হওয়ার পরে এটি থামছে না - এটি কী করছে তা শেষ না করেই তাত্ক্ষণিক থামে। (তারা এটি পেয়েছে;))

আর একটি উপমা - আপনি যখন গাড়ি চালান তখন আপনি কোনও স্টপ / ফলন / 'উপায়' চিহ্নটি পাস করেন না এবং এটি আপনার গাড়ীর পাশে বা পিছনে বসে বসে শেষ করেন। আপনি যখন থামবেন তখন প্রযুক্তিগতভাবে আপনি এখনও এটিতে পৌঁছাতে পারেন নি। এটি 'আপনার যাত্রায় যে জিনিসগুলি পেরিয়ে গেছে "এর মধ্যে অন্তর্ভুক্ত নয়।

আমি আশা করি এর মধ্যে কিছু পাইথনিটিস / পাইথোনাইটাসকে ব্যাখ্যা করতে সহায়তা করে!


এই ব্যাখ্যা আরও স্বজ্ঞাত। ধন্যবাদ
ফ্রেড

বাচ্চাদের ব্যাখ্যাটি কেবল হাসিখুশি!
অ্যান্টনি হ্যাচকিন্স

1
আপনি শুয়োরের উপর লিপস্টিক লাগানোর চেষ্টা করছেন। "স্টপ" এবং "শেষ" এর মধ্যে পার্থক্য অযৌক্তিক is যদি আমি 1 থেকে 7 এ যাই তবে আমি 7 পাস করিনি start আরম্ভ এবং থামার অবস্থানগুলির জন্য পৃথক কনভেনশন রাখা কেবল পাইথনের ত্রুটি। মানুষের সহ অন্যান্য ভাষায়, "X থেকে Y" এর অর্থ "X থেকে Y" হয়। পাইথনে, "এক্স: ওয়াই" এর অর্থ "এক্স: ওয়াই -১"। আপনার যদি 9 থেকে 11 পর্যন্ত সভা হয় তবে আপনি কি লোকদের 9 থেকে 12, বা 8 থেকে 11 এর কথা বলবেন?
bzip2

23

এক্সক্লুসিভ রেঞ্জের কিছু সুবিধা রয়েছে:

একটি জিনিসের জন্য প্রতিটি আইটেম range(0,n)দৈর্ঘ্যের তালিকার জন্য একটি বৈধ সূচক n

এছাড়াও range(0,n)একটি দৈর্ঘ্য n, না n+1যা সমেত পরিসীমা would।


18

এটা তোলে শূন্য ভিত্তিক ইন্ডেক্স এবং সঙ্গে একযোগে ভাল কাজ করে len()। উদাহরণস্বরূপ, যদি আপনার তালিকায় 10 টি আইটেম থাকে xতবে সেগুলি 0-9 নম্বরযুক্ত। range(len(x))আপনাকে 0-9 দেয়।

অবশ্যই, লোকেরা আপনাকে বলবে এটি করা for item in xবা for index, item in enumerate(x)না করার চেয়ে বেশি পাইথোনিক for i in range(len(x))

স্লাইসিং সেভাবেও কাজ করে: foo[1:4]আইটেমের 1-3- foo(এই আইটেম 1 টি মাথায় রেখে আসলে শূন্য-ভিত্তিক সূচকের কারণে দ্বিতীয় আইটেম)। ধারাবাহিকতার জন্য, তাদের উভয়েরই একইভাবে কাজ করা উচিত।

আমি এটিকে মনে করি: "আপনি যে প্রথম সংখ্যাটি চান, তার পরে প্রথম নম্বরটি আপনি চান না ।" আপনি যদি 1-10 চান তবে প্রথম সংখ্যাটি আপনি চান না এটি 11, তাই এটি range(1, 11)

যদি এটি কোনও নির্দিষ্ট অ্যাপ্লিকেশনে জটিল হয়ে ওঠে তবে একটি সামান্য সহায়ক সহায়ক ফাংশন লিখতে যথেষ্ট সহজ যা সমাপ্তি সূচক এবং কলগুলিতে 1 যুক্ত করে range()


1
কাটা উপর সম্মত। w = 'abc'; w[:] == w[0:len(w)]; w[:-1] == w[0:len(w)-1];
কেভিপি

def full_range(start,stop): return range(start,stop+1) ## helper function
নোবার

সম্ভবত for index, item in enumerate(x)বিভ্রান্তি এড়াতে গণনার উদাহরণটি পড়তে হবে
শোনান

@ স্যানস ধন্যবাদ, স্থির।
18:25 এ কান্ডল করুন

12

এটি বিভাজক রেঞ্জগুলির জন্যও কার্যকর; range(a,b)বিভক্ত হতে পারে range(a, x)এবং range(x, b)যেখানে অন্তর্ভুক্তিক পরিসর সহ আপনি লিখতেও পারেন x-1বা হয় x+1। আপনার খুব কমই রেঞ্জগুলি বিভক্ত করার দরকার থাকলেও আপনি প্রায়শই তালিকাগুলি বিভক্ত করার ঝোঁক রাখেন, যা তালিকার টুকরো টুকরো করার একটি কারণ হ'ল l[a:b]a-th উপাদানটি রয়েছে তবে বি-থিম নয় not তারপরে rangeএকই সম্পত্তি থাকা এটিকে সুন্দরভাবে সামঞ্জস্য করে।


11

ব্যাপ্তির দৈর্ঘ্য হ'ল শীর্ষ মানটি নীচের মান থেকে বিয়োগ করবে।

এটি এর মতো কিছু সাথে খুব মিল:

for (var i = 1; i < 11; i++) {
    //i goes from 1 to 10 in here
}

সি-স্টাইলের ভাষায়।

রুবির সীমার মতো:

1...11 #this is a range from 1 to 10

তবে, রুবি বুঝতে পারে যে আপনি অনেক সময় টার্মিনাল মানটি অন্তর্ভুক্ত করতে চান এবং বিকল্প বাক্য গঠনটি সরবরাহ করেন:

1..10 #this is also a range from 1 to 10

17
গাহ! আমি রুবি ব্যবহার করি না, তবে আমি এটি 1..10বনাম কল্পনা করতে পারি1...10 যখন কোড পড়া মধ্যে পার্থক্য করা কঠিন হচ্ছে!
মoinনুদিন

6
@ মারকগ - যখন আপনি জানেন যে দুটি রূপের উপস্থিতি আপনার চোখের পার্থক্যের সাথে মিলিত হয় :)
মিশ্রিত হয়েছে

11
রুবির রেঞ্জ অপারেটর পুরোপুরি স্বজ্ঞাত। আর লম্বা ফর্মটি আপনাকে সংক্ষিপ্ত ক্রম করে। কাশি
রাসেল বোরোগোভ

4
@ রাসেল, সম্ভবত 1 ............ 20 এর মধ্যে 1..10 এর সমান পরিধি দেওয়া উচিত। এখন এটি পরিবর্তনযোগ্য মূল্য হিসাবে কিছু সিনট্যাকটিক চিনি হবে। ;)
কেভপি

4
@ রাসেল অতিরিক্ত বিন্দুটি শেষ আইটেমটিকে পরিসীমা থেকে বের করে দিয়েছে :)
স্কিলড্রিক

5

মূলত অজগর range(n)পুনরুক্তিতেn বারবার যা একচেটিয়া প্রকৃতির কারণ এটি মুদ্রিত হওয়ার পরে এটি সর্বশেষ মান দেয় না, আমরা একটি ফাংশন তৈরি করতে পারি যা অন্তর্ভুক্তি মান দেয় যার অর্থ এটি পরিসরে বর্ণিত সর্বশেষ মানটিও মুদ্রণ করবে।

def main():
    for i in inclusive_range(25):
        print(i, sep=" ")


def inclusive_range(*args):
    numargs = len(args)
    if numargs == 0:
        raise TypeError("you need to write at least a value")
    elif numargs == 1:
        stop = args[0]
        start = 0
        step = 1
    elif numargs == 2:
        (start, stop) = args
        step = 1
    elif numargs == 3:
        (start, stop, step) = args
    else:
        raise TypeError("Inclusive range was expected at most 3 arguments,got {}".format(numargs))
    i = start
    while i <= stop:
        yield i
        i += step


if __name__ == "__main__":
    main()

4

কোডটি বিবেচনা করুন

for i in range(10):
    print "You'll see this 10 times", i

ধারণাটি হ'ল আপনি দৈর্ঘ্যের একটি তালিকা পেয়েছেন y-xযা আপনি পুনরাবৃত্তি করতে পারবেন (উপরে দেখবেন)।

ব্যাপ্তির জন্য পাইথন ডক্স পড়ুন - তারা লুপের পুনরাবৃত্তিকে প্রাথমিক ব্যবহারের জন্য বিবেচনা করে।


1

এটি অনেক ক্ষেত্রেই যুক্তিযুক্ত হতে আরও সুবিধাজনক।

মূলত, আমরা startএবং এর মধ্যবর্তী ব্যবধান হিসাবে একটি পরিসরটি ভাবতে পারি end। যদি start <= end, তাদের মধ্যে বিরতি দৈর্ঘ্য হয় end - start। যদি lenপ্রকৃতপক্ষে দৈর্ঘ্য হিসাবে সংজ্ঞায়িত করা হয় তবে আপনার কাছে:

len(range(start, end)) == start - end

তবে, আমরা অন্তরটির দৈর্ঘ্য পরিমাপ করার পরিবর্তে পরিসরের অন্তর্ভুক্ত পূর্ণ সংখ্যাগুলি গণনা করি। উপরের সম্পত্তিটি সত্য রাখতে, আমাদের একটি শেষবিন্দু অন্তর্ভুক্ত করা উচিত এবং অন্যটি বাদ দেওয়া উচিত।

যোগ করার পদ্ধতি stepপ্যারামিটার দৈর্ঘ্যের একটি ইউনিট চালু ভালো হয়। সেক্ষেত্রে, আপনি আশা করতেন

len(range(start, end, step)) == (start - end) / step

দৈর্ঘ্যের জন্য। গণনাটি পেতে, আপনি কেবল পূর্ণসংখ্যা বিভাগ ব্যবহার করেন।


পাইথনের অসঙ্গতির এই প্রতিরক্ষাগুলি হাসিখুশি। আমি যদি দুটি সংখ্যার মধ্যবর্তী ব্যবধানটি চেয়ে থাকি তবে কেন আমি অন্তরের পরিবর্তে পার্থক্য পেতে বিয়োগ করতে পারি? শুরু এবং শেষের অবস্থানের জন্য বিভিন্ন সূচীকরণ কনভেনশন ব্যবহার করা অসঙ্গত। 5 থেকে 21 পজিশন পাওয়ার জন্য আপনাকে কেন "5:22" লিখতে হবে?
bzip2

এটি পাইথনের নয়, বোর্ড জুড়ে এটি বেশ সাধারণ। সি, জাভা, রুবিতে আপনি এর নাম
রেখেছেন

আমি বলতে চাইছিলাম যে এটি সূচকের পক্ষে সাধারণ, অন্য ভাষার অগত্যা একই ধরণের অবজেক্ট রয়েছে
আর্সেনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.