লুপগুলির জন্য পাইথনে স্কোপিং


177

আমি পাইথনের স্কোপিং বিধি সম্পর্কে জিজ্ঞাসা করছি না; লুপগুলির জন্য পাইথনে স্কোপিং কীভাবে কাজ করে তা আমি সাধারণত বুঝতে পারি । আমার প্রশ্নটি কেন ডিজাইনের সিদ্ধান্তগুলি এইভাবে নেওয়া হয়েছিল। উদাহরণস্বরূপ (কোনও পাং উদ্দেশ্য নয়):

for foo in xrange(10):
    bar = 2
print(foo, bar)

উপরেরটি (9,2) মুদ্রণ করবে।

এটি আমাকে অদ্ভুত হিসাবে আঘাত করে: 'foo' সত্যিই কেবল লুপটি নিয়ন্ত্রণ করে এবং লুপের ভিতরে 'বার' সংজ্ঞায়িত হয়। আমি বুঝতে পারি কেন 'বার' এর জন্য লুপের বাইরে প্রবেশযোগ্য হওয়া প্রয়োজন (অন্যথায়, লুপগুলির জন্য খুব সীমাবদ্ধ কার্যকারিতা থাকবে)। আমি যা বুঝতে পারি না তা কেন লুপটি প্রস্থান করার পরে নিয়ন্ত্রণ ভেরিয়েবলের স্কোপে থাকা প্রয়োজন। আমার অভিজ্ঞতা হিসাবে, এটি কেবল বিশ্বব্যাপী নেমস্পেসকে বিশৃঙ্খলা করে এবং অন্য ভাষাগুলির দোভাষী দ্বারা ধরা পড়তে পারে এমন ত্রুটিগুলি খুঁজে বের করা শক্ত করে তোলে।


6
যদি আপনি চান না যে forলুপটি আপনার বিশ্বব্যাপী নেমস্পেসকে বিশৃঙ্খলা করবে it বন্ধ বন্ধ!
জ্যাথানিজম

24
আপনি যদি বিশ্বব্যাপী নেমস্পেসে কোনও লুপ চালাচ্ছেন না (অস্বাভাবিক), এটি একটি স্থানীয় নেমস্পেসকে বিশৃঙ্খলা করছে ।
গ্লেন মেইনার্ড

3
যদি এটি বিদ্যমান না থাকে তবে আপনি কীভাবে পরে লুপটির অভ্যন্তরে প্রস্থান করছিলেন? লুপের আগে কন্ট্রোল ভেরিয়েবলটি কেবল সংজ্ঞায়িত করবেন ?
এন্ডোলিথ

9
@ এন্ডোলিথ হ্যাঁ ... কেন দরকার নেই?
স্টিভেন লু

3
লোকেরা কেবল তারা যা করতে অভ্যস্ত তা পছন্দ করবে। আমি বলতে চাই যে এই ধরণের জিনিসটি পাইথন কোডারকে ব্যাথা দেয় যারা এই ধরণের জিনিসটিতে অভ্যস্ত হয়ে যায় এবং কোনও ভিন্ন ভাষায় স্যুইচ করার সময় একটি বেদনাদায়ক প্রক্রিয়াটি সহ্য করতে হয়। আমাদের বাকিদের জন্য, এটি মনে করি এটি একটি ঝরঝরে শর্টকাট।
স্টিভেন লু

উত্তর:


107

সর্বাধিক উত্তরটি হ'ল এটি কেবল ব্যাকরণকে সহজ রাখে, গ্রহণের ক্ষেত্রে কোনও হোঁচট খায় না এবং লুপ কনস্ট্রাক্টের মধ্যে কোনও নাম নির্ধারিত করার সময় কোনও নামটি কী পরিমাণ যুক্ত করে তা ছড়িয়ে দিতে না পেরে অনেকেই খুশি হন। ভেরিয়েবলগুলি একটি সুযোগের মধ্যে ঘোষিত হয় না, এটি অ্যাসাইনমেন্ট স্টেটমেন্টের অবস্থান দ্বারা বোঝানো হয়। globalশব্দ মাত্র এই কারণে (অর্থাৎ নিয়োগ বোঝান একটি বিশ্বব্যাপী সুযোগ এ সম্পন্ন করা হয়) জন্য বিদ্যমান।

হালনাগাদ

এখানে এই বিষয়ে একটি ভাল আলোচনা করা হয়েছে: http://mail.python.org/pipermail/python-ideas/2008- অক্টোবর / 002109.html

লুপের জন্য স্থানীয়-লুপ ভেরিয়েবলগুলি তৈরি করার পূর্ববর্তী প্রস্তাবনাগুলি বিদ্যমান কোডের সমস্যায় হোঁচট খেয়েছে যা লুপটি বেরিয়ে যাওয়ার পরে তার মানটি রেখে লুপ ভেরিয়েবলের উপর নির্ভর করে এবং মনে হয় যে এটি একটি পছন্দসই বৈশিষ্ট্য হিসাবে বিবেচিত হয়েছে।

