পাইথন জেনারেটর এবং ফাংশনগুলি "ডিএফ" কীওয়ার্ডটি কেন ভাগ করে?


10

নিম্নোক্ত বিবেচনা কর:

def some_function():
    return 1

def some_generator():
    yield 1

উপরের কোডে, some_functionএকটি ফাংশন, অন্যদিকে some_generatorজেনারেটর রয়েছে। এগুলি দেখতে অনেকটা সাদৃশ্যপূর্ণ।

কোড পড়ার সময় আমার যে সমস্যাটি হচ্ছে yieldতা হ'ল আসলে কোনও ফাংশন বা জেনারেটর কিনা তা নির্ধারণ করার আগে আমাকে "ফাংশন" তে প্রতিটি লাইনের মাধ্যমে স্ক্যান করতে হবে!

এটি কেবল আমার কাছে মনে হচ্ছে জেনারেটরের জন্য আলাদা কীওয়ার্ডটি ব্যবহার করা আরও অর্থবোধ করবে, যেমন:

gen some_generator():
    yield 1

defউভয় জেনারেটর এবং ফাংশনগুলির জন্য কীওয়ার্ডটি ব্যবহার করার যোগ্যতাগুলি কী ? কেন একটি নতুন কীওয়ার্ড পৃথক ফাংশন এবং জেনারেটরের সাথে চালু করা হয়নি?


আমি আসল উত্তরটি জানি না তবে আমি প্রায়শই ফাংশনগুলি লিখতে শুরু করি যা তালিকাগুলি ফিরিয়ে দেয়, তারপরে এটি জেনারেটরে রূপান্তরিত হয় যখন এটি সঠিক মনে হয়। সিনট্যাক্স ম্যাচটি এটিকে আরও প্রাকৃতিক করে তোলে।
রোবট

2
@ স্টিভেন বার্নাপ ডেরেকের genপরিবর্তে এর মতো কিছু ব্যবহার করার পরামর্শ defসেই রূপান্তরটিকে আরও বেশি জোরদার করে তুলবে না।
jamesdlin

2
সাধারণভাবে, ভাষা ডিজাইনাররা সাধারণত অপ্রয়োজনীয় কীওয়ার্ডগুলি এড়ানোর চেষ্টা করেন। তারা যুক্ত প্রতিটি কীওয়ার্ড হ'ল একটি শনাক্তকারী যা প্রোগ্রামগুলি অন্য উদ্দেশ্যে ব্যবহার করার অনুমতি পায় না।
জেমসডলিন

@ জামেসডলিন: তবে প্রশ্নটি উঠছে যে একটি নতুন কীওয়ার্ড প্রয়োজন হবে
জর্জিও

1
@ জেমসডলিন: অবশ্যই আপনি তাদের দেহ দেখে ফাংশন এবং জেনারেটরগুলির মধ্যে পার্থক্য করতে পারেন, তবে প্রশ্নটি যুক্তিযুক্ত যে বিভিন্ন কীওয়ার্ড ব্যবহার করে কোডটি আরও পাঠযোগ্য।
জর্জিও

উত্তর:


14

"উভয় জেনারেটর এবং ফাংশনগুলির জন্য ডিএফ কীওয়ার্ডটি ব্যবহার করার গুণাবলী কী?"

যদিও তারা যান্ত্রিকভাবে পৃথক, বাস্তবে আমি তাদের ব্যবহার করার সময় তারা প্রায়শই কার্যকরভাবে আমার কাছে ধারণাগতভাবে একই রকম হয় (আমি range()বনাম কল করার পক্ষে বেশি ভাবি না xrange())।

দ্রুত এই ফাংশনটি কী কী তা বোঝার শর্তে, আমি সম্মত হই যে এর ব্যবহারের সাথে কিছু নষ্ট defহয়ে গেছে, তবে জিনিসগুলি শুরু হওয়ার সাথে ফাংশনের মধ্যে খুব বেশি বিচলিত হওয়া উচিত নয়।

এমনকি কোনও অন্তর্নিহিতও return Noneশর্তসাপেক্ষে দীর্ঘকাল পরে কোনও ক্রিয়াকলাপের উদ্দেশ্যপূর্ণ আচরণকে বিভ্রান্ত করতে পারে (যেমনটি ছিল return Noneচূড়ান্ত আচরণ হিসাবে বা যুক্তিতে কোনও তদারকি হিসাবে চিহ্নিত)। তবে এগুলি সম্পর্কে আমার বিশ্বাস।

আমি মনে করি না যে আমার যুক্তিটি বিশেষভাবে দৃ inc়প্রত্যয়ী, সুতরাং আমি কেবল পিইপি 255 থেকে পিছিয়ে দেব :

সমস্যা: নন-জেনারেটর ফাংশন থেকে জেনারেটর-ফাংশনকে পৃথক করতে "ডিএফ" এর স্থানে আরেকটি নতুন কীওয়ার্ড (বলুন, "জেনার" বা "জেনারেটর") উপস্থাপন করুন বা অন্যথায় বাক্য গঠন পরিবর্তন করুন।

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

