ฉันจะเรียนรู้การเขียนรหัส Pythonic อย่างมีประสิทธิภาพได้อย่างไร


46

ทำการค้นหาโดย Google สำหรับ "pythonic" เผยให้เห็นการตีความที่หลากหลาย หน้าวิกิพีเดียบอกว่า:

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

นอกจากนี้ยังกล่าวถึงคำว่า "unpythonic":

ในทางตรงกันข้ามเครื่องหมายของรหัส unpythonic คือมันพยายามที่จะเขียนโค้ด C ++ (หรือ Lisp, Perl หรือ Java) ใน Python— นั่นคือให้การถอดความแบบคร่าวๆมากกว่าการแปลแบบสำนวนจากภาษาอื่น แนวคิดของ pythonicity ถูกผูกไว้กับปรัชญาการอ่านที่เรียบง่ายของ Python และหลีกเลี่ยงวิธีการ "มีมากกว่าหนึ่งวิธีที่จะทำ" รหัสที่อ่านไม่ได้หรือสำนวนที่เข้าใจยากนั้นเป็นเสียงที่ไม่ไพเราะ

คำว่า "pythonic" หมายถึงอะไร ฉันจะเรียนรู้วิธีการใช้อย่างมีประสิทธิภาพในทางปฏิบัติได้อย่างไร


6
ฉันคิดว่าคำถามของคุณสามารถขยายไปยังภาษาการเขียนโปรแกรมใด ๆ มีวิธีการเขียนโปรแกรมที่แนะนำอยู่เสมอซึ่งอาจแม่นยำในหลายกรณีและเพื่อปรับปรุงการแก้ไขการอ่านและการบำรุงรักษา ผมคิดว่ายังมีความท้าทายคำแนะนำเหล่านั้นสามารถทำให้วิวัฒนาการภาษาและล่วงหน้า ...
Amine

@Amine จริงดังนั้น อันที่จริงฉันคิดว่าวิกิชุมชนนั้นประกอบด้วยสถานที่ที่จะเรียนรู้สำนวนภาษาได้อย่างแม่นยำ - สำหรับทุกภาษา - ควรได้รับการพิจารณา
yati sagade

อาจเกี่ยวข้องกับ: programmers.stackexchange.com/questions/47860/…
FrustratedWithFormsDesigner

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

1
ด้วยการฝึก Python!
ไดนามิก

คำตอบ:


22

ฉันพบว่าคนส่วนใหญ่มีการตีความของพวกเขาเองในสิ่งที่เป็น "Pythonic" ความหมายจริงๆ จาก Wikipedia:

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

ในทางตรงกันข้ามเครื่องหมายของรหัส unpythonic คือมันพยายามที่จะเขียนโค้ด C ++ (หรือ Lisp, Perl หรือ Java) ใน Python— นั่นคือให้การถอดความแบบคร่าวๆมากกว่าการแปลแบบสำนวนจากภาษาอื่น แนวคิดของ pythonicity ถูกผูกไว้กับปรัชญาการอ่านที่เรียบง่ายของ Python และหลีกเลี่ยงวิธีการ "มีมากกว่าหนึ่งวิธีที่จะทำ" รหัสที่อ่านไม่ได้หรือสำนวนที่เข้าใจยากนั้นเป็นเสียงที่ไม่ไพเราะ

ฉันพบว่ามากกว่าครั้งที่ตัวอย่าง "pythonic" มากกว่านั้นมาจากคนที่พยายามฉลาดด้วย Python idioms และ (อีกครั้งมากกว่าไม่) แสดงรหัสของพวกเขาไม่สามารถอ่านได้จริง (ซึ่งไม่ใช่ Pythonic)

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

ตามที่ระบุโดย WorldEngineer PEP8 เป็นมาตรฐานที่ดีในการติดตาม (และถ้าคุณใช้ VIM จะมีปลั๊กอินสำหรับ Pint8 linting)


จริง ๆ แล้วในตอนท้ายของวันถ้าวิธีการแก้ปัญหาของคุณทำงานและไม่ได้อย่างน่ากลัว un-maintainable และบำรุงรักษาช้าใครสนใจ? มากกว่าเวลาที่ไม่ได้งานของคุณคือการทำงานให้เสร็จไม่เขียนโค้ดไพเราะที่สุดที่เป็นไปได้


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


2
+1 สำหรับคำตอบที่ดี (ยกเว้นใบเสนอราคาตั้งแต่ฉันใช้ใน OP)

