ทำไม Python จึงไม่ดีสำหรับการเขียนโปรแกรมที่ใช้งานได้? [ปิด]


324

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


2
2018 - Coconut (ภาษาโปรแกรมการทำงานที่คอมไพล์ไปยัง Python)ช่วยเพิ่มประสิทธิภาพการเขียนโปรแกรมใน Python ดูเพิ่มเติมชุดของบทความจาก IBM นี้หน้า 1 หน้า 2 หน้า 3
cssyphus

คำตอบ:


393

คำถามที่คุณอ้างอิงถามว่าภาษาใดส่งเสริมทั้ง OO และการเขียนโปรแกรมเชิงฟังก์ชัน Python ไม่สนับสนุนการเขียนโปรแกรมการทำงานแม้ว่ามันจะทำงานได้ดี

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

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

นี่คือสิ่งที่ฉันต้องการใช้ใน Python:


  • ไม่มีการจับคู่รูปแบบและไม่มีการเรียกซ้ำหางหมายความว่าอัลกอริทึมพื้นฐานของคุณจะต้องเขียนอย่างไม่ถูกต้อง การเรียกซ้ำเป็นสิ่งที่น่าเกลียดและช้าใน Python
  • ไลบรารีรายการขนาดเล็กและไม่มีพจนานุกรมที่ใช้งานได้หมายความว่าคุณต้องเขียนสิ่งต่าง ๆ มากมายด้วยตัวคุณเอง
  • ไม่มีไวยากรณ์สำหรับการแก้ปัญหาหรือการแต่งเพลงหมายความว่าสไตล์ที่ไม่มีจุดเป็นเรื่องเกี่ยวกับเครื่องหมายวรรคตอนที่ผ่านการขัดแย้งอย่างชัดเจน
  • Iterators แทนที่จะเป็นรายการขี้เกียจหมายความว่าคุณต้องรู้ว่าคุณต้องการประสิทธิภาพหรือความคงทนและกระจายสายไปlistรอบ ๆ หากคุณต้องการความคงทน (Iterators ใช้ครั้งเดียว)
  • ไวยากรณ์ที่จำเป็นอย่างง่ายของไพ ธ อนพร้อมกับตัวแยกวิเคราะห์ LL1 แบบง่ายหมายความว่าไวยากรณ์ที่ดีกว่าสำหรับ if-expressions และ lambda-expressions นั้นเป็นไปไม่ได้ กุยโด้ชอบแบบนี้และฉันคิดว่าเขาพูดถูก

5
+1 สำหรับการเรียกซ้ำหางที่หายไป - แม้ว่าโครงสร้างวนลูปได้แทนที่มันแล้วมันยังมีบางสิ่งที่คุ้มค่าที่ขาดหายไประหว่าง Python และ Scheme
new123456

5
คำตอบที่ยอดเยี่ยมสำหรับความสมบูรณ์และองค์ประกอบ อนิจจาเช่นเดียวกับคำตอบมากมายที่มีพื้นหลังการทำงานที่แข็งแกร่งมี IMO ใช้คำศัพท์ที่ไม่เหมาะสม ในขณะที่ฉันเข้าใจว่าคุณไม่สามารถอธิบายรายละเอียดของแนวคิดแต่ละคำตอบได้ฉันสงสัยว่า OP (ที่มีพื้นหลัง FP จำกัด ที่ยอมรับ) นั้นทราบดีเมื่ออ่านคำต่างๆเช่น "การจับคู่รูปแบบ", "พจนานุกรมการทำงาน", "currying" หรือ " รายการขี้เกียจ "
ThomasH

4
จุดดี; ฉันคิดว่าทางออกคือการเพิ่มลิงค์ คุณมีตัวแทนเพียงพอที่จะแก้ไขคำตอบของฉันได้ไหม ถ้าเป็นเช่นนั้นอย่าลังเลที่จะเพิ่มลิงก์ไปยังแนวคิดต่าง ๆ ฉันจะเริ่มเมื่อฉันมีเวลาในภายหลัง
Nathan Shively-Sanders