প্রো: বাস্তবে (আপনি তাদের সম্পর্কে কীভাবে ভাবেন), জেনারেটর-ফাংশনগুলি আসলে ফ্যাক্টরি ফাংশন যা জেনারেটর-পুনরুক্তি উত্পাদন করে যেন যাদু দ্বারা। এই ক্ষেত্রে তারা নন-জেনারেটর ফাংশন থেকে একেবারে পৃথক, কোনও ফাংশনের চেয়ে নির্মাতার মতো অভিনয় করে, তাই "ডিএফ" পুনরায় ব্যবহার করা সবচেয়ে বিভ্রান্তিকর। শরীরে সমাহিত একটি "ফলন" বিবৃতি যথেষ্ট সতর্কতা নয় যে শব্দার্থক শব্দগুলি এত আলাদা।

বিডিএফএল: "ডিএফ" এটি থেকে যায়। উভয় পক্ষের কোনও যুক্তি পুরোপুরি বিশ্বাসযোগ্য নয়, তাই আমি আমার ভাষা ডিজাইনারের অন্তর্দৃষ্টি সম্পর্কে পরামর্শ নিয়েছি। এটি আমাকে বলে যে পিইপিতে প্রস্তাবিত সিনট্যাক্সটি ঠিক সঠিক - খুব গরম নয়, খুব বেশি ঠান্ডাও নয়। তবে, গ্রীক পৌরাণিক কাহিনী অনুসারে ওরাকল-এর ডেলফির মতো এটি কেন আমাকে তা বলে না, সুতরাং পিইপি সিনট্যাক্সের বিরুদ্ধে যুক্তিগুলির খণ্ডন আমার নেই। আমি যে সেরাটি নিয়ে আসতে পারি (প্রত্যাখ্যানগুলির সাথে একমত হওয়া ছাড়া ... ইতিমধ্যে তৈরি) তা হ'ল "এফইউডি"। প্রথম থেকেই যদি এটি ভাষার অংশ হত, তবে অ্যান্ড্রু কুচলিংয়ের "পাইথন ওয়ার্টস" পৃষ্ঠাটি তৈরি করায় আমার খুব সন্দেহ doubt


1
এটি লক্ষণীয় যে পিইপি 492-তে যুক্ত হওয়া নতুন await(এবং async withএবং async for) সিনট্যাক্স কনস্ট্রাক্টসগুলির সাথে খুব মিল রয়েছে , তারা যে ফাংশনটি ব্যবহার করছেন তা ন্যায়বিচারের পরিবর্তে ঘোষণা করার জন্য প্রয়োজন । yield fromasync defdef
ফিউরামুরেল

2
  1. নতুন কীওয়ার্ড যুক্ত করা বিদ্যমান প্রোগ্রামগুলিকে ভঙ্গ করে। ভাষা ডিজাইনাররা সাধারণত নতুন কীওয়ার্ড যুক্ত করা এড়াতে চেষ্টা করেন, বিশেষত ভাষা বৈশিষ্ট্যগুলির জন্য ভাষা ইতিমধ্যে কিছুটা জনপ্রিয়তা অর্জন করার পরে। তারা যুক্ত প্রতিটি কীওয়ার্ড একটি শনাক্তকারী যে প্রোগ্রামগুলি অন্যান্য উদ্দেশ্যে ব্যবহার করার অনুমতি নেই, সুতরাং একটি কীওয়ার্ড যুক্ত করা সম্ভাব্যভাবে বিদ্যমান প্রোগ্রামগুলিকে ভেঙে দিতে পারে। ভাষা ডিজাইনারদের ব্যয়ের বিপরীতে একটি নতুন কীওয়ার্ডের সুবিধার বিষয়টি বিবেচনা করতে হবে।

  2. আমি সন্দেহ করি যে জেনারেটরগুলির জন্য পৃথক কীওয়ার্ড সংজ্ঞায়িত করার ফলে অনেক উপকার হবে। প্রতীক কোনও ফাংশনের নামের সাথে বা জেনারেটরের নামের সাথে সংগতিপূর্ণ কিনা তা বোঝার জন্য কলারদের কাছে গুরুত্বপূর্ণ কিছু, এবং ফোনকারীরা কী কীওয়ার্ডটি প্রয়োগ করার জন্য ব্যবহৃত হয়েছিল তা (এবং কখনও কখনও না) দেখতে হবে না। নামকরণের আরও ভাল নামকরণ এবং ডকুমেন্টেশনের দায়িত্ব এটি।


1

জেনারেটর হ'ল ফাংশন যা অলসতার সাথে মূল্যায়ন করে। তারা ভিত্তিতে একই জিনিস হ'ল এটি বোঝা যায় যে তারা একই কীওয়ার্ডটি ব্যবহার করবে। একটি বিকল্প একটি নির্দিষ্ট উদাহরণের জন্য কোনটি সনাক্ত করার জন্য একটি মন্তব্য ব্যবহার করা হতে পারে:

def some_function(): #This is a function.
    return 1

def some_generator(): #This is a generator.
    yield 1

0

আমি অনুমান করব কারণ এটি বেশি পাইথোনিক তবে আমি কী জানি? ;)

আমি সত্যিই ভাবি না যে এটি এতটা গুরুত্বপূর্ণ। আমার জন্য এটি মনে রাখা আরও সহজ কারণ তাদের দু'টি মুখস্থ করার দরকার নেই।

সম্পাদনা: পিইপি বলতে পারে, আপনি সেখানে তদন্ত করতে পারেন।


ধন্যবাদ! আসলে, পিইপি বলে! জেনারেটরগুলির জন্য একটি নতুন কীওয়ার্ড সম্পর্কিত উপকার / বিবেচনা এবং চূড়ান্ত সিদ্ধান্তের জন্য পিইপি 255 দেখুন ।
ডেরেক কোভক

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