পাইথনে কেন কোনও ++ এবং অপারেটর নেই?


442

কেন কোন হয় ++এবং --পাইথন মধ্যে অপারেটরদের?



কারণ সেখানে অনর্থক
cmarangu

সেখানে 4 টি আলাদা ++ অপারেটর রয়েছে যা সবাই একই কাজ করে। ওহ, এখন "সি ++" থেকে "++" সরিয়ে ফেলা যা এখন অবক্ষয়ের মতো বলে মনে হচ্ছে
cmarangu

উত্তর:


443

এটি বোঝায় না কারণ এটি নয়; এটি "x ++" কে "x + = 1 হিসাবে সংজ্ঞায়িত করতে, x এর আগের বাইন্ডিংকে মূল্যায়ন করার জন্য সঠিক ধারণা তৈরি করে"।

যদি আপনি আসল কারণটি জানতে চান তবে আপনাকে পুরানো পাইথন মেলিং তালিকাগুলির মধ্য দিয়ে চলে যেতে হবে বা সেখানে উপস্থিত কাউকে জিজ্ঞাসা করতে হবে (উদাহরণস্বরূপ: গিডো) তবে সত্যটি প্রমাণ করার পক্ষে এটি যথেষ্ট সহজ:

সরল বর্ধন এবং হ্রাস অন্যান্য ভাষার মতো প্রয়োজন হয় না। আপনি for(int i = 0; i < 10; ++i)পাইথনের মতো জিনিসগুলি প্রায়শই লিখেন না ; পরিবর্তে আপনি মত জিনিস না for i in range(0, 10)

যেহেতু এটি প্রায়শই প্রায় প্রয়োজন হয় না, তাই এটির নিজস্ব বিশেষ বাক্য গঠন দেওয়ার খুব কম কারণ আছে; আপনি যখন বৃদ্ধি প্রয়োজন, +=সাধারণত ঠিক আছে।

এটি কোনও অর্থবোধ করে কিনা, বা এটি করা যায় কিনা - এটি সিদ্ধান্ত নেয় না এবং তা পারে and এটি ভাষার মূল বাক্য গঠনে সুবিধাটি যুক্ত করার যোগ্য কিনা তা একটি প্রশ্ন। মনে রাখবেন, এটি চারটি অপারেটর - পোস্টইনক, পোস্টডেক, প্রিনিক, প্রেকেক এবং এগুলির প্রত্যেকের নিজস্ব শ্রেণি ওভারলোড হওয়া দরকার; এগুলি সমস্ত নির্দিষ্ট করা এবং পরীক্ষা করা প্রয়োজন; এটি ভাষায় অপকড যুক্ত করবে (আরও বৃহত্তর, এবং তাই ধীর, ভিএম ইঞ্জিন) বোঝায়; লজিক্যাল ইনক্রিমেন্টকে সমর্থন করে এমন প্রতিটি শ্রেণীর তাদের প্রয়োগ করতে হবে (শীর্ষে +=এবং উপরে -=)।

এটি সমস্তই নিরর্থক +=এবং -=তাই এটি নেট ক্ষতি হয়ে যায়।


98
অ্যারে [i ++] এর মতো কিছু ব্যবহার করা প্রায়শই দরকারী, যা পরিচ্ছন্নভাবে + = / - = দিয়ে করা হয় না।
টার্নার হেইস

102
@ থায়েস: পাইথনে এটি সাধারণ প্যাটার্ন নয়।
গ্লেন মেইনার্ড

9
@ থায়েস যেহেতু এটি একটি লুপের ভিতরে থাকবে, আপনি সম্ভবত iসরাসরি লুপ করতে পারেন - আপনার যদি এটির প্রয়োজন হয় এবং কেবল উদাহরণ ব্যবহার করতে না পারেনarray.append()
টোবিয়াস কেইনজলার

31
আমি দেখতে পাচ্ছি যে আরও বড় উদ্বেগ হ'ল পাঠযোগ্যতা এবং অনুমানযোগ্যতা। আমার সি দিনের মধ্যে ফিরে, আমি চেয়ে বেশি পার্থক্য সম্পর্কে ভুল বোঝাবুঝি থেকে গৌন যথেষ্ট বাগ দেখেছি i++এবং ++i...
চার্লস ডাফি

