Python ฟังก์ชันและเมธอดหลัก: ทำความเข้าใจ def Main()

⚡ สรุปอย่างชาญฉลาด

Python ฟังก์ชัน main เป็นจุดเริ่มต้นที่ตัวแปลภาษาจะเริ่มรันโปรแกรม โดยกำหนดด้วย def main() และใช้เงื่อนไข if __name__ == “__main__” เป็นตัวตรวจสอบเงื่อนไข เพื่อแยกโค้ดโมดูลที่นำกลับมาใช้ใหม่ได้ออกจากการรันสคริปต์แบบเดี่ยวๆ

  • 🚀 จุดเริ่มต้น: ฟังก์ชันหลักจะกำหนดจุดเริ่มต้นของการทำงาน เพื่อให้ผู้อ่านสามารถติดตามลำดับการทำงานของโปรแกรมจากจุดเริ่มต้นที่ชัดเจนเพียงจุดเดียว
  • 🧩 def main():: ห่อping ตรรกะภายใน def main() จะแยกการตั้งค่าและการดำเนินการออกจากคำจำกัดความของฟังก์ชันและคลาส
  • 🔒 ยามชื่อ __name__: การตรวจสอบ if __name__ == “__main__” จะเรียกใช้ main() เฉพาะเมื่อมีการเรียกใช้งานโดยตรงเท่านั้น ไม่ใช่เมื่อมีการนำเข้า
  • 🔁 โมดูลที่สามารถนำกลับมาใช้ใหม่ได้: โค้ดที่มีการป้องกันช่วยให้สคริปต์อื่นๆ สามารถนำเข้าฟังก์ชันของคุณได้โดยไม่ต้องเรียกใช้งานโปรแกรมทั้งหมด
  • ⌨️ การป้อนข้อมูลผ่านบรรทัดคำสั่ง: ฟังก์ชัน main() เป็นสถานที่ที่เหมาะสมที่สุดในการอ่านอาร์กิวเมนต์ sys.argv และส่งคืนสถานะการออกจากโปรแกรม
  • 🤖 ความช่วยเหลือจากเอไอ: ผู้ช่วย AI เช่น GitHub Copilot จะสร้างโครงร่าง main() และตัวป้องกัน __name__ จากข้อความแจ้งเตือนสั้นๆ

Python ฟังก์ชั่นหลัก

ความหมายของ Python ฟังก์ชั่นหลัก?

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

ฟังก์ชัน def main() คืออะไร Pythonเพื่อให้เข้าใจเรื่องนี้ ลองพิจารณาตัวอย่างโค้ดต่อไปนี้ ซึ่งเป็นส่วนหนึ่งของแกนหลัก Python การเขียนโปรแกรม พื้นฐาน:

def main() ตัวอย่างที่ 1

def main():
     print ("Hello World!")
print ("Guru99")

Python ฟังก์ชั่นหลัก

ตรงนี้ เรามีข้อความพิมพ์สองส่วน ส่วนหนึ่งกำหนดไว้ในฟังก์ชันหลักคือ “Hello World!” และอีกส่วนหนึ่งเป็นอิสระ คือ “Guru99” เมื่อคุณรันฟังก์ชัน def main ():

  • เท่านั้น "Guruพิมพ์ออกมา 99 นิ้ว
  • และไม่ใช่โค้ด “Hello World!”

เป็นเพราะเราไม่ได้ประกาศสาย ฟังก์ชัน “if__name__== “__main__”

สิ่งสำคัญคือหลังจากกำหนดฟังก์ชันหลักแล้ว คุณต้องเรียกใช้โค้ดโดยใช้ if__name__== “__main__” จากนั้นจึงรันโค้ด จากนั้นคุณจะได้รับเอาต์พุต “hello world!” ในคอนโซลการเขียนโปรแกรม พิจารณาโค้ดต่อไปนี้

def main() ตัวอย่างที่ 2

def main():
    print("Hello World!")

if __name__ == "__main__":
    main()

print("Guru99")

Guruในกรณีนี้จะพิมพ์เลข 99 ลงไป

Python ฟังก์ชั่นหลัก

นี่คือคำอธิบาย

  • เมื่อ Python ล่ามอ่านไฟล์ต้นฉบับ มันจะรันโค้ดทั้งหมดที่พบในนั้น
  • เมื่อ Python รัน “ไฟล์ต้นฉบับ” เป็นโปรแกรมหลัก โดยจะตั้งค่าตัวแปรพิเศษ (__name__) ให้มีค่า (“__main__”)
  • เมื่อคุณรันฟังก์ชัน main ใน python มันจะอ่านคำสั่ง “if” และตรวจสอบว่า __name__ เท่ากับ __main__ หรือไม่
  • In Python “ถ้า__ชื่อ__== “__หลัก__” ช่วยให้คุณสามารถเรียกใช้ Python ไฟล์อย่างใดอย่างหนึ่งเช่น โมดูลที่ใช้ซ้ำได้หรือโปรแกรมแบบสแตนด์อโลน

