ข้อเสียของ Python คืออะไร [ปิด]


147

Python ดูเหมือนจะโกรธแค้นในทุกวันนี้และไม่ใช่เรื่องที่ไม่สมควรเพราะมันเป็นภาษาที่แท้จริงที่คนส่วนใหญ่ชอบที่จะได้รับปัญหาใหม่ในการแก้ปัญหา แต่ในฐานะที่เป็นนักปราชญ์เคยกล่าวไว้ว่า (เรียกเขาว่านักปราชญ์เท่านั้นเพราะฉันไม่รู้ว่าใครพูดจริง ๆ ไม่แน่ใจว่าเขาเป็นคนฉลาดเลย) เพื่อรู้ภาษาที่แท้จริงไม่เพียง แต่รู้ ไวยากรณ์, การออกแบบ, ฯลฯ , ข้อดี แต่ยังรวมถึงข้อเสียของมัน ไม่มีภาษาใดที่สมบูรณ์แบบบางคนดีกว่าคนอื่น

ดังนั้นสิ่งที่จะเป็นในความคิดของคุณข้อเสียวัตถุประสงค์ของงูหลาม

หมายเหตุ: ฉันไม่ได้ขอให้เปรียบเทียบภาษาที่นี่ (เช่น C # ดีกว่า Python เพราะ ... yadda yadda yadda) - มีวัตถุประสงค์มากกว่า (ในบางระดับ) ความคิดเห็นที่คุณลักษณะภาษาได้รับการออกแบบไม่ดีไม่ว่าจะเป็นอะไร บางอย่างที่คุณขาดไปและอื่น ๆ หากต้องใช้ภาษาอื่นเป็นการเปรียบเทียบ แต่เพียงเพื่อแสดงให้เห็นถึงจุดที่ยากที่จะอธิบายรายละเอียดอย่างอื่น (เช่นเพื่อความเข้าใจง่าย)


50
ฉันคิดว่านี่เป็นคำถามส่วนตัวที่เป็นประโยชน์และมันจะเป็นความอัปยศที่จะปิดมัน
Eric Wilson

25
ดูเหมือนว่าจะมีแฟนคลับไพ ธ อนอยู่ที่นี่ซึ่งเพิ่งโหวตคำตอบต่อต้านหลามทั้งหมด
zvrba

2
@TMN: นั่นยังคงรักษาช่องว่างในฐานะโทเค็นเพียงไม่ส่งคืน - และเป็นสิ่งที่ไวยากรณ์ของ Python ทำเช่นกัน

9
@Roger: ระเบียบเกี่ยวกับ SO คือการแสดงความคิดเห็น downvotes เนื่องจากนี่เป็นเว็บไซต์สำหรับความคิดเห็นส่วนตัวฉันไม่เห็นเหตุผลใดสำหรับ downvotes, esp ไม่มีความคิดเห็น ดังนั้นฉันจึงยืนตาม "ชื่อเรียก" ของฉัน
zvrba

8
@zvrba: Downvotes ยังคงหมายถึง "ไม่มีประโยชน์" เช่นเคย

คำตอบ:


109

ฉันใช้ Python ค่อนข้างสม่ำเสมอและโดยรวมแล้วฉันคิดว่ามันเป็นภาษาที่ดีมาก อย่างไรก็ตามไม่มีภาษาที่สมบูรณ์แบบ นี่คือข้อเสียตามลำดับความสำคัญต่อฉันเป็นการส่วนตัว:

  1. มันช้า ฉันหมายถึงช้าจริงๆ หลายครั้งที่เรื่องนี้ไม่สำคัญ แต่ก็หมายความว่าคุณต้องมีภาษาอื่นสำหรับบิตที่สำคัญต่อประสิทธิภาพ

  2. ฟังก์ชั่นที่ซ้อนกันชนิดดูดที่คุณไม่สามารถแก้ไขตัวแปรในขอบเขตด้านนอก แก้ไข: ฉันยังคงใช้ Python 2 เนื่องจากการสนับสนุนห้องสมุดและข้อบกพร่องของการออกแบบนี้ทำให้ heck ออกมาจากฉัน แต่เห็นได้ชัดว่ามันได้รับการแก้ไขใน Python 3 เนื่องจากคำสั่งnonlocal อดใจรอไม่ไหวแล้วที่ libs ที่ฉันใช้จะถูกส่งไปยังพอร์ตดังนั้นข้อบกพร่องนี้สามารถส่งไปยังกองเถ้าของประวัติศาสตร์ได้ดี

  3. มันขาดคุณสมบัติบางอย่างที่อาจเป็นประโยชน์ต่อไลบรารี่ / รหัสทั่วไปและ IMHO นั้นนำมาซึ่งความเรียบง่ายที่ไม่ดีต่อสุขภาพ สิ่งที่สำคัญที่สุดที่ฉันคิดว่าเป็นประเภทค่าที่ผู้ใช้กำหนด (ฉันเดาว่าสิ่งเหล่านี้สามารถสร้างขึ้นได้ด้วยเวทมนตร์ metaclass แต่ฉันไม่เคยลอง) และฟังก์ชั่นอ้างอิงพารามิเตอร์

  4. มันไกลจากโลหะ ต้องการเขียนเธรดพื้นฐานหรือเคอร์เนลโค้ดหรืออะไร? โชคดี.

  5. ในขณะที่ฉันไม่คิดว่าการขาดความสามารถในการตรวจจับข้อผิดพลาดทางความหมายล่วงหน้าเป็นข้อเสียเปรียบสำหรับพลวัตที่ Python เสนอฉันหวังว่าจะมีวิธีที่จะจับข้อผิดพลาดทางไวยากรณ์และสิ่งที่โง่ ๆ เช่นชื่อตัวแปรที่พิมพ์ผิด

  6. เอกสารไม่ดีพอ ๆ กับภาษาอย่าง PHP และ Java ที่มี backings ของ บริษัท ที่แข็งแกร่ง


60
@ กรณีที่ฉันต้องไม่เห็นด้วย ดัชนีน่ากลัว - ลองมองขึ้นคำสั่งหรือวิธีการในwith listสิ่งที่กล่าวถึงในบทช่วยสอนนั้นไม่สามารถค้นหาได้โดยทั่วไป ฉันโชคดีมากกับเอกสารของ Microsoft สำหรับ C ++
Mark Ransom

17
ประมาณ 5 - เพียงใช้ pyflakes มันถูกเขียนขึ้นเพื่อตรวจจับข้อผิดพลาดเหล่านั้นอย่างแน่นอน
อเล็กซานเด Solovyov

4
เกี่ยวกับความเร็ว: ด้วย PyPy ที่เพิ่มขึ้นผู้ใช้ Python จำนวนมากจะสามารถจัดการกับปัญหาความเร็วได้เพียงแค่ใช้ล่ามที่มี JIT-compiler ในตัว (สำหรับตอนนี้ผู้ใช้ Python 3 และผู้ใช้ C ส่วนขยายโมดูลที่ไม่ได้รับการจัดการโดย cpyext ไม่มีตัวเลือกนี้)
ncoghlan

29
ฉันดูถูก Python docs พวกมันน่ารักกว่าที่คิด แต่หลาย ๆ ครั้งข้อมูลที่เป็นประโยชน์มากมายถูกรวมเข้าในหน้าเดียวเช่นเมธอดบนสตริงและลิสต์ - และลำดับลำดับทั้งหมดจะถูกรวมเข้าด้วยกันเช่นกัน เมื่อฉันค้นหาข้อมูลนี้ฉันเพิ่งลงจอดบนโตโต้ขนาดใหญ่และต้องค้นหาหน้าเพื่อค้นหาสิ่งที่ฉันต้องการ ฉันพบว่าดัชนีในหน้าเหล่านี้อ่านยากและบางครั้งก็ยากที่จะบอกว่าฉันต้องการส่วนใด
Carson Myers

5
ระยะห่างจากโลหะเป็นข้อโต้แย้งได้อย่างไร? Python เคยอ้างว่าตัวเองเป็นภาษาของระบบหรือไม่?
Mark Canlas

66

ฉันเกลียดที่ Python ไม่สามารถแยกความแตกต่างระหว่างการประกาศและการใช้งานของตัวแปร คุณไม่จำเป็นต้องพิมพ์แบบคงที่เพื่อให้เกิดขึ้น มันคงจะดีถ้ามีวิธีที่จะพูดว่า "นี่เป็นตัวแปรที่ฉันตั้งใจประกาศและฉันตั้งใจจะแนะนำชื่อใหม่นี่ไม่ใช่การพิมพ์ผิด"

นอกจากนี้ฉันมักจะใช้ตัวแปร Python ในรูปแบบการเขียนครั้งเดียวนั่นคือฉันถือว่าตัวแปรไม่สามารถเปลี่ยนแปลงได้และไม่ได้แก้ไขหลังจากการมอบหมายครั้งแรก ต้องขอบคุณคุณสมบัติต่างๆเช่นความเข้าใจในรายการซึ่งเป็นเรื่องง่ายอย่างเหลือเชื่อและทำให้การไหลของโค้ดง่ายขึ้น

อย่างไรก็ตามฉันไม่สามารถบันทึกข้อเท็จจริงนั้นได้ ไม่มีสิ่งใดใน Python ที่ทำให้ฉันไม่สามารถเขียนทับหรือใช้ตัวแปรซ้ำได้

โดยสรุปผมอยากจะมีสองคำในภาษานี้และvar letถ้าฉันเขียนไปยังตัวแปรที่ไม่ได้ประกาศโดยหนึ่งในนั้น Python ควรเพิ่มข้อผิดพลาด นอกจากนี้letประกาศตัวแปรเป็นแบบอ่านอย่างเดียวในขณะที่varตัวแปรเป็น“ ปกติ”

ลองพิจารณาตัวอย่างนี้:

x = 42    # Error: Variable `x` undeclared

var x = 1 # OK: Declares `x` and assigns a value.
x = 42    # OK: `x` is declared and mutable.

var x = 2 # Error: Redeclaration of existing variable `x`

let y     # Error: Declaration of read-only variable `y` without value
let y = 5 # OK: Declares `y` as read-only and assigns a value.

y = 23    # Error: Variable `y` is read-only

ขอให้สังเกตว่าประเภทนั้นยังคงอยู่โดยปริยาย (แต่letตัวแปรนั้นมีไว้สำหรับ intents และวัตถุประสงค์ทั้งหมดที่พิมพ์แบบคงที่เนื่องจากไม่สามารถสะท้อนกลับเป็นค่าใหม่ได้ในขณะที่varตัวแปรอาจยังพิมพ์แบบไดนามิก)

ในที่สุดอาร์กิวเมนต์ของเมธอดทั้งหมดควรเป็นletเช่นนั้นควรเป็นแบบอ่านอย่างเดียว โดยทั่วไปไม่มีเหตุผลที่ดีในการแก้ไขพารามิเตอร์ยกเว้นสำนวนต่อไปนี้:

def foo(bar = None):
    if bar == None: bar = [1, 2, 3]

สิ่งนี้อาจถูกแทนที่ด้วยสำนวนที่แตกต่างกันเล็กน้อย:

def foo(bar = None):
    let mybar = bar or [1, 2, 3]

6
ฉันจึงหวังว่า Python จะมีคำสั่ง "var" นอกจากเหตุผล (ดีมาก) ที่คุณระบุมันจะทำให้อ่านโค้ดได้ง่ายขึ้นเพราะคุณสามารถสแกนหน้าเพื่อดูการประกาศตัวแปรทั้งหมดได้
jhocking

25
ราวกับว่านักพัฒนางูหลามเพิกเฉยต่อบทเรียนในอดีต การไม่ประกาศตัวแปรไม่ใช่การประกาศฟังก์ชันเป็นความผิดพลาดที่เกิดขึ้นครั้งแรกในปี 1950 แมลงที่หายากเหล่านั้นซึ่งเป็นผลมาจากการพิมพ์ผิดที่ยากต่อการตรวจจับนั้นถูกสร้างขึ้นอย่างน่าอัศจรรย์ในช่วงทศวรรษที่ 1950 ความผิดพลาดทางภาษานี้เกิดขึ้น (และแก้ไขในภายหลัง) ครั้งแล้วครั้งเล่า การประกาศตัวแปรไม่ใช่ภาระใหญ่หลวง มันช่วยชีวิตก้นฉันหลายครั้ง ฉันอย่างหลีกเลี่ยงไม่ได้use strict;และuse warnings;ใน Perl ในสคริปต์ทุกขนาด Python ได้ปล้นนักพัฒนาของเครื่องช่วยดีบั๊กมากเกินไป
David Hammen

19
@ David เป็นธรรมกับงูหลามก็จะเพิ่มข้อยกเว้นถ้าคุณพยายามเข้าถึงตัวแปรที่ไม่ได้รับมอบหมาย หลายภาษาที่ไม่มีการประกาศจะคืนค่าเริ่มต้นบางประเภท เป็นผลให้เวอร์ชันของ Python มีปัญหาน้อยกว่ามาก
Winston Ewert

1
@yi_H ข้อเสนอไม่ได้หมายความว่าจะเข้ากันได้แบบย้อนหลัง - หรือแม้แต่ข้อเสนอที่แท้จริง คำถามคือ“ สิ่งที่เป็นข้อเสียของงูหลาม” …ก็ดีไม่มีvarและlet(หรือกลไกที่คล้ายกัน) คือข้อเสียเปรียบ พูดอีกอย่าง: ถ้าฉันเป็นดีไซเนอร์ของ Python ฉันจะทำอะไรแบบนี้ ซึ่งกล่าวว่าเวอร์ชันในอนาคตอาจรวมสิ่งนี้เมื่อคุณโหลดแพ็คเกจพิเศษ (คล้ายกับ__future__) import strictพูดว่า สิ่งนี้จะไม่เกิดขึ้นเนื่องจากต้องมีการแฮ็กเพื่อสร้างประโยค…
Konrad Rudolph

3
+1 เพื่อเพิ่มความสามารถในการเขียนโปรแกรม
Evan Plaice

44

การร้องเรียนหลักของฉันคือเธรดซึ่งไม่เป็นตัวแสดงในหลาย ๆ สถานการณ์ (เมื่อเทียบกับ Java, C และอื่น ๆ ) เนื่องจากการล็อคล่ามทั่วโลก (ดูที่"Inside the Python GIL" (ลิงก์ PDF) )

อย่างไรก็ตามมีอินเทอร์เฟซแบบหลายกระบวนการที่ใช้งานง่ายมากอย่างไรก็ตามมันจะหนักกว่าในการใช้หน่วยความจำสำหรับกระบวนการจำนวนมากเทียบกับเธรดหรือยากกว่าถ้าคุณมีข้อมูลที่ใช้ร่วมกันจำนวนมาก ประโยชน์ที่ได้รับคือเมื่อคุณมีโปรแกรมที่ทำงานกับหลายกระบวนการมันสามารถขยายข้ามหลาย ๆ เครื่องสิ่งที่โปรแกรมเธรดไม่สามารถทำได้

ฉันไม่เห็นด้วยกับคำวิจารณ์ของเอกสารฉันคิดว่ามันยอดเยี่ยมและดีกว่าถ้าไม่ใช่ภาษาหลักทั้งหมด

นอกจากนี้คุณสามารถจับหลายข้อบกพร่องรันไทม์ทำงานpylint


2
+1 สำหรับ pylint ฉันไม่รู้ตัว ครั้งต่อไปที่ฉันทำโครงการใน Python ฉันจะลองดู มัลติเธรดยังทำงานได้ดีถ้าคุณใช้ Jython แทนการใช้งาน CPython อ้างอิง OTOH Jython ค่อนข้างช้ากว่า CPython ดังนั้นนี่สามารถเอาชนะวัตถุประสงค์ได้บางส่วน
dsimcha

3
เธรดไม่รองรับอย่างดี? ไลบรารีเธรดอยู่ที่นั่นตั้งแต่ก่อนหน้า 2.1
rox0r

2
ฉันรู้ว่ามีการสนับสนุนเธรด แต่เมื่อเทียบกับ Java หรือ C GIL จะลดประสิทธิภาพของคุณลง นั่นคือเหตุผลที่โมดูลมัลติโปรเซสเซอร์เป็นที่ต้องการมากกว่าการทำเกลียว
cmcginty

2
เอกสารเป็นสิ่งที่ดีหากคุณสามารถหาได้ Googling เรียน Java เป็นมากง่ายกว่างูหลาม
เบรนแดนลอง

@Casey ฉันได้ชี้แจงถ้อยคำในคำตอบเนื่องจากเธรดได้รับการสนับสนุนเพียงแค่แสดงผลงานแปลก ๆ (เพิ่มการอ้างอิงและลิงก์ไปยัง docs ด้วย)
dbr

28

arguably , การขาดการพิมพ์แบบคงที่, ซึ่งสามารถแนะนำคลาสบางอย่างของข้อผิดพลาดรันไทม์ , ไม่คุ้มค่าความยืดหยุ่นเพิ่มที่เป็ดพิมพ์ให้


5
สิ่งนี้ถูกต้องแม้ว่าจะมีเครื่องมืออย่าง PyChecker ซึ่งสามารถตรวจสอบข้อผิดพลาดของคอมไพเลอร์ในภาษาอย่าง C / Java ได้
Oliver Weiler

24
การพิมพ์แบบไดนามิกเป็นการตัดสินใจออกแบบอย่างมีสติไม่ใช่ข้อเสียเปรียบ
missingfaktor

14
มันเหมือนกับการบอกว่าจุดอ่อนของ Java คือการขาดการพิมพ์แบบไดนามิก
MAK

12
@missingfaktor, @MAK เห็นได้ชัดว่าการพิมพ์เป็ดเป็นคุณสมบัติที่ตั้งใจไว้ แต่การตัดสินใจออกแบบส่วนใหญ่จะนำเสนอประโยชน์และข้อเสียตามวัตถุประสงค์ ความยืดหยุ่นของรหัสที่เพิ่มเข้ามานั้นเป็นข้อดีของการพิมพ์แบบไดนามิกและคลาสเพิ่มเติมของข้อผิดพลาดรันไทม์ที่อาจเกิดขึ้นคือข้อเสียเปรียบ ส่วนที่เป็นอัตนัยคือคุณสมบัติที่คุ้มค่าหรือไม่
Jacob

6
การขาดการพิมพ์แบบสแตติกทำให้โปรแกรมเมอร์เขียนโค้ดที่มีข้อผิดพลาดรันไทม์ได้ง่ายขึ้น ใน C # int foo = 4; Console.Write(foo.Length);ไม่ได้รวบรวมดังนั้นข้อผิดพลาด "Int32 ไม่มีความยาวคุณสมบัติ" ไม่สามารถนำไปใช้กับซอฟต์แวร์ที่เผยแพร่ได้โดยไม่ตั้งใจ ในไพ ธ อนเว้นแต่คุณจะเรียกใช้เครื่องมือรองที่เป็นทางเลือกเพื่อค้นหาข้อผิดพลาดเช่นนั้นรหัสที่เข้าถึงสมาชิกของออบเจ็กต์ที่ไม่มีอยู่สามารถไปตรวจไม่พบจนกว่าจะสิ้นสุดลง
ยาโคบ

27

ฉันคิดว่าชิ้นส่วนที่เน้นวัตถุของ Python ให้ความรู้สึก "ติดแน่น" ความต้องการทั้งหมดในการส่ง "ตนเอง" ไปยังทุก ๆ วิธีอย่างชัดเจนเป็นอาการที่เป็นองค์ประกอบของ OOP ที่ไม่ได้วางแผนไว้อย่างชัดเจนคุณสามารถพูดได้ มันยังแสดงให้เห็นกฎการกำหนดขอบเขตของพิ ธ ที่บางครั้งก็ถูกวิพากษ์วิจารณ์ในคำตอบอื่น

แก้ไข:

เมื่อฉันพูดว่าชิ้นส่วนที่เป็นวัตถุของ Python จะรู้สึกว่า "สลักเกลียว" ฉันหมายความว่าในบางครั้งด้าน OOP รู้สึกค่อนข้างไม่สอดคล้องกัน ใช้ Ruby ตัวอย่างเช่นใน Ruby ทุกอย่างเป็นวัตถุและคุณเรียกใช้เมธอดโดยใช้obj.methodไวยากรณ์ที่คุ้นเคย(ยกเว้นตัวดำเนินการโอเวอร์โหลดที่แน่นอน) ใน Python ทุกอย่างก็เป็นวัตถุด้วยเช่นกัน แต่บางวิธีที่คุณเรียกว่าเป็นฟังก์ชั่น คือเกินคุณ__len__จะกลับมายาว แต่เรียกว่าใช้len(obj)แทนคุ้นเคยมากขึ้น (และสอดคล้องกัน) obj.lengthที่พบบ่อยในภาษาอื่น ๆ ฉันรู้ว่ามีเหตุผลที่อยู่เบื้องหลังการตัดสินใจออกแบบนี้ แต่ฉันไม่ชอบพวกเขา

ยิ่งกว่านั้นโมเดล OOP ของ Python ขาดการปกป้องข้อมูลใด ๆ กล่าวคือไม่มีสมาชิกส่วนบุคคลที่ได้รับการปกป้องและสาธารณะ คุณสามารถเลียนแบบพวกเขาโดยใช้_และ__ต่อหน้าวิธีการ แต่มันน่าเกลียด ในทำนองเดียวกันหลามไม่ได้ค่อนข้างได้รับด้านการส่งผ่านข้อความของ OOP ขวาอย่างใดอย่างหนึ่ง


17
พารามิเตอร์ของตัวเองกำลังทำให้ชัดเจนว่าภาษาอื่น ๆ ปล่อยให้อยู่โดยนัย ภาษาเหล่านั้นมีพารามิเตอร์ "ตนเอง" อย่างชัดเจน

13
@Roger Pate: ใช่ แต่ความต้องการที่ชัดเจนสำหรับ "ตัวเอง" เป็นประเภทที่น่ารำคาญ (และฉันจะเถียงสิ่งที่เป็นนามธรรมรั่ว) มันไม่ได้มาจากการตัดสินใจออกแบบโดยเจตนา แต่เนื่องจากกฎการกำหนดขอบเขตที่พิลึกของ Python ฉันไม่สามารถค้นหาบทความได้อย่างรวดเร็ว แต่มีอีเมลโพสต์จาก Guido van Rossum ที่อธิบายได้อย่างชัดเจนว่าทำไมต้องใช้พารามิเตอร์ "self"
mipadi

2
@Roger Pate: ในภาษาเชิงวัตถุการส่งผ่านเป้าหมายเป็นพารามิเตอร์แรกยังคงสามารถพิจารณารายละเอียดการใช้งานได้ จุดของฉันแม้ว่าไม่ว่าจะเป็นความคิดที่ดีหรือไม่ ประเด็นก็คือใน Python มันไม่ได้เกิดจากการตัดสินใจออกแบบอย่างมีสติ แต่เพื่อหลีกเลี่ยงหูดในระบบการกำหนดขอบเขต
mipadi

3
@mipadi: การปรับปรุงมีเหตุผลที่ดีกว่า (ดังนั้นฉันจะลบ downvote) แต่ถ้าคุณดู len เป็นตัวดำเนินการที่คุณใช้งานมากเกินไป OO ใน Python จะมากขึ้น ชอบที่จะเห็นตัวอย่างหรือเหตุผลว่า Python ทำให้การส่งข้อความผิดพลาดได้อย่างไร

8
ตนเองชัดเจนเป็นผลพลอยได้จากความจริงที่ว่าวิธีการที่เป็นเพียงฟังก์ชั่น (และตามที่ Winston ตั้งข้อสังเกตการประกาศตัวแปรท้องถิ่นโดยนัย) คุณมีอิสระที่จะไม่ชอบการตัดสินใจในการออกแบบ แต่การเรียก OOP "ปิด" ในภาษาที่ทุกอย่างเข้าถึงได้ในขณะที่วัตถุในขณะทำงานนั้นโง่
ncoghlan

19

สิ่งที่ฉันไม่ชอบเกี่ยวกับ Python:

  1. การทำเกลียว (ฉันรู้ว่ามันถูกกล่าวถึงแล้ว แต่ควรพูดถึงในทุกโพสต์)
  2. ไม่รองรับฟังก์ชั่นนิรนามหลายบรรทัด ( lambdaสามารถมีได้เพียงนิพจน์เดียวเท่านั้น)
  3. ไม่มีฟังก์ชั่น / คลาสการอ่านอินพุตที่เรียบง่าย แต่ทรงพลัง (เช่นcinหรือscanfใน C ++ และ C หรือScannerใน Java)
  4. สตริงทั้งหมดไม่ใช่ยูนิโค้ดตามค่าเริ่มต้น (แต่ได้รับการแก้ไขใน Python 3)

5
เกี่ยวกับ (2) ฉันคิดว่าสิ่งนี้ชดเชยด้วยความเป็นไปได้ที่จะมีฟังก์ชั่นที่ซ้อนกัน
Konrad Rudolph

3
@ KonradRudolph qualm หลักของฉันพร้อมฟังก์ชั่นที่ซ้อนกันแทน lambdas หลายบรรทัดคือลำดับการอ่านถูกสลับ
CookieOfFortune

2
@wkschwartz: raw_inputและ 'sys.stdin' นั้นค่อนข้างเปลือยเปล่า พวกเขาไม่สนับสนุนการป้อนข้อมูลที่จัดรูปแบบ (เช่นบางสิ่งเช่น "% d:% d:% d"% (ชั่วโมงนาทีนาทีวินาที) เพื่ออ่านในเวลา) จนถึงขณะนี้ Python ไม่มีสิ่งใดที่เข้าใกล้การทำงานของ scanf (ใน C) หรือ Scanner (Java)
MAK

2
@limscoder: สตริงทั้งหมดเป็น Unicode ตามค่าเริ่มต้นใน Java ฉันไม่เห็นเหตุผลที่ดีในการแยกชั้นเรียนแบบ str และ unicode IMHO สตริงและอาร์เรย์ของไบต์ไม่ควรถูกแสดงด้วยนามธรรม คลาสสตริงควรใช้สำหรับการจัดเก็บและจัดการข้อความ - ซึ่งเป็นตัวแทนภายในที่เราไม่สนใจจริงๆ เราไม่ควรต้องการที่จะทำสิ่งที่ต้องการตัด / แทนที่ / ลบ / ใส่ได้ไบต์เฉพาะภายในสตริง - เราต้องการที่จะทำเช่นนี้ที่เฉพาะเจาะจงตัวอักษร มันง่ายที่จะลืมความแตกต่างและมีรหัสของคุณระเบิดเมื่อป้อนข้อมูลที่ไม่ใช่ภาษาอังกฤษ
MAK

1
@limscoder: หากคุณต้องการเห็นยูนิโค้ดง่ายลอง Tcl ฉันต้องเปลี่ยนจาก Tcl เป็น Python เมื่อไม่กี่ปีก่อนและเด็กชายฉันประหลาดใจที่การสนับสนุน Unicode ของ Python ดั้งเดิมนั้นอยู่ในรูปแบบของการประหารชีวิต มันมองไม่เห็นอย่างแท้จริงใน Tcl และความเจ็บปวดที่สำคัญในงูหลาม
Bryan Oakley

18

อาร์กิวเมนต์เริ่มต้นที่มีชนิดข้อมูลที่ไม่แน่นอน

def foo(a, L = []):
    L.append(a)
    print L

>>> foo(1)
[1]
>>> foo(2)
[1, 2]

มันมักจะเป็นผลมาจากข้อบกพร่องที่ลึกซึ้งบางอย่าง ฉันคิดว่ามันจะดีกว่าถ้ามันสร้างวัตถุรายการใหม่เมื่อใดก็ตามที่ต้องการอาร์กิวเมนต์เริ่มต้น (แทนที่จะสร้างวัตถุเดียวที่จะใช้สำหรับการเรียกใช้ฟังก์ชันทุกครั้ง)

แก้ไข: ไม่ใช่ปัญหาใหญ่ แต่เมื่อมีบางสิ่งที่จำเป็นต้องอ้างถึงในเอกสารบ่อยครั้งก็หมายความว่าเป็นปัญหา ไม่ควรทำเช่นนี้

def foo(a, L = None):
    if L is None:
        L = []
    ...

โดยเฉพาะเมื่อนั้นควรจะเป็นค่าเริ่มต้น มันเป็นพฤติกรรมแปลก ๆ ที่ไม่ตรงกับสิ่งที่คุณคาดหวังและไม่เป็นประโยชน์สำหรับสถานการณ์จำนวนมาก


ฉันเห็นการร้องเรียนจำนวนมากเกี่ยวกับเรื่องนี้ แต่ทำไมผู้คนถึงยืนยันว่ามีรายการที่ว่างเปล่า (ที่ฟังก์ชันแก้ไข) เป็นอาร์กิวเมนต์เริ่มต้น นี่เป็นปัญหาใหญ่จริงเหรอ? นั่นคือปัญหาจริงหรือ
Martin Vilcans

8
มันละเมิดหลักการของความประหลาดใจอย่างน้อย ไม่มีใครคาดหวังว่าพารามิเตอร์ของฟังก์ชั่นจะอยู่รอดในการโทร
aib

มันเป็นผลมาจากการเป็นภาษาสคริปต์ คุณจะได้รับการนิ่งงันโดยข้อผิดพลาดนี้เพียงครั้งเดียวและไม่เคยอีกครั้ง การหาจุดบกพร่องนี้ด้วยตัวคุณเองจะช่วยให้คุณได้รับความสนุกเพื่อเตือนคุณว่าใช่นี่ยังคงเป็นภาษาสคริปต์ และนั่นก็เป็นเพียงเพราะภาษานั้นดีในการซ่อนด้านสคริปต์ (สมมติว่าคุณใช้อย่างถูกต้อง)
Zoran Pavlovic

@ ZoranPavlovic จากความอยากรู้เหตุใดจึงเป็นผลมาจากการเป็นภาษาสคริปต์? ดูเหมือนว่าจะมีปัญหาเมื่อข้อมูลถูกผูกไว้และเนื่องจากรายการต่าง ๆ ไม่แน่นอน (ซึ่งเป็นสองสิ่งที่ปกติดี แต่ท้ายที่สุดจะไม่ดีเมื่อรวมกัน) ปัญหาเดียวกันอาจเกิดขึ้นในภาษาที่ไม่ใช่สคริปต์หากคุณผูกข้อมูลในเวลาที่สร้างฟังก์ชันแทนที่จะสร้างรายการใหม่ทุกครั้งที่มีการเรียกใช้ฟังก์ชัน
jsternberg

@ aib: ฉันไม่คิดว่า - พารามิเตอร์ที่นี่เช่นเดียวกับวัตถุ Python อื่น ๆ - เป็นตัวชี้ไปยังวัตถุ ในกรณีนี้วัตถุเป็นสิ่งที่เปลี่ยนแปลงได้และตัวแปรถูกผูกไว้เมื่อประกาศฟังก์ชัน พารามิเตอร์จะ "เอาตัวรอดระหว่างการโทร" แต่สิ่งที่ยังมีชีวิตอยู่คือการอ้างอิงไปยังวัตถุที่ไม่แน่นอน
Patrick Collins

14

ฟีเจอร์บางส่วนของ Python ที่ทำให้มันมีความยืดหยุ่นเช่นเดียวกับการพัฒนาภาษาก็ถูกมองว่าเป็นข้อเสียเปรียบที่สำคัญโดยที่ใช้ในการวิเคราะห์แบบคงที่ "ทั้งโปรแกรม" ดำเนินการโดยการรวบรวมและกระบวนการเชื่อมโยงในภาษาเช่น C ++ และ Java

  • การประกาศตัวแปรท้องถิ่นโดยนัย

มีการประกาศตัวแปรท้องถิ่นโดยใช้คำสั่งการมอบหมายปกติ นี่หมายความว่าการผูกตัวแปรในขอบเขตอื่น ๆ นั้นจำเป็นต้องมีการเพิ่มความคิดเห็นอย่างชัดเจนโดยคอมไพเลอร์ (การประกาศโกลบอลและ nonlocal สำหรับขอบเขตด้านนอกสัญลักษณ์การเข้าถึงแอ็ตทริบิวต์สำหรับขอบเขตอินสแตนซ์) สิ่งนี้จะช่วยลดปริมาณของแผ่นฉนวนที่ต้องใช้อย่างมากเมื่อทำการเขียนโปรแกรม แต่หมายความว่าจำเป็นต้องใช้เครื่องมือวิเคราะห์แบบคงที่ของบุคคลที่สาม (เช่น pyflakes) เพื่อทำการตรวจสอบที่จัดการโดยคอมไพเลอร์ในภาษาที่ต้องการการประกาศตัวแปรที่ชัดเจน

  • รองรับการ "Monkey patching"

เนื้อหาของโมดูลวัตถุคลาสและแม้กระทั่ง namespace ในตัวสามารถปรับเปลี่ยนได้ที่รันไทม์ สิ่งนี้มีพลังมหาศาลทำให้มีเทคนิคที่มีประโยชน์มากมาย อย่างไรก็ตามความยืดหยุ่นนี้หมายความว่า Python ไม่ได้มีคุณสมบัติบางอย่างร่วมกับภาษา OO ที่พิมพ์แบบคงที่ ที่โดดเด่นที่สุดคือพารามิเตอร์ "self" to method เป็นวิธีที่ชัดเจนมากกว่าโดยปริยาย (เนื่องจาก "method" ไม่จำเป็นต้องกำหนดไว้ในคลาสพวกเขาสามารถเพิ่มได้ในภายหลังโดยการปรับเปลี่ยนคลาสซึ่งหมายความว่ามันไม่ได้ใช้งานได้จริงโดยเฉพาะ การส่งผ่านการอ้างอิงอินสแตนซ์โดยนัย) และการควบคุมการเข้าถึงคุณลักษณะไม่สามารถบังคับได้อย่างง่ายดายโดยขึ้นอยู่กับว่ารหัสคือ "ข้างใน" หรือ "นอก" ชั้นเรียน (เนื่องจากความแตกต่างนั้นมีอยู่เฉพาะในขณะที่คำจำกัดความของชั้นเรียน

  • ห่างไกลจากโลหะ

นี่เป็นความจริงสำหรับภาษาระดับสูงอื่น ๆ อีกมากมาย แต่ Python มีแนวโน้มที่จะสรุปรายละเอียดฮาร์ดแวร์ส่วนใหญ่ ภาษาการเขียนโปรแกรมระบบเช่น C และ C ++ ยังคงเหมาะสมกว่าสำหรับการจัดการการเข้าถึงฮาร์ดแวร์โดยตรง (อย่างไรก็ตาม Python จะพูดคุยอย่างมีความสุขกับภาษาเหล่านั้นผ่านทางโมดูลส่วนขยาย CPython หรือพกพาได้มากกว่าผ่านctypesห้องสมุด)


12
  1. ใช้การเยื้องสำหรับบล็อกรหัสแทน {} / start-end อะไรก็ตาม
  2. ภาษาสมัยใหม่ที่ใหม่กว่าทุกภาษามีการกำหนดขอบเขตคำศัพท์ที่เหมาะสม แต่ไม่ใช่ Python (ดูด้านล่าง)
  3. Chaotic docs (เปรียบเทียบกับเอกสาร Perl5 ซึ่งยอดเยี่ยม)
  4. ช่องแคบแจ็คเก็ต (มีทางเดียวเท่านั้นที่จะทำได้)

ตัวอย่างการกำหนดขอบเขตที่ขาด การถอดเสียงจากเซสชันล่าม:

>>> x=0
>>> def f():
...     x+=3
...     print x
... 
>>> f()
Traceback (most recent call last):
  File "", line 1, in ?
  File "", line 2, in f
UnboundLocalError: local variable 'x' referenced before assignment

globalและnonlocalมีการใช้คำหลักเพื่อแก้ไขความโง่เขลาของการออกแบบ


2
เกี่ยวกับการกำหนดขอบเขตมันอาจคุ้มค่าสำหรับผู้ที่อยากรู้python.org/dev/peps/pep-3104เพื่อทำความเข้าใจเหตุผลของวิธีการปัจจุบัน
Winston Ewert

เห็นด้วยกับ +1 ดังนั้น +1
Jas

34
มีวิธีหนึ่งที่จะทำมันเป็นข้อได้เปรียบ เมื่อคุณอ่านรหัสของคนอื่นคุณจะไม่สามารถถอดรหัสคำสั่งเดียวได้ เมื่อสำนวนที่เดินสายในสมองของคุณคุณควรได้รับการยอมรับทันที
rox0r

9
เห็นด้วยอย่างสมบูรณ์กับ @ rox0r "แจ็คเก็ตตรง" ป้องกันไม่ให้เกิดสงครามซินแท็คซ์ทุกประเภท
keithjgrant

8
พูดตามตรงฉันไม่ค่อยต้องการglobalหรือnonlocalคีย์เวิร์ดใน Python ดังนั้นไม่ค่อยที่ฉันลืมปัญหานี้อยู่และต้อง re-google มันไม่กี่ครั้งที่มันเกิดขึ้นแม้ว่าฉันจะเขียนรหัส Python ทุกวันในที่ทำงาน สำหรับฉันรหัสที่ต้องแก้ไขตัวแปรส่วนกลาง (หรือแย่กว่านั้นคือตัวแปรภายนอกที่ไม่ใช่โกลบอล) คือกลิ่นรหัส โดยปกติจะมีวิธีที่ดีกว่า
Ben

11

ฉันพบการผสมผสานของ python ของ object-oriented this.method()และmethod(this)syntax / functional syntax / functional function ที่ไม่มั่นคงมาก:

x = [0, 1, 2, 3, 4]
x.count(1)
len(x)
any(x)
x.reverse()
reversed(x)
x.sort()
sorted(x)

นี่เป็นสิ่งที่แย่มากเพราะฟังก์ชั่นจำนวนมาก (แทนที่จะเป็นวิธีการ) ถูกทิ้งลงในเนมสเปซส่วนกลาง : วิธีการที่เกี่ยวข้องกับรายการ, สตริง, ตัวเลข, ตัวสร้าง, metaprogramming ทั้งหมดรวมกันในรายการเรียงตามตัวอักษรขนาดใหญ่

อย่างน้อยที่สุดภาษาที่ใช้งานได้เช่น F # จะมีฟังก์ชั่นทั้งหมดตั้งชื่ออย่างถูกต้องในโมดูล:

List.map(x)
List.reversed(x)
List.any(x)

ดังนั้นพวกเขาจึงไม่ได้ทั้งหมดเข้าด้วยกัน ยิ่งกว่านั้นนี่คือมาตรฐานที่ติดตามทั่วทั้งห้องสมุดดังนั้นอย่างน้อยก็สอดคล้องกัน

ฉันเข้าใจเหตุผลในการทำฟังก์ชั่น vs วิธีแต่ฉันยังคงคิดว่ามันเป็นความคิดที่ไม่ดีที่จะผสมพวกเขาเช่นนี้ ฉันจะมีความสุขมากถ้าปฏิบัติตามไวยากรณ์วิธีอย่างน้อยสำหรับการดำเนินงานทั่วไป:

x.count(1)
x.len()
x.any()
x.reverse()
x.reversed()
x.sort()
x.sorted()

ไม่ว่าวิธีการกลายพันธุ์หรือไม่การมีวิธีการดังกล่าวบนวัตถุนั้นมีข้อดีหลายประการ:

  • ที่เดียวเพื่อค้นหาการทำงาน "ทั่วไป" ใน data-type: libraries / etc อื่น ๆ อาจมีสิ่งแฟนซีอื่น ๆ ที่พวกเขาสามารถทำได้กับประเภทข้อมูล แต่การดำเนินการ "เริ่มต้น" ทั้งหมดในวิธีการของวัตถุ
  • ไม่จำเป็นต้องให้ทำซ้ำเมื่อโทรModule Module.method(x)ยกตัวอย่างฟังก์ชั่นลิสต์ด้านบนทำไมฉันต้องพูดListซ้ำไปเรื่อย ๆ ? มันควรรู้ว่ามันคือ a Listและฉันไม่ต้องการเรียกใช้Navigation.map()ฟังก์ชันนี้! การใช้x.map()ไวยากรณ์ทำให้มันแห้งและยังคงชัดเจน

และแน่นอนว่ามันมีข้อได้เปรียบเหนือวิธีใส่ทุกอย่างในโลกของการทำมัน ไม่ใช่วิธีปัจจุบันที่ไม่สามารถทำสิ่งต่างๆให้สำเร็จได้ มันเป็นเรื่องที่ค่อนข้างสั้น ( len(lst)) เนื่องจากไม่มีสิ่งใดถูกกำหนดชื่อ! ฉันเข้าใจถึงข้อดีในการใช้ฟังก์ชั่น (พฤติกรรมเริ่มต้น ฯลฯ ) ผ่านวิธีการต่างๆ แต่ฉันก็ยังไม่ชอบ

มันยุ่งแค่ และในโครงการขนาดใหญ่ความยุ่งเหยิงคือศัตรูที่เลวร้ายที่สุดของคุณ


1
ใช่ ... ฉันคิดถึงสไตล์ของ LINQ (ฉันแน่ใจว่า LINQ ไม่ใช่คนแรกที่นำไปใช้ แต่ฉันคุ้นเคยกับมันมากที่สุด) การจัดการรายการ
CookieOfFortune

1
อย่าคิดว่า len (x) เป็นวิธีการหนึ่ง "len" เป็นฟังก์ชั่น Python มีฟังก์ชั่นและวิธีการและฉันไม่เห็นอะไรผิดปกติกับวิธีการนั้น การขาดฟังก์ชั่นที่เหมาะสมคือปกติแล้วแหล่งที่มาของการพิมพ์ที่ไม่มีความจำเป็นมากมาย
rbanffy

ฉันรู้ว่าlen()เป็นฟังก์ชั่นและสิ่งที่เป็นประโยชน์ ฉันยังระบุเหตุผลที่ผมคิดว่ามันเป็นความคิดที่ดีว่าทำไมผมคิดว่าทั่วโลกฟังก์ชั่นที่มีความคิดที่ดีโดยเฉพาะอย่างยิ่งและเหตุผลที่ผมคิดว่าวิธีการให้เป็นวิธีที่สะดวกในการจัดระเบียบและกำหนดขอบเขตการทำงานของคุณ =)
Haoyi

ฉันไม่คิดว่าคำหลัก 42 (หรือ 43) เป็นคำหลักที่มีขนาดใหญ่ ที่ยังมีสิ่งที่ชอบdef, classและการโทรออกฟังก์ชั่นอื่น ๆ เปรียบเทียบกับ 100+ ในภาษายอดนิยมอื่น ๆ ส่วนใหญ่ นอกจากนี้ให้พิจารณาเส้นจาก:import this Namespaces are one honking great idea -- let's do more of those!ฉันคิดว่าคุณอาจเข้าใจผิดว่า Python namespaces;)
Wayne Werner

8

ขาดhomoiconicity

Python ต้องรอ 3.x เพื่อเพิ่มคำหลัก "with" ไม่ว่าจะเป็นภาษา homoiconic ก็ตามมันอาจถูกเพิ่มเข้าไปในห้องสมุดได้เล็กน้อย

ปัญหาอื่น ๆ ส่วนใหญ่ที่ฉันเห็นในคำตอบเป็นหนึ่งใน 3 ประเภท:

1) สิ่งที่สามารถแก้ไขได้ด้วยเครื่องมือ (เช่น pyflakes) 2) รายละเอียดการใช้งาน (GIL ประสิทธิภาพ) 3) สิ่งที่สามารถแก้ไขได้ด้วยมาตรฐานการเข้ารหัส (เช่นคุณสมบัติที่ผู้คนไม่ต้องการ)

