পাইথনে বর্ধিতকরণ এবং হ্রাস অপারেটরদের আচরণ


795

আমি লক্ষ্য করেছি যে একটি পূর্ব-বৃদ্ধি / হ্রাস অপারেটর একটি ভেরিয়েবলের (যেমন ++count) তে প্রয়োগ করা যেতে পারে । এটি সংকলন করে, তবে এটি আসলে ভেরিয়েবলের মান পরিবর্তন করে না!

পাইথনের প্রাক-বর্ধন / হ্রাস অপারেটরগুলির (++ / -) আচরণ কী?

সি / সি ++ এ দেখা এই অপারেটরদের আচরণ থেকে পাইথন কেন বিচ্যুত হয়?


19
পাইথন সি বা সি ++ নয়। বিভিন্ন নকশার সিদ্ধান্ত ভাষা তৈরিতে গিয়েছিল। বিশেষত, পাইথন ইচ্ছাকৃতভাবে অ্যাসাইনমেন্ট অপারেটরগুলি সংজ্ঞায়িত করে না যা স্বেচ্ছাসেবী অভিব্যক্তিতে ব্যবহার করা যেতে পারে; পরিবর্তে, অ্যাসাইনমেন্ট স্টেটমেন্ট এবং বাড়ানো অ্যাসাইনমেন্ট স্টেটমেন্ট রয়েছে। নীচে রেফারেন্স দেখুন।
নেড ডিলি

8
অজগর ++এবং --অপারেটরদের কী কী আপনি ভাবতে পারেন ?
u0b34a0f6ae

29
কৌজার: সি / সি ++ থেকে এসে আমি ++ গণনা লিখি এবং এটি পাইথনে সংকলিত হয়। সুতরাং, আমি ভেবেছিলাম ভাষার অপারেটর রয়েছে।
আশ্বিন নানজাপ্পা

3
@ ফক্স আপনি এমন একটি স্তর এবং সংগঠনের একটি স্তর গ্রহণ করছেন যা প্রমাণ হিসাবে নেই
বেসিক

4
@ মেহাজে ++ এবং - সি "পয়েন্টার গাণিতিকের জন্য সিনট্যাকটিক চিনির হিসাবে" উপস্থিত নেই, এগুলি বিদ্যমান কারণ অনেক প্রসেসরের তাদের স্থানীয় নির্দেশের অংশ হিসাবে স্বয়ংক্রিয় বর্ধন এবং হ্রাস মেমরি অ্যাক্সেস প্রক্রিয়া থাকে (সাধারণ পয়েন্টার ইনডেক্সিং, স্ট্যাক ইনডেক্সিং) সেট। উদাহরণস্বরূপ, 80৮০৯ এ্যাসেম্বারার: sta x++... পারমাণবিক নির্দেশ যা ফলাফল aসংগ্রহকারীকে যেখানে xনির্দেশ করে সেখানে সঞ্চয় করে , তারপরে xসঞ্চয়ের আকারের সাহায্যে বৃদ্ধি করে। এটি করা হয়েছে কারণ এটি পয়েন্টার গাণিতিকের চেয়ে দ্রুত, কারণ এটি খুব সাধারণ এবং এটি সহজে বোঝা যায়। প্রাক এবং পোস্ট উভয়ই।
fyngyrz

উত্তর:


1057

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

++count

পার্স হিসাবে

+(+count)

যা অনুবাদ করে

count

আপনি +=যা করতে চান তা করতে আপনাকে কিছুটা দীর্ঘ অপারেটর ব্যবহার করতে হবে:

