জেনারেটর.নেক্সট () পাইথন 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.