# 2 ไม่ใช่ปัญหาเกี่ยวกับภาษา IMO # 1 และ # 3 ไม่ใช่ปัญหาร้ายแรง


1
withพร้อมใช้งานจาก Python 2.5 ด้วยfrom __future__ import with_statementแต่ฉันเห็นด้วยบางครั้งฉันก็พบว่าโชคร้ายที่ข้อความเช่นif/ for/ print/ ฯลฯ เป็น "พิเศษ" แทนฟังก์ชั่นทั่วไป
dbr

7

Python เป็นภาษาที่ฉันชอบเนื่องจากมีการแสดงออกมาก แต่ก็ยังป้องกันไม่ให้คุณทำผิดพลาดมากเกินไป ฉันยังมีบางสิ่งที่รบกวนฉัน:

  • ไม่มีฟังก์ชั่นที่ไม่ระบุชื่อจริง แลมบ์ดาสามารถใช้สำหรับฟังก์ชั่นคำสั่งเดียวและwithสามารถใช้คำสั่งสำหรับหลายสิ่งที่คุณต้องการใช้บล็อกโค้ดในรูบี แต่ในบางสถานการณ์มันทำให้งุ่มง่ามกว่าที่พวกเขาจะต้องเป็น (ห่างไกลจากความซุ่มซ่ามอย่างที่ควรจะเป็นใน Java แต่ก็ยัง ... )

  • ความสับสนในความสัมพันธ์ระหว่างโมดูลและไฟล์ การใช้ "python foo.py" จากบรรทัดคำสั่งนั้นแตกต่างจาก "import foo" การนำเข้าสัมพัทธ์ใน Python 2.x สามารถทำให้เกิดปัญหาได้เช่นกัน อย่างไรก็ตามโมดูลของ Python นั้นดีกว่าคุณสมบัติที่เกี่ยวข้องของ C, C ++ และ Ruby

  • selfชัดเจน แม้ว่าฉันจะเข้าใจเหตุผลบางอย่างและแม้ว่าฉันจะใช้ Python ทุกวัน แต่ฉันก็มักจะทำผิดพลาดจากการลืมมัน ปัญหาอีกประการหนึ่งของมันคือมันน่าเบื่อนิดหน่อยที่จะสร้างคลาสจากโมดูล ตนเองที่ชัดเจนนั้นเกี่ยวข้องกับการ จำกัด ขอบเขตที่คนอื่น ๆ บ่น ขอบเขตที่เล็กที่สุดใน Python คือขอบเขตของฟังก์ชัน หากคุณทำให้ฟังก์ชั่นของคุณมีขนาดเล็กอย่างที่ควรจะเป็นนั่นไม่ใช่ปัญหาด้วยตัวเองและ IMO มักจะให้โค้ดที่สะอาด

  • ฟังก์ชั่นระดับโลกบางอย่างเช่นlenที่คุณคาดหวังว่าจะเป็นวิธีการ (ซึ่งจริง ๆ แล้วมันอยู่เบื้องหลัง)

  • การเยื้องที่สำคัญ ไม่ใช่ความคิดของตัวเองซึ่งฉันคิดว่ายอดเยี่ยม แต่เนื่องจากนี่เป็นสิ่งเดียวที่ทำให้ผู้คนจำนวนมากลองใช้ Python บางที Python อาจจะดีกว่าด้วยสัญลักษณ์เริ่มต้น / สิ้นสุดบางอย่าง (เป็นทางเลือก) ไม่สนใจคนเหล่านั้นฉันสามารถมีชีวิตอยู่ด้วยขนาดที่บังคับสำหรับการเยื้องเช่นกัน

  • ไม่ใช่ภาษาในตัวของเว็บเบราว์เซอร์แทนที่จะเป็น JavaScript