อ๊ะ .. ควรอ่าน OP ใหม่ก่อนโพสต์ข้อความ: P
Demian Brecht

3
ค่อนข้างมีความสัมพันธ์สูงระหว่างอัตตากับการใช้งานออนไลน์แสดงความคิดเห็นในชุมชนใด ๆ โดยพื้นฐานแล้วคุณไม่เห็นคนที่ไม่เห็นแก่ตัวมากนักเพราะพวกเขาไม่ได้เขียนอะไรมากมายตั้งแต่แรก
isarandi

17

Pythonic คือการใช้รหัสในภาษาไพ ธ อน มันหมายถึงการใช้โครงสร้างและการจัดรูปแบบที่ทำงานได้ดีสำหรับ Python จากมุมมองการเขียนโปรแกรม แต่ยังมาจากมุมมองการอ่านของชุมชน มันเหมือนกับวิธีที่ K&R กำหนดมาตรฐานสำหรับรูปแบบการเขียนโปรแกรม C เป็นเวลานาน คำแนะนำนี้แสดงว่าคุณต้องใช้รหัสในภาษาไพ ธ อน มีการอ้างอิง PEP 8 ในคู่มือดังกล่าวดังนั้นจึงน่าจะคุ้มค่าที่จะอ่าน


1
@MattFenwick นั่นไม่ใช่ 90% ของการเขียนโปรแกรมอะไรที่เกี่ยวกับ? โปรแกรมเมอร์ที่ดีต้องใช้เวลาในการอ่านรหัสมากและในเวลาที่เหลือให้เขียนโค้ดจำนวนมาก รหัส Pythonic ที่คุณอ่านมากขึ้นและยิ่งคุณเขียนใน Python ยิ่งรหัส Pythonic ของคุณก็จะยิ่งมากขึ้นเท่านั้น ฉันไม่คิดว่าจะมีทางลัดใด ๆ ที่นี่
Kris Harper

2
ลิงค์สุดยอด !
Ethan Furman

13

การเขียนรหัส "Pythonic" IMHO เป็นเพียงการใช้งานคุณสมบัติ (V) HLL ที่ภาษามีให้อย่างมีประสิทธิภาพ เป็นตัวอย่างที่แพร่หลาย

x, y = 7, 'fuhrer'

นั่นคือPythonic มาก ฉันจำได้เมื่อฉันเริ่มเรียนรู้ C # หลังจาก Python เพียงเดือนเดียว

int x, y = 10, z;

อย่างใดทำให้ฉันสับสน แต่ใช้เวลาสักครู่ก่อนที่ฉันจะกลับไปที่ราก C / C ++ ของฉัน

อีกวิธี Pythonic ใช้ lambdas

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

จะพิมพ์lเรียงตามลำดับจากมากไปน้อย

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

นอกจากนี้ยังใช้วิธีการเขียนโปรแกรมฟังก์ชั่นที่ใช้งานได้เช่นการใช้แผนที่และลดจะถือว่าเป็น pythonic

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


ฉันไม่ได้รวมลิงก์ตามที่โพสต์ไว้แล้วขณะที่ฉันพิมพ์ - คำตอบของ WorldEngineer :) แค่คิดว่า "ใช้ประโยชน์" คุณสมบัติด้านภาษาสำหรับคุณและคนอื่น ๆ คุณก็จะได้รับ Pythonic และโปรดทำตาม ลิงก์นี้
yati sagade