count += 1

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

  • সহজ পার্সিং। টেকনিক্যালি, পার্সিং ++countদ্ব্যর্থক, যেমন এটা হতে পারে +, +, count(দুই ইউনারী +অপারেটর) শুধু সহজে এটা হতে পারে যেমন ++, count(এক ইউনারী ++অপারেটর)। এটি কোনও তাৎপর্যপূর্ণ অস্পষ্টতা নয়, তবে এটি বিদ্যমান।
  • সরল ভাষা। ++প্রতিশব্দ ছাড়া আর কিছুই নয় += 1। এটি সংক্ষিপ্তরূপে উদ্ভাবিত হয়েছিল কারণ সি সংকলকগুলি বোকা ছিল এবং বেশিরভাগ কম্পিউটারের নির্দেশিকায় কীভাবে অনুকূল a += 1হতে পারে তা জানত না inc। সংকলক এবং বাইটকোড বর্ণিত ভাষাগুলি অনুকূলকরণের এই দিনে, প্রোগ্রামারদের তাদের কোডটি অপ্টিমাইজ করার অনুমতি দেওয়ার জন্য একটি ভাষায় অপারেটরদের যুক্ত করা সাধারণত বিশেষত পাইথনের মতো ভাষায় যা সামঞ্জস্যপূর্ণ এবং পাঠযোগ্য to
  • বিভ্রান্তিকর পার্শ্ব প্রতিক্রিয়া। ++অপারেটরগুলির সাথে ভাষাগুলিতে একটি সাধারণ নবাগত ত্রুটি হ'ল প্রাক এবং উত্তরোত্তর / হ্রাস অপারেটরগুলির মধ্যে পার্থক্যগুলি (অগ্রাধিকার হিসাবে এবং বিনিময়ের মান উভয়) মিশ্রিত করা, এবং পাইথন ভাষা "গোটচা" -কে অপসারণ করতে পছন্দ করে। প্রাধান্য বিষয় এর সি প্রাক / পোস্ট-বৃদ্ধি জগাখিচুড়ি আপ চমত্কার লোমশ, এবং অবিশ্বাস্যভাবে সহজ।

13
"দ্য অপারেটর হ'ল" পরিচয় "অপারেটর, যা কিছুই করে না" " শুধুমাত্র সংখ্যার প্রকারের জন্য; অন্য ধরণের জন্য এটি ডিফল্টরূপে একটি ত্রুটি।
newacct

45
এছাড়াও, সচেতন থাকুন যে, পাইথনে, + = এবং বন্ধুরা অপারেটর নয় যা অভিব্যক্তি হিসাবে ব্যবহার করা যেতে পারে। বরং পাইথনগুলিতে এগুলি একটি "বাড়ানো অ্যাসাইনমেন্ট স্টেটমেন্ট" এর অংশ হিসাবে সংজ্ঞায়িত করা হয়। পাইথনের ভাষা নকশার সিদ্ধান্তের সাথে সামঞ্জস্যপূর্ণ স্বতঃস্ফূর্তভাবে অপারেটর হিসাবে অ্যাসাইনমেন্ট ("=") না দেওয়ার অনুমতি দেওয়া হয়, সি তে কেউ কী করতে পারে তার বিপরীতে
নেড ডিলি

15
ইউনারি +অপারেটরের একটি ব্যবহার রয়েছে। দশমিক দশমিক দশমিক অবজেক্টের জন্য এটি বর্তমান সূক্ষ্মতার সাথে গোল করে।
u0b34a0f6ae

21
আমি পার্সার সরলকরণের উপর বাজি ধরছি। পিইপি 3099 এর আইটেমটি নোট করুন , "পাইথন 3000 এ পরিবর্তন হবে না এমন জিনিসগুলি": "পার্সার এলএল (1) এর চেয়ে বেশি জটিল হবে না complex জটিলটির চেয়ে সহজ সরল This এই ধারণাটি পার্সারে প্রসারিত। পাইথনের ব্যাকরণকে সীমাবদ্ধ করা এলএল (1) পার্সার একটি আশীর্বাদ, কোনও অভিশাপ নয় It এটি আমাদের হাতকড়াগুলিতে রাখে যা আমাদের ওভারবোর্ডে যেতে বাধা দেয় এবং কিছু অন্যান্য গতিময় ভাষার মতো মজাদার ব্যাকরণ নিয়মগুলি শেষ করে যা পার্লের মতো নামহীন হয়ে যায় "" আমি দুর্বোধ্য কিভাবে দেখতে না + +এবং ++অবিচ্ছিন্ন কলিজা (1) ছাড়া।
মাইক ডিসিমোন

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

384

