पायथन में एक साइन फंक्शन क्यों नहीं है?


241

मैं समझ नहीं पा रहा हूं कि पायथन में कोई signफंक्शन क्यों नहीं है । इसमें एक absबिलिन है (जिसे मैं signबहन मानता हूं ), लेकिन नहीं sign

अजगर 2.6 में एक copysignफ़ंक्शन ( गणित में ) भी है, लेकिन कोई संकेत नहीं है। क्यों एक लिखने के लिए परेशान copysign(x,y)जब तुम सिर्फ एक लिख सकता है signऔर उसके बाद प्राप्त copysignसीधे से abs(x) * sign(y)? उत्तरार्द्ध बहुत अधिक स्पष्ट होगा: x, y के चिन्ह के साथ, जबकि नकल के साथ आपको याद रखना होगा कि क्या यह x के चिन्ह के साथ y या y के चिन्ह के साथ x है!

स्पष्ट रूप से sign(x)इससे अधिक कुछ भी प्रदान नहीं करता है cmp(x,0), लेकिन यह बहुत अधिक पठनीय होगा कि यह भी (और अजगर के लिए बहुत पठनीय भाषा के लिए, यह एक बड़ा प्लस होगा)।

अगर मैं एक अजगर डिजाइनर था, तो मैं दूसरा तरीका हो सकता है: कोई cmpबिल्डिन नहीं , बल्कि एक sign। जब आपको आवश्यकता होती है cmp(x,y), तो आप बस एक sign(x-y)(या, गैर-संख्यात्मक सामान के लिए भी बेहतर कर सकते हैं , बस एक x> y - बेशक यह sortedएक पूर्णांक तुलनित्र के बजाय एक बूलियन को स्वीकार करने की आवश्यकता होनी चाहिए )। यह भी अधिक स्पष्ट होगा: सकारात्मक जब x>y(जबकि साथ cmpआप सम्मेलन सकारात्मक ध्यान रखना महत्वपूर्ण है है पहला है बड़ा है, लेकिन यह दूसरी तरह के आसपास हो सकता है)। बेशक cmpअन्य कारणों से अपने आप में समझ में आता है (जैसे कि गैर-संख्यात्मक चीजों को सॉर्ट करते समय, या यदि आप चाहते हैं कि सॉर्ट स्थिर हो, जो केवल बूलियन के साथ उपयोग करना संभव नहीं है)

तो, सवाल यह है कि पायथन डिजाइनर (नों) signने भाषा से समारोह को छोड़ने का फैसला क्यों किया ? बिल्ली copysignअपने माता-पिता के साथ क्यों परेशान होती है sign?

क्या मैं कुछ भूल रहा हूँ?

EDIT - पीटर हैनसन की टिप्पणी के बाद। उचित है कि आपने इसका उपयोग नहीं किया, लेकिन आपने यह नहीं कहा कि आप अजगर के लिए क्या उपयोग करते हैं। 7 वर्षों में जो मैं अजगर का उपयोग करता हूं, मुझे इसकी अनगिनत बार आवश्यकता थी, और आखिरी वह तिनका है जिसने ऊंट की पीठ को तोड़ा है!

हां, आप cmp को पास कर सकते हैं, लेकिन 90% बार जब मुझे इसे पास करने की जरूरत थी, तो यह एक मुहावरे में था जैसे lambda x,y: cmp(score(x),score(y))कि साइन के साथ काम करना ठीक होगा।

अंत में, मुझे आशा है कि आप सहमत हैं कि signइससे अधिक उपयोगी होगा copysign, इसलिए भले ही मैंने आपका विचार खरीदा हो, साइन के बजाय गणित में इसे परिभाषित करने के बारे में क्यों परेशान हो? साइन की तुलना में नकल कितना उपयोगी हो सकता है?