5
ฉันรู้ว่านี่คือ 5 ปี แต่ ... ดูเหมือนว่ามันเป็นเรื่องเกี่ยวกับสิ่งที่คุณคิดถึงจาก Haskellไม่ใช่จากภาษาที่ใช้งานได้ ตัวอย่างเช่นภาษา ML และ Lisp ส่วนใหญ่และลูกหลานไม่มีการแช่งโดยอัตโนมัติทำสไตล์ที่ไม่มีจุดมากเกินไปไม่มีรายการที่ขี้เกียจ ฯลฯ ดังนั้นหากตัววนซ้ำรายการที่ทำให้คนขี้เกียจทำให้ Python เป็นภาษาที่ใช้งานไม่ได้ไม่ต้องให้ CAML สาหัสภาษาการทำงาน?
abarnert

4
@abarnert: Caml มีสัญลักษณ์แสดงหัวข้อย่อยทุกรายการยกเว้นรายการสันหลังยาวซึ่งมีอยู่ในห้องสมุด ฉันใช้ Caml เป็นครั้งคราวในขณะที่ฉันเขียนคำตอบนี้และตอนนี้ใช้ F # ทั้งสองเป็นภาษาที่ใช้งานได้ดีมาก
Nathan Shively-Sanders

102

กุยมีคำอธิบายที่ดีของเรื่องนี้ที่นี่ นี่คือส่วนที่เกี่ยวข้องมากที่สุด:

ฉันไม่เคยคิดว่า Python ได้รับอิทธิพลอย่างมากจากภาษาที่ใช้งานได้ไม่ว่าผู้คนจะพูดหรือคิดอย่างไร ฉันคุ้นเคยกับภาษาที่ต้องใช้ภาษามากขึ้นเช่น C และ Algol 68 และถึงแม้ว่าฉันจะทำฟังก์ชั่นวัตถุชั้นหนึ่งฉันก็ไม่ได้มองว่า Python เป็นภาษาโปรแกรมที่ใช้งานได้ อย่างไรก็ตามก่อนหน้านี้เป็นที่ชัดเจนว่าผู้ใช้ต้องการทำมากขึ้นด้วยรายการและฟังก์ชั่น

...

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

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

ฉันดึงสองสิ่งออกจากนี้:

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

8
คุณสามารถเพิ่มประสิทธิภาพการโทรหางใน Python ได้ดี กุยโด้ไม่ได้ / ไม่เข้าใจ
Jules

26
ดูเหมือนจะต้มลงไปที่ Guido van Rossum ไม่ชอบสไตล์การทำงาน
Svante

59
ฉันคิดว่ามันแม่นยำมากกว่าที่จะบอกว่า Guido van Rossum ไม่เข้าใจสไตล์การใช้งานและไม่เข้าใจว่าทำไม Python จึงต้องการมัน คุณต้องเข้าใจสองสิ่ง: 1) ภาษาการเขียนโปรแกรมอยู่ที่ด้านล่างของสแต็คเทคโนโลยีและส่งผลกระทบต่อทุกสิ่งที่สร้างขึ้นบนพวกเขาและ 2) เช่นเดียวกับซอฟต์แวร์อื่น ๆ มันง่ายกว่าที่จะเพิ่มฟีเจอร์ต่างๆ ดังนั้นฉันคิดว่ามันมีคุณภาพที่ดีสำหรับนักออกแบบภาษาที่จะวิจารณ์คำขอเหล่านี้
เจสันเบเกอร์

8
"ได้รับเสียงกระเพื่อมเป็นแบบไดนามิก" -> และจำเป็นอย่างยิ่ง!
pyon

6
@Jules คุณคิดจะแบ่งปันแนวทางการใช้ tail Optimization Optimization ใน Python หรือไม่? ตัวชี้ไปยังบางแหล่งจะมีประโยชน์
David Shaked

