গুরুত্বপূর্ণ বিষয়টি হল তালিকান বোধগম্যতা একটি নতুন তালিকা তৈরি করে। জেনারেটর একটি পুনরাবৃত্তিযোগ্য অবজেক্ট তৈরি করে যা বিটগুলি গ্রাস করার সাথে সাথে অন-ফ্লাইতে উত্স উপাদানটি "ফিল্টার" করবে।
আপনার কল্পনা করুন যে আপনার কাছে একটি "2 টিবি" লগ ফাইল রয়েছে যার নাম "विशालফিল. টেক্সট" রয়েছে এবং আপনি "ENTRY" শব্দটি দিয়ে শুরু হওয়া সমস্ত লাইনের জন্য সামগ্রী এবং দৈর্ঘ্য চান।
সুতরাং আপনি একটি তালিকা বোধগম্যতা লিখে শুরু করার চেষ্টা করুন:
logfile = open("hugefile.txt","r")
entry_lines = [(line,len(line)) for line in logfile if line.startswith("ENTRY")]
এটি পুরো ফাইলটিকে স্লাপ করে, প্রতিটি লাইনকে প্রক্রিয়া করে এবং আপনার অ্যারেতে মিলিত লাইনগুলি সঞ্চয় করে। এই অ্যারেতে 2TB অবধি সামগ্রী থাকতে পারে। এটি প্রচুর র্যাম, এবং সম্ভবত আপনার উদ্দেশ্যে ব্যবহারিক নয়।
সুতরাং পরিবর্তে আমরা আমাদের সামগ্রীতে একটি "ফিল্টার" প্রয়োগ করতে একটি জেনারেটর ব্যবহার করতে পারি। ফলাফলের উপর পুনরাবৃত্তি শুরু না করা পর্যন্ত কোনও ডেটা আসলেই পড়ে না।
logfile = open("hugefile.txt","r")
entry_lines = ((line,len(line)) for line in logfile if line.startswith("ENTRY"))
এমনকি আমাদের ফাইল থেকে একটি লাইনও পড়েনি। আসলে, বলুন আমরা আমাদের ফলাফলটি আরও আরও ফিল্টার করতে চাই:
long_entries = ((line,length) for (line,length) in entry_lines if length > 80)
এখনও কিছু পড়েনি, তবে আমরা এখন দুটি জেনারেটর নির্দিষ্ট করেছি যা আমাদের ইচ্ছামতো আমাদের ডেটাতে কাজ করবে।
আমাদের ফিল্টার করা লাইনগুলি অন্য কোনও ফাইলে লিখতে দেয়:
outfile = open("filtered.txt","a")
for entry,length in long_entries:
outfile.write(entry)
এখন আমরা ইনপুট ফাইলটি পড়ি। আমাদের for
লুপটি অতিরিক্ত লাইনগুলির অনুরোধ অব্যাহত রাখার সাথে সাথে, long_entries
জেনারেটর জেনারেটরের কাছ থেকে লাইনগুলি দাবি করে entry_lines
, কেবল তাদের অক্ষরে ফিরে আসে যাদের দৈর্ঘ্য 80 টি অক্ষরের চেয়ে বেশি। এবং ঘুরে, entry_lines
জেনারেটর logfile
পুনরুক্তিকারী থেকে লাইনগুলি (ইঙ্গিত হিসাবে ফিল্টারযুক্ত) অনুরোধ করে , যা পরিবর্তে ফাইলটি পড়ে।
সুতরাং সম্পূর্ণ জনবহুল তালিকার আকারে আপনার আউটপুট ফাংশনে ডেটা "পুশিং" না করে আপনি আউটপুট ফাংশনটি কেবল যখন প্রয়োজন তখন ডেটা "টান" দেওয়ার একটি উপায় দিচ্ছেন। এটি আমাদের ক্ষেত্রে অনেক বেশি দক্ষ, তবে যথেষ্ট নমনীয় নয়। জেনারেটর একটি উপায়, একটি পাস; আমরা যে লগ ফাইলটি পড়েছি তা থেকে ডেটা তাত্ক্ষণিকভাবে বাতিল হয়ে যায়, তাই আমরা কোনও আগের লাইনে ফিরে যেতে পারি না। অন্যদিকে, তথ্য শেষ হয়ে গেলে আমাদের চারপাশে রাখার বিষয়ে চিন্তা করতে হবে না।
[exp for x in iter]
শুধু চিনি হতে পারেlist((exp for x in iter))
? নাকি মৃত্যুদণ্ড কার্যকর করার পার্থক্য রয়েছে?