33
@Mazzoni: क्या यह तर्क इस साइट के सभी सवालों के लिए काम नहीं करेगा? बस स्टैकओवरफ़्लो और संबंधित विषय देव या उपयोगकर्ता मेलिंग सूची के लिए हर प्रश्न पूछें!
डेविड डे

43
किसी प्रश्न के लिए उचित स्थान कोई भी स्थान है जहाँ इसका उत्तर दिए जाने की संभावना है। इस प्रकार, स्टैकओवरफ़्लो एक उचित स्थान है।
स्टेफानो बोरीनी

23
-1: @ डेविड: "क्यों" और "क्यों नहीं" सवालों के जवाब यहां आम तौर पर नहीं दिए जा सकते। चूंकि पायथन विकास के अधिकांश प्रधानाचार्य यहां सवालों के जवाब नहीं देते हैं, आप शायद ही कभी (यदि कभी हो) "क्यों" या "क्यों नहीं" प्रश्न का उत्तर पाने जा रहे हैं। इसके अलावा, आपको हल करने के लिए कोई समस्या नहीं है। आपको लगता है जैसे आपके पास एक शेख़ी है। यदि आपको कोई समस्या है ("मैं इस उदाहरण में संकेत की कमी के आसपास कैसे काम करूं ...") यह समझदार है। "क्यों नहीं" इस स्थान के लिए समझदार नहीं है।
लोट

31
सवाल थोड़ा भावुक हो सकता है, लेकिन मुझे नहीं लगता कि यह एक बुरा सवाल है। मुझे यकीन है कि बहुत से लोगों ने एक अंतर्निहित साइन फ़ंक्शन के लिए देखा है, इसलिए यह उत्सुक हो सकता है कि कोई एक क्यों नहीं है।
फोगबर्ड

17
यह एक पूरी तरह से वस्तुनिष्ठ प्रश्न है: "क्यों" पायथन में किसी भी विशेषता का अभाव है, भाषा डिजाइन के इतिहास के बारे में एक वैध प्रश्न है, जिसका उत्तर अजगर या देव (अन्य कभी-कभी ब्लॉग पोस्ट) से उपयुक्त चर्चा को जोड़कर दिया जा सकता है जहां पायथन मुख्य डेवलपर्स एक विषय हैश करने के लिए होते हैं। पहले अपने आप को अजगर देव में इतिहास के बिट्स के लिए Google के लिए कोशिश कर रहा हूँ, मैं समझ सकता हूँ क्यों भाषा के लिए एक नवागंतुक एक मृत अंत मारा और जवाब देने के लिए एक अधिक अनुभवी अजगर व्यक्ति की उम्मीद में यहाँ आ सकता है!
ब्रैंडन रोड्स

जवाबों:


228

संपादित करें:

वास्तव में एक पैच था जो गणितsign() में शामिल था , लेकिन इसे स्वीकार नहीं किया गया था, क्योंकि वे इस बात पर सहमत नहीं थे कि इसे सभी किनारे के मामलों में वापस लौटना चाहिए (+/- 0, +/- नेन, आदि)

इसलिए उन्होंने केवल नकल को लागू करने का फैसला किया, जो (हालांकि अधिक क्रिया) को अंतिम मामलों में उपयोगकर्ता को किनारे के मामलों के लिए वांछित व्यवहार को सौंपने के लिए इस्तेमाल किया जा सकता है - जिसे कभी-कभी कॉल की आवश्यकता हो सकती हैcmp(x,0)


मुझे नहीं पता कि यह बिल्ट-इन क्यों नहीं है, लेकिन मेरे पास कुछ विचार हैं।

copysign(x,y):
Return x with the sign of y.

सबसे महत्वपूर्ण बात, copysignएक सुपरसेट है sign! copysignX = 1 के साथ कॉलिंग एक signफ़ंक्शन के समान है । तो आप बस इस्तेमाल कर सकते हैं copysignऔर इसके बारे में भूल सकते हैं

>>> math.copysign(1, -4)
-1.0
>>> math.copysign(1, 3)
1.0