จากการร้องเรียนเหล่านี้เป็นเพียงคนแรกที่ฉันสนใจพอที่ฉันคิดว่าควรจะเพิ่มในภาษา อีกอันหนึ่งค่อนข้างเล็กยกเว้นอันสุดท้ายซึ่งจะดีมากถ้ามันเกิดขึ้น!


+1 มันทำให้ฉันสงสัยว่าจะเขียนdatetime.datetime.now()เมื่อโปรเจ็กต์หนึ่งสามารถเขียนdatetime.nowและจากนั้นผสมสองโปรเจควิธีหนึ่งในการเขียนมันออกกฎอื่น ๆ และแน่นอนว่าสิ่งนี้จะไม่เกิดขึ้นใน Java ซึ่งจะไม่ตั้งชื่อโมดูลเหมือนกับไฟล์ (?) หากคุณเห็นว่าวิธีทั่วไปดูเหมือนว่าโมดูลจะทำให้เราสับสนกับไฟล์เมื่อมีการใช้งานทั้งสองอย่างและชัดเจนselfฉันยังคงพยายามเข้าใจเนื่องจากการโทรไม่มีจำนวนอาร์กิวเมนต์เท่ากันกับฟังก์ชั่น และคุณอาจคิดว่า VM python นั้นช้า?
Niklas Rosencrantz