52

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

  1. คนพิการแลมบ์ดา เนื่องจากแลมบ์ดามีเพียงนิพจน์เท่านั้นและคุณไม่สามารถทำทุกอย่างได้อย่างง่ายดายในบริบทของนิพจน์นั่นหมายความว่าฟังก์ชันที่คุณสามารถกำหนด "ได้ทันที" นั้นมี จำกัด

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

  3. Guido ขู่ว่าจะลบแผนที่ตัวกรองและลดทุก ๆ ครั้ง

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


3
ทำแผนที่กรองและลดขนาดที่ไม่จำเป็นในงูใหญ่ ฉันยังไม่ได้เห็นโค้ดที่เรียบง่ายมากโดยใช้มัน นอกจากนี้ฟังก์ชั่นการโทรใน Python อาจมีราคาแพงดังนั้นจึงเป็นการดีกว่าที่จะใช้ list / generator comprehension หรือ a loop
เจสันเบเกอร์

2
นี่คือสิ่งที่นาธานแซนเดอร์สกล่าวไว้ด้านล่าง: "Python ไม่สนับสนุนการเขียนโปรแกรมการทำงานแม้ว่ามันจะใช้งานได้ดีทีเดียว" หาก Guido ต้องการให้ Python เป็นภาษาที่ใช้งานได้เขาจะทำให้การติดตั้งใช้งานได้ดีพอที่จะใช้งานฟังก์ชั่นที่ไม่ใช้งานได้และจะใช้ Lambdas ในระดับที่คุณสามารถใช้แผนที่ / ตัวกรอง / ลดได้ด้วยวิธีที่มีประโยชน์ ในทางกลับกันคนที่ใช้งานได้เริ่มตื่นขึ้นมาพร้อมกับความเข้าใจในรายการ หวังว่าเราจะไม่ต้องเลือกอย่างใดอย่างหนึ่ง
344209 Jacob B

7
แผนที่และตัวกรองจะถูกแทนที่ด้วยความเข้าใจในรายการเล็กน้อย ลด - เกือบทุกครั้ง - มันไม่มีประสิทธิภาพจนควรถูกแทนที่ด้วยฟังก์ชันเครื่องกำเนิด
S.Lott

13
@ S.Lott คุณจะเปลี่ยนการลดด้วยเครื่องกำเนิดไฟฟ้าได้อย่างไร
พลวง

17
@JacobB List comprehensions นั้นมีให้บริการในภาษาที่ใช้งานได้ประมาณ 15 ปีก่อนที่ Python จะถูกประดิษฐ์ขึ้นและ 25 ปีก่อนที่ Python จะสามารถใช้งานฟีเจอร์นี้ได้ แนวคิดที่ว่า Python มีอิทธิพลต่อการแพร่กระจายของพวกเขาหรือว่า fp ได้เรียนรู้สิ่งนี้จาก Python หรือเพียงแค่ว่าความนิยมใน fp โลกหลังการใช้งาน Python นั้นเป็นเรื่องที่ผิด การดำเนินการของ Python ถูกนำโดยตรงจาก Haskell บางทีฉันอาจจะเข้าใจผิดคุณและนั่นไม่ใช่สิ่งที่คุณหมายถึง แต่ฉันงงงวยโดย "คนทำงานจะเริ่มตื่นขึ้นมาถึงความเข้าใจในรายการความเข้าใจ"
itsbruce

23

ฉันจะไม่มีวันเรียก Python“ functional” แต่เมื่อใดก็ตามที่ฉันเขียนโปรแกรมใน Python โค้ดก็จะกลายเป็นฟังก์ชันที่เกือบหมดจด

เป็นที่ยอมรับว่ามีสาเหตุหลักมาจากความเข้าใจในรายการที่ดีมาก ดังนั้นฉันจึงไม่แนะนำให้ใช้ Python ในฐานะภาษาโปรแกรมที่ใช้งานได้ แต่ฉันขอแนะนำให้ใช้โปรแกรมสำหรับทุกคนที่ใช้ Python