আপনি যখন বৃদ্ধি বা হ্রাস করতে চান, আপনি সাধারণত এটি পূর্ণসংখ্যায় করতে চান। তাই ভালো:

b++

কিন্তু পাইথন এ, পূর্ণসংখ্যা অপরিবর্তনীয় । এটাই যে আপনি এগুলি পরিবর্তন করতে পারবেন না। এটি কারণ পূর্ণসংখ্যার অবজেক্টগুলি বেশ কয়েকটি নামে ব্যবহার করা যেতে পারে। এটা চেষ্টা কর:

>>> b = 5
>>> a = 5
>>> id(a)
162334512
>>> id(b)
162334512
>>> a is b
True

a এবং b উপরের জিনিসগুলি একই জিনিস। আপনি যদি একটি বৃদ্ধি করেন, আপনি খ বৃদ্ধিও করবেন খ। আপনি যা চান তা তা নয়। সুতরাং আপনাকে আবার নিয়োগ দিতে হবে। এটার মত:

b = b + 1

বা আরও সহজ:

b += 1

যা আবার জমা দেওয়া bহবে b+1। এটি কোনও ইনক্রিমেন্ট অপারেটর নয়, কারণ এটি বৃদ্ধি করে না b, এটি এটি পুনরায় নিয়োগ দেয়।

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


75
উদাহরণটি ভুল (এবং আপনি সম্ভবত পরিচয়ের সাথে অপরিবর্তনীয়তা বিভ্রান্ত করছেন) - কিছু ভিএম অপটিমাইজেশনের কারণে তাদের একই আইডি রয়েছে যা 255 (বা এর মতো কিছু) পর্যন্ত সংখ্যার জন্য একই অবজেক্ট ব্যবহার করে। যেমন (বড় সংখ্যা): >>> এ = 1231231231231 >>> খ = 1231231231231 >>> আইডি (এ), আইডি (খ) (32171144, 32171168)
আয়নেলম্যাক

56
অপরিবর্তনীয়তা দাবি উত্সাহী। ধারণামূলকভাবে, এর i++অর্থ ভেরিয়েবলকে বরাদ্দ i + 1করা । অর্থ বরাদ্দ করা , দ্বারা নির্দেশিত বস্তুটি সংশোধন না করা । অর্থাত্ এর মান বাড়ানোর অর্থ নয় ! ii = 5; i++6iinti5
যান্ত্রিক শামুক 4

3
@ মেকানিক্যাল শামুক: এক্ষেত্রে এটি মোটেই ইনক্রিমেন্ট অপারেটর হবে না। এবং তারপরে + = অপারেটর পরিষ্কার, আরও স্পষ্ট, আরও নমনীয় এবং যাইহোক একই জিনিসটি করে।
লেনার্ট রেজেব্রো

7
@ লেননার্টজেজব্রো: সি ++ এবং জাভাতে i++কেবল লভ্যুতে কাজ করে। যদি বিষয়টিকে নির্দেশিত বস্তুটি বাড়ানোর উদ্দেশ্যে করা হয় তবে iএই সীমাবদ্ধতা অপ্রয়োজনীয় হবে।
যান্ত্রিক শামুক

4
আমি এই উত্তর বেশ চমকপ্রদ মনে। আপনি কেন ধরে নিচ্ছেন যে ++ এর অর্থ + = 1 এর জন্য শর্টহ্যান্ড ছাড়া অন্য কোনও কিছুর অর্থ? এটাই সি-এর অর্থ হ'ল (ধরে নিলাম যে ফেরতের মান ব্যবহৃত হচ্ছে না)। আপনি বায়ু থেকে অন্য কিছু অর্থ টেনে নিয়েছেন বলে মনে হয়।
ডন হ্যাচ

52

যদিও অন্যের উত্তরগুলি যথাযথভাবে কী করে তা দেখায় যেখানে +(যেমন, সংখ্যাটি যেমন এটি হয় তবে তা ছেড়ে দিন) তবে তারা কী ঘটবে তা ব্যাখ্যা না করে তারা এ পর্যন্ত অসম্পূর্ণ।

সঠিক হতে, +xমূল্যায়ন করতে x.__pos__()এবং ++xকরতে x.__pos__().__pos__()

