Java dev learning Python: ฉันต้องใช้แนวคิดอะไรในการห่อหัวของฉัน?


38

ความเป็นมา: ฉันทำงานไม่กี่บทช่วยสอนและเขียนโครงการขนาดเล็ก ทั้งหมดเป็นไปอย่างดีพอโดยใช้ Google และStackOverflow

หลายครั้งในช่วงไม่กี่วันที่ผ่านมาฉันพบว่าตัวเองสงสัยว่า - ฉันรู้สึกว่าฉันยังคงคิดถึง Java อยู่เมื่อฉันเขียนเป็น Python

คำถามนี้ที่ StackOverflow เต็มไปด้วยเคล็ดลับเกี่ยวกับแหล่งข้อมูลที่จะอ่านเพื่อการเรียนรู้ของ Python แต่ฉันยังรู้สึกว่าฉันเป็นนักพัฒนา Java ที่มีพจนานุกรม

สิ่งที่ฉันต้องการทำจริงๆคือ refactor หัวของฉันให้สามารถเขียน Pythonic Python แทน Java ที่ปลอมตัวเป็น Python โดยไม่สูญเสียทักษะ Java ของฉัน

ดังนั้นปมคำถามของฉันคือ: แนวคิดอะไรที่ Java dev ต้องการเรียนรู้ที่จะคิด Pythonic จริงๆ? รวมถึงสิ่งใดก็ตามที่จำเป็นต้องเรียนรู้

หมายเหตุ: ฉันกำลังถามเกี่ยวกับแนวคิดภาษาไม่ใช่เกี่ยวกับไวยากรณ์ภาษา


9
ปล่อยความคิดที่ว่าการเขียนโปรแกรมควรจะยาก
งาน

คำตอบ:


40

นอกเหนือจากที่กล่าวไว้แล้ว:

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

  • มีอินเตอร์เฟซที่ไม่มี; กฎการพิมพ์เป็ด หากคุณต้องการอย่างยิ่งพวกเขามี 'abstract base classes (ABCs)' แต่โดยปกติแล้วคุณจะไม่พลาดอินเตอร์เฟสเนื่องจากไม่มีการตรวจสอบประเภทคงที่

  • แม้ว่าทุกอย่างจะเป็นวัตถุ แต่ฟังก์ชั่นมาก่อนวัตถุ มีเพียงฟังก์ชั่น (และไม่มีคลาส) ในโมดูลนั้นดีมาก

  • ทุกอย่างเป็นเอนทิตีชั้นหนึ่ง การส่งผ่านฟังก์ชั่นเป็นพารามิเตอร์การส่งคืนและการกำหนดตัวแปรเป็นบรรทัดฐาน เหมือนกันสำหรับชั้นเรียน วิธีการเป็นฟังก์ชั่นเพียง; คุณสามารถจัดการกับวิธีการอินสแตนซ์ราวกับว่ามันเป็นฟังก์ชั่นปกติผ่านมันไปรอบ ๆ ฯลฯ

  • ใช้ dicts, ชุด, รายการและ tuples ในตัว รายการและ dicts แปรเปลี่ยนได้ tuples ไม่ใช่ พวกเขาทั้งหมดมีประสิทธิภาพมากและรวบรัด syntactically ทำความคุ้นเคยกับการคืนค่าหลายค่าจากฟังก์ชันโดยใช้ tuple (คุณไม่จำเป็นต้องใช้วงเล็บ) ทำความคุ้นเคยกับการแทนที่ลำดับชั้นที่ซับซ้อนของวัตถุที่ง่ายมากด้วยการใช้ contraptions ที่ทำจากรายการล้วน tuples และ dicts ('hashtables') ทำให้ชีวิตง่ายขึ้น

  • Python มีการสนับสนุน FP ที่ค่อนข้างยุติธรรม เรียนรู้รายการความเข้าใจและจากนั้นวนซ้ำและตัวกำเนิด สิ่งเหล่านี้ช่วยได้มาก

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

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

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

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

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

  • เธรดของ Python นั้นเหมาะสำหรับการประมวลผล I / O-bound แต่ไม่เหมาะสำหรับ CPU-bound อย่าพยายามเพิ่มความเร็วในงานคอมพิวเตอร์โดยการรันในเธรดแบบขนาน


+1 คะแนนที่ดีมาก Nitpicking: Noneโดยปกติจะเป็นสาเหตุAttributeError(แต่ไม่สำคัญคุณมักไม่ต้องการมัน) และคุณสามารถ (และในบางกรณีควร) เขียนวัตถุที่ไม่เปลี่ยนรูป (เช่นผ่านnamedtuple)

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

1
Python (และภาษา FP อื่น ๆ ) แทนที่การสร้างรหัส verbose ของการสร้างบล็อคที่ง่ายขึ้นด้วยการสร้างรหัสที่กะทัดรัดบนการสร้างบล็อกที่ซับซ้อนมากขึ้น คิดว่าโปรเซสเซอร์ RISC กับ CISC
Paul

1
ฉันจะเพิ่มชุดให้กับโครงสร้างข้อมูล
sakisk

2
น้อยกว่า 3 ปีตั้งแต่ฉันถามคำถามนี้ ฉันต้องบอกว่าคำแนะนำนี้ยืนขึ้นได้ดีมาก
LRE

14

อ่านบทความนี้: งูหลามไม่ Java (รวมถึงบทความอื่น ๆ ส่วนใหญ่ในแถบด้านข้างมีมูลค่าการอ่านแม้ว่าจะไม่เกี่ยวข้องกับ Java) บทความนี้ให้พอยน์เตอร์ที่ยอดเยี่ยมเกี่ยวกับวิธีที่โปรแกรมเมอร์ Java สามารถใช้ Python ในการใช้งานผิดพลาดโดยไม่ได้ตั้งใจ


6
"XML ไม่ใช่คำตอบ" - มันเหนือกว่า Java v Python ;-)
LRE

3

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

กรอบก็กำหนดน้อยลงในงูหลาม เฟรมเว็บมี 10s ที่ใช้งานได้สำหรับผู้เริ่มต้นเท่านั้น Django แทนที่ Spring และ SQL Alchemy for Hibernate มากกว่าหรือน้อยกว่า


2

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

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

นี่ myjobtitle และค่าของ job.title ชี้ไปที่วัตถุเดียวกัน class attribute job.startDate ได้รับการกำหนดสตริงก่อนแล้วจึงไปยังวัตถุเวลา และตลอดทุกอย่างอินสแตนซ์ของงานและแม้กระทั่งคลาสเองก็สามารถเปลี่ยนแปลงได้แบบไดนามิก


1

นอกจากนี้คุณยังอาจต้องการที่จะดูที่Jython มันอาจรองรับ Python 2.5 เท่านั้น แต่เราพบว่ามันมีประสิทธิภาพมากที่จะสามารถสร้างต้นแบบอย่างรวดเร็วด้วย Python จากนั้นเขียนใหม่ใน Java ในภายหลังหากจำเป็น

จากคำตอบของฉันเป็นฉันควรคิดอย่างไรเมื่อเปลี่ยนจาก Python เป็น Java ตามที่คำถามนี้ถูกปิดเหมือนสำเนาของคำถามนี้!

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