5
সঙ্গে সমস্যা থেকে সি ++ কোড যাতনার ন্যায্য পরিমাণ (আরও কেউ তাদের জীবনে, সেটা ছাড়া আমি) উপর, আমি সম্মুখীন হয়েছি একটি প্রকল্প আমি কাজ করুন: justifying ঘটনা-পরবর্তী যোগ করা হচ্ছে ++এবং --উপায়ে ব্যবহার করা হচ্ছে যে অনির্ধারিত বা অনির্দিষ্ট মধ্যে ফলাফলের আচরণ। এগুলি জটিল, জটিল-থেকে-সঠিকভাবে-পার্স কোড লেখা সম্ভব করেছে।
ব্রায়ান ভ্যানডেনবার্গ

84

আমি লিখেছি এই মূল উত্তরটি গণনার লোককাহিনীগুলির একটি পৌরাণিক কাহিনী : ডেনিস রিচি দ্বারা " icallyতিহাসিকভাবে অসম্ভব" হিসাবে অভিহিত করা হয়েছে যেমন জুলাই ২০১২ এর এসিএম এর যোগাযোগ সম্পাদকদের চিঠিগুলিতে উল্লেখ করা হয়েছে : 10.1145 / 2209249.2209251


সি ইনক্রিমেন্ট / হ্রাস অপারেটরগুলি এমন এক সময় আবিষ্কার করা হয়েছিল যখন সি সংকলক খুব স্মার্ট ছিল না এবং লেখকরা সরাসরি অভিপ্রায়টি নির্দিষ্ট করতে সক্ষম হতে চেয়েছিলেন যে কোনও মেশিন ল্যাঙ্গুয়েজ অপারেটর ব্যবহার করা উচিত যা একটি সংকলকটির জন্য কয়েকটি মুখ্য চক্র সংরক্ষণ করেছিল একটি করতে পারে

load memory
load 1
add
store memory

পরিবর্তে

inc memory 

এবং পিডিপি -11 এমনকি "autoincrement" এবং "autoincrement ডেফার্ড" সংশ্লিষ্ট নির্দেশাবলী সমর্থিত *++pএবং *p++যথাক্রমে। মারাত্মক কৌতূহলী হলে ম্যানুয়ালটির 5.3 বিভাগ দেখুন ।

সংকলকগুলি সি এর সিনট্যাক্সের মধ্যে নির্মিত উচ্চ-স্তরের অপ্টিমাইজেশন কৌশলগুলি পরিচালনা করার জন্য যথেষ্ট স্মার্ট, তারা এখন কেবল একটি সিনট্যাকটিক সুবিধা।

পাইথনের সমাবেশকারীকে উদ্দেশ্য জানাতে কৌশল নেই কারণ এটি একটি ব্যবহার করে না।


4
জাভাস্ক্রিপ্টটিতে ++ রয়েছে। আমি মনে করি না যে এটি "সমাবেশকারীর উদ্দেশ্যে উদ্দেশ্য প্রকাশের কৌশল"। এছাড়াও পাইথনের বাইকোড রয়েছে। সুতরাং আমি মনে করি কারণটি অন্য কিছু।
নাথান ডেভিস

13
এই "সংকলককে ইঙ্গিত সরবরাহ করা" ব্যবসায়টি আসলে একটি মিথ। সত্যই, এটি যে কোনও ভাষার সাথে মূক সংযোজন এবং এটি নিম্নলিখিত দুটি আদেশ লঙ্ঘন করে: ১. আপনি কম্পিউটার পড়ার জন্য কোড করেন না, অন্য ইঞ্জিনিয়ারকে পড়ার কোড আপনি। এবং ২. আপনি কোনও উপযুক্ত ইঞ্জিনিয়ারকে পড়ার জন্য কোড দিচ্ছেন না, আপনি একজন উপযুক্ত ইঞ্জিনিয়ারকে পড়ার জন্য কোড দিচ্ছেন যখন 3 টায় ক্লান্ত হয়ে পড়ে এবং ক্যাফিনে উঠে যায়।