यदि आप दो पूरे तर्कों को पारित करने से बीमार हो जाते हैं, तो आप signइस तरह से लागू कर सकते हैं , और यह अभी भी दूसरों द्वारा उल्लिखित IEEE सामान के साथ संगत होगा:

>>> sign = functools.partial(math.copysign, 1) # either of these
>>> sign = lambda x: math.copysign(1, x) # two will work
>>> sign(-4)
-1.0
>>> sign(3)
1.0
>>> sign(0)
1.0
>>> sign(-0.0)
-1.0
>>> sign(float('nan'))
-1.0

दूसरे, आमतौर पर जब आप किसी चीज का संकेत चाहते हैं, तो आप इसे एक और मूल्य के साथ गुणा करते हैं। और निश्चित रूप से यह मूल रूप से क्या copysignकरता है।

इसलिए, इसके बजाय:

s = sign(a)
b = b * s

आप बस कर सकते हैं:

b = copysign(b, a)

और हाँ, मुझे आश्चर्य है कि आप 7 वर्षों से अजगर का उपयोग कर रहे हैं और सोचते हैं कि cmpइतनी आसानी से हटाया जा सकता है और इसके द्वारा प्रतिस्थापित किया जा सकता है sign! क्या आपने कभी एक __cmp__विधि के साथ एक वर्ग को लागू नहीं किया है ? क्या आपने कभी cmpकस्टम तुलनित्र फ़ंक्शन को कॉल और निर्दिष्ट नहीं किया है?

संक्षेप में, मैंने खुद को एक signफ़ंक्शन भी चाहा है, लेकिन copysignपहले तर्क के साथ 1 ठीक काम करेगा। मैं असहमत हूं कि signइससे ज्यादा उपयोगी होगा copysign, जैसा कि मैंने दिखाया है कि यह एक ही कार्यक्षमता का सबसेट है।


35
का उपयोग कर [int(copysign(1, zero)) for zero in (0, 0.0, -0.0)]देता है [1, 1, -1]। जो कि en.wikipedia.org/wiki/Sign_function के[0, 0, 0] अनुसार होना चाहिए था
user238424

12
@Andrew - @ user238424 का कॉलिंग ऑर्डर सही है। copysign(a,b)b - b के चिन्ह के साथ रिटर्न अलग इनपुट है, b के चिन्ह के साथ सामान्य करने का मान है। इस मामले में, टिप्पणीकार यह संकेत दे रहा है कि साइन (x) के प्रतिस्थापन के रूप में मैथुन (1, x) विफल रहता है, क्योंकि यह x = 0 के लिए 1 देता है, जबकि साइन (0) 0. का मूल्यांकन करेगा
पॉलमैक्स

7
फ्लोट्स "मान" को "मान" से अलग रखते हैं; -0.0 एक नकारात्मक संख्या है, भले ही वह कार्यान्वयन त्रुटि लगती हो। बस का उपयोग cmp()वांछित परिणाम देगा, शायद लगभग हर मामले के लिए किसी को भी परवाह होगी: [cmp(zero, 0) for zero in (0, 0.0, -0.0, -4, 5)]==> [0, 0, 0, -1, 1]
अजगर २24

11
s = sign(a) b = b * sके बराबर नहीं है b = copysign(b, a)! यह b के संकेत पर विचार नहीं करता है। उदाहरण के लिए यदि a=b=-1पहला कोड 1 लौटेगा जबकि दूसरा रिटर्न -1
जोहान्स जेंडरसी

14
गलत संकेत () प्रतिस्थापन की परिभाषा, साइन (ए) के साथ गुणा के लिए झूठे समकक्ष, नकल की प्रेरणा के लिए झूठी व्याख्या और सही प्रतिस्थापन "सीएमपी (एक्स, 0)" का पहले से ही प्रश्न में उल्लेख किया जा रहा है - वहां बहुत अधिक जानकारी नहीं है और यह मेरे लिए अस्पष्ट है कि यह इतने वोटों के साथ "स्वीकृत" उत्तर क्यों है?
kxr

