পাইথনে পুনরাবৃত্তিকারীরা কেন ব্যতিক্রম উত্থাপন করে?


48

জাভাতে পুনরাবৃত্তির জন্য সিনট্যাক্সটি এখানে রয়েছে (সি # তে কিছুটা অনুরূপ সিনট্যাক্স):

Iterator it = sequence.iterator();

while (it.hasNext()) {
    System.out.println(it.next());
}

যা বোঝায়। পাইথনের সমতুল্য বাক্য গঠন এখানে:

it = iter(sequence)
while True:
    try:
        value = it.next() 
    except StopIteration:
        break
    print(value)

আমি ভেবেছিলাম ব্যতিক্রম কেবলমাত্র, ভাল, ব্যতিক্রমী পরিস্থিতিতে ব্যবহার করা উচিত।

পাইথন পুনরুক্তি বন্ধ করতে ব্যতিক্রমগুলি কেন ব্যবহার করে?


উত্তর:


50

স্পষ্টরূপে একটির জন্য ব্লক চেষ্টা করে না লিখে প্রকাশটি প্রকাশ করার পক্ষে একটি অজগর উপায় রয়েছে StopIteration:

# some_iterable is some collection that can be iterated over
# e.g., a list, sequence, dict, set, itertools.combination(...)

for value in some_iterable:
    print(value)

আপনি কেন প্রবর্তন করা হয়েছে তার পিছনে এবং পুনরাবৃত্তির পিছনে যুক্তি যুক্তিতে আরও জানতে চাইলে আপনি প্রাসঙ্গিক পিইপি 234 255 পড়তে পারেন StopIteration

পাইথনের একটি সাধারণ নীতি হ'ল কিছু করার একটি উপায় (দেখুন import this), এবং সম্ভবত তার সুন্দর, স্পষ্ট, পাঠযোগ্য এবং সহজ, যা পাইথোনিক পদ্ধতিটি সন্তুষ্ট করে। আপনার সমতুল্য কোডটি কেবলমাত্র প্রয়োজনীয় কারণ অজগরটি পুনরাবৃত্তকারীদের hasNextসদস্য ফাংশন দেয় না ; লোককে কেবল পুনরাবৃত্তিকারীদের মাধ্যমে সরাসরি লুপ করতে পছন্দ করে (এবং যদি আপনাকে কেবল এটি পড়ার চেষ্টা করতে এবং একটি ব্যতিক্রম ধরতে অন্য কিছু করার প্রয়োজন হয়)।

StopIterationএকটি পুনরুক্তিকারক শেষে একটি ব্যতিক্রমের এই স্বয়ংক্রিয়ভাবে ধরা অর্থবোধ করে এবং EOFErrorআপনি যদি ফাইলের শেষের অংশটি পড়ে থাকেন তবে উত্থিতদের একটি এনালগ ।


6
"পাইথোনিক" উপায়টি নিশ্চিতভাবে অনেক বেশি "সিক্যুয়েন্সের মানের জন্য:" এর চেয়ে "ইটারের (সিকোয়েন্স) এর জন্য মূল্য:" .. আপডেট পোস্ট?
ইয়াম মার্কোভিচ

15
@ ইয়াম: আমি সম্মত এটি একটি বিদ্যমান ক্রম গ্রহণ এবং এটিতে একটি লুপ প্রয়োগ করতে কেবল এটির পুনরায় রূপান্তর করা অজগর নয়; ক্রম ইতিমধ্যে একটি iterable, তাই একটি রূপান্তর listএকটি থেকে listiteratorঅর্থহীন নয়। আমি শুধু NullUserException এর শুরুর স্থান অনুসরণ করতে, কিভাবে আপনি উচিত কোনো ইটারেটরে, যা একই পথ ধরে লুপ আপনি উচিত কোন iterable উপর লুপ (ব্যাখ্যা করার প্রথম লাইন রাখা list, set, str, tuple, dict, file, generator, ইত্যাদি)। আমি it = itertools.combinations("ABCDE", 2)অর্থপূর্ণ পুনরাবৃত্তির আরও ভাল উদাহরণ পাওয়ার মতো কিছু করতে পারতাম ।
ডাঃ জিম্বব

1
it = iter(sequence)প্রয়োজন হয় না।
ক্যারিডর্ক

2
@ ক্যারিডর্ক - আপনি মন্তব্যগুলি পড়লে আপনি আপনার বক্তব্য সম্বোধন করবেন। এটি প্রয়োজন হয় না এবং প্রশ্নের সূচনা পয়েন্টটি অনুসরণ করার জন্য করা হয়েছিল (যেখানে তারা স্পষ্টভাবে জিজ্ঞাসা করেছিল iterators) এবং আপনার iterস্পষ্টভাবে একটি iterator(চেষ্টা type([])( list) বনাম type(iter([]))( listiterator) তৈরি করতে হবে ।
ডাঃ জিম্বব

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

28

পাইথনটি কেন একটি পুনরাবৃত্তি থামাতে ব্যতিক্রম ব্যবহার করে তা পিইপি 234 তে নথিভুক্ত করা হয়েছে :

পুনরাবৃত্তির শেষের সংকেত দেওয়ার ব্যতিক্রমটি খুব ব্যয়বহুল নয় কিনা তা নিয়ে প্রশ্ন করা হয়েছে। স্টিপইটিরেশন ব্যতিক্রমের জন্য বেশ কয়েকটি বিকল্প প্রস্তাব করা হয়েছে: একটি নির্দিষ্ট মান সমাপ্তির সিগন্যাল করার জন্য প্রান্ত, পুনরুক্তি সম্পন্ন হয়েছে কিনা তা পরীক্ষা করতে একটি ফাংশন সমাপ্তি () এমনকি ইনডেক্সেরর ব্যতিক্রম পুনরায় ব্যবহার করে।

  • একটি বিশেষ মানতে সমস্যা রয়েছে যে যদি কোনও ক্রমটিতে সেই বিশেষ মানটি থাকে তবে সেই অনুক্রমের একটি লুপ কোনও সতর্কতা ছাড়াই অকাল থেকে শেষ হবে। যদি নাল-টার্মিনেটেড সি স্ট্রিংগুলির অভিজ্ঞতা যদি আমাদের এই সমস্যার কারণ হতে পারে তা শিখায় না, তবে পাইথনের অন্তর্মুখী সরঞ্জামটি সমস্ত অন্তর্নির্মিত নামের একটি তালিকা নিয়ে পুনরাবৃত্তি করতে পারে সেই সমস্যাটি কল্পনা করুন, বিশেষ প্রান্তিক মানটি একটি বিল্ট- নামে!

  • একটি শেষ () ফাংশন কল করার জন্য পুনরাবৃত্তির জন্য দুটি কল প্রয়োজন। ব্যতিক্রমের জন্য একটি কল প্লাসের চেয়ে দুটি কল অনেক বেশি ব্যয়বহুল। লুপের জন্য বিশেষত সময়-সমালোচনা ব্যতিক্রমের জন্য খুব সস্তায় পরীক্ষা করতে পারে।

  • ইনডেক্সেরর পুনঃব্যবহার বিভ্রান্তির কারণ হতে পারে কারণ এটি একটি আসল ত্রুটি হতে পারে, যা অকাল আগে লুপ শেষ করে মুখোশ দেওয়া হবে।

দ্রষ্টব্য: একটি ক্রম উপর লুপ করার idiomatic অজগর উপায় এইরকম:

for value in sequence:
    print (value)

20

এটি দর্শনের মধ্যে পার্থক্য। Pythonic নকশা দর্শন EAFP :

অনুমতি চেয়ে ক্ষমা চাইতে সহজ। এই সাধারণ পাইথন কোডিং শৈলীটি বৈধ কী বা বৈশিষ্ট্যগুলির অস্তিত্ব ধরে নিয়েছে এবং যদি অনুমানটি মিথ্যা প্রমাণিত হয় তবে ব্যতিক্রমগুলি ধরবে। এই পরিষ্কার এবং দ্রুত শৈলীটি অনেকের উপস্থিতি tryএবং exceptবিবৃতি দ্বারা চিহ্নিত করা হয় । কৌশলটি LBYL শৈলীর সাথে বিপরীতে দেখা যায় যেমন সি এর মতো আরও অনেক ভাষায় সাধারণ ...


7

জাভা বাস্তবায়নের একটি hasNext()পদ্ধতি রয়েছে যাতে আপনি একটি সঞ্চালনের আগে খালি পুনরাবৃত্তির জন্য পরীক্ষা করতে পারেন next()। যখন আপনি next()কোনও জাভা পুনরুদ্ধারের সাথে কোনও উপাদান ছাড়াই কল করবেন, তখন একটি NoSuchElementExceptionনিক্ষিপ্ত হবে

কার্যকরভাবে, আপনি একটি ট্রাই করতে পারেন। জাভায় ট্রাই..একটি পাইথন বাদে দেখুন। এবং হ্যাঁ, পূর্ববর্তী উত্তর অনুসারে পাইথোনিক বিশ্বে দর্শন অত্যন্ত গুরুত্বপূর্ণ।

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