অজগরটিতে + = কী করে?


118

অজগরটিতে আমার কী + = কী তা জানতে হবে। এটা খুব সহজ। আমি পাইথনের অন্যান্য সংক্ষিপ্ত হাত সরঞ্জামগুলির সংজ্ঞা সংযোগগুলির লিঙ্কগুলিরও প্রশংসা করব।



2
এটি পাইথনের একটি প্রাথমিক অপারেটর (এবং আরও অনেকগুলি ভাষায়), আপনার যদি গুগল দিয়ে শুরু করা উচিত, যদি আপনি কোনও অজগর রেফারেন্স না পড়েন।
টেকনোমেজ

3
@ অ্যান্ডিডগ এটি সত্য যদিও উভয় প্রশ্নই (+ =) অপারেটর সম্পর্কে, আপনি যেটি সংযুক্ত করেছেন সেটি হ'ল একটি পরিশীলিত ব্যবহার এবং সূক্ষ্ম সমস্যা সম্পর্কিত এবং এখানে ওপি সম্ভবত সেখানে যুক্তিটি অনুসরণ করতে সক্ষম নয় (এখনও)।
ড। বেলিসারিয়াস

3
@ অ্যান্ডিডগ সম্ভবত আপনি ঠিক তখনই ঠিক ছিলেন তবে এখানে (প্রায়) গৃহীত সমাধানগুলির দিকে তাকালে স্পষ্ট বোঝা যাচ্ছে যে এই প্রশ্নটি অপারেটরের একটি প্রাথমিক বোধ সম্পর্কে: ডি
ডাঃ বেলিসেরিয়াস

উত্তর:


148

পাইথনে, + = হ'ল __iadd__বিশেষ পদ্ধতির জন্য চিনির আবরণ , __add__বা __radd__যদি __iadd__উপস্থিত না থাকে। __iadd__একটি বর্গ পদ্ধতি কিছু এটা ব্যবহার করতে চান করতে পারেন। তালিকার অবজেক্টটি এটিকে প্রয়োগ করে এবং পুনরুক্ত করার জন্য এটি ব্যবহার করে পুনর্ব্যবহারযোগ্য অবজেক্টের মাধ্যমে প্রতিটি উপাদানকে নিজের সাথে সংযুক্ত করে একইভাবে তালিকার প্রসারিত পদ্ধতিটি করে।

এখানে একটি সাধারণ কাস্টম শ্রেণি যা __iadd__বিশেষ পদ্ধতিটি কার্যকর করে । আপনি অবজেক্টটি কোনও int দিয়ে সূচনা করুন, তারপরে একটি সংখ্যা যুক্ত করতে + = অপারেটরটি ব্যবহার করতে পারেন। __iadd__এটি কল হয়ে যায় তা দেখানোর জন্য আমি একটি মুদ্রণ বিবৃতি যুক্ত করেছি । এছাড়াও, __iadd__কোনও বস্তুর প্রত্যাশা প্রত্যাশিত, তাই আমি নিজের সংযোজন এবং অন্যান্য সংখ্যাটিও ফিরিয়ে দিয়েছি যা এই ক্ষেত্রে অর্থপূর্ণ।

>>> class Adder(object):
        def __init__(self, num=0):
            self.num = num

        def __iadd__(self, other):
            print 'in __iadd__', other
            self.num = self.num + other
            return self.num

>>> a = Adder(2)
>>> a += 3
in __iadd__ 3
>>> a
5

আশাকরি এটা সাহায্য করবে.


24
যদিও আসকারটি এটির জন্য নয়, আসল উত্তরের জন্য +1 করেছে। =)
মাইকেল

@ মিশেল, সেখানেই হাস্যরসের যোগসূত্রটি যুক্ত করে ... :
হারুন জন সাবু

3
প্রশ্নের উত্তর দেওয়ার জন্য +1, তবে -1 __iadd__অন্যরকম ফেরত দেওয়ার জন্য (যা নিজেই যুক্তযোগ্য)
কালেথ

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

129

+= ভেরিয়েবলের মান সহ অন্য মান যুক্ত করে এবং ভেরিয়েবলের জন্য নতুন মান নির্ধারণ করে।

>>> x = 3
>>> x += 2
>>> print x
5