เหตุใดจึงต้องใช้ฟังก์ชัน main() ใน Python?

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

  • ทางเข้าที่ชัดเจน: ฟังก์ชัน main() จะบอกผู้อ่านทุกคนอย่างชัดเจนว่าโปรแกรมเริ่มต้นที่จุดใด ทำให้เข้าใจตรรกะได้ง่าย
  • โมดูลที่สามารถนำกลับมาใช้ใหม่ได้: Code ฟังก์ชันนี้ถูกควบคุมโดยเงื่อนไข if __name__ == “__main__” และจะทำงานเฉพาะเมื่อมีการเรียกใช้งานโดยตรงเท่านั้น ดังนั้นไฟล์อื่นๆ จึงสามารถนำเข้าฟังก์ชันของคุณได้โดยไม่มีผลข้างเคียง
  • ขอบเขตท้องถิ่น: ตัวแปรที่สร้างขึ้นภายในฟังก์ชัน main() จะคงสถานะเป็นตัวแปรภายในฟังก์ชันนั้น ซึ่งจะช่วยหลีกเลี่ยงการชนกันโดยไม่ได้ตั้งใจกับชื่อตัวแปรส่วนกลางในส่วนอื่นๆ ของโมดูล
  • การทดสอบที่ง่ายขึ้น: การแยกตรรกะไว้ในฟังก์ชัน main() ช่วยให้ชุดทดสอบสามารถเรียกใช้ฟังก์ชันนั้นได้โดยตรงและตรวจสอบผลลัพธ์ได้
  • ข้อตกลงร่วมกัน: ฟังก์ชัน main() เป็นสัญญาณที่ได้รับการยอมรับอย่างกว้างขวางว่าเป็นจุดเริ่มต้นของโปรแกรม ซึ่งช่วยให้การบำรุงรักษาทำได้ง่ายขึ้นสำหรับทีมต่างๆ

โดยสรุป ฟังก์ชัน main() เป็นตัวเลือกเสริมใน Pythonแต่จะช่วยให้โปรแกรมขนาดใหญ่สามารถอ่านได้ ทดสอบได้ และปลอดภัยสำหรับการนำเข้า

ตัวแปร __name__ และ Python โมดูล

เพื่อให้เข้าใจถึงความสำคัญของ __name__ ตัวแปรใน Python วิธีฟังก์ชันหลักพิจารณาโค้ดต่อไปนี้:

def main():
    print("hello world!")

if __name__ == "__main__":
    main()

print("Guru99")

print("Value in built variable name is:  ",__name__)

ตัวแปร __name__ และ Python โมดูล

ตอนนี้ให้พิจารณาว่าโค้ดถูกนำเข้าเป็นโมดูล

import MainFunction

print("done")

ตัวแปร __name__ และ Python โมดูล

นี่คือคำอธิบายโค้ด: เช่นเดียวกับซี Python ใช้ == เพื่อการเปรียบเทียบ ในขณะที่ = สำหรับการมอบหมาย Python ล่ามใช้ฟังก์ชันหลักได้สองวิธี

วิ่งตรง:

  • __ชื่อ__=__หลัก__
  • ถ้าคำสั่ง == True และสคริปต์ใน _main_will จะถูกดำเนินการ

นำเข้าเป็นโมดูล

  • __name__= ชื่อไฟล์ของโมดูล
  • ถ้าคำสั่ง == false และสคริปต์ใน __main__ จะไม่ถูกดำเนินการ

เมื่อโค้ดถูกดำเนินการ มันจะตรวจสอบชื่อโมดูลด้วย “if” กลไกนี้ช่วยให้มั่นใจได้ว่าฟังก์ชันหลักจะดำเนินการเฉพาะเมื่อรันโดยตรงเท่านั้น ไม่ใช่เมื่อนำเข้าเป็นโมดูล

ตัวอย่างข้างต้นคือ Python 3 รหัสถ้าคุณต้องการใช้ Python 2 โปรดพิจารณาโค้ดต่อไปนี้

def main():
  print "Hello World!"
  
if __name__== "__main__":
  main()

print "Guru99"

In Python 3. คุณไม่จำเป็นต้องใช้ if__name โค้ดต่อไปนี้ก็ใช้งานได้เช่นกัน

def main():
  print("Hello World!")
  
main()
print("Guru99")

หมายเหตุ ตรวจสอบให้แน่ใจว่าหลังจากกำหนดฟังก์ชัน main แล้ว คุณเว้นการย่อหน้าไว้บ้างและอย่าประกาศโค้ดไว้ด้านล่างฟังก์ชัน def main(): มิฉะนั้น จะทำให้เกิดข้อผิดพลาดการย่อหน้า

วิธีการส่งอาร์กิวเมนต์บรรทัดคำสั่งไปยัง Python ฟังก์ชัน main()

ฟังก์ชัน main() เป็นสถานที่ที่เหมาะสมที่สุดในการจัดการข้อมูลที่ผู้ใช้ป้อนเข้ามาทางบรรทัดคำสั่ง Python ค่าเหล่านี้จะอยู่ในรายการ sys.argv ซึ่งโมดูล sys มาตรฐานจัดเตรียมไว้ให้ รายการแรก sys.argv[0] คือชื่อสคริปต์ และค่าทุกค่าหลังจากนั้นคืออาร์กิวเมนต์ที่ผู้ใช้ป้อน