আমি একটি খুব অদ্ভুত শ্রেণির কাঠামো কল্পনা করতে পারি (বাচ্চারা, বাড়িতে এটি করবেন না!):

class ValueKeeper(object):
    def __init__(self, value): self.value = value
    def __str__(self): return str(self.value)

class A(ValueKeeper):
    def __pos__(self):
        print 'called A.__pos__'
        return B(self.value - 3)

class B(ValueKeeper):
    def __pos__(self):
        print 'called B.__pos__'
        return A(self.value + 19)

x = A(430)
print x, type(x)
print +x, type(+x)
print ++x, type(++x)
print +++x, type(+++x)

13

পাইথনে এই অপারেটর নেই, তবে আপনার যদি সত্যিই তাদের প্রয়োজন হয় তবে আপনি একই কার্যকারিতা সম্পন্ন একটি ফাংশন লিখতে পারেন।

def PreIncrement(name, local={}):
    #Equivalent to ++name
    if name in local:
        local[name]+=1
        return local[name]
    globals()[name]+=1
    return globals()[name]

def PostIncrement(name, local={}):
    #Equivalent to name++
    if name in local:
        local[name]+=1
        return local[name]-1
    globals()[name]+=1
    return globals()[name]-1

ব্যবহার:

x = 1
y = PreIncrement('x') #y and x are both 2
a = 1
b = PostIncrement('a') #b is 1 and a is 2

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

x = 1
def test():
    x = 10
    y = PreIncrement('x') #y will be 2, local x will be still 10 and global x will be changed to 2
    z = PreIncrement('x', locals()) #z will be 11, local x will be 11 and global x will be unaltered
test()

এছাড়াও এই ফাংশনগুলির সাহায্যে আপনি করতে পারেন:

x = 1
print(PreIncrement('x'))   #print(x+=1) is illegal!

তবে আমার মতে নিম্নলিখিত পদ্ধতিগুলি আরও স্পষ্ট:

x = 1
x+=1
print(x)

হ্রাস অপারেটর:

def PreDecrement(name, local={}):
    #Equivalent to --name
    if name in local:
        local[name]-=1
        return local[name]
    globals()[name]-=1
    return globals()[name]

def PostDecrement(name, local={}):
    #Equivalent to name--
    if name in local:
        local[name]-=1
        return local[name]+1
    globals()[name]-=1
    return globals()[name]+1

আমি আমার মডিউলে জাভাস্ক্রিপ্টটি অজগরকে অনুবাদ করে এই ফাংশনগুলি ব্যবহার করেছি।


দ্রষ্টব্য: দুর্দান্ত হওয়ার সাথে সাথে, এই স্থানীয় সাহায্যকারী পদ্ধতিগুলি যদি স্থানীয়দের ক্লাস ফাংশন স্ট্যাক ফ্রেমে উপস্থিত থাকে তবে কাজ করবে না। উদাহরণস্বরূপ - ক্লাস পদ্ধতির ডিফের মধ্যে তাদের কল করা কার্যকর হবে না - 'লোকাল ()' ডিক একটি স্ন্যাপশট, এবং স্ট্যাক ফ্রেম আপডেট করে না।
আদম

11

পাইথনে, কমন লিস্প, স্কিম বা রুবির মতো ভাষার বিপরীতে এক্সপ্রেশন এবং বিবৃতিগুলির মধ্যে একটি পার্থক্য কঠোরভাবে প্রয়োগ করা হয়।

উইকিপিডিয়া

সুতরাং এই জাতীয় অপারেটর প্রবর্তন করে, আপনি প্রকাশ / বিবৃতি বিভক্ত হবে।

একই কারণে আপনি লিখতে পারবেন না

if x = 0:
  y = 1

যেমন আপনি অন্য কয়েকটি ভাষায় পারেন যেখানে এই ধরনের পার্থক্য সংরক্ষণ করা হয়নি।


