มีการถกเถียงกันอยู่เสมอในชุมชนการเขียนโค้ดว่าเวอร์ชัน python ใดดีที่สุดในการเรียนรู้:Python 2.x หรือ Python 3.x
ด้านล่างนี้คือข้อแตกต่างที่สำคัญระหว่าง pyton 2.x และ python 3.x
1. ฟังก์ชั่นการพิมพ์
ใน python 2.x จะถือว่า "print" เป็นคำสั่ง และ python 3.x จะถือว่า "print" เป็นฟังก์ชันอย่างชัดเจน ซึ่งหมายความว่าเราต้องส่งรายการภายในงานพิมพ์ของคุณไปยังฟังก์ชันในวงเล็บด้วยวิธีมาตรฐาน มิฉะนั้น คุณจะได้รับข้อผิดพลาดทางไวยากรณ์
#Python 2.7print 'Python', python_version()print 'Hello, World!'print('Hello, World!')พิมพ์ "ข้อความ",; พิมพ์ 'ข้อความเพิ่มเติมที่นี่'
ผลลัพธ์
Python 2.7.6สวัสดี World!สวัสดี World!text พิมพ์ข้อความเพิ่มเติมที่นี่Python 3import sysprint("เวอร์ชัน Python คือ %s.%s.%s" %sys.version_info[:3])print('สวัสดี World!')print("some text", end="")print('some more text here')
ผลลัพธ์
เวอร์ชัน Python คือ 3.6.1สวัสดี ชาวโลก!บางข้อความ ข้อความเพิ่มเติมที่นี่>>>> พิมพ์ "สวัสดี" ข้อผิดพลาดทางไวยากรณ์:ไม่มีวงเล็บในการเรียกใช้ 'พิมพ์'
2. การหารจำนวนเต็ม
Python 2 ถือว่าตัวเลขที่คุณพิมพ์โดยไม่มีตัวเลขหลังจุดทศนิยมเป็นจำนวนเต็ม ซึ่งอาจนำไปสู่ผลลัพธ์ที่ไม่คาดคิดในระหว่างการหาร ตัวอย่างเช่น หากคุณพิมพ์นิพจน์ 3 / 2 ในโค้ด Python 2 ผลลัพธ์ของการประเมินจะเป็น 1 ไม่ใช่ 1.5 อย่างที่คุณคาดไว้ ขอแนะนำให้ใช้ float(x) แทนการใช้เพียง x ในโค้ด python 3 ของคุณ (ในกรณีที่พอร์ต codebase เป็น python 2) หรือใช้จาก __future__ แผนกนำเข้าในสคริปต์ python 2 ของคุณ
#Python 2
พิมพ์ 'Python', python_version()print '3 / 2 =', 3 / 2print '3 // 2 =', 3 // 2print '3 / 2.0 =', 3 / 2.0print '3 // 2.0 =', 3 // 2.0
ผลลัพธ์
Python 2.7.63 / 2 =13 // 2 =13 / 2.0 =1.53 // 2.0 =1.0
#Python 3.6.1
import sysprint('Python %s.%s.%s' %sys.version_info[:3])print('3 / 2 =', 3 / 2)print('3 // 2 =', 3 // 2)print('3 / 2.0 =', 3 / 2.0)print('3 // 2.0 =', 3 // 2.0)
ผลลัพธ์
Python 3.6.13 / 2 =1.53 // 2 =13 / 2.0 =1.53 // 2.0 =1.0
3. สตริง Unicode
ตามค่าเริ่มต้น Python 3 จะจัดเก็บสตริงเป็น Unicode ในขณะที่ Python 2 ต้องการให้คุณทำเครื่องหมายสตริงด้วย "u" หากคุณต้องการจัดเก็บเป็น Unicode สตริง Unicode ใช้งานได้หลากหลายกว่าสตริง ASCII ซึ่งเป็นค่าเริ่มต้นของ Python 2 เนื่องจากสามารถเก็บจดหมายจากภาษาต่างประเทศ รวมทั้งอีโมจิ ตลอดจนตัวอักษรและตัวเลขโรมันมาตรฐาน
#Python 2
>>> ประเภทการพิมพ์(unicode('นี้เหมือนกับประเภท python3 str'))>>> ประเภทการพิมพ์ (ไม่มีประเภท b'byte') >>> พิมพ์ 'จริงๆ' + b' เหมือนกัน' เหมือนกันจริงๆ
#Python 3
import sysprint('Python %s.%s.%s' %sys.version_info[:3])print('strings are now utf-8 \u03BCnico\u0394é!')print('Python %s.% s.%s' %sys.version_info[:3], end="")print(' has', type(b' bytes for storage data'))print('Python %s.%s.%s' % sys.version_info[:3], end="")print(' also has', type(bytearray(b'bytearrays')))
ผลลัพธ์
Python 3.6.1 สตริงเป็น utf-8 μnicoΔé!Python 3.6.1 มีPython 3.6.1 มี
“string” + b”bytes of data” จะเกิดข้อผิดพลาด
>>>> print ('จริงๆ แล้ว' + b' เหมือนกัน')Traceback (การโทรล่าสุดครั้งล่าสุด):ไฟล์ "" บรรทัดที่ 1 ใน print ('จริงๆ แล้ว ' + b' เหมือนกัน') TypeError:ต้องเป็น str ไม่ใช่ไบต์
4. เพิ่มข้อยกเว้น
Python 3 ต้องการไวยากรณ์ที่แตกต่างกันสำหรับการเพิ่มข้อยกเว้น หากคุณต้องการส่งข้อความแสดงข้อผิดพลาดไปยังผู้ใช้ คุณต้องใช้ไวยากรณ์ -
เพิ่ม IOError (“ข้อความแสดงข้อผิดพลาดของคุณ”)
ไวยากรณ์ด้านบนใช้ได้กับ python 2 และ python 3 ทั้งคู่
อย่างไรก็ตาม รหัสต่อไปนี้ใช้งานได้เฉพาะใน python 2 ไม่ใช่ python 3
เพิ่ม IOError “ข้อความแสดงข้อผิดพลาดของคุณ”
5. แสดงรายการตัวแปรลูปความเข้าใจ
ใน python 2 การกำหนดตัวแปรที่วนซ้ำใน "for loop" เป็นชื่อเดียวกับตัวแปรส่วนกลางอาจทำให้ค่าของตัวแปรส่วนกลางเปลี่ยนแปลงไป ซึ่งโดยทั่วไปแล้วเราไม่ต้องการ ปัญหานี้ได้รับการแก้ไขแล้วใน Python 3 ดังนั้นคุณสามารถใช้ชื่อตัวแปรที่คุณใช้สำหรับตัวแปรควบคุมใน "for loop" ของคุณแล้วโดยไม่ต้องกังวลว่ามันจะรั่วไหลออกมาและไปยุ่งกับค่าของตัวแปรในโค้ดที่เหลือของคุณ
#Python 2print 'Python', python_version()i =1print 'before:i =', iprint 'comprehension:', [i for i in range(5)]print 'after:i =', iก่อน>ผลลัพธ์
Python 2.7.6before:i =1comprehension:[0, 1, 2, 3, 4]หลัง:i =4#Python 3
import sysprint('Python %s.%s.%s' %sys.version_info[:3])i =1print('before:i =', i)print('comprehension:', [i for i) in range(5)])print('หลัง:i =', i)ผลลัพธ์
Python 3.6.1before:i =1comprehension:[0, 1, 2, 3, 4]หลัง:i =1