3
@ tgm1024 ন্যায্য হওয়ার জন্য, প্রতি সেকেন্ডে 10-30 টি অক্ষর কোডিং করার সময়, অর্ধ-দ্বৈত টেলিফোন টাইপ করুন, আপনি কোড দিন যাতে আপনি এটিকে পরবর্তী সপ্তাহের আগে কী করতে পারেন।
এমএসডব্লিউ

4
@ tgm1024 ইউনিক্স এবং সি পিডিপি -11 এর উপর তাদের প্রাথমিক বিকাশের বেশিরভাগ অংশ দেখেছিল যা ব্যবহারকারীর যোগাযোগের জন্য অবিশ্বাস্যরকম ধীর টেলিটিপস ব্যবহার করে। আপনি যখন মারা গেছেন যে আজ মেশিনটির কোডিং বেশিরভাগ নির্বাক, পিছনে তখন হিউম্যান / মেশিন ইন্টারফেস যা ছিল বাধা। আপনার যদি কখনও না হয় তবে আস্তে আস্তে কাজ করা কল্পনা করা শক্ত।
এমএসডাব্লু

65

আমি সবসময় ধরে নিয়েছিলাম এটি পাইথনের জেনের এই লাইনের সাথে করা উচিত:

এটির জন্য সুস্পষ্ট উপায় - এবং কেবলমাত্র একটিই - সেখানে থাকতে হবে।

x ++ এবং x + = 1 হুবহু একই কাজটি করে, তাই উভয়ই থাকার কোনও কারণ নেই।



25
one--বাক্যটিতে একটি, তবে শূন্যের পরেই। সুতরাং এই 'কোয়ান' ইঙ্গিত দেয় যে ইনক্রিমেন্ট / হ্রাস অপারেটরগুলি অ-সুস্পষ্ট।
ভিক্টর কে

14
@ এরালপবি যদি আপনি + = মুছেন, তবে আপনি এক্স + = ১০ এর মতো কাজ করতে পারবেন না + + = ++ এর আরও সাধারণ ঘটনা
ররি

8
এছাড়াও: "অন্তর্নিহিতের চেয়ে সুস্পষ্ট ভাল"।
বার

2
অবশ্যই এক নয়, কারণ x + = 1 এক্সপ্রেশন নয় - এটি একটি বিবৃতি - এবং এটি কোনও কিছুর সাথে মূল্যায়ন করে না। আপনি এই জাতীয় জিনিসগুলি করতে পারবেন না: 'সারি [কল ++] = ক; সারি [কল ++] = বি '। সি ++ থাকা প্রাক-ইনক এবং পোস্ট-ইনক স্টাফের উল্লেখ না করা।
উরি

38

অবশ্যই, আমরা বলতে পারি "গুইডো ঠিক সেভাবে সিদ্ধান্ত নিয়েছে", তবে আমি মনে করি যে প্রশ্নটি সত্যই সেই সিদ্ধান্তের কারণগুলি সম্পর্কে। আমি মনে করি এর বেশ কয়েকটি কারণ রয়েছে:

  • এটি বিবৃতি এবং অভিব্যক্তি একসাথে মিশ্রিত, যা ভাল অনুশীলন নয়। Http://norvig.com/python-iaq.html দেখুন
  • এটি সাধারণত লোকে কম পাঠযোগ্য কোড লিখতে উত্সাহিত করে
  • ইতিমধ্যে উল্লিখিত হিসাবে পাইথন-এ অপ্রয়োজনীয় ভাষা প্রয়োগের ক্ষেত্রে অতিরিক্ত জটিলতা

12
খুশি কেউ অবশেষে বিবৃতি বনাম অভিব্যক্তিটির উল্লেখ করেছেন mentioned সি অ্যাসাইনমেন্টটি একটি এক্সপ্রেশন এবং তাই এটি ++ অপারেটর। পাইথন অ্যাসাইনমেন্টটি একটি বিবৃতি, সুতরাং এটির যদি ++ থাকে তবে এটি সম্ভবত একটি অ্যাসাইনমেন্ট স্টেটমেন্ট হওয়া দরকার (এবং এমনকি কম দরকারী বা প্রয়োজনীয়)।
মার্টিনো