ตัวอย่างต่อไปนี้แสดงวิธีการอ่านและพิมพ์อาร์กิวเมนต์จากบรรทัดคำสั่งภายในฟังก์ชัน main():

import sys

def main():
    print("Script name:", sys.argv[0])
    print("Arguments passed:", sys.argv[1:])

if __name__ == "__main__":
    main()

ถ้าคุณบันทึกไฟล์เป็น script.py แล้วรัน สคริปต์ python.py อัลฟา เบต้าโปรแกรมจะพิมพ์ชื่อสคริปต์และรายการ ['alpha', 'beta'] ออกมา เนื่องจากค่าต่างๆ ถูกส่งเข้ามาภายในฟังก์ชัน main() ทำให้ตรรกะยังคงเป็นระเบียบและทดสอบได้ง่าย

ต่อไปนี้เป็นเคล็ดลับที่เป็นประโยชน์บางประการเมื่อทำงานกับข้อมูลป้อนเข้าทางบรรทัดคำสั่ง:

  • ตัดชื่อสคริปต์ออก: ใช้ sys.argv[1:] เพื่ออ่านเฉพาะอาร์กิวเมนต์ที่ผู้ใช้พิมพ์เท่านั้น
  • ใช้ argparse สำหรับเครื่องมือที่มีประสิทธิภาพ: โมดูล argparse ที่มีมาให้ในตัวจะแยกวิเคราะห์แฟล็ก ตัวเลือก และข้อความช่วยเหลือได้อย่างปลอดภัยกว่าการอ่าน sys.argv ด้วยตนเองมาก
  • ส่งคืนรหัสออก: ห่อการเรียกใช้เป็น sys.exit(main()) เพื่อให้ค่าที่ส่งคืนจาก main() กลายเป็นสถานะการออกจากกระบวนการ
  • ตรวจสอบล่วงหน้า: ตรวจสอบจำนวนและประเภทของอาร์กิวเมนต์ที่ด้านบนของฟังก์ชัน main() ก่อนที่จะรันโปรแกรมส่วนที่เหลือ

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

Python ฟังก์ชัน main() เทียบกับภาษาโปรแกรมอื่นๆ

นักพัฒนาที่มาจากภาษา C, C++หรือ Java โดยทั่วไปมักคาดหวังฟังก์ชัน main() ที่จำเป็น Python วิธีการทำงานแตกต่างออกไป เพราะเป็นภาษาที่ใช้การตีความ ดังนั้นตัวตีความจึงรันไฟล์จากบรรทัดบนสุดไปจนถึงบรรทัดล่างสุด ฟังก์ชัน main() ใน Python ดังนั้นจึงเป็นเพียงธรรมเนียมปฏิบัติมากกว่ากฎเกณฑ์

  • C, C++, C# และ Java: ฟังก์ชัน main() เป็นจุดเริ่มต้นที่จำเป็น รันไทม์จะเรียกฟังก์ชันนี้โดยอัตโนมัติ และจะมีได้เพียงฟังก์ชันเดียวต่อโปรแกรมเท่านั้น
  • Python: ไม่จำเป็นต้องมีฟังก์ชัน main() การทำงานจะเริ่มต้นที่บรรทัดแรกของไฟล์ และฟังก์ชัน def main() จะทำงานก็ต่อเมื่อโค้ดของคุณเรียกใช้เท่านั้น
  • ยาม: บล็อก if __name__ == “__main__” จะให้ผลลัพธ์ดังนี้ Python มีจุดประสงค์คล้ายกับการคอมไพล์ฟังก์ชัน main() โดยการกำหนดโค้ดที่ควรทำงานเฉพาะเมื่อไฟล์นั้นเป็นโปรแกรมหลักเท่านั้น

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

คำถามที่พบบ่อย

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

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

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

ใช่ ฟังก์ชัน main() สามารถส่งค่ากลับได้ และรูปแบบทั่วไปคือการเขียน sys.exit(main()) เพื่อให้ค่าที่ส่งกลับนั้นกลายเป็นรหัสการออกจากกระบวนการ การส่งค่า 0 กลับหมายถึงความสำเร็จ ในขณะที่ค่าที่ไม่ใช่ศูนย์หมายถึงข้อผิดพลาด

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

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

GitHub Copilot จะเติมโค้ดโครงสร้างพื้นฐานของ def main() และเงื่อนไข if __name__ == “__main__” โดยอัตโนมัติจากข้อความแสดงความคิดเห็นสั้นๆ นอกจากนี้ยังแนะนำการแยกวิเคราะห์อาร์กิวเมนต์และ docstrings ช่วยให้คุณมุ่งเน้นไปที่ตรรกะของโปรแกรมแทนที่จะเสียเวลาไปกับโค้ดซ้ำซาก

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

สรุปโพสต์นี้ด้วย: