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 ต่างๆในไฟล์เหล่านั้นจากนั้นคุณสามารถสร้างแพ็คเกจของคุณจากคลาสเหล่านั้นได้