-=, *=, /=বিয়োগ, গুণ এবং বিভাগ জন্য অনুরূপ নয়।


19
"নিজেই" আসলে এখানে খুব খারাপ বর্ণনা, কারণ পূর্ণসংখ্যার পরিবর্তনযোগ্য নয়।
AndiDog

41

x += 5x = x + 5পাইথনে বলার মতো নয় ।

এখানে নোট করুন:

In [1]: x = [2,3,4]    
In [2]: y = x    
In [3]: x += 7,8,9    
In [4]: x
Out[4]: [2, 3, 4, 7, 8, 9]    
In [5]: y
Out[5]: [2, 3, 4, 7, 8, 9]    
In [6]: x += [44,55]    
In [7]: x
Out[7]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [8]: y
Out[8]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [9]: x = x + [33,22]    
In [10]: x
Out[10]: [2, 3, 4, 7, 8, 9, 44, 55, 33, 22]    
In [11]: y
Out[11]: [2, 3, 4, 7, 8, 9, 44, 55]

রেফারেন্সের জন্য দেখুন: কেন + = তালিকাগুলিতে অপ্রত্যাশিত আচরণ করে?


এটি একই, যদিও, অদ্ভুত মামলাটি x += 7,8,9
বাদে

এছাড়াও, সংযুক্ত থ্রেডগুলির মধ্যে একটি এটি ঠিক কোথায় পৃথক হয়েছে সে সম্পর্কে একটি ভাল আলোচনা সরবরাহ করে। stackoverflow.com/questions/6951792/...
UFOs

31

+=একটি ভেরিয়েবলের সাথে একটি সংখ্যা যুক্ত করে, প্রক্রিয়াটিতে ভেরিয়েবলটি নিজেই পরিবর্তন করে (যেখানে +তা হবে না)। এর অনুরূপ, নিম্নলিখিতগুলি রয়েছে যা পরিবর্তনশীলকেও সংশোধন করে:

  • -=, পরিবর্তনশীল থেকে একটি মান বিয়োগ করে ফলাফলের সাথে ভেরিয়েবল সেট করে
  • *=, পরিবর্তনশীল এবং মানকে গুণিত করে ফলাফলকে পরিবর্তনশীল করে তোলে
  • /=, ভেরিয়েবলকে মান দ্বারা বিভক্ত করে ফলাফলকে পরিবর্তনশীল করে তোলে
  • %=, ভেরিয়েবলটি তার ফলাফলটিতে সেট করার সাথে ভেরিয়েবলের উপর মডুলাস সম্পাদন করে

অন্যরাও থাকতে পারে। আমি পাইথন প্রোগ্রামার নই।


2
সংখ্যার জন্য, এই উত্তরটি সঠিক। (দেখুন ব্রায়ান এর উত্তর বিশেষ আচরণের জন্য।) আছে নিশ্চয়ই বিভিন্ন অন্যদের bitwise অপারেটরদের (তত্সহ &=, >>=ইত্যাদি) এবং অতিরিক্ত গণিত অপারেটরদের ( **=, ইত্যাদি)।
মাইকেল


15

এটি নিছক সিনট্যাকটিক শর্টকাট নয়। এটা চেষ্টা কর:

x=[]                   # empty list
x += "something"       # iterates over the string and appends to list
print(x)               # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

বনাম

x=[]                   # empty list
x = x + "something"    # TypeError: can only concatenate list (not "str") to list

এটি চিত্রিত করে যে + = আইএডিডি তালিকার পদ্ধতিটি আহ্বান করে তবে + যোগগুলি যোগ করে , যা তালিকাগুলি সহ বিভিন্ন কাজ করে।


7

মূলত a + = b একটিতে ফলাফল সংরক্ষণের জন্য "b" যুক্ত করে adds এই সরল বর্ণনায় অনেক ভাষাতে + = অপারেটরের বর্ণনা দেওয়া হবে।

তবে সরল বর্ণনাটি বেশ কয়েকটি প্রশ্ন উত্থাপন করে।

  1. "যুক্ত" বলতে আমরা আসলে কী বুঝি?
  2. "ফলাফলটিকে একটি" সংরক্ষণ করে "বলতে কী বোঝায়? পাইথন ভেরিয়েবলগুলি বস্তুগুলির রেফারেন্সগুলি সরাসরি সংরক্ষণ করে মান সংরক্ষণ করে না।