เกี่ยวกับปัญหาของคุณกับคำหลักอย่างชัดเจน ฉันขอแนะนำให้ใช้ไพ ธ อน IDE ดี ๆ ฉันรู้ว่า PyDev บน Eclipse ทำให้ส่วนของลายเซ็นฟังก์ชั่นสมบูรณ์อัตโนมัติหากตรวจพบว่าคุณกำลังเขียนภายในชั้นเรียน
Zoran Pavlovic

5

Python ไม่ได้พัฒนาเต็มที่: ภาษา python 3.2 ในขณะนี้มีปัญหาความเข้ากันได้กับแพคเกจส่วนใหญ่ที่กระจายอยู่ในปัจจุบัน นี่เป็นข้อเสียเปรียบครั้งใหญ่ที่ต้องใช้ความพยายามในการพัฒนามากขึ้น (ค้นหาแพ็คเกจที่ต้องการตรวจสอบความเข้ากันได้การเลือกแพคเกจที่ไม่ดีซึ่งอาจเข้ากันได้ดีกว่าใช้เวอร์ชันที่ดีที่สุดอัปเดตเป็น 3.2 ซึ่งอาจใช้เวลาหลายวัน เริ่มทำสิ่งที่มีประโยชน์)

มีแนวโน้มว่าในกลางปี ​​2012 นี้จะมีข้อเสียน้อยกว่า