সম্মত - যদি তারা বিবৃতি দেয় তবে ন্যূনতম সময়ে পোস্ট-এবং অপারেটরগুলির মধ্যে পার্থক্য সম্পর্কে কথা বলা একেবারে অর্থহীন হয়ে যায়।
ক্রোম্যান

17

কারণ, পাইথনে, পূর্ণসংখ্যাগুলি অপরিবর্তনীয় হয় (int এর + = আসলে একটি পৃথক বস্তু দেয়)।

এছাড়াও, সঙ্গে ++, / - আপনি প্রাক বনাম পোষ্ট- বৃদ্ধি / হ্রাস সম্পর্কে চিন্তা করতে হবে, এবং এটা লিখতে কাছে শুধুমাত্র আর একটি কীস্ট্রোক লাগে x+=1। অন্য কথায়, এটি খুব সামান্য লাভের ব্যয়ে সম্ভাব্য বিভ্রান্তি এড়ায়।


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

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

x + = 1 শেষ হয়ে যাবে না মেমক হয়ে। পাইথন একটি ভেরিয়েবলে 1 যুক্ত করতে একটি ফাংশন কল কার্যকর করে; এটা করুণ।
পালাডলফিন

12

নির্মলতা!

পাইথন স্পষ্টতা সম্পর্কে প্রচুর এবং কোনও প্রোগ্রামার সঠিকভাবে তার অর্থ অনুমান করতে পারে না --aযতক্ষণ না সে / তিনি যে ভাষাটি নির্মাণ করে কোন ভাষা শিখেন না।

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

পাইথন সিন্ট্যাক্টিকাল উপায়গুলির চেয়ে ব্লকগুলি চিহ্নিত করতে ইন্ডেন্টেশন ব্যবহার করে যেমন সিদ্ধান্ত / বন্ধনী বন্ধনের কিছু ফর্ম বা বাধ্যতামূলক শেষের চিহ্নিতকরণ মূলত একই বিবেচনার ভিত্তিতে ভিত্তি করে।

চিত্রণ জন্য, কটাক্ষপাত আছে একটি শর্তাধীন অপারেটর প্রবর্তনের প্রায় আলোচনা : (সি cond ? resultif : resultelseঅন্তত 2005. পড়ুন পাইথন মধ্যে) প্রথম বার্তা এবং সিদ্ধান্ত বার্তা যে আলোচনা (যা একই বিষয়ে বিভিন্ন প্রিকার্সর পূর্বে ছিল)।

ট্রিভিয়া: এর মধ্যে প্রায়শই উল্লিখিত পিইপি হ'ল "পাইথন এক্সটেনশন প্রস্তাব" পিইপি 308 । এলসি অর্থ তালিকা বোধগম্যতা , জিই এর অর্থ জেনারেটর এক্সপ্রেশন (এবং চিন্তা করবেন না যদি তারা আপনাকে বিভ্রান্ত করে তবে তারা পাইথনের কয়েকটি জটিল স্পট নয়)।


10

পাইথন কেন ++অপারেটর রাখে না সে সম্পর্কে আমার বোধগম্যতা অনুসরণ করা হচ্ছে: আপনি পাইথনটিতে এটি লেখার সময় আপনি 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নতুন অবজেক্টকে বরাদ্দ করেননি তবে পুরানোটিকে রাটার বাড়িয়েছেন। এই সমস্ত জিনিস বিভ্রান্তি হ্রাস করার জন্য আইএমএইচও। আরও ভাল বোঝার জন্য দেখুন পাইথন ভেরিয়েবল কীভাবে কাজ করে:

পাইথনে, কোনও ফাংশন কলকারীর দ্বারা উপলব্ধি অনুসারে কিছু যুক্তি সংশোধন করতে পারে তবে অন্যরা তাও নয়?

পাইথন কল-বাই-মান বা কল-বাই রেফারেন্স? আমরাও।

পাইথনটি মান দ্বারা বা রেফারেন্স দিয়ে যায়?

পাইথন কি পাস-বাই-রেফারেন্স বা পাস-বাই-ভ্যালু?