পাইথনে এই দুটি প্রশ্নের উত্তর a এর ডেটা টাইপের উপর নির্ভর করে।


সুতরাং "যোগ" মানে কি?

  • সংখ্যার জন্য এটি সংখ্যাসূচক সংযোজন।
  • তালিকাগুলি, টিপলস, স্ট্রিং ইত্যাদির জন্য এর অর্থ সংক্ষিপ্তকরণ।

নোট করুন যে তালিকার জন্য + = আরও নমনীয় +, তালিকার + অপারেটরের জন্য অন্য তালিকার প্রয়োজন, তবে + = অপারেটর যেকোন পুনরাবৃত্তিকে গ্রহণ করবে।


সুতরাং "একটিতে মান সংরক্ষণ করা" এর অর্থ কী?

যদি বস্তুটি পরিবর্তনীয় হয় তবে স্থান পরিবর্তন করে এটি উত্সাহিত করা হয় (তবে প্রয়োজন হয় না)। সুতরাং এটি একই জিনিস একই পয়েন্ট একটি পয়েন্ট কিন্তু এখন অবজেক্ট বিভিন্ন কন্টেন্ট আছে।

যদি বস্তুটি অপরিবর্তনীয় থাকে তবে স্পষ্টতই এটি স্থানটিতে পরিবর্তনটি সম্পাদন করতে পারে না। কিছু পরিবর্তনীয় অবজেক্টের কোনও "ইনস-প্লেস" অপারেশন প্রয়োগ নাও থাকতে পারে। এই ক্ষেত্রে ভেরিয়েবল "এ" আপডেট করা হবে একটি অতিরিক্ত ক্রিয়াকলাপের ফলাফল যুক্ত একটি নতুন অবজেক্টের দিকে নির্দেশ করতে।

প্রযুক্তিগতভাবে এটি __IADD__প্রথমে সন্ধান করে প্রয়োগ করা হয় , যদি তা প্রয়োগ না হয় তবে __ADD__চেষ্টা করা হয় এবং শেষ পর্যন্ত __RADD__


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

def dostuff(a):
    b = a
    a += (3,4)
    print(repr(a)+' '+repr(b))

dostuff((1,2))
dostuff([1,2])

যখন আমরা একটি টিউপল দিয়ে ডোস্টফ শুরু করি তখন টিউপলটি + = অপারেশনের অংশ হিসাবে অনুলিপি করা হয় এবং তাই বি প্রভাবিত হয় না। তবে আমরা যখন এটি একটি তালিকার সাথে প্রার্থনা করি তখন তালিকাটি জায়গায় পরিবর্তিত হয়, সুতরাং ক এবং খ উভয়ই ক্ষতিগ্রস্থ হয়।

পাইথন 3 এ, "বাইটস" এবং "বাইটারি" প্রকারের সাথে একই রকম আচরণ লক্ষ্য করা যায়।


অবশেষে নোট করুন যে বস্তুটি প্রতিস্থাপন না করা হলেও পুনরায় নিয়োগের ঘটনা ঘটে happens বাম দিকের দিকটি কেবল একটি পরিবর্তনশীল তবে এটি তাত্পর্যপূর্ণ আচরণের কারণ হতে পারে যখন আপনার পরিবর্তনীয় সংগ্রহের ক্ষেত্রে পরিবর্তনীয় সংগ্রহগুলি উল্লেখ করে:

a = ([1,2],[3,4])
a[0] += [5]

এই ক্ষেত্রে [5] সফলভাবে একটি [0] দ্বারা উল্লিখিত তালিকায় যুক্ত হবে তবে তারপরে কোড ব্যতীত একটি ব্যতিক্রম উত্থাপিত হবে এবং একটি [0] পুনরায় সাইন করতে ব্যর্থ হলে।


5

সংক্ষিপ্ত উত্তরটি +=অনুবাদ করা যেতে পারে "+ + এর বামে চলকটিতে ডানদিকে যা কিছু আছে তার যোগ করুন" হিসাবে অনুবাদ করা যেতে পারে।

যাত্রা। আপনার যদি থাকে a = 10তবে a += 5তা হ'ল: a = a + 5