โปรดทราบว่าฉันคิดว่าฉันได้รับการโหวตจากแฟนบอย ในระหว่างการอภิปรายนักพัฒนาทีมนักพัฒนาระดับสูงของเราถึงข้อสรุปเดียวกันแม้ว่า

ครบกําหนดในความหมายหลักหมายถึงทีมสามารถใช้เทคโนโลยีและทำงานได้อย่างรวดเร็วโดยไม่มีความเสี่ยงซ่อนเร้น (รวมถึงปัญหาความเข้ากันได้) แพคเกจหลามของบุคคลที่สามและแอพจำนวนมากไม่ทำงานภายใต้ 3.2 สำหรับแพ็คเกจส่วนใหญ่ในปัจจุบัน สิ่งนี้ทำให้เกิดการรวมการทำงานการทดสอบการนำเทคโนโลยีมาใช้ใหม่มากกว่าการแก้ปัญหาในมือ == เทคโนโลยีที่เป็นผู้ใหญ่น้อยลง

อัปเดตสำหรับมิถุนายน 2556: Python 3 ยังคงมีปัญหาที่ครบกำหนด บ่อยครั้งที่สมาชิกในทีมจะกล่าวถึงแพคเกจที่จำเป็นแล้วพูดว่า "ยกเว้นเพียง 2.6" (ในบางกรณีเหล่านี้ฉันได้ใช้วิธีแก้ปัญหาผ่านซ็อกเก็ต localhost เพื่อใช้แพ็คเกจ 2.6 เท่านั้นที่มี 2.6 และส่วนที่เหลือของ เครื่องมือของเราใช้ 3.2) ไม่ใช่แม้แต่ MoinMoin, pure-python wiki, ถูกเขียนใน Python 3