সংক্ষেপে, আপনি সম্ভবত এটি পাইথন সম্প্রদায়ের জন্য দোষ দিতে পারেন: পি


2
যদি আনয়ন ভেরিয়েবলের ক্ষেত্রটি লুপের দেহের মধ্যে সীমাবদ্ধ থাকে তবে ব্যাকরণ কীভাবে আরও জটিল হবে? এই ধরনের পরিবর্তন পাইথনের শব্দার্থ বিশ্লেষণের মধ্যে সীমাবদ্ধ থাকবে, এর ব্যাকরণের ক্ষেত্রে নয়।
চার্লস

6
লুপগুলি পাইথনে ব্লক নয়। এই ধরণের আচরণগত পরিবর্তনটি ব্যাকরণকে মৌলিকভাবে পরিবর্তন করতে বা একটি বিশেষ কেস সরবরাহ করার জন্য আহ্বান জানায়। ইন্ডাকশন ভেরিয়েবলের সম্পূর্ণ ধারণাটি বর্তমান ব্যাকরণেও প্রকাশিত হয় না। ব্যাকরণটি দোভাষী কীভাবে ব্যাখ্যা করবে তার জন্য চুক্তি সরবরাহ করে। আমার বক্তব্যটি ব্যাকরণকে আরও জটিল না করে এই আচরণে কীভাবে পরিবর্তন আনা যায় তা আমি আগে থেকেই বুঝতে পারি না। ডিজাইন সিদ্ধান্তের পার্শ্ব প্রতিক্রিয়াটি একটি বৈশিষ্ট্য হিসাবে পরিণত হয়েছে, এটি সবই মুট।
জেরেমি ব্রাউন 21

1
এই পোস্টটি এখানে mail.python.org/pipermail/python-dev/2005- সেপ্টেম্বর/056677.html জনাব ব্রাউন এর গতি এবং জটিলতা সম্পর্কে আরও বিশদ দেয় gives
রাজেশ

62

পাইথনের ব্লক নেই, যেমন অন্যান্য কিছু ভাষা রয়েছে (যেমন সি / সি ++ বা জাভা)। অতএব, পাইথনে স্কোপিং ইউনিট একটি ফাংশন।


3
আমি বিভ্রান্ত হয়ে পড়েছি - ফাংশনগুলি যেভাবে স্কুপ করা হয় সেভাবে লুপগুলির জন্য স্কোপিং করা থেকে পাইথনকে কী বাধা দেয়?
চিমেরাকোডার

36
সত্যিই সত্য নয়, এটি ঠিক যে ব্যাকরণটি ব্লক-পাগল হয় না। ( docs.python.org/references/… ) "ব্লকটি পাইথন প্রোগ্রামের পাঠ্যের একটি অংশ যা ইউনিট হিসাবে কার্যকর করা হয় The নিম্নলিখিত ব্লকগুলি হল: একটি মডিউল, একটি ফাংশন বডি এবং একটি শ্রেণি সংজ্ঞা ..."
জেরেমি বাদামী

1
@ থ্যাব্যাকহ্যান্ড, কিছুই নেই এটি কেবল অপ্রয়োজনীয় বলে মনে করা হয়েছিল।
habnabit

@ জেরেমি ব্রাউন - সত্যই। ভাল নোট।
এটজ

6
@ থ্যাব্যাকহ্যান্ড - ব্লকযুক্ত ভাষায়, স্কুপিং forলুপগুলি একটি সাধারণ নীতিটির প্রাকৃতিক বর্ধন। পাইথনে এটি একটি বিশেষ কেস হতে হবে এবং বিশেষ কেসগুলি এড়ানো বাধ্যতামূলক সুবিধা না হলে এড়ানো উচিত।
এটজ

39

এটির জন্য সত্যিকারের দরকারী কেসটি হ'ল ব্যবহার করার সময় enumerateএবং আপনি শেষের মোট গণনা চান:

for count, x in enumerate(someiterator, start=1):
    dosomething(count, x)
print "I did something {0} times".format(count)

এটি কি প্রয়োজনীয়? না, তবে এটি নিশ্চিত সুবিধাজনক।

আরেকটি বিষয় সম্পর্কে সচেতন হতে হবে: পাইথন 2 এ, তালিকা বোঝার ক্ষেত্রে ভেরিয়েবলগুলিও ফাঁস হয়েছে:

>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> x
9

তবে, পাইথন 3-তে একই প্রয়োগ হয় না।


4
আপনি সম্ভবত এটি elseক্লজ, অর্থাৎ করতে পারতেন । else: print "I did something {0} times".format(count)- স্থানীয় সুযোগ (পাইথনের অস্তিত্ব নেই) অদৃশ্য হওয়ার আগে
নাস বানভ