পাইথন: রেফারেন্স দিয়ে আমি কীভাবে একটি ভেরিয়েবল পাস করব?

পাইথন ভেরিয়েবল এবং মেমরি পরিচালনা বোঝা

পাইথনে পাস-বাই-মান আচরণ অনুকরণ করা

পাইথন ফাংশন রেফারেন্স দ্বারা কল

পাইথনিস্টের মতো কোড: আইডোমেটিক পাইথন


9

এটি ঠিক সেভাবে ডিজাইন করা হয়েছিল। বৃদ্ধি এবং হ্রাস অপারেটরগুলি কেবল শর্টকাট x = x + 1। পাইথন সাধারণত একটি নকশা কৌশল গ্রহণ করেছে যা একটি অপারেশন করার বিকল্প উপায়ের সংখ্যা হ্রাস করে। অজমেন্টেড অ্যাসাইনমেন্ট পাইথনের ইনক্রিমেন্ট / হ্রাস অপারেটরগুলির নিকটতম জিনিস, এবং পাইথন ২.০ পর্যন্ত এগুলি যুক্ত করা হয়নি।


3
হ্যাঁ সঙ্গী, মত, আপনি প্রতিস্থাপন করতে পারে return a[i++]সঙ্গে return a[i=i+1]
Luís de Sousa

7

আমি অজগর থেকে খুব নতুন কিন্তু আমার সন্দেহ হয় কারণটি ভাষার মধ্যে পরিবর্তনীয় এবং অপরিবর্তনীয় বস্তুর মধ্যে জোর দেওয়ার কারণে। এখন, আমি জানি যে এক্স ++ সহজেই এক্স = এক্স + 1 হিসাবে ব্যাখ্যা করা যেতে পারে, তবে এটি দেখে মনে হচ্ছে আপনি স্থানে এমন কোনও বস্তু বৃদ্ধি করছেন যা অপরিবর্তনীয় হতে পারে।

শুধু আমার অনুমান / অনুভূতি / কুণ্ডলী।


এই দৃষ্টিভঙ্গি সালে x++কাছাকাছি x += 1তুলনায় x = x + 1এই দুই পাশাপাশি একটি পার্থক্য তৈরি চপল বস্তুর উপর।
glglgl

4

প্রথমত, পাইথন কেবলমাত্র পরোক্ষভাবে সি দ্বারা প্রভাবিত হয়; এটি এবিসি দ্বারা খুব বেশি প্রভাবিত , যার স্পষ্টতই এই অপারেটর নেই , সুতরাং পাইথনগুলিতে সেগুলি না খুঁজে পাওয়া কোনও অবাক হওয়ার বিষয় নয়।

দ্বিতীয়ত, অন্যদের বলেছি, বৃদ্ধি এবং হ্রাস দ্বারা সমর্থিত +=এবং -=ইতিমধ্যে।

তৃতীয়ত, একজন ++এবং --অপারেটর সেটটির সম্পূর্ণ সমর্থন সাধারণত তাদের উভয়ের উপসর্গ এবং পোস্টফিক্স সংস্করণ উভয় সমর্থন করে। সি এবং সি ++ এ এটি পাইথনকে আলিঙ্গন করে এমন সরলতা এবং সরল-ফরোয়ার্ডনের স্পিরিটের বিপরীতে (আমার কাছে মনে হয়) সমস্ত ধরণের "মনোরম" নির্মাণের দিকে পরিচালিত করতে পারে।

উদাহরণস্বরূপ, while(*t++ = *s++);একজন অভিজ্ঞ প্রোগ্রামারকে, কারো কাছে এটি শিখার পক্ষে সি স্টেটমেন্টটি সহজ এবং মার্জিত মনে হতে পারে, এটি সাধারণ কিছু নয়। উপসর্গ এবং পোস্টফিক্স ইনক্রিমেন্ট এবং হ্রাসের মিশ্রণটি নিক্ষেপ করুন এবং এমনকি অনেক পেশাদারকে থামিয়ে কিছুটা ভাবতে হবে।


3