2
ฉันเห็นด้วยกับคุณเฉพาะในกรณีที่คำจำกัดความของวุฒิภาวะของคุณไม่สามารถใช้ร่วมกับเวอร์ชันที่ไม่สามารถใช้งานร่วมกับการออกแบบได้
tshepang

3
ฉันยอมรับว่าสตรีมที่เข้ากันไม่ได้ของงูใหญ่สองตัวนั้นเป็นปัญหา (แม้ว่าจะเข้าใจได้ว่าทำไมมันถึงทำ) แต่ฉันไม่เห็นว่าเป็นปัญหาของ "วุฒิภาวะ"
Winston Ewert

ครบกำหนดในแง่หนึ่งหมายถึงทีมสามารถใช้เทคโนโลยีและทำงานได้อย่างรวดเร็วโดยไม่มีความเสี่ยงซ่อนเร้น (รวมถึงปัญหาความเข้ากันได้) แพคเกจหลามของบุคคลที่สามและแอพจำนวนมากไม่ทำงานภายใต้ 3.2 สำหรับแพ็คเกจส่วนใหญ่ในปัจจุบัน สิ่งนี้ทำให้เกิดการรวมการทำงานการทดสอบการนำเทคโนโลยีมาใช้ใหม่มากกว่าการแก้ปัญหาในมือ == เทคโนโลยีที่เป็นผู้ใหญ่น้อยลง
Jonathan Cline IEEE

2
จากนั้นใช้ Python 2.x คุณรู้ไหมว่า ... ทุกคนใช้เวอร์ชั่นนี้ หรืออ่านเอกสารแพคเกจเป็นเวลา 2 วินาทีเพื่อหาว่าเป็นเวอร์ชั่นใดที่เข้ากันได้
jsternberg

2
"เพียงเพราะ python 3.0 ออกมาบางครั้งไม่ได้หมายความว่าเป็นรุ่นที่คุณควรใช้ Python 3.0 และ 2.x กำลังได้รับการพัฒนาในเวลาเดียวกันฉันหวังว่าในอนาคตเราทุกคนจะสามารถใช้งานได้ python 3.0 แต่สำหรับตอนนี้การใช้ 2.x เป็นทางออกที่ดี "-> นั่นเป็นวิธีพูด 500 อักขระ: ยังไม่เป็นผู้ใหญ่
Jonathan Cline IEEE

4

การกำหนดขอบเขตของ Python เสียอย่างรุนแรงซึ่งทำให้การเขียนโปรแกรมเชิงวัตถุใน Python อึดอัดใจมาก


8
คุณยกตัวอย่างได้ไหม (ฉันแน่ใจว่าคุณพูดถูก แต่ฉันต้องการตัวอย่าง)
Winston Ewert

24
ผมชอบงูหลาม แต่ฉันอย่างดูถูกต้องใส่self.ในด้านหน้าของทุกอ้างอิงถึงคุณสมบัติและวิธีการในอินสแตนซ์ มันทำให้เป็นไปไม่ได้ที่จะใช้ Python เพื่อสร้าง DSL เหมือนง่ายใน Ruby
Adam Crossland

35
ฉันไม่พบตัวเองที่น่าอึดอัดใจฉันชอบความชัดเจน
Winston Ewert

9
ฉันไม่เห็นว่าเรื่องใหญ่ ๆ เกี่ยวกับตัวตนที่ชัดเจนคืออะไร ใน C ++, Java และ D, ผู้คนมักทำให้ตัวแปรสมาชิกชัดเจนโดยการประชุม แต่อย่างใดโดยการเติมคำนำหน้าด้วยการขีดเส้นใต้
dsimcha

7
คุณใช้ตัวเองในวิธีการที่แตกต่างจากการประกาศของพวกเขา: def foo (self) แต่ self.foo () ฉันพบการผสมผสานของคำจำกัดความที่ชัดเจน แต่สิ่งที่แฝงอยู่เบื้องหลังไม่ชัดเจนเกินไป
LennyProgrammers

4

ความรู้เกี่ยวกับ Python ของฉัน:

  • ปิด OOP (ดูคำตอบของ @ mipadi สำหรับรายละเอียดเกี่ยวกับเรื่องนี้)
  • การใช้งาน lambdas ที่ไม่สมบูรณ์
  • ปัญหาขอบเขต
  • ไม่มีการรวบรวมถาวรในไลบรารีมาตรฐาน
  • ความคลาดเคลื่อนไม่ดีต่อ DSLs ในตัว

ทำไมต้องลงคะแนน
missingfaktor

ฉันไม่ได้เป็นนักลงคะแนนเสียง แต่คุณสามารถอธิบายได้ไหมว่าทำไมคุณถึงคิดว่า OO ติดอยู่? Python มี OO อยู่เสมอมันเป็นส่วนสำคัญของภาษา
Daenyth

ดูคำตอบของ @ mipadi
missingfaktor


4

ตัวดัดแปลงการเข้าถึงใน Python ไม่สามารถใช้บังคับได้ - ทำให้ยากในการเขียนโค้ดที่มีโครงสร้างและโมดูลาร์ที่ดี

ฉันคิดว่านั่นเป็นส่วนหนึ่งของการกำหนดขอบเขตของ @ Mason ปัญหาใหญ่โดยทั่วไปเกี่ยวกับภาษานี้ สำหรับโค้ดที่ควรอ่านได้ดูเหมือนว่าเป็นการยากที่จะคิดว่าอะไรที่ควรและควรอยู่ในขอบเขตและสิ่งที่มีค่าจะอยู่ ณ จุดใด ๆ ในเวลา - ฉันกำลังคิดที่จะย้ายจากภาษา Python เนื่องจากข้อเสียเหล่านี้ .

