for row_number, row in enumerate(cursor):
পাইথনে কী করে ?
enumerate
এই প্রসঙ্গে অর্থ কী ?
for row_number, row in enumerate(cursor):
পাইথনে কী করে ?
enumerate
এই প্রসঙ্গে অর্থ কী ?
উত্তর:
enumerate()
ফাংশন একটি iterable করার জন্য একটি কাউন্টার যোগ করে।
সুতরাং প্রতিটি উপাদান জন্য cursor
, একটি tuple সঙ্গে উত্পাদিত হয় (counter, element)
; for
লুপ বেঁধে যে row_number
এবং row
যথাক্রমে।
ডেমো:
>>> elements = ('foo', 'bar', 'baz')
>>> for elem in elements:
... print elem
...
foo
bar
baz
>>> for count, elem in enumerate(elements):
... print count, elem
...
0 foo
1 bar
2 baz
ডিফল্টরূপে, enumerate()
গণনা শুরু হয় 0
তবে আপনি যদি এটিটিকে দ্বিতীয় পূর্ণসংখ্যার যুক্তি দেন তবে পরিবর্তে এটি নম্বরটি থেকে শুরু হবে:
>>> for count, elem in enumerate(elements, 42):
... print count, elem
...
42 foo
43 bar
44 baz
আপনি যদি enumerate()
পাইথনে পুনরায় প্রয়োগ করতে চান তবে তা অর্জনের দুটি উপায় এখানে রয়েছে; একটি itertools.count()
গণনা করার জন্য ব্যবহার করছেন , অন্যটি নিজে একটি জেনারেটরের কার্যক্রমে গণনা করছেন :
from itertools import count
def enumerate(it, start=0):
# return an iterator that adds a counter to each element of it
return zip(count(start), it)
এবং
def enumerate(it, start=0):
count = start
for elem in it:
yield (count, elem)
count += 1
সি প্রকৃত বাস্তবায়ন আধুনিক কাছাকাছি, optimisations সঙ্গে সাধারণ জন্য একটি একক tuple বস্তুর পুনরায় ব্যবহার করার জন্য নয় for i, ...
ক্ষেত্রে unpacking এবং কাউন্টার পর্যন্ত কাউন্টার একটি পাইথন পূর্ণসংখ্যা বস্তুর ব্যবহার এড়াতে বেশী বড় হয়ে একটি আদর্শ সি পূর্ণসংখ্যা মান ব্যবহার (যা সীমাবদ্ধ)।
এটি একটি অন্তর্নির্মিত ফাংশন যা এমন কোনও বস্তুকে ফেরত দেয় যা পুনরাবৃত্তি হতে পারে। ডকুমেন্টেশন দেখুন ।
সংক্ষেপে, এটি একটি পুনরাবৃত্তীয় উপাদানগুলির (যেমন একটি তালিকার মতো) উপরের লুপগুলি, পাশাপাশি একটি সূচী সংখ্যা হিসাবে, একটি টিউপলে মিলিত হয়:
for item in enumerate(["a", "b", "c"]):
print item
কপি করে প্রিন্ট
(0, "a")
(1, "b")
(2, "c")
আপনি যদি কোনও সিক্যুয়েন্স (বা অন্য পুনরাবৃত্তিযোগ্য জিনিস) ধরে লুপ করতে চান এবং একটি সূচী কাউন্টার উপলব্ধ রাখতে চান তবে এটি সহায়ক। আপনি যদি কাউন্টারটি অন্য কোনও মান থেকে শুরু করতে চান (সাধারণত 1), আপনি এটি দ্বিতীয় যুক্তি হিসাবে দিতে পারেন enumerate
।
item
তবে আপনি
yield
/ yield from
, বা জেনারেটর এক্সপ্রেশন যা স্পষ্টভাবে yield
); enumerate
জেনারেটর নয়। সব হাঁস-টাইপিং সংক্রান্ত উদ্দেশ্যে জন্যে রয়েছে কোন পার্থক্য নেই, কিন্তু স্পষ্ট টাইপ পরীক্ষণ এবং পাইথন ভাষা ডক্স শুধুমাত্র একটি উদ্দেশ্য, যা কাভার করে না শব্দটি "জেনারেটর" ব্যবহার enumerate
।
আমি ব্রেট স্লাতকিনের একটি বই ( ইফেক্টিভ পাইথন ) পড়ছি এবং তিনি একটি তালিকার উপরে পুনরাবৃত্তি করতে এবং তালিকার বর্তমান আইটেমের সূচকটিও জানতে পারে তবে তিনি পরামর্শ দিয়েছেন যে এটি ব্যবহার না করা এবং enumerate
পরিবর্তে ব্যবহার করা ভাল। আমি জানি আপনি গণিতের অর্থ কী জিজ্ঞাসা করেছেন, তবে আমি যখন নিম্নলিখিতগুলি বুঝতে পেরেছিলাম তখনও আমি বুঝতে পেরেছিলাম কীভাবে enumerate
বর্তমান আইটেমের সূচীটি সহজ (এবং আরও পাঠযোগ্য) জানতে পেরে কীভাবে তালিকার উপরে পুনরাবৃত্তি করা যায় ।
list_of_letters = ['a', 'b', 'c']
for i in range(len(list_of_letters)):
letter = list_of_letters[i]
print (i, letter)
আউটপুটটি হ'ল:
0 a
1 b
2 c
enumerate
ফাংশনটি পড়ার আগে আমি কিছু করতাম এমনকি সিলিয়ারও করতাম ।
i = 0
for n in list_of_letters:
print (i, n)
i += 1
এটি একই আউটপুট উত্পাদন করে।
তবে enumerate
আমাকে কেবল লিখতে হবে:
list_of_letters = ['a', 'b', 'c']
for i, letter in enumerate(list_of_letters):
print (i, letter)
অন্য ব্যবহারকারীরা enumerate
যেমন উল্লেখ করেছেন, একটি জেনারেটর যা একটি পুনরাবৃত্তিযোগ্য প্রতিটি আইটেমের পাশে একটি ইনক্রিমেন্টাল সূচক যুক্ত করে।
তাই আপনি যদি একটি তালিকা বলার আছে l = ["test_1", "test_2", "test_3"]
, list(enumerate(l))
আপনি ভালো কিছু দিতে হবে: [(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]
।
এখন, কখন এটি দরকারী? সম্ভাব্য ব্যবহারের কেসটি হ'ল আপনি যখন আইটেমগুলি দিয়ে পুনরাবৃত্তি করতে চান এবং আপনি কোনও নির্দিষ্ট আইটেমটি এড়িয়ে যেতে চান যা আপনি কেবল তালিকার সূচকটি জানেন তবে এর মানটি নয় (কারণ এর মানটি তখন জানা যায় না)।
for index, value in enumerate(joint_values):
if index == 3:
continue
# Do something with the other `value`
সুতরাং আপনার কোডটি আরও ভালভাবে পড়তে পারে কারণ আপনি লুপের সাথে নিয়মিতও range
করতে পারেন তবে সেগুলি সূচী করার জন্য আপনার প্রয়োজনীয় আইটেমগুলি অ্যাক্সেস করতে (যেমন, joint_values[i]
)।
যদিও অন্য একজন ব্যবহারকারী enumerate
ব্যবহারের বাস্তবায়নের কথা উল্লেখ করেছেন zip
, আমি মনে করি ব্যবহার না করেই আরও বিশুদ্ধ (তবে কিছুটা জটিল) উপায়টি itertools
নিম্নলিখিত:
def enumerate(l, start=0):
return zip(range(start, len(l) + start), l)
উদাহরণ:
l = ["test_1", "test_2", "test_3"]
enumerate(l)
enumerate(l, 10)
আউটপুট:
[(0, 'টেস্ট_1'), (1, 'টেস্ট_2'), (2, 'টেস্ট 14')]
[(10, 'টেস্ট_1'), (11, 'টেস্ট_2'), (12, 'টেস্ট_3')]
মন্তব্যে উল্লিখিত হিসাবে, পরিসীমা সহ এই পদ্ধতির মূল enumerate
ফাংশন যেমন স্বেচ্ছাসেবী পুনরাবৃত্তিগুলির সাথে কাজ করবে না ।
itertools
হ'ল আপনার range
পন্থাটি কেবল পাত্রেই কাজ করে। enumerate
নির্বিচারে পুনরাবৃত্তি সঙ্গে কাজ করে; আপনি যদি কোনও ফাইল পুনরাবৃত্তি করতে চান, for lineno, line in enumerate(myfile):
কাজ করে তবে আপনি এটি করতে পারেননি range(len(myfile))
কারণ আপনি ইওএফ পৌঁছানো পর্যন্ত দৈর্ঘ্য জানা যায়নি।
গণনা ফাংশন নিম্নলিখিত হিসাবে কাজ করে:
doc = """I like movie. But I don't like the cast. The story is very nice"""
doc1 = doc.split('.')
for i in enumerate(doc1):
print(i)
আউটপুট হয়
(0, 'I like movie')
(1, " But I don't like the cast")
(2, ' The story is very nice')