17

ให้ฉันสาธิตด้วยโค้ดที่นำมาจากคำตอบของคำถาม Python ที่ "ใช้งานได้" ใน SO

งูหลาม:

def grandKids(generation, kidsFunc, val):
  layer = [val]
  for i in xrange(generation):
    layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
  return layer

Haskell:

grandKids generation kidsFunc val =
  iterate (concatMap kidsFunc) [val] !! generation

แตกต่างที่สำคัญที่นี่เป็นที่ห้องสมุดมาตรฐาน Haskell มีฟังก์ชั่นที่มีประโยชน์สำหรับโปรแกรมการทำงาน: ในกรณีนี้iterate, concatและ(!!)


7
นี่คือการเปลี่ยนหนึ่งบรรทัดสำหรับร่างกายที่มีการแสดงออกกำเนิด:grandKids() return reduce(lambda a, v: concat((x for x in kidsFunc(v)) for v in a), xrange(generation), [val])
Lloeki

6
และนี่คือสิ่งที่ไม่ต้องการconcatเช่นกัน:return reduce(lambda a, v: (x for v in a for x in kidsFunc(v)), xrange(generation), [val])
Lloeki

9
@Lloeki: ทำซ้ำจะทำให้รหัสนั้นง่ายขึ้นและ (x สำหรับ v ใน a สำหรับ x ใน kidsFunc (v)) นั้นชัดเจนกว่ามากเช่นเดียวกับ concatMap (kidsFunc) ไพ ธ อนของบิวท์อินสั่งสูงนั้นทำให้โค้ดที่มีความลับเทียบเท่าและ verbose เมื่อเทียบกับ Haskell
Phob

2
concat สามารถถูกแทนที่ด้วยitertools.chain.from_iterable
Antimony

@Antimony: ดีที่จะรู้ ขอบคุณ
yairchu

14

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

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

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

ฉันจะจัดอันดับต่อไปนี้เป็นคุณสมบัติที่สำคัญที่สุดของการเขียนโปรแกรมการทำงาน: a) ความโปร่งใสในการอ้างอิง - ถ้าคุณประเมินข้อความเดียวกันในเวลาและสถานที่อื่น ๆ แต่ด้วยค่าตัวแปรเดียวกันมันจะยังคงเหมือนเดิม b) ไม่มีผลข้างเคียง - ไม่ว่าคุณจะจ้องที่ไวท์บอร์ดนานแค่ไหนสมการที่อีกคนกำลังมองไปที่ไวท์บอร์ดอื่นจะไม่เปลี่ยนโดยไม่ได้ตั้งใจ c) ฟังก์ชั่นก็มีคุณค่าเช่นกัน ซึ่งสามารถส่งผ่านไปและนำไปใช้กับหรือตัวแปรอื่น ๆ d) องค์ประกอบของฟังก์ชันคุณสามารถทำ h = g · f และกำหนดฟังก์ชันใหม่ h (.. ) ซึ่งเทียบเท่ากับการเรียก g (f (.. ))

รายการนี้อยู่ในลำดับความสำคัญของฉันดังนั้นความโปร่งใสในการอ้างอิงเป็นสิ่งสำคัญที่สุดตามด้วยไม่มีผลข้างเคียง

ทีนี้ถ้าคุณผ่านไพ ธ อนและตรวจสอบว่าภาษาและไลบรารีสนับสนุนและรับประกันได้ดีเพียงใดแง่มุมเหล่านี้ - คุณก็พร้อมแล้วที่จะตอบคำถามของคุณเอง


2
ฟังก์ชั่นชั้นหนึ่งใน Python
Carl Smith

@CarlSmith อันนั้น แต่ทิ้ง 3/4 ที่ Python ไม่มี : - \
arya

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

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