เพียงเพราะ "เราทุกคนยินยอมผู้ใหญ่" ไม่ได้หมายความว่าเราไม่ได้ทำผิดพลาดและไม่ทำงานได้ดีขึ้นในโครงสร้างที่แข็งแกร่งโดยเฉพาะเมื่อทำงานในโครงการที่ซับซ้อน - การเยื้องและการขีดเส้นใต้ที่ไม่มีความหมายดูเหมือนจะไม่เพียงพอ .


ดังนั้นการขาดการควบคุมการเข้าถึงจึงไม่ดี ... แต่การกำหนดขอบเขตอย่างชัดเจนของตัวแปรการเขียนไปยังเนมสเปซที่ไม่ใช่ในพื้นที่ก็ไม่ดีเช่นกัน?
ncoghlan

@ncoghlan: 1 - คุณลักษณะนั้นเป็นมาตรฐานในหลายภาษาที่ทันสมัยขึ้นอยู่กับวิธีที่คุณกำหนดค่าโครงการของคุณ 2- มันอยู่ภายใต้การควบคุมของโปรแกรมเมอร์ 3 - ไม่แน่ใจว่ามีอะไรยอดเยี่ยมเกี่ยวกับเรื่องนั้น - คุณสามารถควบคุมขอบเขตของคุณได้อย่างง่ายดายด้วยการตั้งค่าโปรเจ็กต์ในภาษา / IDE ที่คอมไพล์แล้วส่วนใหญ่ หาก 'เราทุกคนยินยอมผู้ใหญ่' เราควรสามารถตัดสินใจและปรับขอบเขตตามระดับความสะดวกสบายโดยเฉพาะของเรา
เวกเตอร์

2
ประเด็นก็คือผู้คนที่ถามว่า "การควบคุมการเข้าถึงแบบบังคับใช้" กำลังขอให้เรานำเอาสิ่งใดสิ่งหนึ่งที่ทำให้ Python เป็นภาษาที่ยอดเยี่ยม: มันเป็นการยากที่นักพัฒนาจะควบคุมวิธีการใช้รหัสในภายหลัง มีจำนวนต้นแบบใน C ++ และรูปแบบ Java ที่มีเพียงเพื่อแก้ไขการควบคุมการเข้าถึงที่บังคับใช้? ฉันสามารถเข้าใจได้อย่างชัดเจนว่าผู้คนที่เลือกที่จะไม่ใช้ Python ด้วยเหตุผลเหล่านั้น แต่การบังคับใช้แบบสแตติกนั้นไม่สามารถทดแทนการทดสอบที่เข้มงวดได้
ncoghlan

1
@ncoghlan - สำหรับฉันสิ่งที่ยอดเยี่ยมเกี่ยวกับ Python คือความสง่างามของวากยสัมพันธ์และความสำเร็จ - ความหมาย และอย่างที่ฉันบอกว่าการกำหนดขอบเขตไม่เกี่ยวข้องกับโปรแกรมเมอร์ที่ทำสิ่งต่าง ๆ ที่พวกเขาไม่ควรทำกับโครงสร้างของรหัสและองค์กรดังนั้นแนวคิดของ 'ผู้ใหญ่ที่ยินยอม' จึงเป็นสิ่งที่สงสัย ฉันทำงานในโครงการที่ซับซ้อนไม่ใช่สาธารณูปโภคและสคริปต์อย่างง่าย - รหัสจะต้องได้รับการทำให้เป็นโมดูลและจัดโครงสร้างอย่างระมัดระวัง - ตัวดัดแปลงการเข้าถึงเป็นหนึ่งในวิธีที่สำคัญที่สุดในการรับรองว่า
เวกเตอร์

1
และการตรวจสอบรหัสการฝึกอบรมและการวิเคราะห์ข้อต่อคือสิ่งอื่น สำหรับฉันแล้วการควบคุมการเข้าถึงที่บังคับใช้อยู่ในที่เก็บข้อมูลเดียวกันกับการพิมพ์แบบสแตติกพวกเขาช่วยในการเพิ่มความมั่นใจในความถูกต้อง (แต่ไม่เพียงพอที่จะหลีกเลี่ยงความจำเป็นในการทดสอบที่ครอบคลุม) แต่มีค่าใช้จ่ายสูง (ในระดับที่ใช้งานได้จริงการควบคุมการเข้าถึงคุณสมบัติของคลาสยังไม่เหมาะกับรูปแบบวัตถุของ Python ที่วิธีการเป็นเพียงฟังก์ชั่นธรรมดาที่ดึงมาจากคลาสขอบเขต "ภายใน / ภายนอก" สำหรับชั้นเรียนไม่มีอยู่จริงดังนั้นจึงไม่สามารถ บังคับใช้)
ncoghlan

3
  1. ประสิทธิภาพไม่ดี แต่ปรับปรุงด้วย pypy
  2. GIL ป้องกันการใช้เธรดเพื่อเร่งโค้ด (แม้ว่านี่จะเป็นการปรับให้เหมาะสมก่อนกำหนด)
  3. มันมีประโยชน์สำหรับการเขียนโปรแกรมประยุกต์เท่านั้น

แต่มันมีคุณสมบัติการไถ่ที่ยอดเยี่ยม:

  1. มันเหมาะสำหรับ RAD
  2. ง่ายต่อการเชื่อมต่อกับ C (และสำหรับ C เพื่อฝังล่ามหลาม)
  3. มันอ่านง่ายมาก
  4. มันง่ายที่จะเรียนรู้
  5. มันเป็นเอกสารที่ดี
  6. รวมแบตเตอรี่จริง ๆ มันเป็นห้องสมุดมาตรฐานที่มีขนาดใหญ่มากและ pypi มีโมดูลสำหรับการใช้งานจริงทุกอย่าง
  7. มันมีชุมชนที่มีสุขภาพดี

อะไรเป็นแรงบันดาลใจให้พูดถึงข้อดี คำถามสำหรับปัญหา อย่างไรก็ตามสิ่งที่คุณหมายถึงมีประโยชน์สำหรับการเขียนโปรแกรมประยุกต์เท่านั้น มีโปรแกรมอะไรอีกบ้าง สิ่งที่เฉพาะเจาะจงมันไม่ดีหรือ?
tshepang

5
ฉันแสดงข้อดีเพราะฉันคิดว่าพวกเขามีค่ามากกว่าข้อเสีย คุณเคยลองใช้โมดูลเคอร์เนล linux ใน python หรือไม่
dan_waterworth

3