মজার বিষয় হল, অ্যাসাইনমেন্ট এক্সপ্রেশনগুলির জন্য নতুন সিনট্যাক্স (পিইপি -572 পাইথন.অর্গ / দেব / পেপস / পেপ-0572 ) সহ আগত রিলিজ পাইথন ৩.৮ এ এই বিধিনিষেধটি প্রত্যাহার করা হবে । আমরা if (n := len(a)) > 10: y = n + 1উদাহরণস্বরূপ লিখতে সক্ষম হব । লক্ষ্য করুন যে সেই উদ্দেশ্যে ( :=) এর জন্য নতুন অপারেটর প্রবর্তনের কারণে এই পার্থক্য স্পষ্ট হয়েছে
জের্টরিন

8

টি এল; ডিআর

পাইথনের অ্যানারি ইনক্রিমেন্ট / হ্রাস অপারেটর ( --/ ++) নেই। পরিবর্তে, একটি মান বৃদ্ধি করতে, ব্যবহার করুন

a += 1

আরও বিশদ এবং গেটছস

তবে এখানে সাবধান। আপনি যদি সি থেকে আগত হন তবে এটি অজগর থেকেও আলাদা। পাইথন "ভেরিয়েবল" অর্থে যে সি আছে, পরিবর্তে ব্যবহার পাইথন নেই নাম এবং বস্তু , এবং পাইথন মধ্যে intগুলি অপরিবর্তনীয় হয়।

সুতরাং আপনি করতে বলুন

a = 1

কি পাইথন এই মাধ্যম: ধরণ একটি বস্তু তৈরি intহচ্ছে মান 1এবং বাঁধুন নাম aএটি। বস্তুর একটি দৃষ্টান্ত হল intথাকার মান 1, এবং নাম a এটা বোঝায়। নাম aএবং বস্তু যা এটি উল্লেখ করে তা পৃথক।

এখন বলুন আপনি কি করেন

a += 1

