2010-04-08 14 views
47

यह एक स्थिति में काम करना संभव है?क्या हमारे पास एक शर्त में असाइनमेंट हो सकता है?

पूर्व के लिए

if (a=some_func()): 
    # Use a 
+5

-1: तुच्छ खुद के जवाब देने के लिए। डुप्लिकेट: http://stackoverflow.com/questions/1663995/python-variable-assignment-and-if-statement –

+1

@ एसएलॉट यह जानना इतना छोटा नहीं है कि क्यों, अगर यह कुछ उत्तरों के लिए नहीं था जो वर्णन करते हैं यहाँ। –

उत्तर

66

इसे क्यों न करें?

>>> def some_func(): 
... return 2 
... 
>>> a = 2 
>>> if (a = some_func()): 
    File "<stdin>", line 1 
    if (a = some_func()): 
     ^
SyntaxError: invalid syntax 
>>> 

तो, नहीं। अजगर में

+17

यह जानबूझकर Guido, उदार पायथन तानाशाह के रूप में मना किया गया है, उन्हें अनावश्यक और उपयोगी से अधिक भ्रमित लगता है। यही कारण है कि कोई पोस्ट-इंक्रिमेंट या प्री-एन्हांसमेंट ऑपरेटर (++) नहीं है। –

+4

उन्होंने 2.0 में * संवर्धित आकलन * को जोड़ने की अनुमति दी क्योंकि 'x = x + 1' को अतिरिक्त लुकअप समय की आवश्यकता होती है जबकि 'x + = 1' कुछ हद तक तेज़ था, लेकिन मुझे यकीन है कि उसे ऐसा करना भी पसंद नहीं था * * बहुत। :-) – wescpy

4

नंबर असाइनमेंट एक बयान, नहीं एक अभिव्यक्ति है।

+0

और गिडो के पास यह कोई अन्य तरीका नहीं होगा। –

+0

@MarkRansom सभी जय Guido। * सही * .. श्वास। – javadba

+0

@javadba वह लड़का गलत होने से कहीं अधिक बार सही रहा है। मैं सराहना करता हूं कि दृष्टि के प्रभारी एक व्यक्ति को समिति द्वारा डिजाइन की तुलना में अधिक सुसंगत रणनीति में परिणाम मिलता है; मैं सी ++ के साथ तुलना और विपरीत कर सकता हूं जो मेरी मुख्य रोटी और मक्खन है। –

15

http://docs.python.org/tutorial/datastructures.html

ध्यान दें कि अजगर में, सी के विपरीत, काम भाव के अंदर नहीं हो सकता है। C प्रोग्रामर इस बारे में शिकायत कर सकते हैं, लेकिन यह समस्याओं सी कार्यक्रमों में सामना करना पड़ा के एक आम वर्ग से बचा जाता है: = टाइपिंग एक अभिव्यक्ति में जब == इरादा था।

यह भी देखें:

http://effbot.org/pyfaq/why-can-t-i-use-an-assignment-in-an-expression.htm

33

नहीं, BDFL कि सुविधा पसंद नहीं आया।

जहां से मैं बैठता हूं, "बेव्वोलेंट डिक्टेटर फॉर लाइफ", ग्विडो वैन रॉसम ने पाइथन को जितना आसान बनाया उतना आसान रखने के लिए कड़ी मेहनत की है। हम अपने द्वारा किए गए कुछ निर्णयों के साथ छेड़छाड़ कर सकते हैं - मैं पसंद करता वह 'नहीं' एक से एक नरक अधिक बार। लेकिन तथ्य यह है कि वहाँ नहीं बड़े पैमाने पर योग्यता के आधार पर, एक समिति अजगर को डिजाइन करने, लेकिन इसके बजाय एक विश्वसनीय "सलाहकार बोर्ड" किया गया है, एक डिजाइनर की संवेदनशीलता के माध्यम से फ़िल्टरिंग, उत्पादन किया गया है कहा अच्छा भाषा, IMHO

+3

सरल? यह सुविधा मेरे कुछ कोड को सरल बना सकती है क्योंकि यह इसे अधिक कॉम्पैक्ट बना सकती है और इसके लिए अधिक पठनीय भी हो सकती है। अब मुझे दो लाइनों की आवश्यकता है जहां मुझे एक की आवश्यकता थी। मुझे इस बात का कोई मुद्दा नहीं मिला कि क्यों पाइथन ने अन्य प्रोग्रामिंग भाषाओं को कई वर्षों तक अस्वीकार कर दिया है (और अक्सर एक बहुत अच्छे कारण के लिए)। विशेष रूप से यह सुविधा हम यहां के बारे में बात कर रहे हैं बहुत उपयोगी है। –

11

सीधे नहीं, this old recipe of mine प्रति -। लेकिन जैसा कि नुस्खा यह, अर्थ बराबर का निर्माण करने जैसे यदि आप एक सी-कोडेड संदर्भ एल्गोरिथ्म से सीधे अनुवाद कर की जरूरत है आसान है कहते हैं (अधिक-मुहावरेदार को पुनर्रचना से पहले पायथन, cour se ;-)। अर्थात्:

class DataHolder(object): 
    def __init__(self, value=None): self.value = value 
    def set(self, value): self.value = value; return value 
    def get(self): return self.value 

data = DataHolder() 

while data.set(somefunc()): 
    a = data.get() 
    # use a 

Btw, अपने विशिष्ट मामले के लिए एक बहुत मुहावरेदार pythonic प्रपत्र, यदि आप वास्तव में पता है कि falsish मूल्य somefunc वापस आ सकते हैं जब यह एक falsish मूल्य (जैसे 0) वापसी करता है,

for a in iter(somefunc, 0): 
    # use a 
है

इसलिए इस विशिष्ट मामले में रिफैक्टरिंग बहुत आसान होगी ;-)।

वापसी हो सकता है falsish मूल्य के किसी भी तरह (0, None, '', ...), एक संभावना है:

import itertools 

for a in itertools.takewhile(lambda x: x, iter(somefunc, object())): 
    # use a 

लेकिन आप एक साधारण कस्टम जनरेटर पसंद कर सकते हैं:

def getwhile(func, *a, **k): 
    while True: 
     x = func(*a, **k) 
     if not x: break 
     yield x 

for a in getwhile(somefunc): 
    # use a 
1

कारण कार्य की स्थिति में अवैध हैं की है कि यह आसान है एक गलती करते हैं और यह सच है आवंटित करने के लिए है या गलत:

some_variable = 5 

# This does not work 
# if True = some_variable: 
# do_something() 

# This only works in Python 2.x 
True = some_variable 

print True # returns 5 

अजगर 3 यह सच है और झूठी में कीवर्ड है, तो कोई खतरा नहीं अब और कर रहे हैं।

+1

में [161]: l_empty == [] आउट [161]: यह सच है में [162] [] == [] आउट [162]: यह सच है मुझे नहीं लगता कि उस कारण है – volcano

0

आप आप के लिए बताए करने के लिए एक समारोह को परिभाषित कर सकते हैं:

def assign(name, value): 
    import inspect 
    frame = inspect.currentframe() 
    try: 
     locals_ = frame.f_back.f_locals 
    finally: 
     del frame 
    locals_[name] = value 
    return value 

if assign('test', 0): 
    print("first", test) 
elif assign('xyz', 123): 
    print("second", xyz) 
संबंधित मुद्दे