4
อันที่จริงข้อพิพาทหลายอย่างที่map, reduce, lambdaและดังกล่าวเป็นสำนวนต่อ se รายการความเข้าใจและการแสดงออกของเครื่องกำเนิดไฟฟ้าเป็นทางเลือกและหลายคนชอบพวกเขาเมื่อใดก็ตามที่เป็นไปได้อย่างสมเหตุสมผล (โดยเฉพาะพวกเขาจะมีเสียงดังน้อยกว่าเมื่อคุณต้องการแลมบ์ดา แน่นอนว่าพวกเขามีการใช้งานและการเขียนโปรแกรมการทำงานแสดงในสำนวนอื่น ๆ (มัณฑนากรเช่น)

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

โดยส่วนตัวฉันไม่เคยเข้าใจการตั้งค่าของผู้คนสำหรับตัวอย่างแรกของคุณ นี่ง่ายกว่าที่จะแยกวิเคราะห์ทางจิตใจ (ซึ่งเป็นเซนของ Python รหัสอ่านบ่อยกว่าที่เขียนไว้): (x, y) = (7, 'fuhrer')- แต่ฉันเกือบจะ "แก้ไข" ที่ไม่มี parens เป็นวิธีที่ดีที่สุดในการเขียน!
Izkata

2
ฉันจะยืนยันว่าตัวอย่างการเรียงลำดับเฉพาะของคุณไม่ใช่แบบ pythonic ทำไมต้องจัดเรียงแลมบ์ดาใหม่อีกครั้งหากคุณทำได้print(sorted(l, reverse=True))ซึ่งจะบอกผู้อ่านอย่างชัดเจนว่าเกิดอะไรขึ้น ฉันจะพบตัวอย่างแรกของคุณที่โต้แย้งได้เช่นกัน มันมีสองงานที่ได้รับการบีบอัดเป็นหนึ่ง ไม่เป็นไร แต่ฉันจะไม่เรียกมันว่า Pythonic มาก ๆ ผู้อ่านจะต้องดูสิ่งที่มันทำนานกว่าเมื่อเทียบกับการมีสองงาน
phresnel

7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

รหัส Pythonic คือ:

  • อ่านง่าย
  • เรียบง่าย (ง่ายที่สุด แต่ไม่ง่ายกว่า)
  • คิดออกดี

1
+1 Zen of Python มีความสำคัญมากกว่าสำหรับการเขียนรหัสไพ ธ อนมากกว่าทำตามรายการของสำนวน; หลังจะไม่ครอบคลุมทุกสถานการณ์
Doval

6

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

ใน Python เนื่องจากเราอยู่ในหัวข้อฉันพบตัวอย่างจากDive Into Python ที่มีประโยชน์อย่างเหลือเชื่อสำหรับการเริ่มต้น พวกเขามีแนวโน้มที่จะสอนไม่เพียง แต่พื้นฐานของ Python เท่านั้น แต่ยังเน้นถึงPython ที่ใช้สำนวน

เมื่อเรียนรู้ D เนื่องจากเอกสารไม่ได้ดีในเวลาเพราะภาษาจึงมีเลือดออกที่ขอบผมได้เรียนรู้จากการอ่านรหัสเพื่อห้องสมุดมาตรฐานเฉพาะบางส่วนของผลงานชิ้นเอกของอังเดร Alexandrescu ของ

เมื่อเรียนรู้ C ++ ฉันได้รับ codebase จากโปรแกรมเมอร์ C ++ ที่ดีและเรียนรู้มากมายเกี่ยวกับการเขียนโปรแกรม C ++ จากการยืนกรานในการส่งผ่านคอนเทนเนอร์ STL โดยการอ้างอิง ฯลฯ

ในทุกภาษาฉันพบว่าการสืบค้นคำถาม StackOverflow เกี่ยวกับภาษาและดูสิ่งที่ผู้คนมักจะทำเพื่อช่วยสิ่งพื้นฐานให้สำเร็จ


+1 เมื่อคุณรู้พื้นฐานของภาษารหัสการอ่านจะช่วยได้มากกว่าการอ่านหนังสือ
Pace

3

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


2

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

วิธีหนึ่งที่จะช่วยคุณกำหนดว่า Pythonic นั้นเกี่ยวข้องกับตัวเองอย่างไรให้ถามตนเองว่า "ทำไมฉัน (หมายถึงคุณ) ใช้ภาษา Python?" คุณสนใจเรื่องอะไรเกี่ยวกับเรื่องนี้?

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

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

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

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

ดังนั้นมีสองด้านของไพ ธ อนคืออะไร หนึ่งคือการสร้างประโยคอื่น ๆ คือการปฏิบัติของ จะอธิบายด้านลึกของ "Pythonic" ได้อย่างไร .. ?

ใน Python มันไม่ใช่เรื่องใหญ่ที่จะทำเช่นนี้: alist = ['one', 'two', 'three \ n'] alist.append ((1234, 'Atuple'))

และ tuple จะถูกเพิ่มลงในรายการโดยไม่ต้องกังวลสำหรับประเภทวัตถุ ส่วน Pythonic ไม่ใช่ว่าคุณสามารถทำได้ แต่รหัสของคุณควรคาดหวังสิ่งนี้และเพียงแค่ทำงาน / ปรับเปลี่ยน

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


-2

ซื้อหนังสือแนะนำ อ่านมัน ควรให้พื้นฐานที่ดีในการใช้ภาษาและในกลไกที่ควรเป็นไปตามสไตล์ชุมชน

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