আমি বিশ্বাস করি যে এটি পাইথন ধর্ম থেকে উদ্ভূত যে "স্পষ্ট বর্ণের চেয়ে সুস্পষ্ট"।


ঠিক আছে, আপনি পাইথনে স্পষ্টভাবে "শুরু" এবং "শেষ" বিবৃতি লেখেন না, তাই না? যদিও আমি বিবৃতিতে একমত, আমার মনে হয় যে এর সীমা আছে। যদিও আমরা সেই সীমানা নিয়ে তর্ক করতে পারি, আমি মনে করি আমরা সকলেই একমত হতে পারি, একটি লাইন আছে, যা অতিক্রম করা অবৈধ। এবং যেহেতু এই সিদ্ধান্ত সম্পর্কে অনেক মতামত এবং ন্যায্যতা আছে, আমি মনে করি না এটি একটি পরিষ্কার পছন্দ ছিল। কমপক্ষে, আমি কোনও উত্স পাই না, যেখানে এটি স্পষ্টভাবে বলা হয়েছে
হাসান আম্মুরি

3

এটি হতে পারে কারণ @ গ্লেনমায়নার্ড অন্যান্য ভাষার সাথে তুলনা করে বিষয়টি দেখছেন , কিন্তু পাইথনে আপনি অজগর উপায়ে কাজ করেন। এটি 'কেন' প্রশ্ন নয়। এটি সেখানে রয়েছে এবং আপনি একই প্রভাবতে জিনিসগুলি করতে পারেন x+=। ইন Python- র জেন , তা দেওয়া হয়: "সেখানে মাত্র একটি সমস্যা সমাধানের জন্য একমুখী হওয়া উচিত।" একাধিক পছন্দ শিল্প (মত প্রকাশের স্বাধীনতা) দুর্দান্ত তবে ইঞ্জিনিয়ারিংয়ে লম্পট।


2

++অপারেটরদের বর্গ পার্শ্ব প্রতিক্রিয়া সঙ্গে অভিব্যক্তি রয়েছে। এটি পাইথনে সাধারণত পাওয়া যায় না।

একই কারণে অ্যাসাইনমেন্টটি পাইথনের কোনও অভিব্যক্তি নয়, এইভাবে সাধারণ if (a = f(...)) { /* using a here */ }প্রতিমাটি প্রতিরোধ করে ।

শেষ পর্যন্ত আমার সন্দেহ হয় যে সেখানে অপারেটর পাইথনসের রেফারেন্স শব্দার্থের সাথে খুব সামঞ্জস্যপূর্ণ নয়। মনে রাখবেন, সি / সি ++ থেকে পরিচিত শব্দার্থবিজ্ঞানের সাথে পাইথনের ভেরিয়েবল (বা পয়েন্টার) নেই।


1
কোনও পরীক্ষা / অভিব্যক্তি / তালিকা অনুধাবনে পার্শ্ব-প্রতিক্রিয়া সহ কোনও ক্রিয়াকলাপ ডাকতে বাধা দেয় না: একটি তালিকা f(a)কোথায় a, কিছু অপরিবর্তনীয় বস্তু।
জিন-ফ্রান্সোইস ফ্যাব্রে

1

এই অপারেটরগুলি কেন সি-তে উপস্থিত রয়েছে তা জিজ্ঞাসা করার জন্য আরও একটি ভাল প্রশ্ন হতে পারে কে ওআরআর ইনক্রিমেন্ট এবং হ্রাস অপারেটরগুলিকে 'অস্বাভাবিক' বলে (বিভাগ 2.8 পৃষ্ঠা 46)। ভূমিকা তাদের "আরও সংক্ষিপ্ত এবং প্রায়শই আরও দক্ষ" বলে calls আমি সন্দেহ করি যে এই ক্রিয়াকলাপগুলি সর্বদা পয়েন্টার ম্যানিপুলেশনে আসে তা তাদের ভূমিকাতেও ভূমিকা রেখেছিল। পাইথনে সম্ভবত সিদ্ধান্ত নেওয়া হয়েছে যে ইনক্রিমেন্টগুলি অনুকূল করার চেষ্টা করার কোনও ধারণা নেই (আসলে আমি কেবল সি তে একটি পরীক্ষা করেছি, এবং মনে হয় জিসিসি-দ্বারা উত্পাদিত অ্যাসেম্বলি উভয় ক্ষেত্রে ইনক্ল্যামের পরিবর্তে অ্যাডেল ব্যবহার করে) এবং নেই পয়েন্টার গাণিতিক; সুতরাং এটি করার একমাত্র আরও উপায় হত এবং আমরা জানি পাইথন এটি ঘৃণা করে।


