2009-10-08 4 views
254

मैं किसी के कोड में यह देखा:पायथन में '//' रखने का क्या कारण है?

y = img_index // num_images 

जहां img_index चल रहे एक सूचकांक है और num_images 3.

है जब मैं IPython में // के साथ चारों ओर गंदगी, यह सिर्फ एक विभाजन चिन्ह की तरह काम करने के लिए (लगता है यानी एक आगे स्लैश)। मैं बस सोच रहा था कि डबल फॉरवर्ड स्लेश होने का कोई कारण है या नहीं?

उत्तर

318

अजगर 3 में, वे / ऑपरेटर बने एक फ्लोटिंग प्वाइंट विभाजन करते हैं, और पूर्णांक प्रभाग (शेष बिना अर्थात भागफल) करने के लिए // ऑपरेटर जोड़ा गया; जबकि पायथन 2 में, / ऑपरेटर बस पूर्णांक विभाजन था, जब तक कि एक ऑपरेंड पहले से ही एक फ़्लोटिंग पॉइंट नंबर नहीं था।

पायथन 2.x में:

>>> 10/3 
3 
>>> # to get a floating point number from integer division: 
>>> 10.0/3 
3.3333333333333335 
>>> float(10)/3 
3.3333333333333335 

अजगर 3 में:

>>> 10/3 
3.3333333333333335 
>>> 10//3 
3 

आगे संदर्भ के लिए, PEP238 देखते हैं।

+13

मैं वास्तव में की तरह इस शैली बेहतर ... मैं कम से कम एक भाषा मैं का उपयोग किया है में याद कर सकते हैं (वीबी?) कारक था '/' 'बनाम \' ... लेकिन मुझे याद है कभी नहीं हो सकता जो क्या था –

+2

पीईपी इस तथ्य को भी संबोधित करता है कि बैकस्लैश बचने वाले पात्रों के लिए आरक्षित है या न्यूलाइन से बच रहा है, ताकि इस तरह के ऑपरेटर के रूप में तत्काल समाप्त हो सके। –

+0

धन्यवाद, मैं कुछ समय के लिए पाइथन 3+ में व्यस्त हूं, और मैंने कभी यह नया नहीं किया है, मैंने हमेशा 'int (n/i) 'किया है। महान जानकारी यहाँ! – Hidde

122

// बिना शर्त "फर्श विभाजन", उदा है:

>>> 4.0//1.5 
2.0 

जैसा कि आप देख, हालांकि दोनों ऑपरेंड float रों, //अभी भी फर्श हैं - तो आप हमेशा पता सुरक्षित रूप से क्या यह वाला है है।

एकल / कर सकते हैं या नहीं मंजिल अजगर रिहाई, भविष्य के आयात, और यहां तक ​​कि झंडे के आधार पर हो सकता है जो अजगर की दौड़, जैसे ... पर:

$ python2.6 -Qold -c 'print 2/3' 
0 
$ python2.6 -Qnew -c 'print 2/3' 
0.666666666667 

जैसा कि आप देख, एकल / हो सकता है मंजिल, या यह एक नाव वापस आ सकते हैं, पूरी तरह से गैर स्थानीय मुद्दों, के लिए और -Q ध्वज के महत्व सहित अप के आधार पर ... ;-)।

तो, अगर और जब आप पता आप फर्श, हमेशा उपयोग // है, जो यह की गारंटी देता है चाहता हूँ। अगर और जब आप जानते हैं कि फर्श चाहते हैं, तो float() अन्य ऑपरेंड के आसपास थप्पड़ मारें और / का उपयोग करें। कोई अन्य संयोजन, और आप संस्करण, आयात और झंडे की दया पर हैं! -)

+8

दिलचस्प बात यह है कि truncating // अभी भी एक फ्लोट – Lucretiel

+0

देता है // ऑपरेटर फर्श डिवीजन करता है, विभाजन को छोटा या छोटा नहीं करता है। –

+0

यह इस प्रश्न की प्रकृति के आधार पर अधिक प्रत्यक्ष उत्तर है, imho। उच्च वोट दिया गया उत्तर उपयोगी है लेकिन यह एक क्रिस्टल स्पष्ट बनाता है कि आप पाइथन 2 में एक दूसरे को क्यों चुनेंगे। –

20

एलेक्स की प्रतिक्रिया के पूरक के लिए, मैं जोड़ता हूं कि पायथन 2.2.0a2, from __future__ import division से शुरू करने के लिए एक सुविधाजनक विकल्प है float(…)/…सभी डिवीजनों, नाव डिवीजनों प्रदर्शन // के साथ उन लोगों को छोड़कर। यह 2.2.0a2 से सभी संस्करणों के साथ काम करता है।

7

//float प्रकार के वापसी मूल्य के साथ विभागों के लिए math.floor() के लिए उपनाम माना जा सकता है। यह के रूप में int के रिटर्न वैल्यू वाले डिवीजनों के लिए no-op के रूप में कार्य करता है।

import math 
# let's examine `float` returns 
# ------------------------------------- 
# divide 
>>> 1.0/2 
0.5 
# divide and round down 
>>> math.floor(1.0/2) 
0.0 
# divide and round down 
>>> 1.0 // 2 
0.0 

# now let's examine `integer` returns 
# ------------------------------------- 
>>> 1/2 
0 
>>> 1//2 
0 
13

इन अन्य उत्तर की मदद के लिए // ऑपरेटर भी / पर महत्वपूर्ण (3x) प्रदर्शन लाभ प्रदान करता है, यह मानते हुए आप पूर्णांक विभाजन चाहते हैं।

$ python -m timeit '20.5 // 2' 
100000000 loops, best of 3: 0.0149 usec per loop 
$ python -m timeit '20.5/2' 
10000000 loops, best of 3: 0.0484 usec per loop 
$ python -m timeit '20/2' 
10000000 loops, best of 3: 0.043 usec per loop 
$ python -m timeit '20 // 2' 
100000000 loops, best of 3: 0.0144 usec per loop