যেহেতু intঅপরিবর্তনীয়, এখানে যা ঘটে তা নিম্নরূপ:

  1. অবজেক্টটি অনুসন্ধান করে দেখুন a(এটি একটি intআইডি সহ 0x559239eeb380)
  2. বস্তুর মান দেখুন 0x559239eeb380(এটি হ'ল 1)
  3. সেই মানটিতে 1 যুক্ত করুন (1 + 1 = 2)
  4. মান সহ একটি নতুন int অবজেক্ট তৈরি করুন 2(এতে অবজেক্ট আইডি রয়েছে 0x559239eeb3a0)
  5. aএই নতুন অবজেক্টটিতে নামটি পুনরায় ফিরিয়ে দিন
  6. এখন aঅবজেক্টকে বোঝায় 0x559239eeb3a0এবং মূল অবজেক্ট ( 0x559239eeb380) আর নাম দিয়ে রেফার করা হয় না a। আসল অবজেক্টটির উল্লেখ করে অন্য কোনও নাম না থাকলে এটি পরে আবর্জনা সংগ্রহ করা হবে।

নিজে চেষ্টা করে দেখুন:

a = 1
print(hex(id(a)))
a += 1
print(hex(id(a)))

6

হ্যাঁ, আমি ++ এবং - কার্যকারিতাও মিস করেছি। সি কোডের কয়েক মিলিয়ন লাইন আমার পুরানো মাথায় এই ধরণের চিন্তাভাবনা আঁকিয়েছিল, এবং এটির বিরুদ্ধে লড়াই করার চেয়ে ... এখানে আমি ক্লাস করেছি যা প্রয়োগ করে:

pre- and post-increment, pre- and post-decrement, addition,
subtraction, multiplication, division, results assignable
as integer, printable, settable.

এখানে:

class counter(object):
    def __init__(self,v=0):
        self.set(v)

    def preinc(self):
        self.v += 1
        return self.v
    def predec(self):
        self.v -= 1
        return self.v

    def postinc(self):
        self.v += 1
        return self.v - 1
    def postdec(self):
        self.v -= 1
        return self.v + 1

    def __add__(self,addend):
        return self.v + addend
    def __sub__(self,subtrahend):
        return self.v - subtrahend
    def __mul__(self,multiplier):
        return self.v * multiplier
    def __div__(self,divisor):
        return self.v / divisor

    def __getitem__(self):
        return self.v

    def __str__(self):
        return str(self.v)

    def set(self,v):
        if type(v) != int:
            v = 0
        self.v = v

আপনি এটি এর মতো ব্যবহার করতে পারেন:

c = counter()                          # defaults to zero
for listItem in myList:                # imaginary task
     doSomething(c.postinc(),listItem) # passes c, but becomes c+1

... ইতিমধ্যে সি আছে, আপনি এটি করতে পারেন ...

c.set(11)
while c.predec() > 0:
    print c

....বা শুধু...

d = counter(11)
while d.predec() > 0:
    print d

... এবং (পুনরায়) নিয়োগের জন্য পূর্ণসংখ্যায় ...

c = counter(100)
d = c + 223 # assignment as integer
c = c + 223 # re-assignment as integer
print type(c),c # <type 'int'> 323

... যদিও এটি সি টাইপ কাউন্টার হিসাবে বজায় রাখবে:

c = counter(100)
c.set(c + 223)
print type(c),c # <class '__main__.counter'> 323

সম্পাদনা করুন:

এবং তারপরে এই অপ্রত্যাশিত (এবং পুরোপুরি অযাচিত) আচরণ রয়েছে ,

c = counter(42)
s = '%s: %d' % ('Expecting 42',c) # but getting non-numeric exception
print s

... কারণ এই টিপলের অভ্যন্তরে, গেটাইটেম () যা ব্যবহৃত তা নয়, পরিবর্তে অবজেক্টের একটি রেফারেন্স বিন্যাসকরণ ফাংশনে প্রেরণ করা হয়। দীর্ঘশ্বাস. তাই:

c = counter(42)
s = '%s: %d' % ('Expecting 42',c.v) # and getting 42.
print s

... বা, আরও ভার্বোসিয়েলে এবং স্পষ্টভাবে আমরা কী ঘটতে চেয়েছিলাম তা স্পষ্টভাবে বলা হয়েছে, যদিও ভার্বোসিটির দ্বারা প্রকৃত আকারে প্রতি-ইঙ্গিত দেওয়া হয়েছে ( c.vপরিবর্তে ব্যবহার করুন) ...

c = counter(42)
s = '%s: %d' % ('Expecting 42',c.__getitem__()) # and getting 42.
print s

2

সি এর মতো ভাষায় পাইথনগুলিতে পাইথ / প্রাক ইনক্রিমেন্ট / হ্রাস অপারেটর নেই

আমরা গণিত (-1) * (-1) = (+1) এর মতো একাধিক লক্ষণগুলি গুণমান হিসাবে দেখতে ++বা দেখতে পাচ্ছি can--

যেমন

---count

পার্স হিসাবে

-(-(-count)))

যা অনুবাদ করে

-(+count)

কারণ, -সাইন দিয়ে -সাইন এর গুণফল+

এবং পরিশেষে,

-count

1
এটি কী বলে যে অন্যান্য উত্তরগুলি দেয় না?
ড্যানিয়েল বি।

@DanielB। অন্যান্য উত্তর অভ্যন্তরীণভাবে কী ঘটে তা জানায় নি। এবং, তারা কখনই লিখেনি কখন কি হবে তা তারা জানায় নি -----count
অনুজ

প্রথম, গৃহীত উত্তর দেয়। ...
ড্যানিয়েল বি

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

0

অজগর 3.8+ এ আপনি করতে পারেন:

(a:=a+1) #same as a++

আপনি এটি দিয়ে অনেক চিন্তা করতে পারেন।

>>> a = 0
>>> while (a:=a+1) < 5:
    print(a)


1
2
3
4

অথবা আপনি যদি আরও পরিশীলিত সিনট্যাক্স সহ কিছু লিখতে চান (লক্ষ্যটি অপ্টিমাইজেশন নয়):

>>> del a
>>> while (a := (a if 'a' in locals() else 0) + 1) < 5:
    print(a)


1
2
3
4

ত্রুটি ছাড়াই একটি ডস উপস্থিত না থাকলে এটি 0 টি ফিরে আসবে এবং তারপরে এটি 1 এ সেট করবে

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