นอกจากนี้ Python ยังรองรับการเรียนการสอนและการเรียบเรียง แต่ไม่ได้อยู่ในระดับภาษา แต่จะอยู่ในไลบรารีมาตรฐานแทน
Kevin

10

Python เป็นภาษาที่ใช้งานได้เกือบ มันคือ "functional lite"

มันมีคุณสมบัติพิเศษดังนั้นมันจึงไม่บริสุทธิ์สำหรับบางคน

มันยังขาดคุณสมบัติบางอย่างดังนั้นจึงยังไม่สมบูรณ์พอสำหรับบางคน

คุณสมบัติที่ขาดหายไปนั้นค่อนข้างง่ายต่อการเขียน ลองดูโพสต์แบบนี้ใน FP ใน Python


2
ส่วนใหญ่ฉันเห็นด้วยกับโพสต์นี้ แต่ฉันไม่เห็นด้วยกับการพูดว่า Python เป็นภาษาที่ใช้งานได้ มันสนับสนุนการเขียนโปรแกรมที่จำเป็นอย่างมากและเป็นการยากที่จะไม่ใช้ "คุณสมบัติพิเศษ" ที่คุณพูดถึง ฉันคิดว่าเป็นการดีที่สุดที่จะอ้างถึง Python ว่าเป็น "functional lite" อย่างที่คุณทำในโพสต์อื่น :-)
Jason Baker

8
-1 ขออภัยไม่ ฉันหมายถึงเพียงแค่ไม่ ภาษาเชิงหน้าที่จัดทำโครงสร้างที่อำนวยความสะดวกในการใช้เหตุผลอย่างเป็นทางการ: อุปนัย (ML), สมการ (Haskell) การปิดและฟังก์ชั่นที่ไม่ระบุชื่อเพียงอย่างเดียวนั้นเป็นเพียงการสร้างรูปแบบกลยุทธ์
pyon

8

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


4

นอกเหนือจากคำตอบอื่น ๆ เหตุผลหนึ่งที่ Python และภาษาหลายกระบวนทัศน์อื่น ๆ ส่วนใหญ่ไม่เหมาะสำหรับการเขียนโปรแกรมการใช้งานจริงเพราะคอมไพเลอร์ / เครื่องเสมือน / รันไทม์ไม่สนับสนุนการเพิ่มประสิทธิภาพการทำงาน การเพิ่มประสิทธิภาพประเภทนี้ทำได้โดยผู้รวบรวมเข้าใจกฎทางคณิตศาสตร์ ตัวอย่างเช่นภาษาการเขียนโปรแกรมจำนวนมากรองรับmapฟังก์ชั่นหรือวิธีการ นี่เป็นฟังก์ชั่นมาตรฐานที่ค่อนข้างใช้ฟังก์ชั่นเป็นหนึ่งอาร์กิวเมนต์และ iterable เป็นอาร์กิวเมนต์ที่สองจากนั้นใช้ฟังก์ชันนั้นกับแต่ละองค์ประกอบใน iterable

อย่างไรก็ตามมันกลับกลายmap( foo() , x ) * map( foo(), y )เป็นเช่นเดียวกันกับmap( foo(), x * y )เป็นเช่นเดียวกับกรณีหลังนั้นเร็วกว่าเคสรุ่นก่อนเนื่องจากสำเนาต้นฉบับทำสำเนาได้สองชุด

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


map( foo() , x ) * map( foo(), y ) == map( foo(), x * y )ไม่เป็นความจริงสำหรับฟังก์ชั่นทั้งหมด ตัวอย่างเช่นพิจารณากรณีเมื่อfooคำนวณอนุพันธ์
Eli Korvigo

1
ผมคิดว่าเขามีความหมายแทน+ *
user1747134

คุณสมมติว่า foo () เป็นเส้นตรง
juan Isaza

คุณสมบัตินั้นไม่เป็นความจริงสำหรับ foo (x) = x + 1 ในฐานะ (x + 1) * (y + 1)! = x * y + 1
juan Isaza
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.