উত্তর:
এটি বোঝায় না কারণ এটি নয়; এটি "x ++" কে "x + = 1 হিসাবে সংজ্ঞায়িত করতে, x এর আগের বাইন্ডিংকে মূল্যায়ন করার জন্য সঠিক ধারণা তৈরি করে"।
যদি আপনি আসল কারণটি জানতে চান তবে আপনাকে পুরানো পাইথন মেলিং তালিকাগুলির মধ্য দিয়ে চলে যেতে হবে বা সেখানে উপস্থিত কাউকে জিজ্ঞাসা করতে হবে (উদাহরণস্বরূপ: গিডো) তবে সত্যটি প্রমাণ করার পক্ষে এটি যথেষ্ট সহজ:
সরল বর্ধন এবং হ্রাস অন্যান্য ভাষার মতো প্রয়োজন হয় না। আপনি for(int i = 0; i < 10; ++i)
পাইথনের মতো জিনিসগুলি প্রায়শই লিখেন না ; পরিবর্তে আপনি মত জিনিস না for i in range(0, 10)
।
যেহেতু এটি প্রায়শই প্রায় প্রয়োজন হয় না, তাই এটির নিজস্ব বিশেষ বাক্য গঠন দেওয়ার খুব কম কারণ আছে; আপনি যখন বৃদ্ধি প্রয়োজন, +=
সাধারণত ঠিক আছে।
এটি কোনও অর্থবোধ করে কিনা, বা এটি করা যায় কিনা - এটি সিদ্ধান্ত নেয় না এবং তা পারে and এটি ভাষার মূল বাক্য গঠনে সুবিধাটি যুক্ত করার যোগ্য কিনা তা একটি প্রশ্ন। মনে রাখবেন, এটি চারটি অপারেটর - পোস্টইনক, পোস্টডেক, প্রিনিক, প্রেকেক এবং এগুলির প্রত্যেকের নিজস্ব শ্রেণি ওভারলোড হওয়া দরকার; এগুলি সমস্ত নির্দিষ্ট করা এবং পরীক্ষা করা প্রয়োজন; এটি ভাষায় অপকড যুক্ত করবে (আরও বৃহত্তর, এবং তাই ধীর, ভিএম ইঞ্জিন) বোঝায়; লজিক্যাল ইনক্রিমেন্টকে সমর্থন করে এমন প্রতিটি শ্রেণীর তাদের প্রয়োগ করতে হবে (শীর্ষে +=
এবং উপরে -=
)।
এটি সমস্তই নিরর্থক +=
এবং -=
তাই এটি নেট ক্ষতি হয়ে যায়।
i
সরাসরি লুপ করতে পারেন - আপনার যদি এটির প্রয়োজন হয় এবং কেবল উদাহরণ ব্যবহার করতে না পারেনarray.append()
i++
এবং ++i
...
++
এবং --
উপায়ে ব্যবহার করা হচ্ছে যে অনির্ধারিত বা অনির্দিষ্ট মধ্যে ফলাফলের আচরণ। এগুলি জটিল, জটিল-থেকে-সঠিকভাবে-পার্স কোড লেখা সম্ভব করেছে।
আমি লিখেছি এই মূল উত্তরটি গণনার লোককাহিনীগুলির একটি পৌরাণিক কাহিনী : ডেনিস রিচি দ্বারা " icallyতিহাসিকভাবে অসম্ভব" হিসাবে অভিহিত করা হয়েছে যেমন জুলাই ২০১২ এর এসিএম এর যোগাযোগ সম্পাদকদের চিঠিগুলিতে উল্লেখ করা হয়েছে : 10.1145 / 2209249.2209251
সি ইনক্রিমেন্ট / হ্রাস অপারেটরগুলি এমন এক সময় আবিষ্কার করা হয়েছিল যখন সি সংকলক খুব স্মার্ট ছিল না এবং লেখকরা সরাসরি অভিপ্রায়টি নির্দিষ্ট করতে সক্ষম হতে চেয়েছিলেন যে কোনও মেশিন ল্যাঙ্গুয়েজ অপারেটর ব্যবহার করা উচিত যা একটি সংকলকটির জন্য কয়েকটি মুখ্য চক্র সংরক্ষণ করেছিল একটি করতে পারে
load memory
load 1
add
store memory
পরিবর্তে
inc memory
এবং পিডিপি -11 এমনকি "autoincrement" এবং "autoincrement ডেফার্ড" সংশ্লিষ্ট নির্দেশাবলী সমর্থিত *++p
এবং *p++
যথাক্রমে। মারাত্মক কৌতূহলী হলে ম্যানুয়ালটির 5.3 বিভাগ দেখুন ।
সংকলকগুলি সি এর সিনট্যাক্সের মধ্যে নির্মিত উচ্চ-স্তরের অপ্টিমাইজেশন কৌশলগুলি পরিচালনা করার জন্য যথেষ্ট স্মার্ট, তারা এখন কেবল একটি সিনট্যাকটিক সুবিধা।
পাইথনের সমাবেশকারীকে উদ্দেশ্য জানাতে কৌশল নেই কারণ এটি একটি ব্যবহার করে না।
আমি সবসময় ধরে নিয়েছিলাম এটি পাইথনের জেনের এই লাইনের সাথে করা উচিত:
এটির জন্য সুস্পষ্ট উপায় - এবং কেবলমাত্র একটিই - সেখানে থাকতে হবে।
x ++ এবং x + = 1 হুবহু একই কাজটি করে, তাই উভয়ই থাকার কোনও কারণ নেই।
one--
শূন্য?
one--
বাক্যটিতে একটি, তবে শূন্যের পরেই। সুতরাং এই 'কোয়ান' ইঙ্গিত দেয় যে ইনক্রিমেন্ট / হ্রাস অপারেটরগুলি অ-সুস্পষ্ট।
অবশ্যই, আমরা বলতে পারি "গুইডো ঠিক সেভাবে সিদ্ধান্ত নিয়েছে", তবে আমি মনে করি যে প্রশ্নটি সত্যই সেই সিদ্ধান্তের কারণগুলি সম্পর্কে। আমি মনে করি এর বেশ কয়েকটি কারণ রয়েছে:
কারণ, পাইথনে, পূর্ণসংখ্যাগুলি অপরিবর্তনীয় হয় (int এর + = আসলে একটি পৃথক বস্তু দেয়)।
এছাড়াও, সঙ্গে ++, / - আপনি প্রাক বনাম পোষ্ট- বৃদ্ধি / হ্রাস সম্পর্কে চিন্তা করতে হবে, এবং এটা লিখতে কাছে শুধুমাত্র আর একটি কীস্ট্রোক লাগে x+=1
। অন্য কথায়, এটি খুব সামান্য লাভের ব্যয়ে সম্ভাব্য বিভ্রান্তি এড়ায়।
42++
... কিছু পুরানো ফোর্টরান সংকলক (বা তাই আমি পড়েছি) এর মধ্যে এরকম কিছু (আক্ষরিক ধ্রুবকটি সংশোধন করা) আসলে সম্ভব ছিল : ভবিষ্যতের সমস্ত ব্যবহার যে প্রোগ্রামে এই আক্ষরিক এর পরে সত্যিই আলাদা মান হবে। শুভ ডিবাগিং!
int
সাধারণভাবে অপরিবর্তনীয়। একটি int
ইন সি কেবল স্মৃতিতে স্থান নির্ধারণ করে। এবং সেই জায়গায় বিটগুলি খুব বেশি পরিবর্তনীয়। উদাহরণস্বরূপ, আপনি কোনওটির একটি রেফারেন্স তৈরি করতে পারেন int
এবং সেই রেফারেন্সের বিভিন্ন পরিবর্তন করতে পারেন। এই পরিবর্তনটি int
সেই জায়গাতে সমস্ত রেফারেন্সে (মূল ভেরিয়েবল সহ ) দৃশ্যমান । পাইথন পূর্ণসংখ্যার অবজেক্টের জন্য এটি একইরকম নয়।
পাইথন স্পষ্টতা সম্পর্কে প্রচুর এবং কোনও প্রোগ্রামার সঠিকভাবে তার অর্থ অনুমান করতে পারে না --a
যতক্ষণ না সে / তিনি যে ভাষাটি নির্মাণ করে কোন ভাষা শিখেন না।
পাইথন এমন কন্সট্রাক্টস এড়ানো সম্পর্কেও অনেক কিছু যা ভুলকে আমন্ত্রণ জানায় এবং ++
অপারেটররা ত্রুটিগুলির সমৃদ্ধ উত্স হিসাবে পরিচিত। পাইথনে এই অপারেটর না থাকাই এই দুটি কারণই যথেষ্ট।
পাইথন সিন্ট্যাক্টিকাল উপায়গুলির চেয়ে ব্লকগুলি চিহ্নিত করতে ইন্ডেন্টেশন ব্যবহার করে যেমন সিদ্ধান্ত / বন্ধনী বন্ধনের কিছু ফর্ম বা বাধ্যতামূলক শেষের চিহ্নিতকরণ মূলত একই বিবেচনার ভিত্তিতে ভিত্তি করে।
চিত্রণ জন্য, কটাক্ষপাত আছে একটি শর্তাধীন অপারেটর প্রবর্তনের প্রায় আলোচনা : (সি cond ? resultif : resultelse
অন্তত 2005. পড়ুন পাইথন মধ্যে) প্রথম বার্তা এবং সিদ্ধান্ত বার্তা যে আলোচনা (যা একই বিষয়ে বিভিন্ন প্রিকার্সর পূর্বে ছিল)।
ট্রিভিয়া: এর মধ্যে প্রায়শই উল্লিখিত পিইপি হ'ল "পাইথন এক্সটেনশন প্রস্তাব" পিইপি 308 । এলসি অর্থ তালিকা বোধগম্যতা , জিই এর অর্থ জেনারেটর এক্সপ্রেশন (এবং চিন্তা করবেন না যদি তারা আপনাকে বিভ্রান্ত করে তবে তারা পাইথনের কয়েকটি জটিল স্পট নয়)।
পাইথন কেন ++
অপারেটর রাখে না সে সম্পর্কে আমার বোধগম্যতা অনুসরণ করা হচ্ছে: আপনি পাইথনটিতে এটি লেখার সময় আপনি a=b=c=1
তিনটি ভেরিয়েবল (লেবেল) একই বস্তুর দিকে নির্দেশ করতে পারবেন (যার মান 1)। আপনি এটি আইডি ফাংশন ব্যবহার করে যাচাই করতে পারবেন যা কোনও অবজেক্টের মেমরি ঠিকানা ফিরিয়ে দেবে:
In [19]: id(a)
Out[19]: 34019256
In [20]: id(b)
Out[20]: 34019256
In [21]: id(c)
Out[21]: 34019256
তিনটি ভেরিয়েবল (লেবেল) একই বস্তুর দিকে নির্দেশ করে। এখন পরিবর্তনশীলগুলির মধ্যে একটি বৃদ্ধি করুন এবং দেখুন কীভাবে এটি মেমরির ঠিকানাগুলিকে প্রভাবিত করে:
In [22] a = a + 1
In [23]: id(a)
Out[23]: 34019232
In [24]: id(b)
Out[24]: 34019256
In [25]: id(c)
Out[25]: 34019256
আপনি দেখতে পাচ্ছেন যে ভেরিয়েবল a
এখন অন্য একটি বস্তুকে ভেরিয়েবল b
এবং হিসাবে নির্দেশ করে c
। কারণ আপনি এটি ব্যবহার a = a + 1
করেছেন তা স্পষ্টভাবে পরিষ্কার। অন্য কথায় আপনি লেবেলকে সম্পূর্ণ অন্য একটি বিষয় বরাদ্দ করেন a
। কল্পনা করুন যে আপনি এটি লিখতে পারেন a++
তা আপনাকে পরামর্শ দিতে পারে যে আপনি পরিবর্তনশীল a
নতুন অবজেক্টকে বরাদ্দ করেননি তবে পুরানোটিকে রাটার বাড়িয়েছেন। এই সমস্ত জিনিস বিভ্রান্তি হ্রাস করার জন্য আইএমএইচও। আরও ভাল বোঝার জন্য দেখুন পাইথন ভেরিয়েবল কীভাবে কাজ করে:
পাইথনে, কোনও ফাংশন কলকারীর দ্বারা উপলব্ধি অনুসারে কিছু যুক্তি সংশোধন করতে পারে তবে অন্যরা তাও নয়?
পাইথন কল-বাই-মান বা কল-বাই রেফারেন্স? আমরাও।
পাইথনটি মান দ্বারা বা রেফারেন্স দিয়ে যায়?
পাইথন কি পাস-বাই-রেফারেন্স বা পাস-বাই-ভ্যালু?
পাইথন: রেফারেন্স দিয়ে আমি কীভাবে একটি ভেরিয়েবল পাস করব?
পাইথন ভেরিয়েবল এবং মেমরি পরিচালনা বোঝা
পাইথনে পাস-বাই-মান আচরণ অনুকরণ করা
এটি ঠিক সেভাবে ডিজাইন করা হয়েছিল। বৃদ্ধি এবং হ্রাস অপারেটরগুলি কেবল শর্টকাট x = x + 1
। পাইথন সাধারণত একটি নকশা কৌশল গ্রহণ করেছে যা একটি অপারেশন করার বিকল্প উপায়ের সংখ্যা হ্রাস করে। অজমেন্টেড অ্যাসাইনমেন্ট পাইথনের ইনক্রিমেন্ট / হ্রাস অপারেটরগুলির নিকটতম জিনিস, এবং পাইথন ২.০ পর্যন্ত এগুলি যুক্ত করা হয়নি।
return a[i++]
সঙ্গে return a[i=i+1]
।
আমি অজগর থেকে খুব নতুন কিন্তু আমার সন্দেহ হয় কারণটি ভাষার মধ্যে পরিবর্তনীয় এবং অপরিবর্তনীয় বস্তুর মধ্যে জোর দেওয়ার কারণে। এখন, আমি জানি যে এক্স ++ সহজেই এক্স = এক্স + 1 হিসাবে ব্যাখ্যা করা যেতে পারে, তবে এটি দেখে মনে হচ্ছে আপনি স্থানে এমন কোনও বস্তু বৃদ্ধি করছেন যা অপরিবর্তনীয় হতে পারে।
শুধু আমার অনুমান / অনুভূতি / কুণ্ডলী।
x++
কাছাকাছি x += 1
তুলনায় x = x + 1
এই দুই পাশাপাশি একটি পার্থক্য তৈরি চপল বস্তুর উপর।
প্রথমত, পাইথন কেবলমাত্র পরোক্ষভাবে সি দ্বারা প্রভাবিত হয়; এটি এবিসি দ্বারা খুব বেশি প্রভাবিত , যার স্পষ্টতই এই অপারেটর নেই , সুতরাং পাইথনগুলিতে সেগুলি না খুঁজে পাওয়া কোনও অবাক হওয়ার বিষয় নয়।
দ্বিতীয়ত, অন্যদের বলেছি, বৃদ্ধি এবং হ্রাস দ্বারা সমর্থিত +=
এবং -=
ইতিমধ্যে।
তৃতীয়ত, একজন ++
এবং --
অপারেটর সেটটির সম্পূর্ণ সমর্থন সাধারণত তাদের উভয়ের উপসর্গ এবং পোস্টফিক্স সংস্করণ উভয় সমর্থন করে। সি এবং সি ++ এ এটি পাইথনকে আলিঙ্গন করে এমন সরলতা এবং সরল-ফরোয়ার্ডনের স্পিরিটের বিপরীতে (আমার কাছে মনে হয়) সমস্ত ধরণের "মনোরম" নির্মাণের দিকে পরিচালিত করতে পারে।
উদাহরণস্বরূপ, while(*t++ = *s++);
একজন অভিজ্ঞ প্রোগ্রামারকে, কারো কাছে এটি শিখার পক্ষে সি স্টেটমেন্টটি সহজ এবং মার্জিত মনে হতে পারে, এটি সাধারণ কিছু নয়। উপসর্গ এবং পোস্টফিক্স ইনক্রিমেন্ট এবং হ্রাসের মিশ্রণটি নিক্ষেপ করুন এবং এমনকি অনেক পেশাদারকে থামিয়ে কিছুটা ভাবতে হবে।
আমি বিশ্বাস করি যে এটি পাইথন ধর্ম থেকে উদ্ভূত যে "স্পষ্ট বর্ণের চেয়ে সুস্পষ্ট"।
এটি হতে পারে কারণ @ গ্লেনমায়নার্ড অন্যান্য ভাষার সাথে তুলনা করে বিষয়টি দেখছেন , কিন্তু পাইথনে আপনি অজগর উপায়ে কাজ করেন। এটি 'কেন' প্রশ্ন নয়। এটি সেখানে রয়েছে এবং আপনি একই প্রভাবতে জিনিসগুলি করতে পারেন x+=
। ইন Python- র জেন , তা দেওয়া হয়: "সেখানে মাত্র একটি সমস্যা সমাধানের জন্য একমুখী হওয়া উচিত।" একাধিক পছন্দ শিল্প (মত প্রকাশের স্বাধীনতা) দুর্দান্ত তবে ইঞ্জিনিয়ারিংয়ে লম্পট।
++
অপারেটরদের বর্গ পার্শ্ব প্রতিক্রিয়া সঙ্গে অভিব্যক্তি রয়েছে। এটি পাইথনে সাধারণত পাওয়া যায় না।
একই কারণে অ্যাসাইনমেন্টটি পাইথনের কোনও অভিব্যক্তি নয়, এইভাবে সাধারণ if (a = f(...)) { /* using a here */ }
প্রতিমাটি প্রতিরোধ করে ।
শেষ পর্যন্ত আমার সন্দেহ হয় যে সেখানে অপারেটর পাইথনসের রেফারেন্স শব্দার্থের সাথে খুব সামঞ্জস্যপূর্ণ নয়। মনে রাখবেন, সি / সি ++ থেকে পরিচিত শব্দার্থবিজ্ঞানের সাথে পাইথনের ভেরিয়েবল (বা পয়েন্টার) নেই।
f(a)
কোথায় a
, কিছু অপরিবর্তনীয় বস্তু।
এই অপারেটরগুলি কেন সি-তে উপস্থিত রয়েছে তা জিজ্ঞাসা করার জন্য আরও একটি ভাল প্রশ্ন হতে পারে কে ওআরআর ইনক্রিমেন্ট এবং হ্রাস অপারেটরগুলিকে 'অস্বাভাবিক' বলে (বিভাগ 2.8 পৃষ্ঠা 46)। ভূমিকা তাদের "আরও সংক্ষিপ্ত এবং প্রায়শই আরও দক্ষ" বলে calls আমি সন্দেহ করি যে এই ক্রিয়াকলাপগুলি সর্বদা পয়েন্টার ম্যানিপুলেশনে আসে তা তাদের ভূমিকাতেও ভূমিকা রেখেছিল। পাইথনে সম্ভবত সিদ্ধান্ত নেওয়া হয়েছে যে ইনক্রিমেন্টগুলি অনুকূল করার চেষ্টা করার কোনও ধারণা নেই (আসলে আমি কেবল সি তে একটি পরীক্ষা করেছি, এবং মনে হয় জিসিসি-দ্বারা উত্পাদিত অ্যাসেম্বলি উভয় ক্ষেত্রে ইনক্ল্যামের পরিবর্তে অ্যাডেল ব্যবহার করে) এবং নেই পয়েন্টার গাণিতিক; সুতরাং এটি করার একমাত্র আরও উপায় হত এবং আমরা জানি পাইথন এটি ঘৃণা করে।
আমি এটি বুঝতে পেরেছি তাই আপনি ভাববেন না যে মেমরির মান পরিবর্তিত হয়েছে। সিতে যখন আপনি এক্স ++ করেন মেমরির এক্স এর মান পরিবর্তন হয়। তবে পাইথনটিতে সমস্ত সংখ্যা অপরিবর্তনীয় তাই সেই x পয়েন্টের ঠিকানা হিসাবে এখনও x + 1 নেই। আপনি যখন x ++ লিখবেন তখন আপনি ভাববেন যে x কী ঘটেছিল তা হ'ল এক্স রিফ্রেন্সটি মেমরির এমন একটি জায়গায় পরিবর্তিত হয় যেখানে x + 1 সঞ্চিত থাকে বা যদি ডো এর উপস্থিতি না থাকে তবে এই অবস্থানটি পুনরায় তৈরি করুন।
++
এবং থেকে আলাদা করে তোলে += 1
?
এই পৃষ্ঠায় ইতিমধ্যে ভাল উত্তর সম্পূর্ণ করতে:
ধরা যাক আমরা এটি করার সিদ্ধান্ত নিয়েছি, উপসর্গ ( ++i
) যা ইউনারি + এবং - অপারেটরকে ভেঙে ফেলবে।
আজ, দ্বারা উপসর্গ করা ++
বা --
কিছুই করা হয় না, কারণ এটি দু'বার অ্যানারি প্লাস অপারেটরকে সক্ষম করে (কিছুই করে না) বা আনরি বিয়োগ দু'বার করে (দুইবার: নিজেকে বাতিল করে দেয়)
>>> i=12
>>> ++i
12
>>> --i
12
সুতরাং এটি সম্ভাব্যভাবে এই যুক্তি ভঙ্গ করবে।
অন্যান্য উত্তরগুলি বর্ণনা করেছে যে এটির পুনরুক্তিকারীদের জন্য কেন প্রয়োজন হয় না, তবে কখনও কখনও ইন-লাইনে ভেরিয়েবল বাড়ানোর ক্ষেত্রে এটি কার্যকর হয়, আপনি টিপলস এবং একাধিক অ্যাসাইনমেন্ট ব্যবহার করে একই প্রভাব অর্জন করতে পারেন:
b = ++a
হয়ে:
a,b = (a+1,)*2
এবং b = a++
হয়ে:
a,b = a+1, a
পাইথন 3.8 নিয়োগ প্রবর্তন :=
অপারেটর, আমাদের অর্জন করতে সক্ষম হবেন foo(++a)
সঙ্গে
foo(a:=a+1)
foo(a++)
যদিও এখনও অধরা।
আমি মনে করি এটি সম্পর্কিত পরিবর্তন এবং অবজেক্টগুলির অপরিবর্তনীয় ধারণার সাথে সম্পর্কিত। পাইথনে 2,3,4,5 অপরিবর্তনীয়। নীচের চিত্রটি দেখুন। 2 এই অজগর প্রক্রিয়া অবধি আইডি স্থির করেছে।
এক্স ++ এর অর্থ মূলত সি-তে সি-এর মতো একটি ইন-প্লেস ইনক্রিমেন্ট হবে, এক্স ++ ইন-প্লেস ইনক্রিমেন্ট সম্পাদন করবে। সুতরাং, x = 3, এবং x ++ অজগরের চেয়ে 3 এ মেমোরিতে 3 বাড়বে যেখানে 3 টি এখনও মেমরিতে থাকবে।
অজগরতে, আপনাকে স্মৃতিতে একটি মান পুনরায় তৈরি করতে হবে না। এর ফলে পারফরম্যান্স অপটিমাইজেশন হতে পারে।
এটি হান্চ ভিত্তিক উত্তর is
আমি জানি এটি একটি পুরানো থ্রেড, তবে ++ i এর সর্বাধিক সাধারণ ব্যবহারটি কভার করা হয় না, যখন কোনও সরবরাহকৃত সূচক থাকে না তখন ম্যানুয়ালি সূচি নির্ধারণ করা হয়। এই পরিস্থিতি কেন পাইথন গণনা প্রদান করে ()
উদাহরণ: প্রদত্ত যে কোনও ভাষায়, আপনি যখন কোনও সেট পুনরুক্ত করার জন্য ফোরচের মতো কোনও নির্মাণ ব্যবহার করেন - উদাহরণের জন্য আমরা এমনকি এটিও বলব যে এটি একটি নিরবচ্ছিন্ন সেট এবং সেগুলি আলাদা করার জন্য আপনার একটি অনন্য সূচি প্রয়োজন, বলুন
i = 0
stuff = {'a': 'b', 'c': 'd', 'e': 'f'}
uniquestuff = {}
for key, val in stuff.items() :
uniquestuff[key] = '{0}{1}'.format(val, i)
i += 1
এর মতো ক্ষেত্রে অজগর একটি গণনা পদ্ধতি সরবরাহ করে, যেমন
for i, (key, val) in enumerate(stuff.items()) :