সুতরাং, "এ" এখন 15 এর সমান।


এই উত্তরটি ইতিমধ্যে আলোচিত হয়নি এমন কী অবদান রাখে? এটি একটি সদৃশ উত্তর ...

জেডিভি, শুধু সাহায্য করার চেষ্টা করছি। আমি একটি নতুন অবদানকারী, তাই দুঃখিত যদি আপনি মনে করেন আমার উত্তরটি সদৃশ ছিল।

এটি পরিষ্কার যে আপনি অন্যান্য উত্তরগুলির বেশিরভাগটির দিকে নজর দিলে এটি একটি সদৃশ। এটি অবদান রাখা ভাল, তবে নতুন কিছু অবদানের জন্য আপনার প্রচেষ্টা করা উচিত (উদাহরণস্বরূপ, অ্যাড বনাম আইএডিডি উত্তর এর মতো) অথবা আপনি একটি পরিষ্কার সমাধানে ছুরিকাঘাত নিতে চান। তবে, যতদূর আমি বলতে পারি, শীর্ষ-মতামতযুক্ত উত্তরগুলি আপনি যতটা মৌলিক উত্তরের জন্য পেতে পারেন তত পরিষ্কার are

4

নোট কিছু পরিস্থিতিতে x += yযেমন একই থাকে না x = x + yযেখানে অপারেটর অগ্রাধিকারের কারণে অতিরিক্ত অপারেটর অন্তর্ভুক্ত থাকে কারণ ডান হাতটি সর্বদা প্রথমে মূল্যায়ন করা হয়, যেমন

>>> x = 2
>>> x += 2 and 1
>>> x
3

>>> x = 2
>>> x = x + 2 and 1
>>> x
1

প্রথম কেসটি এতে প্রসারিত করুন:

>>> x = 2
>>> x = x + (2 and 1)
>>> x
3

অন্যান্য অপারেটরগুলির সাথে 'রিয়েল ওয়ার্ল্ড'-এ আপনার মুখোমুখি হওয়ার সম্ভাবনা বেশি

x *= 2 + 1== x = x * (2 + 1)! =x = x * 2 + 1


4

+= লেখার জন্য একটি শর্টকাট

number = 4
number = number + 1

সুতরাং পরিবর্তে আপনি লিখতে হবে

numbers = 4
numbers += 1

দুটি উপায়ই সঠিক তবে উদাহরণ দুটি আপনাকে কিছুটা কম কোড লিখতে সহায়তা করে


1
আচরণ সংখ্যায় একই তবে সাধারণভাবে এটি একই রকম নয়।
প্লাগওয়াশ

0

অন্যরা যেমন বলেছে, + = অপারেটর একটি শর্টকাট। একটি উদাহরণ:

var = 1;
var = var + 1;
#var = 2

এটিও এর মতো লেখা যেতে পারে:

var = 1;
var += 1;
#var = 2

সুতরাং প্রথম উদাহরণ লেখার পরিবর্তে, আপনি কেবল দ্বিতীয়টি লিখতে পারেন, যা ঠিক কাজ করবে।


0

মনে রাখবেন আপনি যখন পুরনো ক্যালকুলেটরে 2 এবং 3 উদাহরণস্বরূপ যোগফল ব্যবহার করতেন এবং প্রতিবার =আপনি যখন মোটে 3 টি যুক্ত +=দেখেন তখন একই কাজ করবে। উদাহরণ:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8

0

আমি অনেকগুলি উত্তর দেখছি যা একাধিক পূর্ণসংখ্যার সাথে + = ব্যবহার করে না।

একটি উদাহরণ:

x -= 1 + 3

এটি অনুরূপ হবে:

x = x - (1 + 3)

এবং না:

x = (x - 1) + 3

0

ডকুমেন্টেশন অনুযায়ী

x += yসমতূল্য x = operator.iadd(x, y)। এটির আর একটি উপায় বলতে z = operator.iadd(x, y)গেলে তা যৌগিক বিবরণের সমতুল্য z = x; z += y

তাই x += 3হিসাবে একই x = x + 3

x = 2

x += 3

print(x)

আউটপুট 5 হবে।

লক্ষ্য করুন যে এছাড়াও আছে

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