3
পাইথন 3 তে কেবল দ্বিতীয় উদাহরণটি কাজ করে না, তাই না? প্রথম এখনও আছে? পাইথন 3 থেকে কেন এটি সরানো হয়েছে?
এন্ডোলিথ

7
গণনার জন্য, গণিতে আইটেম (একটি, শুরু = 1): # ডিফল্ট সূচকটি শূন্য থেকে
তাও ঝাং

3
প্রথম উদাহরণটি, ভাল ব্যবহারের ক্ষেত্রে হওয়ার চেয়ে বরং প্রমাণের মতো মনে হয় যে এই স্কোপিং বিধিটি বিপজ্জনক এবং এর উপর নির্ভর করা উচিত নয়। someiteratorখালি থাকলে কী হবে ?
সর্বাধিক

1
@ নাস যদিও elseএই ক্ষেত্রে কোনও ধারা ব্যবহার করা যেতে পারে তবে লুপ বডিটি breakঅকাল সময়ের আগে এটি কার্যকরভাবে কাজ করবে না ।
জেমসডলিন

2

যদি আপনার লুপটিতে ব্রেক স্টেটমেন্ট থাকে (এবং পরে পুনরাবৃত্তির মানটি ব্যবহার করতে চান, সম্ভবত ব্যাক আপ নিতে, কিছু উপস্থাপন করতে বা স্থিতি দেওয়ার জন্য), এটি আপনাকে কোডের একটি লাইন এবং একটি অ্যাসাইনমেন্ট সংরক্ষণ করে, তাই একটি সুবিধা রয়েছে a


1

পাইথনের প্রাথমিক প্রভাবগুলির মধ্যে একটি হ'ল এবিসি , নেদারল্যান্ডসে নতুনদের প্রোগ্রামিং ধারণার পাঠদানের জন্য তৈরি একটি ভাষা। পাইথনের স্রষ্টা গুইডো ভ্যান রসুম ১৯৮০-এর দশকে বেশ কয়েক বছর ধরে এবিসি-তে কাজ করেছিলেন। আমি এবিসি সম্পর্কে প্রায় কিছুই জানি না, তবে এটি যেমনটি প্রাথমিকভাবে তৈরি করা তাদের উদ্দেশ্যে, আমি মনে করি এটির প্রাথমিক স্নাতকের মতো অনেকগুলি স্কোপ থাকতে হবে।


-1

প্রারম্ভিকদের জন্য, যদি ভেরিয়েবলগুলি লুপের স্থানীয় হয়, তবে সেই লুপগুলি বেশিরভাগ আসল ওয়ার্ল্ড প্রোগ্রামিংয়ের জন্য অকেজো।

বর্তমান পরিস্থিতিতে:

# Sum the values 0..9
total = 0
for foo in xrange(10):
    total = total + foo
print total

ফলন 45। পাইথনে অ্যাসাইনমেন্ট কীভাবে কাজ করে তা বিবেচনা করুন। লুপ ভেরিয়েবলগুলি কঠোরভাবে স্থানীয় থাকলে:

# Sum the values 0..9?
total = 0
for foo in xrange(10):
    # Create a new integer object with value "total + foo" and bind it to a new
    # loop-local variable named "total".
    total = total + foo
print total

ফলন 0, কারণ totalঅ্যাসাইনমেন্টের পরে লুপের ভিতরে লুপের totalবাইরের মতো একই চলক হয় না । এটি অনুকূল বা প্রত্যাশিত আচরণ হবে না।


5
প্রশ্নের উত্তর দিচ্ছি না। ওপি নিখরচায় সম্পর্কে জিজ্ঞাসা করছিল, মোট নয় (বা তাদের উদাহরণে বার)।
জেমস ব্র্যাডবেরি

6
@ জেমস ব্র্যাডবারি totalএবং fooএখনও অপির দৃশ্যে লুপ-স্থানীয় বাইন্ডিং থাকতে পারে এবং যুক্তিটি একই the
কर्क স্ট্রুজার

2
ওপি: "আমি বুঝতে পারি কেন এটা বাইরে অ্যাক্সেসযোগ্য লুপ (অন্যথায়, loops জন্য খুব সীমিত যেত কার্যকারিতা) হতে 'বার' এর জন্য প্রয়োজন হতে পারে কেন এটা প্রয়োজনীয় জন্য কি আমি বুঝতে পারছি না হয়। নিয়ন্ত্রণ পরিবর্তনশীল থাকা লুপটি প্রস্থান করার পরে সুযোগে। (জোর আমার)
জেমস ব্র্যাডবেরি

2
@ জেমস ব্র্যাডবেরি আপনারা হয়তো ঠিক বলেছেন তবে আমি তিন বছর আগে এর জবাব দিয়েছি এবং এখনই এটি বিতর্ক করার উপযুক্ত নয়।
কર્ક স্ট্রুজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.