ฉันชอบงูใหญ่และข้อเสียแรกที่มาถึงใจของฉันคือเมื่อแสดงความคิดเห็นออกคำสั่งเช่นif myTest():นั้นคุณต้องเปลี่ยนการเยื้องของบล็อกที่ถูกประหารทั้งหมดซึ่งคุณไม่ต้องทำกับ C หรือ Java อันที่จริงแล้วใน python แทนที่จะแสดงความคิดเห็นในประโยค if-clause แทนฉันเริ่มให้ความเห็นด้วยวิธีนี้: `ถ้าเป็น True: #myTest () ดังนั้นฉันจะไม่ต้องเปลี่ยนบล็อกโค้ดต่อไปนี้อีก เนื่องจาก Java และ C ไม่พึ่งพาการเยื้องจึงทำให้การคอมเม้นท์คำสั่งง่ายขึ้นด้วย C และ Java


1
คุณจะแก้ไขรหัส C หรือ Java อย่างจริงจังเพื่อเปลี่ยนระดับบล็อกของบางรหัสโดยไม่เปลี่ยนการเยื้องหรือไม่
Ben

4
@Ben ชั่วคราวใช่ ...
ทางเลือก

1
@ เหมือนกันที่นี่
Christopher Mahan

2
ผมใช้เคล็ดลับของการเปลี่ยนแปลงไปif something() if False and something()เคล็ดลับก็คือ "แสดงความคิดเห็นออก" โดยใช้สตริงหลายบรรทัด
Martin Vilcans

1
@ มาร์ตินแน่นอน! ถ้าเป็นเท็จ ...
Christopher Mahan

3

การจัดส่งหลายรายการไม่สามารถทำงานร่วมกับระบบประเภทการจัดส่งแบบเดี่ยวได้ดีและไม่ค่อยมีประสิทธิภาพ

การโหลดแบบไดนามิกเป็นปัญหาใหญ่ในระบบไฟล์แบบขนานที่ความหมายคล้าย POSIX นำไปสู่การชะลอตัวลงอย่างรุนแรงสำหรับการดำเนินการที่ต้องใช้ข้อมูลเมตา ฉันมีเพื่อนร่วมงานที่เผาผลาญหนึ่งในสี่ล้านชั่วโมงในการทำงานเพียงแค่รับ Python (ที่มี numpy, mpi4py, petc4py และโมดูลส่วนขยายอื่น ๆ ) ที่โหลดบนแกน 65k (การจำลองส่งผลลัพธ์ทางวิทยาศาสตร์ใหม่ ๆ ที่สำคัญดังนั้นมันจึงคุ้มค่า แต่เป็นปัญหาเมื่อมีการเผาน้ำมันมากกว่าหนึ่งถังเพื่อโหลด Python หนึ่งครั้ง) การไม่สามารถเชื่อมโยงแบบคงที่ได้บังคับให้เราไปสู่การมีส่วนร่วมที่ยอดเยี่ยม เวลาในการโหลดที่สมเหตุสมผลในระดับรวมถึงการแพตช์ libc-rtld เพื่อให้dlopenการเข้าถึงระบบไฟล์ส่วนรวม


ว้าวดูเหมือนว่ามีเทคนิคสูงคุณมีเอกสารอ้างอิงตัวอย่างโพสต์บล็อกหรือบทความในหัวข้อหรือไม่ ฉันสงสัยว่าฉันจะได้สัมผัสกับกรณีดังกล่าวในอนาคตอันใกล้
วินเซนต์

Aron ให้พูดคุยที่ SciPy 2012 dlopenสิ่งที่อยู่ในของเราcollfsห้องสมุด พื้นที่เก็บข้อมูลนั้นยังมีลูกเล่นเพิ่มเติมของ zipimport ที่ได้รับแรงบันดาลใจจากการแคชเส้นทางของ Asher Langton เรากำลังทำงานเกี่ยวกับการกระจายที่ดีขึ้นและกระดาษ
Jed

3
  • ค่อนข้างมากของห้องสมุดบุคคลที่สามที่สำคัญมากและซอฟต์แวร์ที่ใช้กันอย่างแพร่หลายค่อนข้างไม่ pythonic ตัวอย่างเล็ก ๆ น้อย ๆ : soaplib, openerp, reportlab คำติชมอยู่นอกขอบเขตมันอยู่ที่นั่นมันถูกใช้อย่างกว้างขวาง แต่มันทำให้วัฒนธรรมของงูหลามสับสน (มันเจ็บคำขวัญที่บอกว่า "ควรมีอย่างใดอย่างหนึ่ง ความสำเร็จแบบ pythonic ที่เป็นที่รู้จัก (เช่น django หรือ trac) ดูเหมือนจะเป็นข้อยกเว้น
  • ความลึกที่ไม่ จำกัด ของอินสแตนซ์คลาสคลาสเมตาคลาสนั้นมีความสวยงามและเป็นเอกลักษณ์ แต่เพื่อให้เชี่ยวชาญคุณต้องรู้ล่ามอย่างลึกซึ้ง (ซึ่งในรหัสไพ ธ อนนั้นถูกตีความ ฯลฯ ) มันไม่เป็นที่รู้จักและใช้กันอย่างแพร่หลาย (หรือใช้อย่างถูกต้อง) ในขณะที่เวทมนตร์สีดำที่คล้ายกันเช่น C # generics ซึ่งเป็นแนวคิดที่ซับซ้อนมากขึ้น (IMHO) ดูเหมือนว่ารู้จักและใช้กันอย่างแพร่หลายมากขึ้นตามสัดส่วน
  • เพื่อให้เข้าใจหน่วยความจำและแบบจำลองเกลียวได้ดีคุณต้องมีประสบการณ์กับงูหลามเนื่องจากไม่มีสเป็คที่ครอบคลุม คุณเพิ่งรู้ว่าอะไรทำงานได้ดีอาจเป็นเพราะคุณอ่านล่ามหรือล่ามที่มีประสบการณ์และค้นพบวิธีการแก้ไข ตัวอย่างเช่นมีการอ้างอิงที่แข็งแกร่งหรืออ่อนแอเท่านั้นไม่ใช่การอ้างอิงแบบ soft และ phantom ของ java Java มีเธรดสำหรับการรวบรวมขยะในขณะที่ไม่มีคำตอบอย่างเป็นทางการเกี่ยวกับเมื่อการรวบรวมขยะเกิดขึ้นในหลาม คุณสามารถสังเกตได้ว่าการรวบรวมขยะไม่ได้เกิดขึ้นหากไม่มีการเรียกใช้งานโค้ดไพ ธ อนและสรุปได้ว่าบางครั้งมันอาจเกิดขึ้นเมื่อพยายามจัดสรรหน่วยความจำ อาจเป็นเรื่องยุ่งยากเมื่อคุณไม่รู้ว่าทำไมทรัพยากรที่ถูกล็อคไม่ได้ถูกปล่อยออกมา (ประสบการณ์ของฉันเกี่ยวกับสิ่งนั้นคือ mod_python ใน freeswitch)

อย่างไรก็ตามหลามเป็นภาษาหลักของฉันเป็นเวลา 4 ปีแล้ว การเป็นแฟนบอย, ชนชั้นนำหรือโมโนมาเนียไม่ได้เป็นส่วนหนึ่งของวัฒนธรรมหลาม


+1 Spec สำหรับรุ่นหน่วยความจำและเกลียวอยู่ขวา แต่ FWIW ตัวรวบรวมขยะ Java อยู่ในเธรด (และส่วนใหญ่ทุกอย่างเกี่ยวกับ GC) ไม่ใช่ลักษณะของภาษาจาวาหรือข้อมูลจำเพาะ VM ต่อ se แต่เป็นเรื่องของการใช้งานของ JVM โดยเฉพาะ อย่างไรก็ตาม Sun / Oracle JVM หลักมีการบันทึกพฤติกรรมของ wrt GC และความสามารถในการกำหนดค่าได้อย่างกว้างขวางจนถึงระดับที่มีการตีพิมพ์หนังสือทั้งเล่มเกี่ยวกับการปรับแต่ง JVM ในทางทฤษฎีเราสามารถจัดทำเอกสาร CPython ได้ในลักษณะเดียวกัน
Andrew Janke

2
  • OOP แปลก ๆ
    • len(s)ผ่าน__len__(self)และ "วิธีการพิเศษ" อื่น ๆ
    • วิธีพิเศษเพิ่มเติมซึ่งอาจมาจากวิธีพิเศษอื่น ๆ ( __add__และ__iadd__สำหรับ+และ+=)
    • self เป็นพารามิเตอร์วิธีแรก
    • คุณสามารถลืมที่จะเรียกตัวสร้างคลาสฐาน
    • ไม่มีตัวดัดแปลงการเข้าถึง (ส่วนตัวป้องกัน ... )
  • ไม่มีคำจำกัดความคงที่
  • ไม่มีการเปลี่ยนแปลงไม่ได้สำหรับประเภทที่กำหนดเอง
  • GIL
  • ประสิทธิภาพต่ำซึ่งนำไปสู่การผสมผสานของ Python และ C และปัญหาในการสร้าง (มองหา C libs การพึ่งพาแพลตฟอร์ม ... )
  • เอกสารไม่ดีโดยเฉพาะใน libs ของบุคคลที่สาม
  • ความไม่ลงรอยกันระหว่าง Python 2.x และ 3.x
  • เครื่องมือวิเคราะห์รหัสที่ไม่ดี (เทียบกับสิ่งที่เสนอสำหรับภาษาที่พิมพ์แบบคงที่เช่น Java หรือ C #)

5
โดยส่วนตัวแล้วฉันคิดว่าความไม่ลงรอยกันระหว่าง 2.x ถึง 3.x เป็นหนึ่งในข้อดีที่สุดของ Python แน่นอนว่ามันยังเป็นข้อเสีย แต่ความกล้าของนักพัฒนาที่จะทำลายความเข้ากันได้ย้อนหลังก็หมายความว่าพวกเขาไม่จำเป็นต้องพก cruft ไปอย่างไม่มีที่สิ้นสุด ภาษาอื่น ๆ ต้องการการยกเครื่องเช่นนั้น
Konrad Rudolph

0

"การเปลี่ยนไม่ได้" ไม่ได้เป็นจุดแข็ง หมายเลข AFAIK tuples และสตริงไม่เปลี่ยนรูปทุกอย่างอื่น (เช่นวัตถุ) ไม่แน่นอน เปรียบเทียบกับภาษาที่ใช้งานได้เช่น Erlang หรือ Haskell ที่ซึ่งทุกอย่างไม่เปลี่ยนรูป (โดยค่าเริ่มต้นอย่างน้อย)

อย่างไรก็ตามการเปลี่ยนไม่ได้จริงๆส่องแสงพร้อมกัน * ซึ่งไม่ได้เป็นจุดแข็งของ Python ดังนั้นอย่างน้อยก็เป็นผลที่ตามมา

(* = สำหรับ nitpickers: ฉันหมายถึงการทำงานพร้อมกันซึ่งอย่างน้อยก็ส่วนคู่ขนานกันฉันเดาว่า Python ใช้ได้กับการเห็นพ้องด้วย "single-threaded" ซึ่งการเปลี่ยนแปลงไม่ได้สำคัญเท่าไร (ใช่ FP-lovers ฉันรู้ว่าการเปลี่ยนแปลงไม่ได้ ยอดเยี่ยมแม้ไม่มีการเกิดขึ้นพร้อมกัน))


0

ฉันชอบที่จะมีโครงสร้างที่ขนานกันอย่างชัดเจน บ่อยกว่าเมื่อฉันเขียนรายการความเข้าใจเช่น

[ f(x) for x in lots_of_sx ]

ฉันไม่สนใจลำดับที่จะประมวลผลองค์ประกอบ บางครั้งฉันไม่สนใจว่าพวกเขาจะกลับมาเพื่อ

แม้ว่า CPython จะไม่สามารถทำได้ดีเมื่อ f ของฉันเป็น Python แท้ๆ แต่พฤติกรรมเช่นนี้อาจถูกกำหนดไว้สำหรับการใช้งานอื่น ๆ ที่จะใช้


// วางพวงของเธรด // ส่งคิวคิวไปยังเธรดทั้งหมด que.extend ([x สำหรับ x ใน lots_of_sx]) que.wait () # รอให้ล็อตทั้งหมดจะประมวลผลโดยเธรด
Zoran Pavlovic

0

งูใหญ่ไม่มีหางเพิ่มประสิทธิภาพการโทรส่วนใหญ่สำหรับเหตุผลปรัชญา ซึ่งหมายความว่าการวนรอบซ้ำในโครงสร้างขนาดใหญ่อาจทำให้หน่วยความจำ O (n) (เนื่องจากสแต็กที่ไม่จำเป็นซึ่งถูกเก็บไว้) และคุณต้องเขียนการสอบถามซ้ำเป็นวนซ้ำเพื่อรับหน่วยความจำ O (1)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.