1

আমি এটি বুঝতে পেরেছি তাই আপনি ভাববেন না যে মেমরির মান পরিবর্তিত হয়েছে। সিতে যখন আপনি এক্স ++ করেন মেমরির এক্স এর মান পরিবর্তন হয়। তবে পাইথনটিতে সমস্ত সংখ্যা অপরিবর্তনীয় তাই সেই x পয়েন্টের ঠিকানা হিসাবে এখনও x + 1 নেই। আপনি যখন x ++ লিখবেন তখন আপনি ভাববেন যে x কী ঘটেছিল তা হ'ল এক্স রিফ্রেন্সটি মেমরির এমন একটি জায়গায় পরিবর্তিত হয় যেখানে x + 1 সঞ্চিত থাকে বা যদি ডো এর উপস্থিতি না থাকে তবে এই অবস্থানটি পুনরায় তৈরি করুন।


1
সুতরাং কি এই ++এবং থেকে আলাদা করে তোলে += 1?
বের

1

এই পৃষ্ঠায় ইতিমধ্যে ভাল উত্তর সম্পূর্ণ করতে:

ধরা যাক আমরা এটি করার সিদ্ধান্ত নিয়েছি, উপসর্গ ( ++i) যা ইউনারি + এবং - অপারেটরকে ভেঙে ফেলবে।

আজ, দ্বারা উপসর্গ করা ++বা --কিছুই করা হয় না, কারণ এটি দু'বার অ্যানারি প্লাস অপারেটরকে সক্ষম করে (কিছুই করে না) বা আনরি বিয়োগ দু'বার করে (দুইবার: নিজেকে বাতিল করে দেয়)

>>> i=12
>>> ++i
12
>>> --i
12

সুতরাং এটি সম্ভাব্যভাবে এই যুক্তি ভঙ্গ করবে।


1

অন্যান্য উত্তরগুলি বর্ণনা করেছে যে এটির পুনরুক্তিকারীদের জন্য কেন প্রয়োজন হয় না, তবে কখনও কখনও ইন-লাইনে ভেরিয়েবল বাড়ানোর ক্ষেত্রে এটি কার্যকর হয়, আপনি টিপলস এবং একাধিক অ্যাসাইনমেন্ট ব্যবহার করে একই প্রভাব অর্জন করতে পারেন:

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
: = অ্যাসিজনমেন্ট একটি অপমান
নেহেম

0

আমি মনে করি এটি সম্পর্কিত পরিবর্তন এবং অবজেক্টগুলির অপরিবর্তনীয় ধারণার সাথে সম্পর্কিত। পাইথনে 2,3,4,5 অপরিবর্তনীয়। নীচের চিত্রটি দেখুন। 2 এই অজগর প্রক্রিয়া অবধি আইডি স্থির করেছে।

ধ্রুবক এবং ভেরিয়েবলের আইডি

এক্স ++ এর অর্থ মূলত সি-তে সি-এর মতো একটি ইন-প্লেস ইনক্রিমেন্ট হবে, এক্স ++ ইন-প্লেস ইনক্রিমেন্ট সম্পাদন করবে। সুতরাং, x = 3, এবং x ++ অজগরের চেয়ে 3 এ মেমোরিতে 3 বাড়বে যেখানে 3 টি এখনও মেমরিতে থাকবে।

অজগরতে, আপনাকে স্মৃতিতে একটি মান পুনরায় তৈরি করতে হবে না। এর ফলে পারফরম্যান্স অপটিমাইজেশন হতে পারে।

এটি হান্চ ভিত্তিক উত্তর is


0

আমি জানি এটি একটি পুরানো থ্রেড, তবে ++ 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()) :
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.