জেনারেটর.নেক্সট () পাইথন 3 এ দৃশ্যমান?


247

আমার একটি জেনারেটর রয়েছে যা একটি সিরিজ উত্পন্ন করে, উদাহরণস্বরূপ:

def triangle_nums():
    '''Generates a series of triangle numbers'''
    tn = 0
    counter = 1
    while True:
        tn += counter
        yield tn
        counter += + 1

পাইথন 2 এ আমি নিম্নলিখিত কলগুলি করতে সক্ষম হয়েছি:

g = triangle_nums()  # get the generator
g.next()             # get the next value

তবে পাইথন 3-তে আমি যদি একই দুটি লাইনের কোড প্রয়োগ করি তবে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

AttributeError: 'generator' object has no attribute 'next'

তবে, লুপ আইট্রেটর সিনট্যাক্স পাইথন 3-এ কাজ করে

for n in triangle_nums():
    if not exit_cond:
       do_something()...

পাইথন 3 এর আচরণের এই পার্থক্যের ব্যাখ্যা করে এমন কিছু আমি এখনও সন্ধান করতে পারিনি।

উত্তর:


406

g.next()নামকরণ করা হয়েছে g.__next__()। এর কারণ ধারাবাহিকতা: বিশেষ পদ্ধতিগুলির মতো __init__()এবং __del__()সকলের ডাবল আন্ডারস্কোর থাকে (বা বর্তমান দেশীয় ভাষায় "ডান্ডার"), এবং .next()এই নিয়মের কয়েকটি ব্যতিক্রম ছিল one এটি পাইথন 3.0 এ স্থির করা হয়েছিল। [*]

কল করার পরিবর্তে g.__next__(), ব্যবহার করুন next(g)।

[*] অন্যান্য বিশেষ বৈশিষ্ট্য রয়েছে যা এই স্থির করেছে; func_name, এখন __name__, ইত্যাদি


কোন ধারণা কেন পাইথন 2 প্রথমে এই পদ্ধতির জন্য ডারার কনভেনশনটি বন্ধ করে দিয়েছিল?
— রিক

সম্ভবত এটি একটি তদারকি।
— লেনার্ট রেজেব্রো 11 '11

আপনি যখন ক্লাসে __আরআর __ ওভাররাইট করবেন তখন কী হবে? এটি কি আরআরটি (আপত্তি) বা __st __ (আপত্তি) পরিবর্তন করে?
— NoName

@ ননাম এর মতো কোনও জিনিস নেই __str__(obj), তাই আমি আসলে প্রশ্নটি বুঝতে পারি না।
— লেনার্ট রেগেব্রো

1
@ নামনাম হ্যাঁ, আপনি করেন।
— লেনার্ট রেজেব্রো

144

চেষ্টা করুন:

next(g)

এই ঝরঝরে টেবিলটি পরীক্ষা করুন যা এটির জন্য আসে যখন 2 এবং 3 এর মধ্যে সিনট্যাক্সের পার্থক্য দেখায়।


1
@MaikuMori আমি লিঙ্ক (পিয়ার সংস্করণ জন্য অপেক্ষা) সংশোধন করা হয়েছে (সাইট diveintopython3.org নিচে হবে বলে মনে হয় মিরর সাইট। Diveintopython3.ep.io এখনও জীবিত)
— gecco

1
আবার লিঙ্কটি স্থির করে। python3porting.com/differences.html আরও সম্পূর্ণ, বিটিডব্লিউ ।
— লেনার্ট রেগেব্রো

কোনও পদ্ধতি থেকে কোনও ফাংশনে স্যুইচ করার কি কোনও ন্যায়সঙ্গততা আছে, এর বাইরে g.next()সত্যই হওয়া উচিত g.__next__()এবং আমাদের এমন কিছু থাকা দরকার যা কার্যকারিতা সহ কোনও জঘন্য পদ্ধতি নয় g.next()?
— টিসি প্রক্টর

11

যদি আপনার কোডটি পাইথন 2 এবং পাইথন 3 এর অধীনে চলতে থাকে তবে 2to3 ছয়টি লাইব্রেরি এটির মতো ব্যবহার করুন :

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'

18
যদি আপনি পাইথন সংস্করণগুলি 2.6 এর আগে সমর্থন না করে তবে এর জন্য খুব বেশি প্রয়োজন নেই। পাইথন 2.6 এবং 2.7 এর nextঅন্তর্নির্মিত ফাংশন রয়েছে।
— মার্ক ডিকিনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.