Python 3 - โมดูล
โมดูลช่วยให้คุณสามารถจัดระเบียบโค้ด Python ของคุณได้อย่างมีเหตุผล การจัดกลุ่มโค้ดที่เกี่ยวข้องเป็นโมดูลทำให้เข้าใจและใช้โค้ดได้ง่ายขึ้น โมดูลคือออบเจ็กต์ Python ที่มีแอตทริบิวต์ที่ตั้งชื่อโดยพลการซึ่งคุณสามารถผูกและอ้างอิงได้
โมดูลคือไฟล์ที่ประกอบด้วยรหัส Python โมดูลสามารถกำหนดฟังก์ชันคลาสและตัวแปรได้ โมดูลยังสามารถรวมโค้ดที่รันได้
ตัวอย่าง
รหัส Python สำหรับโมดูลที่ชื่อ aname โดยปกติจะอยู่ในไฟล์ชื่อaname.py นี่คือตัวอย่างของโมดูลง่ายๆ support.py -
def print_func( par ):
print "Hello : ", par
return
คำชี้แจงการนำเข้า
คุณสามารถใช้ซอร์สไฟล์ Python เป็นโมดูลได้โดยเรียกใช้คำสั่งนำเข้าในไฟล์ต้นฉบับ Python อื่น ๆ import มีไวยากรณ์ต่อไปนี้ -
import module1[, module2[,... moduleN]
เมื่อล่ามพบคำสั่งนำเข้าจะนำเข้าโมดูลหากมีโมดูลอยู่ในเส้นทางการค้นหา เส้นทางการค้นหาคือรายการของไดเร็กทอรีที่ล่ามค้นหาก่อนที่จะอิมพอร์ตโมดูล ตัวอย่างเช่นในการนำเข้าโมดูล hello.py คุณต้องใส่คำสั่งต่อไปนี้ที่ด้านบนของสคริปต์ -
#!/usr/bin/python3
# Import module support
import support
# Now you can call defined function that module as follows
support.print_func("Zara")
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Hello : Zara
โมดูลจะถูกโหลดเพียงครั้งเดียวโดยไม่คำนึงถึงจำนวนครั้งที่นำเข้า ซึ่งจะป้องกันไม่ให้การเรียกใช้โมดูลเกิดขึ้นซ้ำ ๆ หากมีการนำเข้าหลายครั้ง
คำชี้แจงจาก ... นำเข้า
Python ของ fromคำสั่งอนุญาตให้คุณนำเข้าแอตทริบิวต์เฉพาะจากโมดูลไปยังเนมสเปซปัจจุบัน from...import มีไวยากรณ์ต่อไปนี้ -
from modname import name1[, name2[, ... nameN]]
ตัวอย่างเช่นในการนำเข้าฟังก์ชัน fibonacci จากโมดูล fibonacci ให้ใช้คำสั่งต่อไปนี้ -
#!/usr/bin/python3
# Fibonacci numbers module
def fib(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a + b
return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
คำสั่งนี้ไม่ได้นำเข้าโมดูลทั้งหมดเข้าสู่เนมสเปซปัจจุบัน เพียงแค่แนะนำรายการ fibonacci จากโมดูล fib ลงในตารางสัญลักษณ์ส่วนกลางของโมดูลการนำเข้า
คำชี้แจงจาก ... นำเข้า *
นอกจากนี้ยังสามารถอิมพอร์ตชื่อทั้งหมดจากโมดูลไปยังเนมสเปซปัจจุบันได้โดยใช้คำสั่งนำเข้าต่อไปนี้ -
from modname import *
นี่เป็นวิธีง่ายๆในการนำเข้ารายการทั้งหมดจากโมดูลไปยังเนมสเปซปัจจุบัน อย่างไรก็ตามควรใช้คำสั่งนี้เท่าที่จำเป็น
การเรียกใช้โมดูลเป็นสคริปต์
ภายในโมดูลชื่อโมดูล (เป็นสตริง) จะพร้อมใช้งานเป็นค่าของตัวแปรส่วนกลาง __name__ โค้ดในโมดูลจะถูกเรียกใช้งานเช่นเดียวกับที่คุณนำเข้า แต่ตั้งค่า __name__ เป็น "__main__"
เพิ่มรหัสนี้ที่ส่วนท้ายของโมดูลของคุณ -
#!/usr/bin/python3
# Fibonacci numbers module
def fib(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a + b
return result
if __name__ == "__main__":
f = fib(100)
print(f)
เมื่อคุณรันโค้ดด้านบนเอาต์พุตต่อไปนี้จะแสดงขึ้น
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
การค้นหาโมดูล
เมื่อคุณนำเข้าโมดูลล่าม Python จะค้นหาโมดูลในลำดับต่อไปนี้ -
ไดเร็กทอรีปัจจุบัน
หากไม่พบโมดูล Python จะค้นหาแต่ละไดเร็กทอรีในตัวแปรเชลล์ PYTHONPATH
หากทุกอย่างล้มเหลว Python จะตรวจสอบเส้นทางเริ่มต้น บน UNIX เส้นทางเริ่มต้นนี้ปกติ / usr / local / lib / python3 /
เส้นทางการค้นหาโมดูลถูกเก็บไว้ในระบบโมดูลระบบเป็นไฟล์ sys.pathตัวแปร. ตัวแปร sys.path มีไดเร็กทอรีปัจจุบัน PYTHONPATH และค่าดีฟอลต์ที่ขึ้นกับการติดตั้ง
ตัวแปร PYTHONPATH
PYTHONPATH เป็นตัวแปรสภาพแวดล้อมซึ่งประกอบด้วยรายการไดเร็กทอรี ไวยากรณ์ของ PYTHONPATH เหมือนกับของตัวแปรเชลล์ PATH
นี่คือ PYTHONPATH ทั่วไปจากระบบ Windows -
set PYTHONPATH = c:\python34\lib;
และนี่คือ PYTHONPATH ทั่วไปจากระบบ UNIX -
set PYTHONPATH = /usr/local/lib/python
เนมสเปซและขอบเขต
ตัวแปรคือชื่อ (ตัวระบุ) ที่แมปกับวัตถุ namespaceเป็นพจนานุกรมของชื่อตัวแปร (คีย์) และวัตถุที่สอดคล้องกันของพวกเขา (ค่า)
คำสั่งหลามสามารถเข้าถึงตัวแปรในnamespace ท้องถิ่นและในnamespace โลก หากตัวแปรโลคัลและตัวแปรโกลบอลมีชื่อเดียวกันตัวแปรโลคัลจะเงาตัวแปรโกลบอล
แต่ละฟังก์ชันมีเนมสเปซในเครื่องของตนเอง วิธีการของคลาสเป็นไปตามกฎการกำหนดขอบเขตเช่นเดียวกับฟังก์ชันทั่วไป
Python ทำให้การคาดเดาอย่างมีความรู้ว่าตัวแปรเป็นแบบท้องถิ่นหรือทั่วโลก ถือว่าตัวแปรใด ๆ ที่กำหนดค่าในฟังก์ชันเป็นแบบโลคัล
ดังนั้นในการกำหนดค่าให้กับตัวแปรส่วนกลางภายในฟังก์ชันคุณต้องใช้คำสั่งส่วนกลางก่อน
- คำสั่งglobal VarNameบอก Python ว่า VarName เป็นตัวแปรส่วนกลาง Python หยุดค้นหาเนมสเปซภายในสำหรับตัวแปร
ตัวอย่างเช่นเรากำหนดตัวแปรMoneyในเนมสเปซส่วนกลาง ภายในฟังก์ชัน Money เรากำหนด Money เป็นค่าดังนั้น Python จึงถือว่า Money เป็นตัวแปรท้องถิ่น
อย่างไรก็ตามเราเข้าถึงค่าของตัวแปรท้องถิ่นMoneyก่อนที่จะตั้งค่าดังนั้นผลลัพธ์ UnboundLocalError การไม่ใส่ข้อคิดเห็นในคำสั่งส่วนกลางช่วยแก้ปัญหาได้
#!/usr/bin/python3
Money = 2000
def AddMoney():
# Uncomment the following line to fix the code:
# global Money
Money = Money + 1
print (Money)
AddMoney()
print (Money)
ฟังก์ชัน dir ()
ฟังก์ชันในตัว dir () ส่งคืนรายการสตริงที่เรียงลำดับที่มีชื่อที่กำหนดโดยโมดูล
รายการประกอบด้วยชื่อของโมดูลตัวแปรและฟังก์ชันทั้งหมดที่กำหนดไว้ในโมดูล ต่อไปนี้เป็นตัวอย่างง่ายๆ -
#!/usr/bin/python3
# Import built-in module math
import math
content = dir(math)
print (content)
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan',
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp',
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',
'sqrt', 'tan', 'tanh']
ในที่นี้ตัวแปรสตริงพิเศษ __name__ คือชื่อของโมดูลและ __file__ คือชื่อไฟล์ที่โมดูลถูกโหลด
ฟังก์ชัน globals () และ local ()
globals() และ locals() ฟังก์ชันสามารถใช้เพื่อส่งคืนชื่อในเนมสเปซส่วนกลางและโลคัลโดยขึ้นอยู่กับตำแหน่งที่เรียก
ถ้า locals() ถูกเรียกจากภายในฟังก์ชันมันจะส่งคืนชื่อทั้งหมดที่สามารถเข้าถึงได้ในเครื่องจากฟังก์ชันนั้น
ถ้า globals() ถูกเรียกจากภายในฟังก์ชันจะส่งคืนชื่อทั้งหมดที่สามารถเข้าถึงได้ทั่วโลกจากฟังก์ชันนั้น
ประเภทการส่งคืนของฟังก์ชันทั้งสองนี้คือพจนานุกรม ดังนั้นจึงสามารถแยกชื่อโดยใช้ไฟล์keys() ฟังก์ชัน
ฟังก์ชั่น reload ()
เมื่อโมดูลถูกอิมพอร์ตลงในสคริปต์โค้ดในส่วนระดับบนสุดของโมดูลจะถูกเรียกใช้งานเพียงครั้งเดียว
ดังนั้นหากคุณต้องการเรียกใช้โค้ดระดับบนสุดในโมดูลอีกครั้งคุณสามารถใช้ฟังก์ชันreload () ฟังก์ชั่น reload () จะนำเข้าโมดูลที่นำเข้าก่อนหน้านี้อีกครั้ง ไวยากรณ์ของฟังก์ชัน reload () คือ -
reload(module_name)
ที่นี่ module_name คือชื่อของโมดูลที่คุณต้องการโหลดซ้ำไม่ใช่สตริงที่มีชื่อโมดูล ตัวอย่างเช่นในการโหลดโมดูล hello ซ้ำให้ทำดังต่อไปนี้ -
reload(hello)
แพ็คเกจใน Python
แพ็กเกจคือโครงสร้างไดเร็กทอรีไฟล์แบบลำดับชั้นที่กำหนดสภาวะแวดล้อมแอ็พพลิเคชัน Python เดียวที่ประกอบด้วยโมดูลและแพ็กเกจย่อยและแพ็กเกจย่อยและอื่น ๆ
พิจารณาไฟล์Pots.py ที่มีอยู่ในสมุดโทรศัพท์ ไฟล์นี้มีซอร์สโค้ดบรรทัดต่อไปนี้ -
#!/usr/bin/python3
def Pots():
print ("I'm Pots Phone")
ในทำนองเดียวกันเรามีอีกสองไฟล์ที่มีฟังก์ชันที่แตกต่างกันโดยมีชื่อเดียวกันกับด้านบน พวกเขาคือ -
โทรศัพท์ /ไฟล์Isdn.py ที่มีฟังก์ชัน Isdn ()
โทรศัพท์ /ไฟล์G3.py ที่มีฟังก์ชัน G3 ()
ตอนนี้สร้างไฟล์ __init__.py อีกหนึ่งไฟล์ในไดเรกทอรีโทรศัพท์ -
- Phone/__init__.py
เพื่อให้ฟังก์ชันทั้งหมดของคุณพร้อมใช้งานเมื่อคุณนำเข้าโทรศัพท์คุณต้องใส่คำสั่งการนำเข้าอย่างชัดเจนใน __init__.py ดังต่อไปนี้ -
from Pots import Pots
from Isdn import Isdn
from G3 import G3
หลังจากที่คุณเพิ่มบรรทัดเหล่านี้ใน __init__.py คุณจะมีคลาสเหล่านี้ทั้งหมดเมื่อคุณนำเข้าแพ็คเกจโทรศัพท์
#!/usr/bin/python3
# Now import your Phone Package.
import Phone
Phone.Pots()
Phone.Isdn()
Phone.G3()
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone
ในตัวอย่างข้างต้นเราได้ยกตัวอย่างฟังก์ชันเดียวในแต่ละไฟล์ แต่คุณสามารถเก็บฟังก์ชันต่างๆไว้ในไฟล์ของคุณได้ คุณยังสามารถกำหนดคลาส Python ต่างๆในไฟล์เหล่านั้นจากนั้นคุณสามารถสร้างแพ็คเกจของคุณจากคลาสเหล่านั้นได้