59

"कॉपसाइन" को IEEE 754, और C99 विनिर्देशन के भाग द्वारा परिभाषित किया गया है। इसलिए यह पायथन में है। फ़ंक्शन को पूर्ण रूप से एब्स (x) * साइन (y) द्वारा लागू नहीं किया जा सकता है क्योंकि यह कैसे NaN मानों को संभालने के लिए है।

>>> import math
>>> math.copysign(1, float("nan"))
1.0
>>> math.copysign(1, float("-nan"))
-1.0
>>> math.copysign(float("nan"), 1)
nan
>>> math.copysign(float("nan"), -1)
nan
>>> float("nan") * -1
nan
>>> float("nan") * 1
nan
>>> 

यह साइनस () की तुलना में अधिक उपयोगी कार्य करता है।

विशिष्ट कारणों से IEEE के साइनबिट (x) मानक पायथन में उपलब्ध नहीं है, मुझे नहीं पता। मैं अनुमान लगा सकता हूं, लेकिन यह अनुमान लगाने वाला होगा।

गणित मॉड्यूल स्वयं जांचता है (1, x) एक तरीके के रूप में जांचता है कि क्या x नकारात्मक या गैर-नकारात्मक है। गणितीय कार्यों से निपटने वाले अधिकांश मामलों के लिए जो साइन (x) की तुलना में अधिक उपयोगी लगता है जो 1, 0, या -1 देता है क्योंकि विचार करने के लिए एक कम मामला है। उदाहरण के लिए, निम्नलिखित पायथन के गणित मॉड्यूल से है:

static double
m_atan2(double y, double x)
{
        if (Py_IS_NAN(x) || Py_IS_NAN(y))
                return Py_NAN;
        if (Py_IS_INFINITY(y)) {
                if (Py_IS_INFINITY(x)) {
                        if (copysign(1., x) == 1.)
                                /* atan2(+-inf, +inf) == +-pi/4 */
                                return copysign(0.25*Py_MATH_PI, y);
                        else
                                /* atan2(+-inf, -inf) == +-pi*3/4 */
                                return copysign(0.75*Py_MATH_PI, y);
                }
                /* atan2(+-inf, x) == +-pi/2 for finite x */
                return copysign(0.5*Py_MATH_PI, y);

वहां आप स्पष्ट रूप से देख सकते हैं कि कॉपीसाइन () तीन-मूल्यवान संकेत () फ़ंक्शन की तुलना में अधिक प्रभावी कार्य है।

आप ने लिखा:

यदि मैं एक अजगर डिजाइनर था, तो मैं आसपास का दूसरा रास्ता होगा: कोई cmp () बिलिन नहीं, बल्कि एक चिन्ह ()

इसका मतलब है कि आप नहीं जानते कि सीएमपी () का इस्तेमाल अंकों के अलावा चीजों के लिए भी किया जाता है। cmp ("यह", "वह") एक संकेत () फ़ंक्शन के साथ लागू नहीं किया जा सकता है।

मेरे अतिरिक्त उत्तरों को अन्यत्र टकराने के लिए संपादित करें :

आप अपने औचित्य को आधार बनाते हैं कि एब्स () और साइन () को अक्सर एक साथ कैसे देखा जाता है। जैसा कि C मानक लाइब्रेरी में किसी भी प्रकार का 'साइन (x)' फ़ंक्शन नहीं होता है, मुझे नहीं पता कि आप अपने विचारों को कैसे उचित ठहराते हैं। एब्स (इंट) और फैब्स (डबल) और फैबसेफ (फ्लोट) और फैब्सल (लंबे) लेकिन साइन का कोई उल्लेख नहीं है। "कॉपीसाइन ()" और "साइनबिट ()" है, लेकिन वे केवल IEEE 754 नंबर पर लागू होते हैं।

जटिल संख्याओं के साथ, पायथन में (-3 + 4 जे) क्या संकेत देगा, क्या इसे लागू किया जाना था? abs (-3 + 4j) वापसी 5.0। यह इस बात का एक स्पष्ट उदाहरण है कि कैसे एब्स () का उपयोग उन जगहों पर किया जा सकता है जहां साइन () का कोई मतलब नहीं है।

मान लीजिए कि साइन (x) पायथन में जोड़े गए थे, एब्स (x) के पूरक के रूप में। यदि 'x' एक उपयोगकर्ता-परिभाषित वर्ग का एक उदाहरण है जो __abs __ (स्व) विधि को लागू करता है तो abs (x) x .__ abs __ () को कॉल करेगा। सही तरीके से काम करने के लिए, एब्स (x) को उसी तरह से हैंडल करना है तो पाइथन को साइन (x) स्लॉट हासिल करना होगा ।

यह अपेक्षाकृत अनावश्यक फ़ंक्शन के लिए अत्यधिक है। इसके अलावा, साइन (x) क्यों मौजूद है और nonnegative (x) और nonpositive (x) मौजूद नहीं हैं? पायथन के गणित मॉड्यूल कार्यान्वयन से मेरा स्निपेट दिखाता है कि कैसे नॉनवेगेटिव () को लागू करने के लिए प्रतिलिपि (x, y) का उपयोग किया जा सकता है, जो कि एक साधारण संकेत (x) नहीं कर सकता है।

अजगर को IEEE 754 / C99 गणित फ़ंक्शन के लिए बेहतर समर्थन होना चाहिए। इसमें एक साइनबिट (x) फ़ंक्शन जोड़ा जाएगा, जो कि आप फ्लोट्स के मामले में क्या चाहते हैं। यह पूर्णांकों या जटिल संख्याओं, बहुत कम तारों के लिए काम नहीं करेगा, और इसमें वह नाम नहीं होगा जिसे आप खोज रहे हैं।

आप "क्यों" पूछते हैं, और उत्तर "साइन (x) उपयोगी नहीं है।" आप दावा करते हैं कि यह उपयोगी है। फिर भी आपकी टिप्पणियों से पता चलता है कि आप उस दावे को करने में सक्षम होने के लिए पर्याप्त नहीं जानते हैं, जिसका अर्थ है कि आपको इसकी आवश्यकता के पुख्ता सबूत दिखाने होंगे। यह कहना कि NumPy लागू होता है, यह पर्याप्त रूप से आश्वस्त नहीं करता है। आपको ऐसे मामलों को दिखाने की आवश्यकता होगी कि मौजूदा फ़ंक्शन को साइन फ़ंक्शन के साथ कैसे सुधार किया जाएगा।

और यह StackOverflow के दायरे से बाहर है। इसे पायथन सूची में से एक के बजाय लें।


5
ठीक है, मुझे नहीं लगता कि इससे आपको खुशी होगी, लेकिन पायथन 3 में न तो :-) है cmp()और न हीsign()
एंटोनी पी।

4
एक अच्छा संकेत () फ़ंक्शन लिखना जो IEEE 754 के साथ ठीक से काम करेगा तुच्छ नहीं है। इसे भाषा में शामिल करने के लिए यह एक अच्छा बिंदु होगा, इसे छोड़ने के बजाय, भले ही मैंने प्रश्न में इस बिंदु को विस्तृत नहीं किया हो
Davide

2
आपकी टिप्पणी "यदि आप चाहते हैं कि आप किस तरह से स्थिर होना चाहते हैं" का अर्थ है कि आप यह भी नहीं जानते कि स्थिर प्रकार कैसे काम करता है। आपका कथन जो नकल और हस्ताक्षर समतुल्य है कि आप इस पोस्ट से पहले IEEE 754 गणित के बारे में ज्यादा नहीं जानते थे। क्या अजगर को 754 गणित के सभी कार्यों को कोर में लागू करना चाहिए? गैर-सी 99 संकलक के लिए इसे क्या करना चाहिए? गैर -754 प्लेटफार्म? "इस्नोएनेगेटिव" और "इस्नोस्पोज़िटिव" भी उपयोगी कार्य हैं। क्या अजगर को भी शामिल करना चाहिए? abs (x) डिफर्स टू x .__ abs __ (), तो साइन करना चाहिए (x) x को डिफर करना ।__ साइन __ ()? इसके लिए बहुत कम मांग या आवश्यकता है, इसलिए इसे कोर में क्यों रखा जाना चाहिए?
एंड्रयू डल्के

2
math.copysign (1, फ्लोट ("- नेन") -1 के बजाय 1.0 लौटाता है, जब मैं इसे 2.7 में
आज़माता हूँ

34

साइन के लिए एक और लाइनर ()

sign = lambda x: (1, -1)[x<0]

यदि आप इसे x = 0 के लिए वापस करना चाहते हैं:

sign = lambda x: x and (1, -1)[x<0]

1
क्यों? यह प्रश्न स्वयं स्वीकार करता cmp(x, 0)है कि आपके समकक्ष है sign, और lambda x: cmp(x, 0)आपके द्वारा सुझाए गए से अधिक पठनीय है।
टूलमेकरसैट

1
दरअसल, मैं गलत था। मैंने यह मान लिया था कि 'सीएमपी' को -1,0, + 1 वापस करने के लिए निर्दिष्ट किया गया था, लेकिन मैं देखता हूं कि कल्पना इसकी गारंटी नहीं देती है।
टूलमेकरसेव

सुंदर। शुरू किए गए प्रश्न का उत्तर दें: अजगर इंट या फ्लोट -1, 0, 1, 1 पर?
scharfmn

1
क्या इसके बजाय सूचियों का उपयोग करने का कोई फायदा है -1 if x < 0 else 1?
मतीन उल्हाक

6
sign = lambda x: -1 if x < 0 else 1है 15% तेजी से । उसी के साथ sign = lambda x: x and (-1 if x < 0 else 1)
मतीन उल्हाक

26

चूंकि हटाcmp दिया गया है , आप उसी कार्यक्षमता को प्राप्त कर सकते हैं

def cmp(a, b):
    return (a > b) - (a < b)

def sign(a):
    return (a > 0) - (a < 0)

यह काम करता है float, intऔर यहां तक ​​कि Fraction। मामले में floatनोटिस sign(float("nan"))शून्य है।

पायथन की आवश्यकता नहीं है कि तुलना एक बूलियन को लौटाती है, और इसलिए बूल () से तुलना करना अनिवार्य है, लेकिन असामान्य कार्यान्वयन से बचाता है:

def sign(a):
    return bool(a > 0) - bool(a < 0)

13

विकिपीडिया परिभाषा के साथ केवल सही उत्तर का अनुपालन

विकिपीडिया पर परिभाषा पढ़ता है:

संकेत परिभाषा

अत,

sign = lambda x: -1 if x < 0 else (1 if x > 0 else (0 if x == 0 else NaN))

सभी उद्देश्यों और उद्देश्यों के लिए इसे सरल बनाया जा सकता है:

sign = lambda x: -1 if x < 0 else (1 if x > 0 else 0)

यह फ़ंक्शन परिभाषा तेजी से निष्पादित होती है और 0, 0.0, -0.0, -4 और 5 के लिए सही परिणाम की गारंटी देती है (अन्य गलत उत्तरों पर टिप्पणी देखें)।

ध्यान दें कि शून्य (0) न तो सकारात्मक है और न ही नकारात्मक


1
यह उत्तर बताता है कि कैसे शक्तिशाली अभी तक शक्तिशाली अजगर सफल हो सकता है।
नेल्सनगॉन

1
वक्रोक्ति: कोड WP परिभाषा को लागू नहीं करता है, यह अंत में एक डिफ़ॉल्ट खंड के साथ मध्य खंड को बदल देता है। जबकि यह गैर-वास्तविक संख्याओं को संभालने के लिए आवश्यक है जैसे कि यह गलत तरीके से सीधे WP कथन ('इसलिए') का पालन करते हुए दिखाया गया है।
जुरगेन स्ट्रोबेल

1
@ JürgenStrobel मुझे पता है कि आपका क्या मतलब है और मैं भी लंबे समय से इस मुद्दे पर विचार कर रहा हूं। मैंने ज्यादातर उपयोग के मामलों के सरलीकृत संस्करण को बनाए रखते हुए, उत्तर को सही औपचारिकता के लिए बढ़ाया।
सर्ज स्ट्रोबंड्ट

10

numpy में एक साइन फंक्शन है, और आपको अन्य कार्यों का एक बोनस भी देता है। इसलिए:

import numpy as np
x = np.sign(y)

बस सावधान रहें कि परिणाम एक numpy.float64 है:

>>> type(np.sign(1.0))
<type 'numpy.float64'>

Json जैसी चीजों के लिए, यह बात मायने रखती है, क्योंकि json को यह पता नहीं है कि कैसे numpy.float64 प्रकारों को क्रमांकित किया जाता है। उस मामले में, आप कर सकते हैं:

float(np.sign(y))

एक नियमित फ्लोट प्राप्त करने के लिए।


10

इसे चलाने का प्रयास करें, जहां x कोई भी संख्या है

int_sign = bool(x > 0) - bool(x < 0)

बूल () के लिए जबरदस्ती इस संभावना को संभालती है कि तुलना ऑपरेटर बूलियन वापस नहीं करता है।


अच्छा विचार है, लेकिन मुझे लगता है कि आपका मतलब है: int_sign = int (x> 0) - int (x <0)
yucer

मेरा मतलब है: int_sign = lambda x: (x> 0) - (x <0)
yucer

1
@yucer नहीं, वह वास्तव में कलाकारों को बूल का मतलब था (जो वैसे भी int का एक उपवर्ग है), सैद्धांतिक संभावना के कारण जिसके कारण उन्होंने स्पष्टीकरण का लिंक दिया।
वाल्टर ट्रॉस

इस निर्माण का एकमात्र नकारात्मक पक्ष यह है कि यह तर्क दो बार दिखाई देता है, जो कि केवल तभी होता है जब यह एकल चर हो
वाल्टर ट्रॉस

5

हां एक सही sign()फ़ंक्शन कम से कम गणित मॉड्यूल में होना चाहिए - जैसा कि सुन्न में है। क्योंकि एक बार गणित उन्मुख कोड के लिए इसकी आवश्यकता होती है।

लेकिन math.copysign()स्वतंत्र रूप से भी उपयोगी है।

cmp()और obj.__cmp__()... आम तौर पर स्वतंत्र रूप से उच्च महत्व है। सिर्फ गणित उन्मुख कोड के लिए नहीं। तुलना / छँटाई tuples, दिनांक वस्तुओं, पर विचार करें ...

पर देव तर्क http://bugs.python.org/issue1640 की चूक के बारे में math.sign()है, क्योंकि अजीब हैं:

  • कोई अलग नहीं है -NaN
  • sign(nan) == nan बिना चिंता के (जैसे exp(nan))
  • sign(-0.0) == sign(0.0) == 0 चिंता के बिना
  • sign(-inf) == -1 चिंता के बिना

- जैसा कि सुन्न में है


4

पायथन 2 में, cmp()एक पूर्णांक देता है: कोई आवश्यकता नहीं है कि परिणाम -1, 0, या 1 हो, इसलिए sign(x)ऐसा नहीं है cmp(x,0)

पायथन 3 में, cmp()समृद्ध तुलना के पक्ष में हटा दिया गया है। के लिए cmp(), अजगर 3 यह पता चलता है :

def cmp(a, b):
    return (a > b) - (a < b)

जो cmp () के लिए ठीक है, लेकिन फिर से साइन () के लिए उपयोग नहीं किया जा सकता है क्योंकि तुलना ऑपरेटरों को बूलियन वापस करने की आवश्यकता नहीं है ।

इस संभावना से निपटने के लिए, तुलनात्मक परिणाम ऊलजलूल होने चाहिए:

 def sign(a):
    return bool(x > 0) - bool(x < 0)

यह किसी भी काम करता है typeजो पूरी तरह से आदेश दिया जाता है (विशेष मूल्यों जैसे NaNया अनन्तता सहित )।


0

आपको एक की आवश्यकता नहीं है, आप बस उपयोग कर सकते हैं:

If not number == 0:
    sig = number/abs(number)
else:
    sig = 0

4
यह इंगित करता है कि 0 की तरफ किस तरफ जा रहा है, यह जांचने के लिए x / abs(x)केवल चाइनिंग की तुलना में थोड़ा अधिक समय लगता if/elseहै, या इस मामले के return (x > 0) - (x < 0)लिए boolमूल्यों को घटाने के लिए घिनौना-संतोषजनक का उपयोग करते हुएint

1
अजगर व्यवहार करता है Trueऔर Falseके रूप में 1और 0, यदि आप पूरी तरह इस करते हैं और या तो प्राप्त कर सकते हैं 1, 0या -1def sign(x): return (x > 0) - (x < 0)वापस नहीं लौटेगा bool, यह वापस आ जाएगा int- यदि आप पास 0हो जाते हैं तो आप 0वापस आ


-8

कारण "साइन" शामिल नहीं है, अगर हम प्रत्येक उपयोगी एक-लाइनर को अंतर्निहित कार्यों की सूची में शामिल करते हैं, तो पायथन आसान और व्यावहारिक नहीं होगा। यदि आप इस फ़ंक्शन का इतनी बार उपयोग करते हैं तो आप इसे स्वयं क्यों नहीं करते हैं? ऐसा नहीं है कि यह दूर से कठिन या ऐसा करने के लिए थकाऊ है।


6
ठीक है, मैं इसे केवल तभी खरीदूंगा जब abs()इसे छोड़ दिया गया हो। sign()और abs()अक्सर एक साथ उपयोग किए जाते हैं, sign()दो में से सबसे उपयोगी है (IMO), और कोई भी दूरस्थ रूप से लागू करने के लिए कठिन या थकाऊ नहीं है (भले ही यह त्रुटि प्रवण हो, देखें कि यह उत्तर कैसे गलत है: stackoverflow.com/questions/1986152/… )
डेविड डे

1
बात यह है कि sign()स्वयं का संख्यात्मक परिणाम शायद ही उपयोगी है। जब आप अधिकांश समय करते हैं तो एक चर सकारात्मक या नकारात्मक होने के आधार पर विभिन्न कोड पथ लेते हैं, और उस स्थिति में यह स्पष्ट रूप से स्थिति को लिखने के लिए अधिक पठनीय है।
एंटोनी पी।

3
abs () का उपयोग चिन्ह की तुलना में बहुत अधिक किया जाता है () होगा। और मैंने आपको NumPy ट्रैकर की ओर इशारा किया है जो दिखाता है कि लागू करने के लिए कितना कठिन संकेत () हो सकता है। हस्ताक्षर (-3 + 4j) क्या होना चाहिए? जबकि abs (-3 + 4j) 5.0 है। आप ऐसे संकेत बनाते हैं जो संकेत () और एब्स () अक्सर एक साथ देखे जाते हैं। C मानक लाइब्रेरी में 'साइन' फ़ंक्शन नहीं है, तो आप अपना डेटा कहां प्राप्त कर रहे हैं?
एंड्रयू डालके
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.