Python 3 - คู่มือฉบับย่อ
โมดูล __future__
Python 3.x แนะนำคีย์เวิร์ดและฟีเจอร์ที่เข้ากันไม่ได้กับ Python 2 ซึ่งสามารถนำเข้าผ่านโมดูล __future__ ในตัวใน Python 2 ขอแนะนำให้ใช้การนำเข้า __future__ หากคุณกำลังวางแผนรองรับ Python 3.x สำหรับโค้ดของคุณ
ตัวอย่างเช่นหากเราต้องการให้ Python 3.x มีพฤติกรรมการหารจำนวนเต็มใน Python 2 ให้เพิ่มคำสั่งนำเข้าต่อไปนี้
from __future__ import division
ฟังก์ชันการพิมพ์
การเปลี่ยนแปลงที่น่าสังเกตและเป็นที่รู้จักมากที่สุดใน Python 3 คือวิธีที่ printใช้ฟังก์ชัน ตอนนี้จำเป็นต้องใช้วงเล็บ () กับฟังก์ชันการพิมพ์ เป็นทางเลือกใน Python 2
print "Hello World" #is acceptable in Python 2
print ("Hello World") # in Python 3, print must be followed by ()
ฟังก์ชัน print () จะแทรกบรรทัดใหม่ที่ส่วนท้ายตามค่าเริ่มต้น ใน Python 2 สามารถระงับได้โดยใส่ ',' ที่ส่วนท้าย ใน Python 3 "end = ''" ต่อท้ายช่องว่างแทนการขึ้นบรรทัดใหม่
print x, # Trailing comma suppresses newline in Python 2
print(x, end=" ") # Appends a space instead of a newline in Python 3
การอ่านข้อมูลจากแป้นพิมพ์
Python 2 มีฟังก์ชันอินพุตสองเวอร์ชัน input() และ raw_input(). ฟังก์ชัน input () จะถือว่าข้อมูลที่ได้รับเป็นสตริงหากรวมอยู่ในเครื่องหมายคำพูด '' หรือ "" มิฉะนั้นข้อมูลจะถือว่าเป็นตัวเลข
ใน Python 3 ฟังก์ชัน raw_input () เลิกใช้งานแล้ว นอกจากนี้ข้อมูลที่ได้รับจะถือว่าเป็นสตริงเสมอ
In Python 2
>>> x = input('something:')
something:10 #entered data is treated as number
>>> x
10
>>> x = input('something:')
something:'10' #entered data is treated as string
>>> x
'10'
>>> x = raw_input("something:")
something:10 #entered data is treated as string even without ''
>>> x
'10'
>>> x = raw_input("something:")
something:'10' #entered data treated as string including ''
>>> x
"'10'"
In Python 3
>>> x = input("something:")
something:10
>>> x
'10'
>>> x = input("something:")
something:'10' #entered data treated as string with or without ''
>>> x
"'10'"
>>> x = raw_input("something:") # will result NameError
Traceback (most recent call last):
File "<pyshell#3>", line 1, in
<module>
x = raw_input("something:")
NameError: name 'raw_input' is not defined
กองจำนวนเต็ม
ใน Python 2 ผลลัพธ์ของการหารจำนวนเต็มสองจำนวนจะถูกปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุด ด้วยเหตุนี้ 3/2 จะแสดง 1 เพื่อให้ได้การหารทศนิยมต้องใช้ตัวเศษหรือตัวส่วนเป็นทศนิยมอย่างชัดเจน ดังนั้น 3.0 / 2 หรือ 3 / 2.0 หรือ 3.0 / 2.0 จะได้ผล 1.5
Python 3 จะประเมิน 3/2 เป็น 1.5 โดยค่าเริ่มต้นซึ่งง่ายกว่าสำหรับโปรแกรมเมอร์มือใหม่
การเป็นตัวแทนของ Unicode
Python 2 ต้องการให้คุณทำเครื่องหมายสตริงด้วย au หากคุณต้องการจัดเก็บเป็น Unicode
Python 3 เก็บสตริงเป็น Unicode ตามค่าเริ่มต้น เรามีสตริง Unicode (utf-8) และคลาส 2 ไบต์: ไบต์และไบต์อาร์เรย์
xrange () ฟังก์ชันถูกลบออก
ใน Python 2 range () ส่งคืนรายการและ xrange () ส่งคืนอ็อบเจ็กต์ที่จะสร้างเฉพาะรายการในช่วงเมื่อจำเป็นเท่านั้นซึ่งจะช่วยประหยัดหน่วยความจำ
ใน Python 3 ฟังก์ชัน range () จะถูกลบออกและ xrange () ถูกเปลี่ยนชื่อเป็น range () นอกจากนี้ออบเจ็กต์ range () ยังรองรับการแบ่งส่วนใน Python 3.2 และใหม่กว่า
เพิ่มข้อยกเว้น
Python 2 ยอมรับทั้งสองสัญกรณ์ไวยากรณ์ 'เก่า' และ 'ใหม่' Python 3 เพิ่ม SyntaxError ถ้าเราไม่ใส่อาร์กิวเมนต์ข้อยกเว้นไว้ในวงเล็บ
raise IOError, "file error" #This is accepted in Python 2
raise IOError("file error") #This is also accepted in Python 2
raise IOError, "file error" #syntax error is raised in Python 3
raise IOError("file error") #this is the recommended syntax in Python 3
อาร์กิวเมนต์ในข้อยกเว้น
ใน Python 3 อาร์กิวเมนต์ถึงข้อยกเว้นควรประกาศด้วยคีย์เวิร์ด 'as'
except Myerror, err: # In Python2
except Myerror as err: #In Python 3
next () ฟังก์ชันและ .next () วิธีการ
ใน Python 2, next () เป็นวิธีการสร้างวัตถุได้รับอนุญาต ใน Python 2 ยังยอมรับฟังก์ชัน next () เพื่อวนซ้ำบนวัตถุตัวสร้าง อย่างไรก็ตามใน Python 3 ถัดไป (0 เป็นวิธีการสร้างถูกยกเลิกและเพิ่ม AttributeError
gen = (letter for letter in 'Hello World') # creates generator object
next(my_generator) #allowed in Python 2 and Python 3
my_generator.next() #allowed in Python 2. raises AttributeError in Python 3
2to3 ยูทิลิตี้
พร้อมกับล่าม Python 3 สคริปต์ 2to3.py มักจะติดตั้งในโฟลเดอร์ tools / scripts มันอ่านซอร์สโค้ด Python 2.x และใช้ชุดตัวแก้ไขเพื่อแปลงเป็นรหัส Python 3.x ที่ถูกต้อง
Here is a sample Python 2 code (area.py):
def area(x,y = 3.14):
a = y*x*x
print a
return a
a = area(10)
print "area",a
To convert into Python 3 version:
$2to3 -w area.py
Converted code :
def area(x,y = 3.14): # formal parameters
a = y*x*x
print (a)
return a
a = area(10)
print("area",a)
Python เป็นภาษาสคริปต์ระดับสูงที่ตีความโต้ตอบและเชิงวัตถุ Python ออกแบบมาให้อ่านง่าย ใช้คำหลักภาษาอังกฤษบ่อยครั้งในขณะที่ภาษาอื่น ๆ ใช้เครื่องหมายวรรคตอน มีโครงสร้างทางไวยากรณ์น้อยกว่าภาษาอื่น ๆ
Python is Interpreted- Python ถูกประมวลผลที่รันไทม์โดยล่าม คุณไม่จำเป็นต้องคอมไพล์โปรแกรมของคุณก่อนดำเนินการ ซึ่งคล้ายกับ PERL และ PHP
Python is Interactive - คุณสามารถนั่งที่พรอมต์ Python และโต้ตอบกับล่ามโดยตรงเพื่อเขียนโปรแกรมของคุณ
Python is Object-Oriented - Python รองรับสไตล์ Object-Oriented หรือเทคนิคการเขียนโปรแกรมที่ห่อหุ้มโค้ดภายในออบเจ็กต์
Python is a Beginner's Language - Python เป็นภาษาที่ยอดเยี่ยมสำหรับโปรแกรมเมอร์ระดับเริ่มต้นและรองรับการพัฒนาแอพพลิเคชั่นที่หลากหลายตั้งแต่การประมวลผลข้อความธรรมดาไปจนถึงเบราว์เซอร์ WWW ไปจนถึงเกม
ประวัติ Python
Python ได้รับการพัฒนาโดย Guido van Rossum ในช่วงปลายทศวรรษที่แปดสิบและต้นยุคที่สถาบันวิจัยคณิตศาสตร์และวิทยาการคอมพิวเตอร์แห่งชาติในเนเธอร์แลนด์
Python มาจากภาษาอื่น ๆ รวมถึง ABC, Modula-3, C, C ++, Algol-68, SmallTalk และ Unix shell และภาษาสคริปต์อื่น ๆ
Python มีลิขสิทธิ์ เช่นเดียวกับ Perl ซอร์สโค้ด Python พร้อมใช้งานแล้วภายใต้ GNU General Public License (GPL)
ขณะนี้ Python ได้รับการดูแลโดยทีมพัฒนาหลักของสถาบันแม้ว่า Guido van Rossum จะยังคงมีบทบาทสำคัญในการกำกับความก้าวหน้า
Python 1.0 ได้รับการเผยแพร่ในเดือนพฤศจิกายน พ.ศ. 2537 ในปี พ.ศ. 2543 Python 2.0 ได้รับการเผยแพร่ Python 2.7.11 เป็น Python 2 รุ่นล่าสุด
ในขณะเดียวกัน Python 3.0 ได้รับการเผยแพร่ในปี 2008 Python 3 ไม่สามารถใช้งานร่วมกับ Python 2 แบบย้อนหลังได้การเน้นใน Python 3 คือการลบโครงสร้างและโมดูลการเขียนโปรแกรมที่ซ้ำกันออกไปเพื่อให้ "ควรมีเพียงอันเดียวและควรมีเพียงอันเดียว - วิธีที่ชัดเจนในการทำ " Python 3.5.1 เป็น Python 3 เวอร์ชันล่าสุด
คุณสมบัติ Python
คุณสมบัติของ Python ได้แก่ -
Easy-to-learn- Python มีคีย์เวิร์ดไม่กี่คำโครงสร้างที่เรียบง่ายและไวยากรณ์ที่กำหนดไว้อย่างชัดเจน สิ่งนี้ช่วยให้นักเรียนสามารถเลือกภาษาได้อย่างรวดเร็ว
Easy-to-read - รหัส Python มีความชัดเจนมากขึ้นและมองเห็นได้ด้วยตา
Easy-to-maintain - ซอร์สโค้ดของ Python นั้นค่อนข้างดูแลรักษาง่าย
A broad standard library - ไลบรารีจำนวนมากของ Python สามารถพกพาได้และใช้งานข้ามแพลตฟอร์มได้บน UNIX, Windows และ Macintosh
Interactive Mode - Python รองรับโหมดอินเทอร์แอกทีฟซึ่งช่วยให้สามารถทดสอบและแก้จุดบกพร่องของโค้ดได้
Portable - Python สามารถทำงานบนแพลตฟอร์มฮาร์ดแวร์ที่หลากหลายและมีอินเทอร์เฟซเดียวกันในทุกแพลตฟอร์ม
Extendable- คุณสามารถเพิ่มโมดูลระดับต่ำให้กับล่าม Python ได้ โมดูลเหล่านี้ช่วยให้โปรแกรมเมอร์สามารถเพิ่มหรือปรับแต่งเครื่องมือเพื่อให้มีประสิทธิภาพมากขึ้น
Databases - Python มีอินเทอร์เฟซสำหรับฐานข้อมูลเชิงพาณิชย์ที่สำคัญทั้งหมด
GUI Programming - Python รองรับแอพพลิเคชั่น GUI ที่สามารถสร้างและพอร์ตไปยังการโทรระบบไลบรารีและระบบ windows จำนวนมากเช่น Windows MFC, Macintosh และระบบ X Window ของ Unix
Scalable - Python มีโครงสร้างที่ดีกว่าและรองรับโปรแกรมขนาดใหญ่มากกว่าเชลล์สคริปต์
นอกเหนือจากคุณสมบัติที่กล่าวมาแล้ว Python ยังมีคุณสมบัติที่ดีอีกมากมาย มีอยู่ไม่กี่รายการด้านล่าง -
สนับสนุนวิธีการเขียนโปรแกรมเชิงฟังก์ชันและโครงสร้างเช่นเดียวกับ OOP
สามารถใช้เป็นภาษาสคริปต์หรือสามารถคอมไพล์เป็นไบต์โค้ดเพื่อสร้างแอปพลิเคชันขนาดใหญ่
ให้ประเภทข้อมูลไดนามิกระดับสูงมากและรองรับการตรวจสอบประเภทไดนามิก
รองรับการเก็บขยะอัตโนมัติ
สามารถรวมเข้ากับ C, C ++, COM, ActiveX, CORBA และ Java ได้อย่างง่ายดาย
Python 3 พร้อมใช้งานสำหรับ Windows, Mac OS และระบบปฏิบัติการ Linux ส่วนใหญ่ แม้ว่า Python 2 จะพร้อมใช้งานสำหรับระบบปฏิบัติการอื่น ๆ แต่การรองรับ Python 3 ยังไม่พร้อมใช้งานสำหรับพวกเขาหรือถูกทิ้งไป
การตั้งค่าสภาพแวดล้อมท้องถิ่น
เปิดหน้าต่างเทอร์มินัลแล้วพิมพ์ "python" เพื่อดูว่ามีการติดตั้งแล้วและติดตั้งเวอร์ชันใด
รับ Python
แพลตฟอร์ม Windows
ไบนารีของ Python 3 (Python 3.5.1) เวอร์ชันล่าสุดมีอยู่ในหน้าดาวน์โหลดนี้
มีตัวเลือกการติดตั้งที่แตกต่างกันดังต่อไปนี้
- ไฟล์ zip ที่ฝังได้ของ Windows x86-64
- โปรแกรมติดตั้งปฏิบัติการ Windows x86-64
- ตัวติดตั้งบนเว็บของ Windows x86-64
- ไฟล์ zip แบบฝังของ Windows x86
- โปรแกรมติดตั้งปฏิบัติการ Windows x86
- โปรแกรมติดตั้งบนเว็บ Windows x86
Note- ในการติดตั้ง Python 3.5.1 ข้อกำหนดขั้นต่ำของระบบปฏิบัติการคือ Windows 7 ที่มี SP1 สำหรับเวอร์ชัน 3.0 ถึง 3.4.x สามารถใช้ Windows XP ได้
แพลตฟอร์มลินุกซ์
Linux ที่มีรสชาติต่างกันใช้ตัวจัดการแพ็คเกจที่แตกต่างกันสำหรับการติดตั้งแพ็คเกจใหม่
บน Ubuntu Linux Python 3 ถูกติดตั้งโดยใช้คำสั่งต่อไปนี้จากเทอร์มินัล
$sudo apt-get install python3-minimal
การติดตั้งจากแหล่งที่มา
ดาวน์โหลด tarball ซอร์ส Gzipped จาก URL ดาวน์โหลดของ Python - https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Extract the tarball
tar xvfz Python-3.5.1.tgz
Configure and Install:
cd Python-3.5.1
./configure --prefix = /opt/python3.5.1
make
sudo make install
Mac OS
ดาวน์โหลดตัวติดตั้ง Mac OS จาก URL นี้ - https://www.python.org/downloads/mac-osx/
- ตัวติดตั้ง MacOS X 64 บิต / 32 บิต - python-3.5.1-macosx10.6.pkg
- ตัวติดตั้ง MacOS X 32 บิต i386 / PPC - python-3.5.1-macosx10.5.pkg
ดับเบิลคลิกที่ไฟล์แพ็กเกจนี้และทำตามคำแนะนำของวิซาร์ดเพื่อติดตั้ง
ซอร์สโค้ดไบนารีเอกสารข่าวสาร ฯลฯ ที่เป็นปัจจุบันและเป็นปัจจุบันที่สุดมีอยู่ในเว็บไซต์ทางการของ Python -
Python Official Website - https://www.python.org/
คุณสามารถดาวน์โหลดเอกสาร Python ได้จากไซต์ต่อไปนี้ เอกสารนี้มีให้ในรูปแบบ HTML, PDF และ PostScript
Python Documentation Website- www.python.org/doc/
การตั้งค่า PATH
โปรแกรมและไฟล์ปฏิบัติการอื่น ๆ สามารถอยู่ในหลายไดเร็กทอรี ดังนั้นระบบปฏิบัติการจึงจัดเตรียมเส้นทางการค้นหาที่แสดงรายการไดเร็กทอรีที่ค้นหาไฟล์ปฏิบัติการ
คุณสมบัติที่สำคัญคือ -
พา ธ ถูกเก็บไว้ในตัวแปรสภาพแวดล้อมซึ่งเป็นสตริงที่มีชื่อดูแลโดยระบบปฏิบัติการ ตัวแปรนี้มีข้อมูลที่พร้อมใช้งานสำหรับเชลล์คำสั่งและโปรแกรมอื่น ๆ
ตัวแปรพา ธ ถูกตั้งชื่อเป็น PATH ใน Unix หรือ Path ใน Windows (Unix ขึ้นอยู่กับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ Windows ไม่ใช่)
ใน Mac OS โปรแกรมติดตั้งจะจัดการกับรายละเอียดเส้นทาง ในการเรียกใช้ตัวแปล Python จากไดเร็กทอรีใด ๆ คุณต้องเพิ่มไดเร็กทอรี Python ในพา ธ ของคุณ
การตั้งค่า Path ที่ Unix / Linux
ในการเพิ่มไดเร็กทอรี Python ไปยังพา ธ สำหรับเซสชันเฉพาะใน Unix -
In the csh shell - พิมพ์ setenv PATH "$ PATH: / usr / local / bin / python3" แล้วกด Enter
In the bash shell (Linux) - พิมพ์ export PYTHONPATH = / usr / local / bin / python3.4 แล้วกด Enter
In the sh or ksh shell - พิมพ์ PATH = "$ PATH: / usr / local / bin / python3" แล้วกด Enter
Note - / usr / local / bin / python3 คือพา ธ ของไดเร็กทอรี Python
การตั้งค่าเส้นทางที่ Windows
ในการเพิ่มไดเร็กทอรี Python ไปยังพา ธ สำหรับเซสชันเฉพาะใน Windows -
At the command prompt - พิมพ์ path% path% C: \ Python แล้วกด Enter
Note - C: \ Python คือพา ธ ของไดเร็กทอรี Python
ตัวแปรสภาพแวดล้อม Python
นี่คือตัวแปรสภาพแวดล้อมที่สำคัญซึ่ง Python รู้จัก -
ซีเนียร์ | ตัวแปรและคำอธิบาย |
---|---|
1 | PYTHONPATH มีบทบาทคล้ายกับ PATH ตัวแปรนี้บอกล่าม Python ว่าจะค้นหาไฟล์โมดูลที่นำเข้ามาในโปรแกรมได้ที่ไหน ควรมีไดเร็กทอรีไลบรารีซอร์ส Python และไดเร็กทอรีที่มีซอร์สโค้ด Python บางครั้ง PYTHONPATH ถูกกำหนดไว้ล่วงหน้าโดยโปรแกรมติดตั้ง Python |
2 | PYTHONSTARTUP มันมีเส้นทางของไฟล์เริ่มต้นที่มีซอร์สโค้ด Python จะดำเนินการทุกครั้งที่คุณเริ่มล่าม มีชื่อว่า. pythonrc.py ใน Unix และมีคำสั่งที่โหลดยูทิลิตี้หรือแก้ไข PYTHONPATH |
3 | PYTHONCASEOK ใช้ใน Windows เพื่อสั่งให้ Python ค้นหาการจับคู่แบบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ในคำสั่งนำเข้า ตั้งค่าตัวแปรนี้เป็นค่าใดก็ได้เพื่อเปิดใช้งาน |
4 | PYTHONHOME เป็นเส้นทางการค้นหาโมดูลทางเลือก โดยปกติจะฝังอยู่ในไดเร็กทอรี PYTHONSTARTUP หรือ PYTHONPATH เพื่อให้การสลับไลบรารีโมดูลทำได้ง่าย |
กำลังรัน Python
มีสามวิธีในการเริ่ม Python -
ล่ามแบบโต้ตอบ
คุณสามารถเริ่ม Python จาก Unix, DOS หรือระบบอื่น ๆ ที่มีตัวแปลบรรทัดคำสั่งหรือหน้าต่างเชลล์
ป้อน python บรรทัดคำสั่ง
เริ่มเขียนโค้ดได้ทันทีในล่ามโต้ตอบ
$python # Unix/Linux
or
python% # Unix/Linux
or
C:>python # Windows/DOS
นี่คือรายการของตัวเลือกบรรทัดคำสั่งทั้งหมดที่มี -
ซีเนียร์ | ตัวเลือกและคำอธิบาย |
---|---|
1 | -d ให้เอาต์พุตการดีบัก |
2 | -O สร้าง bytecode ที่ปรับให้เหมาะสม (ส่งผลให้เกิดไฟล์. pyo) |
3 | -S อย่าเรียกใช้ไซต์นำเข้าเพื่อค้นหาเส้นทาง Python เมื่อเริ่มต้น |
4 | -v เอาต์พุต verbose (การติดตามโดยละเอียดเกี่ยวกับคำสั่งการนำเข้า) |
5 | -X ปิดใช้งานข้อยกเว้นในตัวตามคลาส (เพียงใช้สตริง); ล้าสมัยเริ่มต้นด้วยเวอร์ชัน 1.6 |
6 | -c cmd เรียกใช้สคริปต์ Python ที่ส่งเป็นสตริง cmd |
7 | file เรียกใช้สคริปต์ Python จากไฟล์ที่กำหนด |
สคริปต์จากบรรทัดคำสั่ง
สามารถเรียกใช้สคริปต์ Python ได้ที่บรรทัดคำสั่งโดยเรียกใช้ตัวแปลบนแอปพลิเคชันของคุณดังที่แสดงในตัวอย่างต่อไปนี้
$python script.py # Unix/Linux
or
python% script.py # Unix/Linux
or
C:>python script.py # Windows/DOS
Note - ตรวจสอบให้แน่ใจว่าโหมดการอนุญาตไฟล์อนุญาตให้ดำเนินการได้
สภาพแวดล้อมการพัฒนาแบบบูรณาการ
คุณสามารถเรียกใช้ Python จากสภาพแวดล้อม Graphical User Interface (GUI) ได้เช่นกันหากคุณมีแอปพลิเคชัน GUI บนระบบของคุณที่รองรับ Python
Unix - IDLE เป็น Unix IDE แรกสำหรับ Python
Windows - PythonWin เป็นอินเทอร์เฟซ Windows ตัวแรกสำหรับ Python และเป็น IDE ที่มี GUI
Macintosh - Python เวอร์ชัน Macintosh พร้อมกับ IDLE IDE สามารถดาวน์โหลดได้จากเว็บไซต์หลักซึ่งสามารถดาวน์โหลดได้ทั้งไฟล์ MacBinary หรือ BinHex'd
หากคุณไม่สามารถตั้งค่าสภาพแวดล้อมได้อย่างเหมาะสมคุณสามารถขอความช่วยเหลือจากผู้ดูแลระบบของคุณ ตรวจสอบให้แน่ใจว่าสภาพแวดล้อม Python ได้รับการตั้งค่าอย่างเหมาะสมและทำงานได้ดีอย่างสมบูรณ์
Note - ตัวอย่างทั้งหมดที่ระบุในบทต่อ ๆ ไปจะดำเนินการด้วย Python 3.4.1 เวอร์ชันที่มีอยู่ใน Windows 7 และ Ubuntu Linux
เราได้ตั้งค่าสภาพแวดล้อมการเขียนโปรแกรม Python ทางออนไลน์แล้วเพื่อให้คุณสามารถดำเนินการตัวอย่างที่มีอยู่ทั้งหมดทางออนไลน์ในขณะที่คุณกำลังเรียนรู้ทฤษฎี อย่าลังเลที่จะแก้ไขตัวอย่างใด ๆ และดำเนินการทางออนไลน์
ภาษา Python มีความคล้ายคลึงกับ Perl, C และ Java มาก อย่างไรก็ตามมีความแตกต่างบางประการระหว่างภาษา
โปรแกรม Python แรก
ให้เราดำเนินการโปรแกรมในโหมดต่างๆของการเขียนโปรแกรม
การเขียนโปรแกรมโหมดโต้ตอบ
การเรียกใช้ล่ามโดยไม่ส่งผ่านไฟล์สคริปต์เนื่องจากพารามิเตอร์จะแสดงพร้อมต์ต่อไปนี้ -
$ python
Python 3.3.2 (default, Dec 10 2013, 11:35:01)
[GCC 4.6.3] on Linux
Type "help", "copyright", "credits", or "license" for more information.
>>>
On Windows:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
พิมพ์ข้อความต่อไปนี้ที่พรอมต์ Python แล้วกด Enter -
>>> print ("Hello, Python!")
หากคุณใช้ Python เวอร์ชันเก่า (Python 2.x) ให้ใช้วงเล็บเป็น inprintฟังก์ชันเป็นทางเลือก สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Hello, Python!
การเขียนโปรแกรมโหมดสคริปต์
การเรียกใช้ล่ามด้วยพารามิเตอร์สคริปต์จะเริ่มต้นการดำเนินการของสคริปต์และดำเนินต่อไปจนกว่าสคริปต์จะเสร็จสิ้น เมื่อสคริปต์เสร็จสิ้นล่ามจะไม่ทำงานอีกต่อไป
ให้เราเขียนโปรแกรม Python อย่างง่ายในสคริปต์ ไฟล์ Python มีนามสกุล.py. พิมพ์ซอร์สโค้ดต่อไปนี้ในไฟล์ test.py -
print ("Hello, Python!")
เราถือว่าคุณได้ตั้งค่าล่าม Python ไว้ในไฟล์ PATHตัวแปร. ตอนนี้ลองเรียกใช้โปรแกรมนี้ดังนี้ -
On Linux
$ python test.py
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Hello, Python!
On Windows
C:\Python34>Python test.py
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Hello, Python!
ให้เราลองใช้วิธีอื่นในการเรียกใช้สคริปต์ Python ใน Linux นี่คือไฟล์ test.py ที่แก้ไข -
#!/usr/bin/python3
print ("Hello, Python!")
เราถือว่าคุณมี Python interpreter อยู่ในไดเร็กทอรี / usr / bin ตอนนี้ลองเรียกใช้โปรแกรมนี้ดังนี้ -
$ chmod +x test.py # This is to make file executable $./test.py
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Hello, Python!
ตัวระบุ Python
ตัวระบุ Python คือชื่อที่ใช้เพื่อระบุตัวแปรฟังก์ชันคลาสโมดูลหรือวัตถุอื่น ๆ ตัวระบุเริ่มต้นด้วยตัวอักษร A ถึง Z หรือ a ถึง z หรือขีดล่าง (_) ตามด้วยตัวอักษรศูนย์หรือมากกว่าขีดล่างและตัวเลข (0 ถึง 9)
Python ไม่อนุญาตให้ใช้อักขระเครื่องหมายวรรคตอนเช่น @, $ และ% ภายในตัวระบุ Python เป็นภาษาโปรแกรมที่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ด้วยประการฉะนี้Manpower และ manpower เป็นตัวระบุสองตัวที่แตกต่างกันใน Python
นี่คือหลักการตั้งชื่อสำหรับตัวระบุ Python -
ชื่อคลาสขึ้นต้นด้วยตัวอักษรตัวพิมพ์ใหญ่ ตัวระบุอื่น ๆ ทั้งหมดขึ้นต้นด้วยตัวอักษรพิมพ์เล็ก
การเริ่มต้นตัวระบุด้วยขีดล่างนำหน้าเพียงตัวเดียวบ่งชี้ว่าตัวระบุนั้นเป็นแบบส่วนตัว
การเริ่มต้นตัวระบุที่มีขีดล่างนำหน้าสองตัวบ่งชี้ตัวระบุส่วนตัวที่ชัดเจน
หากตัวระบุลงท้ายด้วยเครื่องหมายขีดล่างสองตัวด้วยตัวระบุจะเป็นชื่อพิเศษที่กำหนดโดยภาษา
คำสงวน
รายการต่อไปนี้แสดงคีย์เวิร์ด Python คำเหล่านี้เป็นคำสงวนและคุณไม่สามารถใช้เป็นค่าคงที่หรือตัวแปรหรือชื่อตัวระบุอื่น ๆ คีย์เวิร์ด Python ทั้งหมดประกอบด้วยอักษรตัวพิมพ์เล็กเท่านั้น
และ | ผู้บริหาร | ไม่ |
เช่น | ในที่สุด | หรือ |
ยืนยัน | สำหรับ | ผ่าน |
หยุดพัก | จาก | พิมพ์ |
ชั้นเรียน | ทั่วโลก | ยก |
ดำเนินการต่อ | ถ้า | กลับ |
def | นำเข้า | ลอง |
เดล | ใน | ในขณะที่ |
elif | คือ | ด้วย |
อื่น | แลมด้า | ผลผลิต |
ยกเว้น |
เส้นและการเยื้อง
Python ไม่ใช้วงเล็บปีกกา ({}) เพื่อระบุบล็อกของโค้ดสำหรับนิยามคลาสและฟังก์ชันหรือการควบคุมโฟลว์ บล็อกของโค้ดแสดงด้วยการเยื้องบรรทัดซึ่งบังคับใช้อย่างเข้มงวด
จำนวนช่องว่างในการเยื้องเป็นตัวแปร แต่คำสั่งทั้งหมดในบล็อกต้องเยื้องด้วยจำนวนที่เท่ากัน ตัวอย่างเช่น -
if True:
print ("True")
else:
print ("False")
อย่างไรก็ตามบล็อกต่อไปนี้สร้างข้อผิดพลาด -
if True:
print ("Answer")
print ("True")
else:
print "(Answer")
print ("False")
ดังนั้นใน Python บรรทัดต่อเนื่องทั้งหมดที่เยื้องด้วยช่องว่างจำนวนเท่ากันจะสร้างบล็อก ตัวอย่างต่อไปนี้มีบล็อกคำสั่งต่างๆ -
Note- อย่าพยายามเข้าใจตรรกะ ณ เวลานี้ เพียงตรวจสอบให้แน่ใจว่าคุณเข้าใจบล็อกต่างๆแม้ว่าจะไม่ได้จัดฟันก็ตาม
#!/usr/bin/python3
import sys
file_finish = "end"
file_text = ""
contents=[]
file_name=input("Enter filename: ")
if len(file_name) == 0:
print("Please enter filename")
sys.exit()
try:
# open file stream
file = open(file_name, "w")
except IOError:
print ("There was an error writing to", file_name)
sys.exit()
print ("Enter '", file_finish,)
print ("' When finished")
while file_text != file_finish:
file_text = input("Enter text: ")
contents.append(file_text)
if file_text == file_finish:
# close the file
file.close()
break
print(contents)
data = ' '.join([str(elem) for elem in contents])
print(data)
file.write(data)
file.close()
file_name = input("Enter filename: ")
if len(file_name) == 0:
print ("Next time please enter something")
sys.exit()
try:
file = open(file_name, "r")
except IOError:
print ("There was an error reading file")
sys.exit()
file_text = file.read()
file.close()
print (file_text)
คำสั่งหลายบรรทัด
คำสั่งใน Python มักจะลงท้ายด้วยบรรทัดใหม่ อย่างไรก็ตาม Python อนุญาตให้ใช้อักขระความต่อเนื่องของบรรทัด (\) เพื่อแสดงว่าบรรทัดควรดำเนินต่อไป ตัวอย่างเช่น -
total = item_one + \
item_two + \
item_three
ข้อความที่อยู่ในเครื่องหมายวงเล็บ [], {} หรือ () ไม่จำเป็นต้องใช้อักขระต่อเนื่องของบรรทัด ตัวอย่างเช่น -
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
ใบเสนอราคาใน Python
Python ยอมรับเครื่องหมายคำพูด single ('), double (") และ triple (' '' หรือ" "") เพื่อแสดงถึงตัวอักษรสตริงตราบใดที่เครื่องหมายคำพูดประเภทเดียวกันเริ่มต้นและสิ้นสุดสตริง
คำพูดสามคำใช้เพื่อขยายสตริงในหลายบรรทัด ตัวอย่างเช่นสิ่งต่อไปนี้ทั้งหมดถูกกฎหมาย -
word = 'word'
sentence = "This is a sentence."
paragraph = """This is a paragraph. It is
made up of multiple lines and sentences."""
ความคิดเห็นใน Python
เครื่องหมายแฮช (#) ที่ไม่อยู่ในสตริงลิเทอรัลคือจุดเริ่มต้นของข้อคิดเห็น อักขระทั้งหมดหลัง # จนถึงตอนท้ายของบรรทัดฟิสิคัลเป็นส่วนหนึ่งของข้อคิดเห็นและล่าม Python จะไม่สนใจสิ่งเหล่านี้
#!/usr/bin/python3
# First comment
print ("Hello, Python!") # second comment
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Hello, Python!
คุณสามารถพิมพ์ความคิดเห็นในบรรทัดเดียวกันหลังคำสั่งหรือนิพจน์ -
name = "Madisetti" # This is again comment
Python ไม่มีคุณสมบัติการแสดงความคิดเห็นหลายบรรทัด คุณต้องแสดงความคิดเห็นทีละบรรทัดดังนี้ -
# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.
ใช้เส้นว่าง
บรรทัดที่มีเฉพาะช่องว่างอาจมีความคิดเห็นเรียกว่าบรรทัดว่างและ Python จะละเว้นโดยสิ้นเชิง
ในเซสชันล่ามแบบโต้ตอบคุณต้องป้อนบรรทัดทางกายภาพที่ว่างเปล่าเพื่อยุติคำสั่งหลายบรรทัด
กำลังรอผู้ใช้
บรรทัดต่อไปนี้ของโปรแกรมจะแสดงพร้อมต์และข้อความว่า“ กดปุ่ม Enter เพื่อออก” จากนั้นรอให้ผู้ใช้ดำเนินการ -
#!/usr/bin/python3
input("\n\nPress the enter key to exit.")
ในที่นี้ "\ n \ n" ใช้เพื่อสร้างบรรทัดใหม่สองบรรทัดก่อนที่จะแสดงบรรทัดจริง เมื่อผู้ใช้กดปุ่มโปรแกรมจะสิ้นสุดลง นี่เป็นเคล็ดลับที่ดีในการเปิดหน้าต่างคอนโซลไว้จนกว่าผู้ใช้จะใช้แอปพลิเคชันเสร็จสิ้น
คำสั่งหลายรายการในบรรทัดเดียว
เครื่องหมายอัฒภาค (;) อนุญาตให้มีหลายคำสั่งในบรรทัดเดียวเนื่องจากไม่มีคำสั่งใดเริ่มบล็อกโค้ดใหม่ นี่คือตัวอย่างการตัดโดยใช้อัฒภาค -
import sys; x = 'foo'; sys.stdout.write(x + '\n')
กลุ่มคำสั่งหลายกลุ่มเป็นห้องชุด
เรียกกลุ่มของคำสั่งแต่ละรายการซึ่งสร้างบล็อกรหัสเดียว suitesใน Python คำสั่งผสมหรือเชิงซ้อนเช่น if, while, def และ class ต้องการบรรทัดส่วนหัวและชุด
บรรทัดส่วนหัวเริ่มต้นประโยคคำสั่ง (ด้วยคีย์เวิร์ด) และสิ้นสุดด้วยเครื่องหมายจุดคู่ (:) และตามด้วยบรรทัดอย่างน้อยหนึ่งบรรทัดซึ่งประกอบกันเป็นชุด ตัวอย่างเช่น -
if expression :
suite
elif expression :
suite
else :
suite
อาร์กิวเมนต์บรรทัดคำสั่ง
สามารถเรียกใช้โปรแกรมจำนวนมากเพื่อให้ข้อมูลพื้นฐานเกี่ยวกับวิธีเรียกใช้โปรแกรมเหล่านี้ Python ช่วยให้คุณสามารถทำได้ด้วย -h -
$ python -h
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-c cmd : program passed in as string (terminates option list)
-d : debug output from parser (also PYTHONDEBUG=x)
-E : ignore environment variables (such as PYTHONPATH)
-h : print this help message and exit
[ etc. ]
คุณยังสามารถตั้งโปรแกรมสคริปต์ของคุณในลักษณะที่ควรยอมรับตัวเลือกต่างๆ อาร์กิวเมนต์บรรทัดคำสั่งเป็นหัวข้อขั้นสูง ให้เราเข้าใจมัน
ตัวแปรไม่ใช่อะไรเลยนอกจากตำแหน่งหน่วยความจำที่สงวนไว้เพื่อเก็บค่า หมายความว่าเมื่อคุณสร้างตัวแปรคุณจะสงวนพื้นที่ในหน่วยความจำไว้
ตามชนิดข้อมูลของตัวแปรล่ามจะจัดสรรหน่วยความจำและตัดสินใจว่าอะไรสามารถเก็บไว้ในหน่วยความจำที่สงวนไว้ ดังนั้นโดยการกำหนดประเภทข้อมูลที่แตกต่างกันให้กับตัวแปรคุณสามารถจัดเก็บจำนวนเต็มทศนิยมหรืออักขระในตัวแปรเหล่านี้ได้
การกำหนดค่าให้กับตัวแปร
ตัวแปร Python ไม่จำเป็นต้องมีการประกาศอย่างชัดเจนเพื่อสงวนพื้นที่หน่วยความจำ การประกาศจะเกิดขึ้นโดยอัตโนมัติเมื่อคุณกำหนดค่าให้กับตัวแปร เครื่องหมายเท่ากับ (=) ใช้เพื่อกำหนดค่าให้กับตัวแปร
ตัวถูกดำเนินการทางด้านซ้ายของตัวดำเนินการ = คือชื่อของตัวแปรและตัวถูกดำเนินการทางด้านขวาของตัวดำเนินการ = คือค่าที่เก็บไว้ในตัวแปร ตัวอย่างเช่น -
#!/usr/bin/python3
counter = 100 # An integer assignment
miles = 1000.0 # A floating point
name = "John" # A string
print (counter)
print (miles)
print (name)
ในที่นี้ 100, 1000.0 และ "John" คือค่าที่กำหนดให้กับตัวแปรตัวนับไมล์และชื่อตามลำดับ สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
100
1000.0
John
การมอบหมายงานหลายรายการ
Python ช่วยให้คุณกำหนดค่าเดียวให้กับตัวแปรหลายตัวพร้อมกัน
ตัวอย่างเช่น -
a = b = c = 1
ที่นี่อ็อบเจ็กต์จำนวนเต็มถูกสร้างขึ้นด้วยค่า 1 และตัวแปรทั้งสามถูกกำหนดให้กับตำแหน่งหน่วยความจำเดียวกัน คุณยังสามารถกำหนดหลายออบเจ็กต์ให้กับตัวแปรหลายตัว ตัวอย่างเช่น -
a, b, c = 1, 2, "john"
ที่นี่วัตถุจำนวนเต็มสองชิ้นที่มีค่า 1 และ 2 ถูกกำหนดให้กับตัวแปร a และ b ตามลำดับและวัตถุสตริงหนึ่งตัวที่มีค่า "john" จะถูกกำหนดให้กับตัวแปร c
ประเภทข้อมูลมาตรฐาน
ข้อมูลที่จัดเก็บในหน่วยความจำสามารถมีได้หลายประเภท ตัวอย่างเช่นอายุของบุคคลจะถูกจัดเก็บเป็นค่าตัวเลขและที่อยู่ของบุคคลนั้นจะถูกจัดเก็บเป็นอักขระตัวเลขและตัวอักษร Python มีประเภทข้อมูลมาตรฐานต่างๆที่ใช้เพื่อกำหนดการดำเนินการที่เป็นไปได้และวิธีการจัดเก็บสำหรับแต่ละประเภท
Python มีข้อมูลมาตรฐานห้าประเภท -
- Numbers
- String
- List
- Tuple
- Dictionary
Python Numbers
ชนิดข้อมูลตัวเลขเก็บค่าตัวเลข วัตถุตัวเลขถูกสร้างขึ้นเมื่อคุณกำหนดค่าให้กับวัตถุเหล่านั้น ตัวอย่างเช่น -
var1 = 1
var2 = 10
คุณยังสามารถลบการอ้างอิงไปยังออบเจ็กต์ตัวเลขโดยใช้ไฟล์ delคำให้การ. ไวยากรณ์ของdel คำสั่งคือ -
del var1[,var2[,var3[....,varN]]]]
คุณสามารถลบวัตถุเดียวหรือหลายวัตถุโดยใช้ไฟล์ del คำให้การ.
ตัวอย่างเช่น -
del var
del var_a, var_b
Python รองรับตัวเลขสามประเภทที่แตกต่างกัน -
- int (จำนวนเต็มลงนาม)
- ลอย (ค่าจริงจุดลอยตัว)
- ซับซ้อน (จำนวนเชิงซ้อน)
จำนวนเต็มทั้งหมดใน Python3 แสดงเป็นจำนวนเต็มยาว ดังนั้นจึงไม่มีประเภทตัวเลขแยกกันตราบใด
ตัวอย่าง
นี่คือตัวอย่างของตัวเลข -
int | ลอย | ซับซ้อน |
---|---|---|
10 | 0.0 | 3.14j |
100 | 15.20 น | 45.j |
-786 | -21.9 | 9.322e-36j |
080 | 32.3 + จ 18 | .876j |
-0490 | -90. | -.6545 + 0J |
-0x260 | -32.54e100 | 3e + 26J |
0x69 | 70.2-E12 | 4.53e-7j |
จำนวนเชิงซ้อนประกอบด้วยคู่ลำดับของจำนวนทศนิยมจริงที่แสดงด้วย x + yj โดยที่ x และ y เป็นจำนวนจริงและ j คือหน่วยจินตภาพ
Python Strings
สตริงใน Python ถูกระบุว่าเป็นชุดอักขระที่ต่อเนื่องกันซึ่งแสดงในเครื่องหมายคำพูด Python อนุญาตให้ใช้อัญประกาศคู่หรือคู่ ชุดย่อยของสตริงสามารถนำมาใช้โดยใช้ตัวดำเนินการ slice ([] และ [:]) โดยมีดัชนีเริ่มต้นที่ 0 ในจุดเริ่มต้นของสตริงและทำงานจาก -1 ไปยังจุดสิ้นสุด
เครื่องหมายบวก (+) คือตัวดำเนินการต่อสายอักขระและเครื่องหมายดอกจัน (*) เป็นตัวดำเนินการซ้ำ ตัวอย่างเช่น -
#!/usr/bin/python3
str = 'Hello World!'
print (str) # Prints complete string
print (str[0]) # Prints first character of the string
print (str[2:5]) # Prints characters starting from 3rd to 5th
print (str[2:]) # Prints string starting from 3rd character
print (str * 2) # Prints string two times
print (str + "TEST") # Prints concatenated string
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Hello World!
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST
รายการ Python
รายการเป็นประเภทข้อมูลผสมของ Python ที่หลากหลายที่สุด รายการประกอบด้วยรายการที่คั่นด้วยลูกน้ำและอยู่ในวงเล็บเหลี่ยม ([]) รายการจะคล้ายกับอาร์เรย์ใน C ในระดับหนึ่งความแตกต่างอย่างหนึ่งคือรายการทั้งหมดที่อยู่ในรายการอาจเป็นชนิดข้อมูลที่แตกต่างกัน
ค่าที่จัดเก็บในรายการสามารถเข้าถึงได้โดยใช้ตัวดำเนินการ slice ([] และ [:]) โดยมีดัชนีเริ่มต้นที่ 0 ในตอนต้นของรายการและดำเนินการตามจุดสิ้นสุด -1 เครื่องหมายบวก (+) คือตัวดำเนินการต่อรายการและเครื่องหมายดอกจัน (*) เป็นตัวดำเนินการการทำซ้ำ ตัวอย่างเช่น -
#!/usr/bin/python3
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']
print (list) # Prints complete list
print (list[0]) # Prints first element of the list
print (list[1:3]) # Prints elements starting from 2nd till 3rd
print (list[2:]) # Prints elements starting from 3rd element
print (tinylist * 2) # Prints list two times
print (list + tinylist) # Prints concatenated lists
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
['abcd', 786, 2.23, 'john', 70.200000000000003]
abcd
[786, 2.23]
[2.23, 'john', 70.200000000000003]
[123, 'john', 123, 'john']
['abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john']
Python Tuples
ทูเพิลเป็นชนิดข้อมูลลำดับอื่นที่คล้ายกับรายการ ทูเพิลประกอบด้วยค่าจำนวนหนึ่งโดยคั่นด้วยเครื่องหมายจุลภาค สิ่งที่แตกต่างจากรายการคือ tuples จะอยู่ในวงเล็บ
ความแตกต่างที่สำคัญระหว่างลิสต์และทูเพิลคือ - ลิสต์อยู่ในวงเล็บ ([]) และองค์ประกอบและขนาดของมันสามารถเปลี่ยนแปลงได้ในขณะที่ทูเพิลอยู่ในวงเล็บ (()) และไม่สามารถอัพเดตได้ Tuples สามารถคิดได้ว่าread-onlyรายการ ตัวอย่างเช่น -
#!/usr/bin/python3
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
tinytuple = (123, 'john')
print (tuple) # Prints complete tuple
print (tuple[0]) # Prints first element of the tuple
print (tuple[1:3]) # Prints elements starting from 2nd till 3rd
print (tuple[2:]) # Prints elements starting from 3rd element
print (tinytuple * 2) # Prints tuple two times
print (tuple + tinytuple) # Prints concatenated tuple
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
('abcd', 786, 2.23, 'john', 70.200000000000003)
abcd
(786, 2.23)
(2.23, 'john', 70.200000000000003)
(123, 'john', 123, 'john')
('abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john')
รหัสต่อไปนี้ไม่ถูกต้องกับทูเปิลเนื่องจากเราพยายามอัปเดตทูเพิลซึ่งไม่ได้รับอนุญาต กรณีที่คล้ายกันเป็นไปได้กับรายการ -
#!/usr/bin/python3
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tuple[2] = 1000 # Invalid syntax with tuple
list[2] = 1000 # Valid syntax with list
พจนานุกรม Python
พจนานุกรมของ Python เป็นประเภทตารางแฮช ทำงานเหมือนอาร์เรย์หรือแฮชที่เชื่อมโยงกันที่พบใน Perl และประกอบด้วยคู่คีย์ - ค่า คีย์พจนานุกรมสามารถเป็น Python ได้เกือบทุกประเภท แต่โดยปกติจะเป็นตัวเลขหรือสตริง ในทางกลับกันค่าอาจเป็นวัตถุ Python ใด ๆ ก็ได้
พจนานุกรมล้อมรอบด้วยวงเล็บปีกกา ({}) และสามารถกำหนดและเข้าถึงค่าได้โดยใช้วงเล็บปีกกา ([]) ตัวอย่างเช่น -
#!/usr/bin/python3
dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"
tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
print (dict['one']) # Prints value for 'one' key
print (dict[2]) # Prints value for 2 key
print (tinydict) # Prints complete dictionary
print (tinydict.keys()) # Prints all the keys
print (tinydict.values()) # Prints all the values
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
This is one
This is two
{'name': 'john', 'dept': 'sales', 'code': 6734}
dict_keys(['name', 'dept', 'code'])
dict_values(['john', 'sales', 6734])
พจนานุกรมไม่มีแนวคิดเรื่องลำดับระหว่างองค์ประกอบ มันไม่ถูกต้องที่จะบอกว่าองค์ประกอบนั้น "ไม่เป็นระเบียบ"; ไม่เรียงลำดับ
การแปลงประเภทข้อมูล
บางครั้งคุณอาจต้องทำการแปลงระหว่างประเภทที่มีอยู่แล้วภายใน ในการแปลงระหว่างประเภทคุณเพียงแค่ใช้ชื่อประเภทเป็นฟังก์ชัน
มีฟังก์ชันในตัวมากมายเพื่อทำการแปลงจากประเภทข้อมูลหนึ่งไปยังอีกประเภทหนึ่ง ฟังก์ชันเหล่านี้ส่งคืนอ็อบเจ็กต์ใหม่ที่แทนค่าที่แปลงแล้ว
ซีเนียร์ | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | int(x [,base]) แปลง x เป็นจำนวนเต็ม ฐานระบุฐานถ้า x เป็นสตริง |
2 | float(x) แปลง x เป็นเลขทศนิยม |
3 | complex(real [,imag]) สร้างจำนวนเชิงซ้อน |
4 | str(x) แปลงวัตถุ x เป็นการแสดงสตริง |
5 | repr(x) แปลงวัตถุ x เป็นสตริงนิพจน์ |
6 | eval(str) ประเมินสตริงและส่งคืนอ็อบเจ็กต์ |
7 | tuple(s) แปลง s เป็นทูเปิล |
8 | list(s) แปลงเป็นรายการ |
9 | set(s) แปลง s เป็นชุด |
10 | dict(d) สร้างพจนานุกรม d ต้องเป็นลำดับของสิ่งที่ได้ (คีย์ค่า) |
11 | frozenset(s) แปลง s เป็นเซ็ตแช่แข็ง |
12 | chr(x) แปลงจำนวนเต็มเป็นอักขระ |
13 | unichr(x) แปลงจำนวนเต็มเป็นอักขระ Unicode |
14 | ord(x) แปลงอักขระเดี่ยวเป็นค่าจำนวนเต็ม |
15 | hex(x) แปลงจำนวนเต็มเป็นสตริงเลขฐานสิบหก |
16 | oct(x) แปลงจำนวนเต็มเป็นสตริงฐานแปด |
ตัวดำเนินการคือโครงสร้างซึ่งสามารถจัดการกับค่าของตัวถูกดำเนินการได้ พิจารณานิพจน์ 4 + 5 = 9 ในที่นี้ 4 และ 5 เรียกว่าตัวถูกดำเนินการและ + เรียกว่าตัวดำเนินการ
ประเภทของตัวดำเนินการ
ภาษา Python รองรับตัวดำเนินการประเภทต่อไปนี้ -
- ตัวดำเนินการเลขคณิต
- ตัวดำเนินการเปรียบเทียบ (เชิงสัมพันธ์)
- ผู้ดำเนินการมอบหมาย
- ตัวดำเนินการทางตรรกะ
- ตัวดำเนินการ Bitwise
- ผู้ดำเนินการสมาชิก
- ตัวดำเนินการระบุตัวตน
ให้เราดูตัวดำเนินการทั้งหมดทีละตัว
ตัวดำเนินการทางคณิตศาสตร์ Python
สมมติตัวแปร a เก็บค่า 10 และตัวแปร b ถือค่า 21 แล้ว -
แสดงตัวอย่าง
ตัวดำเนินการ | คำอธิบาย | ตัวอย่าง |
---|---|---|
+ นอกจากนี้ | เพิ่มค่าที่ด้านใดด้านหนึ่งของตัวดำเนินการ | a + b = 31 |
- การลบ | ลบตัวถูกดำเนินการทางขวามือออกจากตัวถูกดำเนินการด้านซ้าย | ก - ข = -11 |
* การคูณ | คูณค่าที่ด้านใดด้านหนึ่งของตัวดำเนินการ | a * b = 210 |
/ แผนก | แบ่งตัวถูกดำเนินการทางซ้ายด้วยตัวถูกดำเนินการทางขวามือ | b / a = 2.1 |
% โมดูลัส | หารตัวถูกดำเนินการทางซ้ายด้วยตัวถูกดำเนินการทางขวามือและส่งคืนส่วนที่เหลือ | ข% a = 1 |
** เลขชี้กำลัง | ทำการคำนวณเลขชี้กำลัง (กำลัง) บนตัวดำเนินการ | a ** b = 10 ยกกำลัง 20 |
// | Floor Division - การหารตัวถูกดำเนินการที่ผลลัพธ์คือผลหารที่ตัวเลขหลังจุดทศนิยมจะถูกลบออก แต่ถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งเป็นค่าลบผลลัพธ์จะถูกปัดเศษเช่นปัดจากศูนย์ (ไปทางอินฟินิตี้ลบ): | 9 // 2 = 4 และ 9.0 // 2.0 = 4.0, -11 // 3 = -4, -11.0 // 3 = -4.0 |
ตัวดำเนินการเปรียบเทียบ Python
ตัวดำเนินการเหล่านี้จะเปรียบเทียบค่าของด้านใดด้านหนึ่งและตัดสินใจความสัมพันธ์ระหว่างกัน เรียกอีกอย่างว่าตัวดำเนินการเชิงสัมพันธ์
สมมติตัวแปร a เก็บค่า 10 และตัวแปร b ถือค่า 20 แล้ว -
แสดงตัวอย่าง
ตัวดำเนินการ | คำอธิบาย | ตัวอย่าง |
---|---|---|
== | ถ้าค่าของตัวถูกดำเนินการสองค่าเท่ากันเงื่อนไขจะกลายเป็นจริง | (a == b) ไม่เป็นความจริง |
! = | หากค่าของตัวถูกดำเนินการสองตัวไม่เท่ากันเงื่อนไขจะกลายเป็นจริง | (a! = b) เป็นจริง |
> | ถ้าค่าของตัวถูกดำเนินการด้านซ้ายมากกว่าค่าของตัวถูกดำเนินการด้านขวาเงื่อนไขจะกลายเป็นจริง | (a> b) ไม่เป็นความจริง |
< | ถ้าค่าของตัวถูกดำเนินการด้านซ้ายน้อยกว่าค่าของตัวถูกดำเนินการด้านขวาเงื่อนไขจะกลายเป็นจริง | (a <b) เป็นจริง |
> = | ถ้าค่าของตัวถูกดำเนินการด้านซ้ายมากกว่าหรือเท่ากับค่าของตัวถูกดำเนินการด้านขวาเงื่อนไขจะกลายเป็นจริง | (a> = b) ไม่เป็นความจริง |
<= | ถ้าค่าของตัวถูกดำเนินการด้านซ้ายน้อยกว่าหรือเท่ากับค่าของตัวถูกดำเนินการด้านขวาเงื่อนไขจะกลายเป็นจริง | (a <= b) เป็นจริง |
ตัวดำเนินการกำหนด Python
สมมติตัวแปร a เก็บค่า 10 และตัวแปร b ถือค่า 20 แล้ว -
แสดงตัวอย่าง
ตัวดำเนินการ | คำอธิบาย | ตัวอย่าง |
---|---|---|
= | กำหนดค่าจากตัวถูกดำเนินการด้านขวาไปยังตัวถูกดำเนินการด้านซ้าย | c = a + b กำหนดค่าของ a + b ให้เป็น c |
+ = เพิ่มและ | เพิ่มตัวถูกดำเนินการด้านขวาให้กับตัวถูกดำเนินการด้านซ้ายและกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการด้านซ้าย | c + = a เทียบเท่ากับ c = c + a |
- = ลบและ | มันจะลบตัวถูกดำเนินการด้านขวาออกจากตัวถูกดำเนินการด้านซ้ายและกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการด้านซ้าย | c - = a เทียบเท่ากับ c = c - a |
* = คูณและ | จะคูณตัวถูกดำเนินการด้านขวากับตัวถูกดำเนินการด้านซ้ายและกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการด้านซ้าย | c * = a เทียบเท่ากับ c = c * a |
/ = หาร AND | มันแบ่งตัวถูกดำเนินการด้านซ้ายกับตัวถูกดำเนินการด้านขวาและกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการด้านซ้าย | c / = a เทียบเท่ากับ c = c / ac / = a เทียบเท่ากับ c = c / a |
% = โมดูลัสและ | ใช้โมดูลัสโดยใช้ตัวถูกดำเนินการสองตัวและกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการด้านซ้าย | c% = a เทียบเท่ากับ c = c% a |
** = เลขชี้กำลังและ | ทำการคำนวณเลขชี้กำลัง (กำลัง) บนตัวดำเนินการและกำหนดค่าให้กับตัวถูกดำเนินการด้านซ้าย | c ** = a เทียบเท่ากับ c = c ** a |
// = กองพื้น | ดำเนินการแบ่งชั้นบนตัวดำเนินการและกำหนดค่าให้กับตัวถูกดำเนินการด้านซ้าย | c // = a เทียบเท่ากับ c = c // a |
ตัวดำเนินการ Python Bitwise
ตัวดำเนินการ Bitwise ทำงานบนบิตและดำเนินการแบบบิตต่อบิต สมมติว่า a = 60; และ b = 13; ตอนนี้ในรูปแบบไบนารีจะเป็นดังนี้ -
a = 0011 1100
b = 0000 1101
-----------------
a & b = 0000 1100
a | b = 0011 1101
a ^ b = 0011 0001
~ a = 1100 0011
ฟังก์ชัน bin () ในตัวของ Python สามารถใช้เพื่อรับการแสดงเลขฐานสองของจำนวนเต็ม
ตัวดำเนินการ Bitwise ต่อไปนี้รองรับภาษา Python -
แสดงตัวอย่าง
ตัวดำเนินการ | คำอธิบาย | ตัวอย่าง |
---|---|---|
& ไบนารี AND | ตัวดำเนินการคัดลอกบิตไปยังผลลัพธ์หากมีอยู่ในตัวถูกดำเนินการทั้งสอง | (a & b) (หมายถึง 0000 1100) |
| ไบนารีหรือ | จะคัดลอกบิตหากมีอยู่ในตัวถูกดำเนินการอย่างใดอย่างหนึ่ง | (a | b) = 61 (หมายถึง 0011 1101) |
^ ไบนารี XOR | จะคัดลอกบิตหากตั้งค่าไว้ในตัวถูกดำเนินการเดียว แต่ไม่ใช่ทั้งสองอย่าง | (a ^ b) = 49 (หมายถึง 0011 0001) |
~ ส่วนเสริมไบนารี | เป็นยูนารีและมีผลของบิต 'พลิก' | (~ a) = -61 (หมายถึง 1100 0011 ในรูปแบบประกอบของ 2 เนื่องจากเลขฐานสองที่ลงนาม |
<< ไบนารีซ้าย Shift | ค่าของตัวถูกดำเนินการด้านซ้ายจะถูกย้ายไปทางซ้ายตามจำนวนบิตที่ระบุโดยตัวถูกดำเนินการด้านขวา | a << 2 = 240 (หมายถึง 1111 0000) |
>> ไบนารีขวากะ | ค่าของตัวถูกดำเนินการด้านซ้ายจะถูกย้ายไปทางขวาตามจำนวนบิตที่ระบุโดยตัวถูกดำเนินการด้านขวา | a >> 2 = 15 (หมายถึง 0000 1111) |
Python Logical Operators
ตัวดำเนินการทางตรรกะต่อไปนี้ได้รับการสนับสนุนโดยภาษา Python สมมติตัวแปรa ถือ True และตัวแปร b ถือเป็นเท็จแล้ว -
แสดงตัวอย่าง
ตัวดำเนินการ | คำอธิบาย | ตัวอย่าง |
---|---|---|
และตรรกะ AND | ถ้าตัวถูกดำเนินการทั้งสองเป็นจริงเงื่อนไขจะกลายเป็นจริง | (a และ b) เป็นเท็จ |
หรือตรรกะหรือ | หากตัวถูกดำเนินการสองตัวใดตัวหนึ่งไม่เป็นศูนย์เงื่อนไขจะกลายเป็นจริง | (a หรือ b) เป็น True |
ไม่ใช่ตรรกะไม่ | ใช้เพื่อย้อนกลับสถานะตรรกะของตัวถูกดำเนินการ | ไม่ใช่ (a และ b) เป็น True |
Python Membership Operators
ตัวดำเนินการที่เป็นสมาชิกของ Python จะทดสอบการเป็นสมาชิกตามลำดับเช่นสตริงรายการหรือสิ่งที่เพิ่มขึ้น มีผู้ให้บริการสมาชิกสองรายดังที่อธิบายไว้ด้านล่าง -
แสดงตัวอย่าง
ตัวดำเนินการ | คำอธิบาย | ตัวอย่าง |
---|---|---|
ใน | ประเมินค่าเป็นจริงหากพบตัวแปรในลำดับที่ระบุและเป็นเท็จ | x ใน y จะให้ผลลัพธ์ 1 ถ้า x เป็นสมาชิกของลำดับ y |
ไม่เข้า | ประเมินค่าเป็นจริงหากไม่พบตัวแปรในลำดับที่ระบุและเป็นเท็จ | x ไม่อยู่ใน y ไม่ได้ผลลัพธ์ใน 1 ถ้า x ไม่ใช่สมาชิกของลำดับ y |
Python Identity Operators
ตัวดำเนินการเอกลักษณ์เปรียบเทียบตำแหน่งหน่วยความจำของสองวัตถุ มีตัวดำเนินการเอกลักษณ์สองตัวดังที่อธิบายไว้ด้านล่าง -
แสดงตัวอย่าง
ตัวดำเนินการ | คำอธิบาย | ตัวอย่าง |
---|---|---|
คือ | ประเมินเป็นจริงหากตัวแปรที่ด้านใดด้านหนึ่งของตัวดำเนินการชี้ไปที่วัตถุเดียวกันและเป็นเท็จ | x คือ y ที่นี่ is ผลลัพธ์ใน 1 ถ้า id (x) เท่ากับ id (y) |
ไม่ใช่ | ประเมินค่าเป็นเท็จหากตัวแปรด้านใดด้านหนึ่งของตัวดำเนินการชี้ไปที่วัตถุเดียวกันและเป็นจริงเป็นอย่างอื่น | x ไม่ใช่ y ตรงนี้ is not ผลลัพธ์จะเป็น 1 ถ้า id (x) ไม่เท่ากับ id (y) |
ลำดับความสำคัญของตัวดำเนินการ Python
ตารางต่อไปนี้แสดงตัวดำเนินการทั้งหมดจากลำดับความสำคัญสูงสุดไปยังต่ำสุด
แสดงตัวอย่าง
ซีเนียร์ | ตัวดำเนินการและคำอธิบาย |
---|---|
1 | ** การยกกำลัง (ยกกำลัง) |
2 | ~ + - ส่วนเสริมยูนารีบวกและลบ (ชื่อเมธอดสำหรับสองตัวสุดท้ายคือ + @ และ - @) |
3 | * / % // คูณหารโมดูโลและการแบ่งชั้น |
4 | + - การบวกและการลบ |
5 | >> << เลื่อนไปทางขวาและซ้าย |
6 | & Bitwise 'และ' |
7 | ^ | Bitwise เอกสิทธิ์เฉพาะ `` หรือ '' และ `` หรือ '' ปกติ |
8 | <= < > >= ตัวดำเนินการเปรียบเทียบ |
9 | <> == != ตัวดำเนินการความเท่าเทียมกัน |
10 | = %= /= //= -= += *= **= ตัวดำเนินการมอบหมาย |
11 | is is not ตัวดำเนินการระบุตัวตน |
12 | in not in ผู้ดำเนินการสมาชิก |
13 | not or and ตัวดำเนินการทางตรรกะ |
การตัดสินใจคือการคาดการณ์ถึงเงื่อนไขที่เกิดขึ้นระหว่างการดำเนินการของโปรแกรมและการดำเนินการที่ระบุตามเงื่อนไข
โครงสร้างการตัดสินใจจะประเมินนิพจน์หลายรายการซึ่งให้ผลลัพธ์เป็น TRUE หรือ FALSE คุณต้องตัดสินใจว่าจะดำเนินการใดและจะดำเนินการตามคำสั่งใดหากผลลัพธ์เป็นจริงหรือเท็จเป็นอย่างอื่น
ต่อไปนี้เป็นรูปแบบทั่วไปของโครงสร้างการตัดสินใจทั่วไปที่พบในภาษาโปรแกรมส่วนใหญ่ -
ภาษาการเขียนโปรแกรม Python ถือว่าใด ๆ non-zero และ non-null ค่าเป็น TRUE และใด ๆ zero หรือ null values เป็นค่า FALSE
ภาษาการเขียนโปรแกรม Python มีคำสั่งในการตัดสินใจประเภทต่อไปนี้
ซีเนียร์ | คำชี้แจงและคำอธิบาย |
---|---|
1 | ถ้างบ อัน if statement ประกอบด้วยนิพจน์บูลีนตามด้วยหนึ่งคำสั่งขึ้นไป |
2 | if ... else คำสั่ง อัน if statement ตามด้วยตัวเลือกก็ได้ else statementซึ่งดำเนินการเมื่อนิพจน์บูลีนเป็น FALSE |
3 | คำสั่ง if ซ้อนกัน คุณสามารถใช้ if หรือ else if คำสั่งภายในอื่น if หรือ else if คำสั่ง (s) |
ให้เราทำตามคำสั่งตัดสินใจแต่ละข้ออย่างรวดเร็ว
Single Statement Suites
หากชุดของ if อนุประโยคประกอบด้วยเพียงบรรทัดเดียวอาจอยู่ในบรรทัดเดียวกับคำสั่งส่วนหัว
ตัวอย่าง
นี่คือตัวอย่างของไฟล์ one-line if อนุประโยค -
#!/usr/bin/python3
var = 100
if ( var == 100 ) : print ("Value of expression is 100")
print ("Good bye!")
เอาต์พุต
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Value of expression is 100
Good bye!
โดยทั่วไปคำสั่งจะดำเนินการตามลำดับ - คำสั่งแรกในฟังก์ชันจะถูกเรียกใช้ก่อนตามด้วยคำสั่งที่สองและอื่น ๆ อาจมีสถานการณ์ที่คุณต้องเรียกใช้บล็อกโค้ดหลาย ๆ ครั้ง
ภาษาโปรแกรมจัดเตรียมโครงสร้างการควบคุมต่างๆที่ช่วยให้เส้นทางการดำเนินการซับซ้อนมากขึ้น
คำสั่งวนซ้ำช่วยให้เราดำเนินการคำสั่งหรือกลุ่มของคำสั่งได้หลายครั้ง แผนภาพต่อไปนี้แสดงคำสั่งลูป -
ภาษาโปรแกรม Python จัดเตรียมลูปประเภทต่อไปนี้เพื่อจัดการกับข้อกำหนดการวนซ้ำ
ซีเนียร์ | ประเภทห่วงและคำอธิบาย |
---|---|
1 | ในขณะที่วนซ้ำ ทำซ้ำคำสั่งหรือกลุ่มของคำสั่งในขณะที่เงื่อนไขที่กำหนดเป็น TRUE จะทดสอบเงื่อนไขก่อนที่จะดำเนินการร่างกายลูป |
2 | สำหรับห่วง เรียกใช้ลำดับของคำสั่งหลาย ๆ ครั้งและย่อโค้ดที่จัดการตัวแปรลูป |
3 | ลูปที่ซ้อนกัน คุณสามารถใช้ลูปหนึ่งหรือหลายวงในอีกอันหนึ่งหรือหลาย ๆ วงก็ได้ |
คำสั่งควบคุมลูป
คำสั่งควบคุมลูปเปลี่ยนการดำเนินการจากลำดับปกติ เมื่อการดำเนินการออกจากขอบเขตอ็อบเจ็กต์อัตโนมัติทั้งหมดที่สร้างขึ้นในขอบเขตนั้นจะถูกทำลาย
Python รองรับคำสั่งควบคุมต่อไปนี้
ซีเนียร์ | คำชี้แจงและคำอธิบายการควบคุม |
---|---|
1 | คำสั่งทำลาย ยุติคำสั่งลูปและโอนการดำเนินการไปยังคำสั่งทันทีตามลูป |
2 | ดำเนินการต่อ ทำให้ลูปข้ามส่วนที่เหลือของร่างกายและทดสอบสภาพของมันใหม่ทันทีก่อนที่จะย้ำอีกครั้ง |
3 | ใบแจ้งยอด คำสั่ง pass ใน Python ใช้เมื่อจำเป็นต้องใช้คำสั่งในเชิงวากยสัมพันธ์ แต่คุณไม่ต้องการให้คำสั่งหรือโค้ดใด ๆ ดำเนินการ |
ให้เราดูคำสั่งควบคุมลูปสั้น ๆ
Iterator และ Generator
Iteratorเป็นวัตถุที่ช่วยให้โปรแกรมเมอร์สามารถสำรวจผ่านองค์ประกอบทั้งหมดของคอลเล็กชันโดยไม่คำนึงถึงการนำไปใช้งานเฉพาะ ใน Python ออบเจ็กต์ตัววนซ้ำจะใช้สองวิธีiter() และ next().
สามารถใช้วัตถุ String, List หรือ Tuple เพื่อสร้าง Iterator
list = [1,2,3,4]
it = iter(list) # this builds an iterator object
print (next(it)) #prints next available element in iterator
Iterator object can be traversed using regular for statement
!usr/bin/python3
for x in it:
print (x, end=" ")
or using next() function
while True:
try:
print (next(it))
except StopIteration:
sys.exit() #you have to import sys module for this
ก generator เป็นฟังก์ชันที่สร้างหรือให้ลำดับของค่าโดยใช้วิธีการให้ผลตอบแทน
เมื่อเรียกใช้ฟังก์ชันเครื่องกำเนิดจะส่งคืนวัตถุเครื่องกำเนิดไฟฟ้าโดยไม่ต้องเริ่มต้นการเรียกใช้ฟังก์ชัน เมื่อเมธอด next () ถูกเรียกเป็นครั้งแรกฟังก์ชันจะเริ่มดำเนินการจนกว่าจะถึงคำสั่ง yield ซึ่งจะส่งคืนค่าที่ได้รับ ผลตอบแทนติดตามเช่นจำการดำเนินการครั้งสุดท้ายและการเรียกถัดไป () ครั้งที่สองต่อจากค่าก่อนหน้า
ตัวอย่าง
ตัวอย่างต่อไปนี้กำหนดเครื่องกำเนิดไฟฟ้าซึ่งสร้างตัววนซ้ำสำหรับหมายเลขฟีโบนักชีทั้งหมด
#!usr/bin/python3
import sys
def fibonacci(n): #generator function
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(5) #f is iterator object
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
ชนิดข้อมูลตัวเลขเก็บค่าตัวเลข เป็นประเภทข้อมูลที่ไม่เปลี่ยนรูป ซึ่งหมายความว่าการเปลี่ยนค่าของชนิดข้อมูลตัวเลขจะส่งผลให้ออบเจ็กต์ที่จัดสรรใหม่
วัตถุตัวเลขถูกสร้างขึ้นเมื่อคุณกำหนดค่าให้กับวัตถุเหล่านั้น ตัวอย่างเช่น -
var1 = 1
var2 = 10
คุณยังสามารถลบการอ้างอิงไปยังออบเจ็กต์ตัวเลขโดยใช้ไฟล์ delคำให้การ. ไวยากรณ์ของdel คำสั่งคือ -
del var1[,var2[,var3[....,varN]]]]
คุณสามารถลบวัตถุเดียวหรือหลายวัตถุโดยใช้ไฟล์ delคำให้การ. ตัวอย่างเช่น -
del var
del var_a, var_b
Python รองรับประเภทตัวเลขที่แตกต่างกัน -
int (signed integers) - มักเรียกว่าแค่จำนวนเต็มหรือ ints. เป็นจำนวนเต็มบวกหรือลบโดยไม่มีจุดทศนิยม จำนวนเต็มใน Python 3 มีขนาดไม่ จำกัด Python 2 มีจำนวนเต็มสองประเภท - int และ long ไม่มี 'long integer'ใน Python 3 อีกต่อไป
float (floating point real values)- เรียกอีกอย่างว่าลอยซึ่งแสดงถึงจำนวนจริงและเขียนด้วยจุดทศนิยมหารจำนวนเต็มและส่วนที่เป็นเศษส่วน การลอยตัวอาจอยู่ในสัญกรณ์ทางวิทยาศาสตร์โดย E หรือ e ระบุกำลัง 10 (2.5e2 = 2.5 x 10 2 = 250)
complex (complex numbers)- อยู่ในรูปแบบ a + bJ โดยที่ a และ b เป็นลอยและ J (หรือ j) แทนค่ารากที่สองของ -1 (ซึ่งเป็นจำนวนจินตภาพ) ส่วนจริงของจำนวนคือ a และส่วนจินตภาพคือ b จำนวนเชิงซ้อนไม่ได้ใช้มากนักในการเขียนโปรแกรม Python
เป็นไปได้ที่จะแทนจำนวนเต็มในรูปฐานสิบหกหรือฐานแปด
>>> number = 0xA0F #Hexa-decimal
>>> number
2575
>>> number = 0o37 #Octal
>>> number
31
ตัวอย่าง
นี่คือตัวอย่างบางส่วนของตัวเลข
int | ลอย | ซับซ้อน |
---|---|---|
10 | 0.0 | 3.14j |
100 | 15.20 น | 45.j |
-786 | -21.9 | 9.322e-36j |
080 | 32.3 + จ 18 | .876j |
-0490 | -90. | -.6545 + 0J |
-0 × 260 | -32.54e100 | 3e + 26J |
0 × 69 | 70.2-E12 | 4.53e-7j |
จำนวนเชิงซ้อนประกอบด้วยคู่ลำดับของจำนวนทศนิยมจริงที่แสดงด้วย a + bj โดยที่ a คือส่วนจริงและ b คือส่วนจินตภาพของจำนวนเชิงซ้อน
การแปลงประเภทตัวเลข
Python แปลงตัวเลขภายในในนิพจน์ที่มีชนิดผสมเป็นชนิดทั่วไปสำหรับการประเมิน บางครั้งคุณจำเป็นต้องบังคับตัวเลขอย่างชัดเจนจากประเภทหนึ่งไปยังอีกประเภทหนึ่งเพื่อให้เป็นไปตามข้อกำหนดของตัวดำเนินการหรือพารามิเตอร์ฟังก์ชัน
ประเภท int(x) เพื่อแปลง x เป็นจำนวนเต็มธรรมดา
ประเภท long(x) เพื่อแปลง x เป็นจำนวนเต็มยาว
ประเภท float(x) เพื่อแปลง x เป็นเลขทศนิยม
ประเภท complex(x) การแปลง x เป็นจำนวนเชิงซ้อนโดยมีส่วนจริง x และส่วนจินตภาพเป็นศูนย์
ประเภท complex(x, y)การแปลง x และ y เป็นจำนวนเชิงซ้อนด้วยส่วนจริง x และส่วนจินตภาพ y x และ y เป็นนิพจน์ตัวเลข
ฟังก์ชันทางคณิตศาสตร์
Python มีฟังก์ชันต่อไปนี้ที่คำนวณทางคณิตศาสตร์
ซีเนียร์ | ฟังก์ชันและผลตอบแทน (คำอธิบาย) |
---|---|
1 | เอบีเอส (x) ค่าสัมบูรณ์ของ x: ระยะห่าง (บวก) ระหว่าง x ถึงศูนย์ |
2 | เพดาน (x) เพดานของ x: จำนวนเต็มที่น้อยที่สุดไม่น้อยกว่า x |
3 | cmp(x, y) -1 ถ้า x <y, 0 ถ้า x == y หรือ 1 ถ้า x> y Deprecated ใน Python 3 ให้ใช้ไฟล์ return (x>y)-(x<y). |
4 | ประสบการณ์ (x) เลขชี้กำลังของ x: e x |
5 | fabs (x) ค่าสัมบูรณ์ของ x |
6 | ชั้น (x) ชั้นของ x: จำนวนเต็มที่มากที่สุดไม่เกิน x |
7 | บันทึก (x) ลอการิทึมธรรมชาติของ x สำหรับ x> 0 |
8 | log10 (x) ลอการิทึมฐาน 10 ของ x สำหรับ x> 0 |
9 | สูงสุด (x1, x2, ... ) อาร์กิวเมนต์ที่ใหญ่ที่สุด: ค่าที่ใกล้เคียงกับอินฟินิตี้ที่เป็นบวกมากที่สุด |
10 | นาที (x1, x2, ... ) อาร์กิวเมนต์ที่เล็กที่สุด: ค่าที่ใกล้เคียงกับอินฟินิตี้เชิงลบมากที่สุด |
11 | modf (x) ส่วนเศษส่วนและจำนวนเต็มของ x ในทูเพิลสองรายการ ทั้งสองส่วนมีเครื่องหมายเดียวกับ x ส่วนจำนวนเต็มจะถูกส่งกลับเป็นทศนิยม |
12 | ธาร (x, y) ค่าของ x ** y |
13 | รอบ (x [, n]) xปัดเศษเป็น n หลักจากจุดทศนิยม Python ปัดเศษจากศูนย์เป็นไทเบรกเกอร์: รอบ (0.5) คือ 1.0 และรอบ (-0.5) คือ -1.0 |
14 | sqrt (x) รากที่สองของ x สำหรับ x> 0 |
ฟังก์ชันตัวเลขสุ่ม
หมายเลขสุ่มใช้สำหรับเกมการจำลองการทดสอบความปลอดภัยและความเป็นส่วนตัว Python มีฟังก์ชันต่อไปนี้ที่ใช้กันทั่วไป
ซีเนียร์ | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | ทางเลือก (seq) รายการสุ่มจากรายการทูเพิลหรือสตริง |
2 | Randrange ([เริ่ม,] หยุด [, ขั้นตอน]) องค์ประกอบที่เลือกแบบสุ่มจากช่วง (เริ่มต้นหยุดขั้นตอน) |
3 | สุ่ม () สุ่มลอย r เช่นที่ 0 น้อยกว่าหรือเท่ากับ r และ r น้อยกว่า 1 |
4 | เมล็ดพันธุ์ ([x]) ตั้งค่าเริ่มต้นจำนวนเต็มที่ใช้ในการสร้างตัวเลขสุ่ม เรียกใช้ฟังก์ชันนี้ก่อนเรียกใช้ฟังก์ชันโมดูลสุ่มอื่น ๆ ส่งคืนไม่มี |
5 | สับเปลี่ยน (lst) สุ่มรายการในสถานที่ ส่งคืนไม่มี |
6 | เครื่องแบบ (x, y) สุ่มลอย r เช่นที่ x น้อยกว่าหรือเท่ากับ r และ r น้อยกว่า y |
ฟังก์ชันตรีโกณมิติ
Python มีฟังก์ชันต่อไปนี้ที่ทำการคำนวณตรีโกณมิติ
ซีเนียร์ | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | acos (x) ส่งกลับอาร์กโคไซน์ของ x เป็นเรเดียน |
2 | asin (x) ส่งกลับไซน์อาร์กของ x เป็นเรเดียน |
3 | atan (x) คืนค่าแทนเจนต์ส่วนโค้งของ x เป็นเรเดียน |
4 | atan2 (y, x) กลับ atan (y / x) เป็นเรเดียน |
5 | cos (x) คืนค่าโคไซน์ของ x เรเดียน |
6 | hypot (x, y) คืนค่าบรรทัดฐานแบบยุคลิด sqrt (x * x + y * y) |
7 | บาป (x) ส่งคืนค่าไซน์ของ x เรเดียน |
8 | ผิวสีแทน (x) คืนค่าแทนเจนต์ของ x เรเดียน |
9 | องศา (x) แปลงมุม x จากเรเดียนเป็นองศา |
10 | เรเดียน (x) แปลงมุม x จากองศาเป็นเรเดียน |
ค่าคงที่ทางคณิตศาสตร์
โมดูลยังกำหนดค่าคงที่ทางคณิตศาสตร์สองค่า -
ซีเนียร์ | ค่าคงที่และคำอธิบาย |
---|---|
1 | pi ค่าไพคงที่ทางคณิตศาสตร์ |
2 | e ค่าคงที่ทางคณิตศาสตร์ e |
สตริงเป็นหนึ่งในประเภทที่นิยมมากที่สุดใน Python เราสามารถสร้างได้ง่ายๆโดยใส่เครื่องหมายอัญประกาศ Python ถือว่าอัญประกาศเดี่ยวเหมือนกับเครื่องหมายคำพูดคู่ การสร้างสตริงทำได้ง่ายเพียงแค่กำหนดค่าให้กับตัวแปร ตัวอย่างเช่น -
var1 = 'Hello World!'
var2 = "Python Programming"
การเข้าถึงค่าในสตริง
Python ไม่รองรับประเภทอักขระ สิ่งเหล่านี้ถือว่าเป็นสตริงที่มีความยาวหนึ่งดังนั้นจึงถือว่าเป็นสตริงย่อยด้วย
ในการเข้าถึงสตริงย่อยให้ใช้วงเล็บเหลี่ยมสำหรับการแบ่งส่วนพร้อมกับดัชนีหรือดัชนีเพื่อรับสตริงย่อยของคุณ ตัวอย่างเช่น -
#!/usr/bin/python3
var1 = 'Hello World!'
var2 = "Python Programming"
print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
var1[0]: H
var2[1:5]: ytho
การอัปเดตสตริง
คุณสามารถ "อัปเดต" สตริงที่มีอยู่ได้โดย (re) กำหนดตัวแปรให้กับสตริงอื่น ค่าใหม่อาจเกี่ยวข้องกับค่าก่อนหน้าหรือกับสตริงที่แตกต่างกันโดยสิ้นเชิง ตัวอย่างเช่น -
#!/usr/bin/python3
var1 = 'Hello World!'
print ("Updated String :- ", var1[:6] + 'Python')
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Updated String :- Hello Python
อักขระหลบหนี
ตารางต่อไปนี้คือรายการของอักขระ Escape หรืออักขระที่ไม่สามารถพิมพ์ได้ซึ่งสามารถแสดงด้วยเครื่องหมายแบ็กสแลช
อักขระหลบหนีถูกตีความ; ในสตริงที่ยกมาเดี่ยวและสตริงที่ยกมาคู่
เครื่องหมายแบ็กสแลช | อักขระเลขฐานสิบหก | คำอธิบาย |
---|---|---|
\ ก | 0x07 | กระดิ่งหรือแจ้งเตือน |
\ b | 0x08 | Backspace |
\ cx | Control-x | |
\ Cx | Control-x | |
\ e | 0x1b | หนี |
\ ฉ | 0x0c | ฟีดรูปแบบ |
\ M- \ Cx | Meta-Control-x | |
\ n | 0x0a | ขึ้นบรรทัดใหม่ |
\ nnn | สัญกรณ์ฐานแปดโดยที่ n อยู่ในช่วง 0.7 | |
\ r | 0x0d | การกลับรถ |
\ s | 0x20 | พื้นที่ |
\ t | 0x09 | แท็บ |
\ v | 0x0b | แท็บแนวตั้ง |
\ x | ตัวละคร x | |
\ xnn | สัญกรณ์เลขฐานสิบหกโดยที่ n อยู่ในช่วง 0.9, af หรือ AF |
สตริงโอเปอเรเตอร์พิเศษ
สมมติตัวแปรสตริง a ถือ 'สวัสดี' และตัวแปร b ถือ 'Python' จากนั้น -
ตัวดำเนินการ | คำอธิบาย | ตัวอย่าง |
---|---|---|
+ | การต่อ - เพิ่มค่าที่ด้านใดด้านหนึ่งของตัวดำเนินการ | a + b จะให้ HelloPython |
* | การทำซ้ำ - สร้างสตริงใหม่โดยเชื่อมต่อสำเนาหลายชุดของสตริงเดียวกัน | a * 2 จะให้ -HelloHello |
[] | Slice - ให้อักขระจากดัชนีที่กำหนด | a [1] จะให้ e |
[:] | Range Slice - ให้อักขระจากช่วงที่กำหนด | [1: 4] จะให้เอลล์ |
ใน | Membership - ส่งคืนจริงหากมีอักขระอยู่ในสตริงที่กำหนด | H ในพินัยกรรมให้ 1 |
ไม่เข้า | Membership - ส่งคืนค่าจริงหากไม่มีอักขระในสตริงที่กำหนด | M ไม่อยู่ในจะให้ 1 |
r / R | Raw String - ระงับความหมายที่แท้จริงของอักขระ Escape ไวยากรณ์สำหรับสตริงดิบจะเหมือนกับสตริงปกติทุกประการยกเว้นตัวดำเนินการสตริงดิบตัวอักษร "r" ซึ่งนำหน้าเครื่องหมายคำพูด "r" สามารถเป็นตัวพิมพ์เล็ก (r) หรือตัวพิมพ์ใหญ่ (R) และต้องอยู่หน้าเครื่องหมายคำพูดแรกทันที | พิมพ์ r '\ n' พิมพ์ \ n และพิมพ์ R '\ n'prints \ n |
% | รูปแบบ - ดำเนินการจัดรูปแบบสตริง | ดูที่หัวข้อถัดไป |
ตัวดำเนินการจัดรูปแบบสตริง
หนึ่งในคุณสมบัติที่ยอดเยี่ยมที่สุดของ Python คือตัวดำเนินการรูปแบบสตริง% โอเปอเรเตอร์นี้มีลักษณะเฉพาะสำหรับสตริงและประกอบขึ้นสำหรับชุดที่มีฟังก์ชันจากตระกูล printf () ของ C ต่อไปนี้เป็นตัวอย่างง่ายๆ -
#!/usr/bin/python3
print ("My name is %s and weight is %d kg!" % ('Zara', 21))
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
My name is Zara and weight is 21 kg!
นี่คือรายการชุดสัญลักษณ์ที่สมบูรณ์ซึ่งสามารถใช้ร่วมกับ% -
ซีเนียร์ | จัดรูปแบบสัญลักษณ์และการแปลง |
---|---|
1 | %c ตัวละคร |
2 | %s การแปลงสตริงผ่าน str () ก่อนการจัดรูปแบบ |
3 | %i จำนวนเต็มทศนิยมที่ลงนาม |
4 | %d จำนวนเต็มทศนิยมที่ลงนาม |
5 | %u จำนวนเต็มทศนิยมที่ไม่ได้ลงชื่อ |
6 | %o จำนวนเต็มฐานแปด |
7 | %x เลขฐานสิบหก (อักษรตัวพิมพ์เล็ก) |
8 | %X เลขฐานสิบหก (อักษรตัวพิมพ์ใหญ่) |
9 | %e สัญกรณ์เลขชี้กำลัง (ด้วยตัวพิมพ์เล็ก 'e') |
10 | %E สัญกรณ์เอกซ์โพเนนเชียล (มี UPPERcase 'E') |
11 | %f จำนวนจริงลอยตัว |
12 | %g ยิ่งสั้นลงของ% f และ% e |
13 | %G ยิ่งสั้นลงของ% f และ% E |
สัญลักษณ์และฟังก์ชันการทำงานที่รองรับอื่น ๆ แสดงอยู่ในตารางต่อไปนี้ -
ซีเนียร์ | สัญลักษณ์และการทำงาน |
---|---|
1 | * อาร์กิวเมนต์ระบุความกว้างหรือความแม่นยำ |
2 | - เหตุผลด้านซ้าย |
3 | + แสดงเครื่องหมาย |
4 | <sp> เว้นช่องว่างไว้ก่อนจำนวนบวก |
5 | # เพิ่มเลขศูนย์นำหน้าฐานแปด ('0') หรือเลขฐานสิบหกนำหน้า '0x' หรือ '0X' ขึ้นอยู่กับว่าใช้ 'x' หรือ 'X' |
6 | 0 รองจากซ้ายด้วยศูนย์ (แทนช่องว่าง) |
7 | % "%%" ทำให้คุณมีลิเทอรัล "%" เพียงตัวเดียว |
8 | (var) ตัวแปรการแมป (อาร์กิวเมนต์พจนานุกรม) |
9 | m.n. m คือความกว้างรวมขั้นต่ำและ n คือจำนวนหลักที่จะแสดงหลังจุดทศนิยม (ถ้าใช้ appl) |
คำคมสาม
คำพูดสามคำของ Python ช่วยให้สตริงสามารถขยายได้หลายบรรทัดรวมถึง NEWLINE แบบคำต่อคำแท็บและอักขระพิเศษอื่น ๆ
ไวยากรณ์สำหรับคำพูดสามคำประกอบด้วยสามครั้งต่อเนื่องกัน single or double คำพูด
#!/usr/bin/python3
para_str = """this is a long string that is made up of
several lines and non-printable characters such as
TAB ( \t ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [ \n ], or just a NEWLINE within
the variable assignment will also show up.
"""
print (para_str)
เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังต่อไปนี้ สังเกตว่าอักขระพิเศษทุกตัวถูกแปลงเป็นรูปแบบสิ่งพิมพ์ลงไปที่ NEWLINE สุดท้ายที่ท้ายสตริงระหว่าง "ขึ้น" และปิดคำพูดสามคำ นอกจากนี้โปรดทราบว่า NEWLINE อาจเกิดขึ้นกับการกลับรถอย่างชัดเจนที่ท้ายบรรทัดหรือรหัสหลีกเลี่ยง (\ n) -
this is a long string that is made up of
several lines and non-printable characters such as
TAB ( ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [
], or just a NEWLINE within
the variable assignment will also show up.
สตริงดิบไม่ถือว่าแบ็กสแลชเป็นอักขระพิเศษเลย อักขระทุกตัวที่คุณใส่ลงในสตริงดิบยังคงเป็นไปตามที่คุณเขียนไว้ -
#!/usr/bin/python3
print ('C:\\nowhere')
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
C:\nowhere
ตอนนี้ให้ใช้สตริงดิบ เราจะแสดงออกมาr'expression' ดังต่อไปนี้ -
#!/usr/bin/python3
print (r'C:\\nowhere')
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
C:\\nowhere
สตริง Unicode
ใน Python 3 สตริงทั้งหมดจะแสดงใน Unicode ใน Python 2 จะถูกเก็บไว้ภายในเป็น 8 บิต ASCII ดังนั้นจึงต้องแนบ 'u' เพื่อทำให้เป็น Unicode ตอนนี้ไม่จำเป็นอีกต่อไปแล้ว
วิธีการสตริงในตัว
Python มีวิธีการในตัวต่อไปนี้เพื่อจัดการกับสตริง -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | ใช้ประโยชน์ () อักษรตัวแรกของสตริงเป็นตัวพิมพ์ใหญ่ |
2 | ศูนย์ (ความกว้างช่องเติม) ส่งคืนสตริงที่บุด้วยFillcharโดยให้สตริงเดิมอยู่กึ่งกลางคอลัมน์ความกว้างทั้งหมด |
3 | นับ (str, ขอ = 0, end = len (สตริง)) นับจำนวนครั้งที่ str เกิดขึ้นในสตริงหรือในสตริงย่อยของสตริงหากดัชนีเริ่มต้นขอและสิ้นสุดดัชนีสิ้นสุดจะได้รับ |
4 | ถอดรหัส (การเข้ารหัส = 'UTF-8', ข้อผิดพลาด = 'เข้มงวด') ถอดรหัสสตริงโดยใช้ตัวแปลงสัญญาณที่ลงทะเบียนสำหรับการเข้ารหัส การเข้ารหัสเริ่มต้นเป็นการเข้ารหัสสตริงเริ่มต้น |
5 | เข้ารหัส (การเข้ารหัส = 'UTF-8', ข้อผิดพลาด = 'เข้มงวด') ส่งคืนเวอร์ชันสตริงที่เข้ารหัสของสตริง เมื่อเกิดข้อผิดพลาดค่าเริ่มต้นคือการเพิ่ม ValueError เว้นแต่จะมีการระบุข้อผิดพลาดด้วย "ละเว้น" หรือ "แทนที่" |
6 | สิ้นสุดด้วย (คำต่อท้ายขอ = 0, end = len (สตริง)) กำหนดว่าสตริงหรือสตริงย่อยของสตริง (ถ้าดัชนีเริ่มต้นขอและสิ้นสุดดัชนีสิ้นสุดจะได้รับ) ลงท้ายด้วยคำต่อท้าย คืนค่าจริงถ้าเป็นอย่างนั้นและเป็นเท็จ |
7 | ขยายแท็บ (tabsize = 8) ขยายแท็บในสตริงเป็นหลายช่องว่าง ค่าเริ่มต้นคือ 8 ช่องว่างต่อแท็บหากไม่ได้ระบุขนาดแท็บ |
8 | ค้นหา (str, ขอ = 0 end = len (สตริง)) ตรวจสอบว่า str เกิดขึ้นในสตริงหรือในสตริงย่อยของสตริงหากดัชนีเริ่มต้นขอและสิ้นสุดดัชนีสิ้นสุดจะได้รับดัชนีผลตอบแทนหากพบและ -1 มิฉะนั้น |
9 | ดัชนี (str, ขอ = 0, end = len (สตริง)) เหมือนกับ find () แต่จะมีข้อยกเว้นหากไม่พบ str |
10 | ไอซอลนัม () ส่งคืนค่าจริงหากสตริงมีอักขระอย่างน้อย 1 ตัวและอักขระทั้งหมดเป็นตัวอักษรและตัวเลขคละกันมิฉะนั้นจะเป็นเท็จ |
11 | isalpha () ส่งคืนจริงหากสตริงมีอักขระอย่างน้อย 1 ตัวและอักขระทั้งหมดเป็นตัวอักษรและเป็นเท็จ |
12 | isdigit () ส่งคืนจริงหากสตริงมีเพียงตัวเลขและเป็นเท็จ |
13 | ไอโซเวอร์ () ส่งคืนจริงหากสตริงมีอักขระที่กำหนดอย่างน้อย 1 ตัวและอักขระที่อยู่ในกล่องทั้งหมดเป็นตัวพิมพ์เล็กและเป็นเท็จ |
14 | เป็นตัวเลข () ส่งคืนจริงหากสตริงยูนิโคดมีเฉพาะอักขระตัวเลขและเป็นเท็จ |
15 | isspace () ส่งคืนจริงหากสตริงมีเฉพาะอักขระเว้นวรรคและเป็นเท็จ |
16 | istitle () ส่งคืนจริงหากสตริงเป็น "titlecased" อย่างถูกต้องและเป็นเท็จ |
17 | isupper () ส่งคืนจริงหากสตริงมีอักขระที่อยู่อย่างน้อยหนึ่งตัวและอักขระที่อยู่ในกล่องทั้งหมดเป็นตัวพิมพ์ใหญ่และเป็นเท็จ |
18 | เข้าร่วม (seq) ผสาน (ต่อกัน) การแสดงสตริงขององค์ประกอบในลำดับ seq เข้ากับสตริงด้วยสตริงตัวคั่น |
19 | len (สตริง) ส่งกลับความยาวของสตริง |
20 | ljust (ความกว้าง [ช่องเติม]) ส่งคืนสตริงที่มีช่องว่างพร้อมกับสตริงเดิมที่จัดชิดซ้ายเป็นคอลัมน์ความกว้างทั้งหมด |
21 | ต่ำกว่า () แปลงอักษรตัวพิมพ์ใหญ่ทั้งหมดในสตริงเป็นตัวพิมพ์เล็ก |
22 | lstrip () ลบช่องว่างนำหน้าทั้งหมดในสตริง |
23 | แมคโครทรานส์ () ส่งคืนตารางการแปลที่จะใช้ในฟังก์ชันแปล |
24 | สูงสุด (str) ส่งคืนอักขระตามตัวอักษรสูงสุดจากสตริง str |
25 | นาที (str) ส่งกลับอักขระตามตัวอักษรขั้นต่ำจากสตริง str |
26 | แทนที่ (เก่าใหม่ [สูงสุด]) แทนที่การเกิดขึ้นทั้งหมดของสตริงเก่าด้วยใหม่หรือสูงสุดที่เกิดขึ้นหากกำหนดสูงสุด |
27 | rfind (str, ขอ = 0, end = len (สตริง)) เหมือนกับ find () แต่ค้นหาย้อนกลับในสตริง |
28 | rindex (str, ขอ = 0, end = len (สตริง)) เหมือนกับดัชนี () แต่ค้นหาย้อนหลังในสตริง |
29 | rjust (ความกว้าง [Fillchar]) ส่งคืนสตริงที่มีช่องว่างพร้อมกับสตริงเดิมที่จัดชิดขวาให้กับคอลัมน์ความกว้างทั้งหมด |
30 | rstrip () ลบช่องว่างต่อท้ายทั้งหมดของสตริง |
31 | แยก (str = "", num = string.count (str)) แยกสตริงตามตัวคั่น str (ช่องว่างหากไม่ได้ระบุไว้) และส่งคืนรายการสตริงย่อย แยกเป็นสตริงย่อยจำนวนมากที่สุดหากกำหนด |
32 | เส้นแบ่ง (num = string.count ('\ n')) แยกสตริงทั้งหมด (หรือ num) NEWLINE และส่งกลับรายการของแต่ละบรรทัดโดยลบ NEWLINE ออก |
33 | เริ่มต้นด้วย (str, ขอ = 0, end = len (สตริง)) กำหนดว่าสตริงหรือสตริงย่อยของสตริง (ถ้าดัชนีเริ่มต้นขอและสิ้นสุดดัชนีสิ้นสุดจะได้รับ) เริ่มต้นด้วยสตริงย่อย str; คืนค่าจริงถ้าเป็นอย่างนั้นและเป็นเท็จ |
34 | แถบ ([ตัวอักษร]) ดำเนินการทั้ง lstrip () และ rstrip () บนสตริง |
35 | แลกเปลี่ยน () Inverts case สำหรับตัวอักษรทั้งหมดในสตริง |
36 | หัวข้อ() ส่งคืนสตริงเวอร์ชัน "titlecased" นั่นคือทุกคำขึ้นต้นด้วยตัวพิมพ์ใหญ่และส่วนที่เหลือเป็นตัวพิมพ์เล็ก |
37 | แปล (ตาราง, deleteechars = "") แปลสตริงตามตารางการแปล str (256 ตัวอักษร) โดยลบสิ่งเหล่านั้นในสตริงเดล |
38 | บน () แปลงอักษรตัวพิมพ์เล็กในสตริงเป็นตัวพิมพ์ใหญ่ |
39 | zfill (กว้าง) ส่งคืนสตริงเดิมที่มีเลขศูนย์เป็นอักขระความกว้างทั้งหมด มีไว้สำหรับตัวเลข zfill () เก็บเครื่องหมายใด ๆ ที่กำหนดไว้ (น้อยกว่าหนึ่งศูนย์) |
40 | เป็นทศนิยม () ส่งคืนจริงหากสตริง Unicode มีเฉพาะอักขระทศนิยมและเป็นเท็จ |
โครงสร้างข้อมูลพื้นฐานที่สุดใน Python คือไฟล์ sequence. แต่ละองค์ประกอบของลำดับได้รับการกำหนดตัวเลข - ตำแหน่งหรือดัชนี ดัชนีแรกเป็นศูนย์ดัชนีที่สองคือหนึ่งและอื่น ๆ
Python มีลำดับในตัวหกประเภท แต่ลำดับที่พบมากที่สุดคือรายการและสิ่งที่เราจะเห็นในบทช่วยสอนนี้
มีบางสิ่งที่คุณสามารถทำได้กับประเภทลำดับทั้งหมด การดำเนินการเหล่านี้รวมถึงการจัดทำดัชนีการแบ่งส่วนการเพิ่มการคูณและการตรวจสอบการเป็นสมาชิก นอกจากนี้ Python ยังมีฟังก์ชันในตัวสำหรับการค้นหาความยาวของลำดับและสำหรับการค้นหาองค์ประกอบที่ใหญ่ที่สุดและเล็กที่สุด
รายการ Python
รายการนี้เป็นประเภทข้อมูลที่หลากหลายที่สุดที่มีอยู่ใน Python ซึ่งสามารถเขียนเป็นรายการของค่าที่คั่นด้วยจุลภาค (รายการ) ระหว่างวงเล็บเหลี่ยม สิ่งสำคัญเกี่ยวกับรายการคือรายการในรายการไม่จำเป็นต้องเป็นประเภทเดียวกัน
การสร้างรายการทำได้ง่ายเพียงแค่ใส่ค่าที่คั่นด้วยเครื่องหมายจุลภาคที่แตกต่างกันระหว่างวงเล็บเหลี่ยม ตัวอย่างเช่น -
list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5 ];
list3 = ["a", "b", "c", "d"];
เช่นเดียวกับดัชนีสตริงดัชนีรายการเริ่มต้นที่ 0 และรายการสามารถแบ่งส่วนเชื่อมต่อและอื่น ๆ ได้
การเข้าถึงค่าในรายการ
ในการเข้าถึงค่าในรายการให้ใช้วงเล็บเหลี่ยมสำหรับการแบ่งส่วนร่วมกับดัชนีหรือดัชนีเพื่อรับค่าที่มีอยู่ในดัชนีนั้น ตัวอย่างเช่น -
#!/usr/bin/python3
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7 ]
print ("list1[0]: ", list1[0])
print ("list2[1:5]: ", list2[1:5])
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
list1[0]: physics
list2[1:5]: [2, 3, 4, 5]
การอัปเดตรายการ
คุณสามารถอัปเดตองค์ประกอบรายการเดียวหรือหลายรายการได้โดยให้สไลซ์ทางด้านซ้ายมือของตัวดำเนินการกำหนดและคุณสามารถเพิ่มลงในองค์ประกอบในรายการด้วยวิธีการผนวก () ตัวอย่างเช่น -
#!/usr/bin/python3
list = ['physics', 'chemistry', 1997, 2000]
print ("Value available at index 2 : ", list[2])
list[2] = 2001
print ("New value available at index 2 : ", list[2])
Note - วิธีการผนวก () จะกล่าวถึงในส่วนต่อไป
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Value available at index 2 : 1997
New value available at index 2 : 2001
ลบองค์ประกอบรายการ
หากต้องการลบองค์ประกอบรายการคุณสามารถใช้ไฟล์ delคำสั่งถ้าคุณรู้แน่ชัดว่าคุณกำลังลบองค์ประกอบใด คุณสามารถใช้วิธีลบ () หากคุณไม่ทราบแน่ชัดว่าจะลบรายการใด ตัวอย่างเช่น -
#!/usr/bin/python3
list = ['physics', 'chemistry', 1997, 2000]
print (list)
del list[2]
print ("After deleting value at index 2 : ", list)
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 : ['physics', 'chemistry', 2000]
Note - วิธีลบ () จะกล่าวถึงในส่วนต่อไป
การใช้งานรายการพื้นฐาน
รายการตอบสนองต่อตัวดำเนินการ + และ * เหมือนกับสตริง พวกเขาหมายถึงการเรียงต่อกันและการทำซ้ำที่นี่เช่นกันยกเว้นว่าผลลัพธ์จะเป็นรายการใหม่ไม่ใช่สตริง
ในความเป็นจริงรายการตอบสนองต่อการดำเนินการตามลำดับทั่วไปทั้งหมดที่เราใช้กับสตริงในบทก่อนหน้า
นิพจน์ Python | ผล | คำอธิบาย |
---|---|---|
เลน ([1, 2, 3]) | 3 | ความยาว |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | การเชื่อมต่อ |
['สวัสดี!'] * 4 | ['Hi!', 'Hi!', 'Hi!', 'Hi!'] | การทำซ้ำ |
3 ใน [1, 2, 3] | จริง | การเป็นสมาชิก |
สำหรับ x ใน [1,2,3]: พิมพ์ (x, end = '') | 1 2 3 | การทำซ้ำ |
การจัดทำดัชนีการแบ่งส่วนและเมทริกซ์
เนื่องจากรายการเป็นลำดับการจัดทำดัชนีและการแบ่งส่วนจึงทำงานในลักษณะเดียวกับรายการเช่นเดียวกับที่ทำกับสตริง
สมมติว่าอินพุตต่อไปนี้ -
L = ['C++'', 'Java', 'Python']
นิพจน์ Python | ผล | คำอธิบาย |
---|---|---|
L [2] | 'Python' | การชดเชยเริ่มต้นที่ศูนย์ |
L [-2] | 'Java' | เชิงลบ: นับจากทางขวา |
L [1:] | ['Java', 'Python'] | การแบ่งส่วนดึงข้อมูลส่วนต่างๆ |
ฟังก์ชั่นและวิธีการแสดงรายการในตัว
Python มีฟังก์ชันรายการต่อไปนี้ -
ซีเนียร์ | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | len (รายการ) ระบุความยาวทั้งหมดของรายการ |
2 | สูงสุด (รายการ) ส่งคืนสินค้าจากรายการที่มีค่าสูงสุด |
3 | นาที (รายการ) ส่งคืนรายการจากรายการด้วยค่าต่ำสุด |
4 | รายการ (seq) แปลงทูเพิลเป็นรายการ |
Python มีวิธีการแสดงรายการต่อไปนี้ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | list.append (obj) ผนวกวัตถุ obj เข้ากับรายการ |
2 | list.count (obj) ผลตอบแทนนับจำนวนครั้งที่ obj เกิดขึ้นในรายการ |
3 | list.extend(seq) Appends the contents of seq to list |
4 | list.index(obj) Returns the lowest index in list that obj appears |
5 | list.insert(index, obj) Inserts object obj into list at offset index |
6 | list.pop(obj = list[-1]) Removes and returns last object or obj from list |
7 | list.remove(obj) Removes object obj from list |
8 | list.reverse() Reverses objects of list in place |
9 | list.sort([func]) Sorts objects of list, use compare func if given |
A tuple is a collection of objects which ordered and immutable. Tuples are sequences, just like lists. The main difference between the tuples and the lists is that the tuples cannot be changed unlike lists. Tuples use parentheses, whereas lists use square brackets.
Creating a tuple is as simple as putting different comma-separated values. Optionally, you can put these comma-separated values between parentheses also. For example −
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"
The empty tuple is written as two parentheses containing nothing −
tup1 = ();
To write a tuple containing a single value you have to include a comma, even though there is only one value −
tup1 = (50,)
Like string indices, tuple indices start at 0, and they can be sliced, concatenated, and so on.
Accessing Values in Tuples
To access values in tuple, use the square brackets for slicing along with the index or indices to obtain the value available at that index. For example −
#!/usr/bin/python3
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])
When the above code is executed, it produces the following result −
tup1[0]: physics
tup2[1:5]: (2, 3, 4, 5)
Updating Tuples
Tuples are immutable, which means you cannot update or change the values of tuple elements. You are able to take portions of the existing tuples to create new tuples as the following example demonstrates −
#!/usr/bin/python3
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
# Following action is not valid for tuples
# tup1[0] = 100;
# So let's create a new tuple as follows
tup3 = tup1 + tup2
print (tup3)
When the above code is executed, it produces the following result −
(12, 34.56, 'abc', 'xyz')
Delete Tuple Elements
Removing individual tuple elements is not possible. There is, of course, nothing wrong with putting together another tuple with the undesired elements discarded.
To explicitly remove an entire tuple, just use the del statement. For example −
#!/usr/bin/python3
tup = ('physics', 'chemistry', 1997, 2000);
print (tup)
del tup;
print ("After deleting tup : ")
print (tup)
This produces the following result.
Note − An exception is raised. This is because after del tup, tuple does not exist any more.
('physics', 'chemistry', 1997, 2000)
After deleting tup :
Traceback (most recent call last):
File "test.py", line 9, in <module>
print tup;
NameError: name 'tup' is not defined
Basic Tuples Operations
Tuples respond to the + and * operators much like strings; they mean concatenation and repetition here too, except that the result is a new tuple, not a string.
In fact, tuples respond to all of the general sequence operations we used on strings in the previous chapter.
Python Expression | Results | Description |
---|---|---|
len((1, 2, 3)) | 3 | Length |
(1, 2, 3) + (4, 5, 6) | (1, 2, 3, 4, 5, 6) | Concatenation |
('Hi!',) * 4 | ('Hi!', 'Hi!', 'Hi!', 'Hi!') | Repetition |
3 in (1, 2, 3) | True | Membership |
for x in (1,2,3) : print (x, end = ' ') | 1 2 3 | Iteration |
Indexing, Slicing, and Matrixes
Since tuples are sequences, indexing and slicing work the same way for tuples as they do for strings, assuming the following input −
T=('C++', 'Java', 'Python')
Python Expression | Results | Description |
---|---|---|
T[2] | 'Python' | Offsets start at zero |
T[-2] | 'Java' | Negative: count from the right |
T[1:] | ('Java', 'Python') | Slicing fetches sections |
No Enclosing Delimiters
No enclosing Delimiters is any set of multiple objects, comma-separated, written without identifying symbols, i.e., brackets for lists, parentheses for tuples, etc., default to tuples, as indicated in these short examples.
Built-in Tuple Functions
Python includes the following tuple functions −
Sr.No. | Function & Description |
---|---|
1 | cmp(tuple1, tuple2) Compares elements of both tuples. |
2 | len(tuple) Gives the total length of the tuple. |
3 | max(tuple) Returns item from the tuple with max value. |
4 | min(tuple) Returns item from the tuple with min value. |
5 | tuple(seq) Converts a list into tuple. |
Each key is separated from its value by a colon (:), the items are separated by commas, and the whole thing is enclosed in curly braces. An empty dictionary without any items is written with just two curly braces, like this: {}.
Keys are unique within a dictionary while values may not be. The values of a dictionary can be of any type, but the keys must be of an immutable data type such as strings, numbers, or tuples.
Accessing Values in Dictionary
To access dictionary elements, you can use the familiar square brackets along with the key to obtain its value. Following is a simple example −
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])
When the above code is executed, it produces the following result −
dict['Name']: Zara
dict['Age']: 7
If we attempt to access a data item with a key, which is not a part of the dictionary, we get an error as follows −
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
print ("dict['Alice']: ", dict['Alice'])
When the above code is executed, it produces the following result −
dict['Zara']:
Traceback (most recent call last):
File "test.py", line 4, in <module>
print "dict['Alice']: ", dict['Alice'];
KeyError: 'Alice'
Updating Dictionary
You can update a dictionary by adding a new entry or a key-value pair, modifying an existing entry, or deleting an existing entry as shown in a simple example given below.
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School" # Add new entry
print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])
When the above code is executed, it produces the following result −
dict['Age']: 8
dict['School']: DPS School
Delete Dictionary Elements
You can either remove individual dictionary elements or clear the entire contents of a dictionary. You can also delete entire dictionary in a single operation.
To explicitly remove an entire dictionary, just use the del statement. Following is a simple example −
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
del dict['Name'] # remove entry with key 'Name'
dict.clear() # remove all entries in dict
del dict # delete entire dictionary
print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])
This produces the following result.
An exception is raised because after del dict, the dictionary does not exist anymore.
dict['Age']:
Traceback (most recent call last):
File "test.py", line 8, in <module>
print "dict['Age']: ", dict['Age'];
TypeError: 'type' object is unsubscriptable
Note − The del() method is discussed in subsequent section.
Properties of Dictionary Keys
Dictionary values have no restrictions. They can be any arbitrary Python object, either standard objects or user-defined objects. However, same is not true for the keys.
There are two important points to remember about dictionary keys −
(a) More than one entry per key is not allowed. This means no duplicate key is allowed. When duplicate keys are encountered during assignment, the last assignment wins. For example −
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}
print ("dict['Name']: ", dict['Name'])
When the above code is executed, it produces the following result −
dict['Name']: Manni
(b) Keys must be immutable. This means you can use strings, numbers or tuples as dictionary keys but something like ['key'] is not allowed. Following is a simple example −
#!/usr/bin/python3
dict = {['Name']: 'Zara', 'Age': 7}
print ("dict['Name']: ", dict['Name'])
When the above code is executed, it produces the following result −
Traceback (most recent call last):
File "test.py", line 3, in <module>
dict = {['Name']: 'Zara', 'Age': 7}
TypeError: list objects are unhashable
Built-in Dictionary Functions and Methods
Python includes the following dictionary functions −
Sr.No. | Function & Description |
---|---|
1 | cmp(dict1, dict2) No longer available in Python 3. |
2 | len(dict) Gives the total length of the dictionary. This would be equal to the number of items in the dictionary. |
3 | str(dict) Produces a printable string representation of a dictionary |
4 | type(variable) Returns the type of the passed variable. If passed variable is dictionary, then it would return a dictionary type. |
Python includes the following dictionary methods −
Sr.No. | Method & Description |
---|---|
1 | dict.clear() Removes all elements of dictionary dict |
2 | dict.copy() Returns a shallow copy of dictionary dict |
3 | dict.fromkeys() Create a new dictionary with keys from seq and values set to value. |
4 | dict.get(key, default=None) For key key, returns value or default if key not in dictionary |
5 | dict.has_key(key) Removed, use the in operation instead. |
6 | dict.items() Returns a list of dict's (key, value) tuple pairs |
7 | dict.keys() Returns list of dictionary dict's keys |
8 | dict.setdefault(key, default = None) Similar to get(), but will set dict[key] = default if key is not already in dict |
9 | dict.update(dict2) Adds dictionary dict2's key-values pairs to dict |
10 | dict.values() Returns list of dictionary dict's values |
A Python program can handle date and time in several ways. Converting between date formats is a common chore for computers. Python's time and calendar modules help track dates and times.
What is Tick?
Time intervals are floating-point numbers in units of seconds. Particular instants in time are expressed in seconds since 12:00am, January 1, 1970(epoch).
There is a popular time module available in Python which provides functions for working with times, and for converting between representations. The function time.time() returns the current system time in ticks since 12:00am, January 1, 1970(epoch).
Example
#!/usr/bin/python3
import time; # This is required to include time module.
ticks = time.time()
print ("Number of ticks since 12:00am, January 1, 1970:", ticks)
This would produce a result something as follows −
Number of ticks since 12:00am, January 1, 1970: 1455508609.34375
Date arithmetic is easy to do with ticks. However, dates before the epoch cannot be represented in this form. Dates in the far future also cannot be represented this way - the cutoff point is sometime in 2038 for UNIX and Windows.
What is TimeTuple?
Many of the Python's time functions handle time as a tuple of 9 numbers, as shown below −
Index | Field | Values |
---|---|---|
0 | 4-digit year | 2016 |
1 | Month | 1 to 12 |
2 | Day | 1 to 31 |
3 | Hour | 0 to 23 |
4 | Minute | 0 to 59 |
5 | Second | 0 to 61 (60 or 61 are leap-seconds) |
6 | Day of Week | 0 to 6 (0 is Monday) |
7 | Day of year | 1 to 366 (Julian day) |
8 | Daylight savings | -1, 0, 1, -1 means library determines DST |
For Example −
import time
print (time.localtime());
This would produce a result as follows −
time.struct_time(tm_year = 2016, tm_mon = 2, tm_mday = 15, tm_hour = 9,
tm_min = 29, tm_sec = 2, tm_wday = 0, tm_yday = 46, tm_isdst = 0)
The above tuple is equivalent to struct_time structure. This structure has following attributes −
Index | Attributes | Values |
---|---|---|
0 | tm_year | 2016 |
1 | tm_mon | 1 to 12 |
2 | tm_mday | 1 to 31 |
3 | tm_hour | 0 to 23 |
4 | tm_min | 0 to 59 |
5 | tm_sec | 0 to 61 (60 or 61 are leap-seconds) |
6 | tm_wday | 0 to 6 (0 is Monday) |
7 | tm_yday | 1 to 366 (Julian day) |
8 | tm_isdst | -1, 0, 1, -1 means library determines DST |
Getting current time
To translate a time instant from seconds since the epoch floating-point value into a timetuple, pass the floating-point value to a function (e.g., localtime) that returns a time-tuple with all valid nine items.
#!/usr/bin/python3
import time
localtime = time.localtime(time.time())
print ("Local current time :", localtime)
This would produce the following result, which could be formatted in any other presentable form −
Local current time : time.struct_time(tm_year = 2016, tm_mon = 2, tm_mday = 15,
tm_hour = 9, tm_min = 29, tm_sec = 2, tm_wday = 0, tm_yday = 46, tm_isdst = 0)
Getting formatted time
You can format any time as per your requirement, but a simple method to get time in a readable format is asctime() −
การสาธิตสด#!/usr/bin/python3
import time
localtime = time.asctime( time.localtime(time.time()) )
print ("Local current time :", localtime)
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Local current time : Mon Feb 15 09:34:03 2016
รับปฏิทินสำหรับเดือน
โมดูลปฏิทินมีวิธีการเล่นปฏิทินรายปีและรายเดือนที่หลากหลาย ที่นี่เราพิมพ์ปฏิทินสำหรับเดือนที่กำหนด (ม.ค. 2008) -
#!/usr/bin/python3
import calendar
cal = calendar.month(2016, 2)
print ("Here is the calendar:")
print (cal)
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Here is the calendar:
February 2016
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29
โมดูลเวลา
มีความนิยม timeโมดูลที่มีอยู่ใน Python ซึ่งมีฟังก์ชันสำหรับการทำงานกับเวลาและสำหรับการแปลงระหว่างการแสดง นี่คือรายการวิธีการทั้งหมดที่มี
ซีเนียร์ | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | time.altzone ค่าชดเชยของเขตเวลา DST ในพื้นที่ซึ่งอยู่ทางตะวันตกของ UTC เป็นไม่กี่วินาทีหากมีการกำหนดไว้ ซึ่งจะเป็นลบหากเขตเวลา DST ในพื้นที่อยู่ทางตะวันออกของ UTC (เช่นเดียวกับในยุโรปตะวันตกรวมถึงสหราชอาณาจักร) ใช้สิ่งนี้หากแสงในเวลากลางวันไม่ใช่ศูนย์ |
2 | time.asctime ([tupletime]) ยอมรับไทม์ทูเพิลและส่งคืนสตริง 24 อักขระที่อ่านได้เช่น 'อังคาร 11 ธันวาคม 18:07:14 2008' |
3 | time.clock () ส่งคืนเวลา CPU ปัจจุบันเป็นจำนวนวินาทีทศนิยม ในการวัดต้นทุนการคำนวณของวิธีการต่างๆค่าของ time.clock มีประโยชน์มากกว่าค่า time.time () |
4 | time.ctime ([วินาที]) เช่น asctime (localtime (secs)) และไม่มีข้อโต้แย้งก็เหมือนกับ asctime () |
5 | time.gmtime ([วินาที]) ยอมรับการแสดงผลทันทีในไม่กี่วินาทีนับตั้งแต่ยุคและส่งคืนค่าไทม์ทูเพิลด้วยเวลา UTC หมายเหตุ - t.tm_isdst เป็น 0 เสมอ |
6 | time.localtime ([วินาที]) ยอมรับการแสดงผลทันทีเป็นวินาทีตั้งแต่ยุคและส่งคืนไทม์ทูเพิล t ด้วยเวลาท้องถิ่น (t.tm_isdst คือ 0 หรือ 1 ขึ้นอยู่กับว่า DST ใช้กับวินาทีทันทีตามกฎท้องถิ่นหรือไม่) |
7 | time.mktime (ทูเพิลไทม์) ยอมรับทันทีที่แสดงเป็นไทม์ทูเพิลในเวลาท้องถิ่นและส่งคืนค่าทศนิยมพร้อมกับค่าทันทีที่แสดงเป็นวินาทีนับตั้งแต่ยุค |
8 | เวลานอนหลับ (วินาที) ระงับเธรดการโทรเป็นวินาทีวินาที |
9 | time.strftime (fmt [, tupletime]) ยอมรับทันทีที่แสดงเป็นไทม์ทูเพิลในเวลาท้องถิ่นและส่งคืนสตริงที่แสดงถึงการโต้ตอบทันทีตามที่ระบุโดยสตริง fmt |
10 | time.strptime (str, fmt = '% a% b% d% H:% M:% S% Y') แยกวิเคราะห์ str ตามรูปแบบสตริง fmt และส่งคืนค่าทันทีในรูปแบบ time-tuple |
11 | time.time () ส่งคืนเวลาปัจจุบันทันทีจำนวนทศนิยมของวินาทีนับตั้งแต่ยุค |
12 | time.tzset () รีเซ็ตกฎการแปลงเวลาที่ใช้โดยรูทีนไลบรารี ตัวแปรสภาพแวดล้อม TZ ระบุวิธีการดำเนินการนี้ |
มีแอตทริบิวต์ที่สำคัญสองอย่างที่สามารถใช้ได้กับโมดูลเวลา พวกเขาคือ -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | time.timezone แอตทริบิวต์ time.timezone คือการชดเชยเป็นวินาทีของเขตเวลาท้องถิ่น (ไม่มี DST) จาก UTC (> 0 ในอเมริกา; <= 0 ในส่วนใหญ่ของยุโรปเอเชียแอฟริกา) |
2 | time.tzname แอตทริบิวต์ time.tzname คือคู่ของสตริงที่ขึ้นกับโลแคลซึ่งเป็นชื่อของเขตเวลาท้องถิ่นที่ไม่มีและมี DST ตามลำดับ |
โมดูลปฏิทิน
โมดูลปฏิทินมีฟังก์ชันที่เกี่ยวข้องกับปฏิทินรวมถึงฟังก์ชันในการพิมพ์ปฏิทินข้อความสำหรับเดือนหรือปีที่กำหนด
ตามค่าเริ่มต้นปฏิทินจะใช้วันจันทร์เป็นวันแรกของสัปดาห์และวันอาทิตย์เป็นวันสุดท้าย หากต้องการเปลี่ยนสิ่งนี้โทรcalendar.setfirstweekday() ฟังก์ชัน
นี่คือรายการฟังก์ชั่นที่มีให้กับไฟล์ calendar โมดูล -
ซีเนียร์ | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | calendar.calendar(year,w = 2,l = 1,c = 6) ส่งคืนสตริงหลายบรรทัดพร้อมปฏิทินสำหรับปีที่จัดรูปแบบเป็นสามคอลัมน์โดยคั่นด้วยช่องว่าง c w คือความกว้างในอักขระของแต่ละวัน แต่ละบรรทัดมีความยาว 21 * w + 18 + 2 * c l คือจำนวนบรรทัดในแต่ละสัปดาห์ |
2 | calendar.firstweekday( ) ส่งคืนการตั้งค่าปัจจุบันสำหรับวันธรรมดาที่เริ่มต้นในแต่ละสัปดาห์ โดยค่าเริ่มต้นเมื่อนำเข้าปฏิทินเป็นครั้งแรกนี่คือ 0 ซึ่งหมายถึงวันจันทร์ |
3 | calendar.isleap(year) ส่งคืนค่า True หากปีเป็นปีอธิกสุรทิน มิฉะนั้นเท็จ |
4 | calendar.leapdays(y1,y2) ส่งคืนจำนวนวันอธิกสุรทินทั้งหมดในปีที่อยู่ในช่วง (y1, y2) |
5 | calendar.month(year,month,w = 2,l = 1) ส่งคืนสตริงหลายบรรทัดพร้อมปฏิทินสำหรับเดือนเดือนของปีหนึ่งบรรทัดต่อสัปดาห์บวกสองบรรทัดส่วนหัว w คือความกว้างในอักขระของแต่ละวัน แต่ละบรรทัดมีความยาว 7 * w + 6 l คือจำนวนบรรทัดในแต่ละสัปดาห์ |
6 | calendar.monthcalendar(year,month) ส่งกลับรายการของรายการ ints แต่ละรายการย่อยหมายถึงสัปดาห์ วันนอกเดือนเดือนของปีตั้งค่าเป็น 0; วันภายในเดือนจะถูกตั้งค่าเป็นวันของเดือน 1 ขึ้นไป |
7 | calendar.monthrange(year,month) ส่งคืนจำนวนเต็มสองจำนวน อันแรกคือรหัสของวันทำงานสำหรับวันแรกของเดือนเดือนในปีปี อันที่สองคือจำนวนวันในเดือนนั้น รหัสวันธรรมดาคือ 0 (วันจันทร์) ถึง 6 (วันอาทิตย์); ตัวเลขเดือนคือ 1 ถึง 12 |
8 | calendar.prcal(year,w = 2,l = 1,c = 6) เช่นเดียวกับพิมพ์ calendar.calendar (ปี, w, l, c) |
9 | calendar.prmonth(year,month,w = 2,l = 1) เช่นเดียวกับพิมพ์ calendar.month (ปี, เดือน, w, l) |
10 | calendar.setfirstweekday(weekday) ตั้งค่าวันแรกของแต่ละสัปดาห์เป็นรหัสวันธรรมดาในวันธรรมดา รหัสวันธรรมดาคือ 0 (วันจันทร์) ถึง 6 (วันอาทิตย์) |
11 | calendar.timegm(tupletime) การผกผันของ time.gmtime: ยอมรับเวลาทันทีในรูปแบบไทม์ทูเพิลและส่งกลับค่าทันทีเช่นเดียวกับจำนวนทศนิยมของวินาทีนับตั้งแต่ยุค |
12 | calendar.weekday(year,month,day) ส่งคืนรหัสวันธรรมดาสำหรับวันที่ที่ระบุ รหัสวันธรรมดาคือ 0 (วันจันทร์) ถึง 6 (วันอาทิตย์); ตัวเลขเดือนคือ 1 (มกราคม) ถึง 12 (ธันวาคม) |
โมดูลและฟังก์ชั่นอื่น ๆ
หากคุณสนใจคุณจะพบรายการโมดูลและฟังก์ชั่นที่สำคัญอื่น ๆ ที่จะเล่นกับวันที่และเวลาใน Python -
- โมดูลวันที่และเวลา
- โมดูล pytz
- โมดูล dateutil
ฟังก์ชันคือบล็อกของโค้ดที่จัดระเบียบและใช้ซ้ำได้ซึ่งใช้ในการดำเนินการเดียวที่เกี่ยวข้อง ฟังก์ชั่นให้ความเป็นโมดูลาร์ที่ดีขึ้นสำหรับแอปพลิเคชันของคุณและการใช้โค้ดซ้ำในระดับสูง
อย่างที่คุณทราบแล้ว Python มีฟังก์ชันในตัวมากมายเช่น print () เป็นต้น แต่คุณยังสามารถสร้างฟังก์ชันของคุณเองได้ ฟังก์ชันเหล่านี้เรียกว่าฟังก์ชันที่ผู้ใช้กำหนดเอง
การกำหนดฟังก์ชัน
คุณสามารถกำหนดฟังก์ชันเพื่อจัดเตรียมฟังก์ชันที่ต้องการได้ กฎง่ายๆในการกำหนดฟังก์ชันใน Python มีดังนี้
บล็อกฟังก์ชันเริ่มต้นด้วยคำสำคัญ def ตามด้วยชื่อฟังก์ชันและวงเล็บ (())
พารามิเตอร์อินพุตหรืออาร์กิวเมนต์ใด ๆ ควรอยู่ในวงเล็บเหล่านี้ คุณยังสามารถกำหนดพารามิเตอร์ภายในวงเล็บเหล่านี้
คำสั่งแรกของการทำงานอาจเป็นคำสั่งตัวเลือก - สตริงเอกสารของฟังก์ชั่นหรือdocstring
บล็อกโค้ดภายในทุกฟังก์ชันเริ่มต้นด้วยเครื่องหมายจุดคู่ (:) และเยื้อง
คำสั่งส่งคืน [นิพจน์] ออกจากฟังก์ชันซึ่งเป็นทางเลือกที่จะส่งผ่านนิพจน์กลับไปยังผู้เรียก คำสั่ง return ที่ไม่มีอาร์กิวเมนต์เหมือนกับ return None
ไวยากรณ์
def functionname( parameters ):
"function_docstring"
function_suite
return [expression]
โดยค่าเริ่มต้นพารามิเตอร์จะมีลักษณะการทำงานตามตำแหน่งและคุณต้องแจ้งให้ทราบตามลำดับเดียวกันกับที่กำหนดไว้
ตัวอย่าง
ฟังก์ชันต่อไปนี้รับสตริงเป็นพารามิเตอร์อินพุตและพิมพ์บนหน้าจอมาตรฐาน
def printme( str ):
"This prints a passed string into this function"
print (str)
return
เรียกใช้ฟังก์ชัน
การกำหนดฟังก์ชันตั้งชื่อให้ระบุพารามิเตอร์ที่จะรวมไว้ในฟังก์ชันและจัดโครงสร้างบล็อกของโค้ด
เมื่อโครงสร้างพื้นฐานของฟังก์ชันเสร็จสิ้นคุณสามารถเรียกใช้งานได้โดยเรียกใช้จากฟังก์ชันอื่นหรือจากพรอมต์ Python โดยตรง ต่อไปนี้เป็นตัวอย่างในการเรียกไฟล์printme() ฟังก์ชัน -
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call printme function
printme("This is first call to the user defined function!")
printme("Again second call to the same function")
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
This is first call to the user defined function!
Again second call to the same function
ผ่านการอ้างอิงเทียบกับมูลค่า
พารามิเตอร์ทั้งหมด (อาร์กิวเมนต์) ในภาษา Python จะถูกส่งผ่านโดยการอ้างอิง หมายความว่าหากคุณเปลี่ยนสิ่งที่พารามิเตอร์อ้างถึงภายในฟังก์ชันการเปลี่ยนแปลงจะสะท้อนกลับในฟังก์ชันการโทรด้วย ตัวอย่างเช่น -
#!/usr/bin/python3
# Function definition is here
def changeme( mylist ):
"This changes a passed list into this function"
print ("Values inside the function before change: ", mylist)
mylist[2]=50
print ("Values inside the function after change: ", mylist)
return
# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)
ที่นี่เรากำลังรักษาการอ้างอิงของวัตถุที่ส่งผ่านและต่อท้ายค่าในวัตถุเดียวกัน ดังนั้นสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Values inside the function before change: [10, 20, 30]
Values inside the function after change: [10, 20, 50]
Values outside the function: [10, 20, 50]
มีอีกหนึ่งตัวอย่างที่อาร์กิวเมนต์ถูกส่งผ่านโดยการอ้างอิงและการอ้างอิงจะถูกเขียนทับภายในฟังก์ชันที่เรียกว่า
#!/usr/bin/python3
# Function definition is here
def changeme( mylist ):
"This changes a passed list into this function"
mylist = [1,2,3,4] # This would assi new reference in mylist
print ("Values inside the function: ", mylist)
return
# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)
พารามิเตอร์ mylistอยู่ในพื้นที่ของการเปลี่ยนแปลงฟังก์ชัน การเปลี่ยนรายการของฉันภายในฟังก์ชันจะไม่มีผลกับรายการของฉัน ฟังก์ชั่นนี้ไม่ได้ทำอะไรเลยและสุดท้ายสิ่งนี้จะให้ผลลัพธ์ดังนี้ -
Values inside the function: [1, 2, 3, 4]
Values outside the function: [10, 20, 30]
อาร์กิวเมนต์ของฟังก์ชัน
คุณสามารถเรียกใช้ฟังก์ชันโดยใช้อาร์กิวเมนต์ที่เป็นทางการประเภทต่อไปนี้ -
- อาร์กิวเมนต์ที่จำเป็น
- อาร์กิวเมนต์คำหลัก
- อาร์กิวเมนต์เริ่มต้น
- อาร์กิวเมนต์ที่มีความยาวตัวแปร
อาร์กิวเมนต์ที่จำเป็น
อาร์กิวเมนต์ที่จำเป็นคืออาร์กิวเมนต์ที่ส่งไปยังฟังก์ชันตามลำดับตำแหน่งที่ถูกต้อง ที่นี่จำนวนอาร์กิวเมนต์ในการเรียกใช้ฟังก์ชันควรตรงกับนิยามฟังก์ชันทุกประการ
เพื่อเรียกใช้ฟังก์ชัน printme()คุณต้องส่งอาร์กิวเมนต์เดียวมิฉะนั้นจะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ดังนี้ -
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call printme function
printme()
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Traceback (most recent call last):
File "test.py", line 11, in <module>
printme();
TypeError: printme() takes exactly 1 argument (0 given)
อาร์กิวเมนต์คำหลัก
อาร์กิวเมนต์คำหลักเกี่ยวข้องกับการเรียกใช้ฟังก์ชัน เมื่อคุณใช้อาร์กิวเมนต์คำสำคัญในการเรียกใช้ฟังก์ชันผู้เรียกจะระบุอาร์กิวเมนต์ด้วยชื่อพารามิเตอร์
สิ่งนี้ช่วยให้คุณสามารถข้ามอาร์กิวเมนต์หรือไม่เรียงลำดับได้เนื่องจากตัวแปล Python สามารถใช้คีย์เวิร์ดที่ให้มาเพื่อจับคู่ค่ากับพารามิเตอร์ คุณยังสามารถเรียกใช้คำหลักไปยังไฟล์printme() ฟังก์ชั่นดังต่อไปนี้ -
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call printme function
printme( str = "My string")
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
My string
ตัวอย่างต่อไปนี้ให้ภาพที่ชัดเจนขึ้น โปรดทราบว่าลำดับของพารามิเตอร์ไม่สำคัญ
#!/usr/bin/python3
# Function definition is here
def printinfo( name, age ):
"This prints a passed info into this function"
print ("Name: ", name)
print ("Age ", age)
return
# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Name: miki
Age 50
อาร์กิวเมนต์เริ่มต้น
อาร์กิวเมนต์เริ่มต้นคืออาร์กิวเมนต์ที่ถือว่าเป็นค่าเริ่มต้นหากไม่มีการระบุค่าในการเรียกใช้ฟังก์ชันสำหรับอาร์กิวเมนต์นั้น ตัวอย่างต่อไปนี้ให้แนวคิดเกี่ยวกับอาร์กิวเมนต์เริ่มต้นซึ่งจะพิมพ์อายุเริ่มต้นหากไม่ผ่าน -
#!/usr/bin/python3
# Function definition is here
def printinfo( name, age = 35 ):
"This prints a passed info into this function"
print ("Name: ", name)
print ("Age ", age)
return
# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
printinfo( name = "miki" )
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Name: miki
Age 50
Name: miki
Age 35
อาร์กิวเมนต์ที่มีความยาวตัวแปร
คุณอาจต้องประมวลผลฟังก์ชันสำหรับอาร์กิวเมนต์มากกว่าที่คุณระบุไว้ในขณะที่กำหนดฟังก์ชัน อาร์กิวเมนต์เหล่านี้เรียกว่าอาร์กิวเมนต์ที่มีความยาวตัวแปรและไม่มีชื่ออยู่ในนิยามฟังก์ชันซึ่งแตกต่างจากอาร์กิวเมนต์ที่จำเป็นและอาร์กิวเมนต์เริ่มต้น
ไวยากรณ์สำหรับฟังก์ชันที่มีอาร์กิวเมนต์ตัวแปรที่ไม่ใช่คีย์เวิร์ดได้รับด้านล่าง -
def functionname([formal_args,] *var_args_tuple ):
"function_docstring"
function_suite
return [expression]
เครื่องหมายดอกจัน (*) วางไว้หน้าชื่อตัวแปรที่เก็บค่าของอาร์กิวเมนต์ตัวแปรที่ไม่ใช่คำหลักทั้งหมด ทูเปิลนี้จะว่างเปล่าหากไม่มีการระบุอาร์กิวเมนต์เพิ่มเติมระหว่างการเรียกใช้ฟังก์ชัน ต่อไปนี้เป็นตัวอย่างง่ายๆ -
#!/usr/bin/python3
# Function definition is here
def printinfo( arg1, *vartuple ):
"This prints a variable passed arguments"
print ("Output is: ")
print (arg1)
for var in vartuple:
print (var)
return
# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Output is:
10
Output is:
70
60
50
ฟังก์ชั่นที่ไม่ระบุตัวตน
ฟังก์ชันเหล่านี้เรียกว่า anonymous เนื่องจากไม่ได้ประกาศในลักษณะมาตรฐานโดยใช้ defคำสำคัญ. คุณสามารถใช้ไฟล์lambda คำหลักเพื่อสร้างฟังก์ชันที่ไม่ระบุชื่อขนาดเล็ก
รูปแบบแลมบ์ดาสามารถรับอาร์กิวเมนต์จำนวนเท่าใดก็ได้ แต่ส่งคืนค่าเพียงค่าเดียวในรูปแบบของนิพจน์ ไม่สามารถมีคำสั่งหรือหลายนิพจน์
ฟังก์ชันที่ไม่ระบุชื่อไม่สามารถเรียกโดยตรงเพื่อพิมพ์ได้เนื่องจากแลมบ์ดาต้องการนิพจน์
ฟังก์ชันแลมบ์ดามีเนมสเปซโลคัลของตนเองและไม่สามารถเข้าถึงตัวแปรนอกเหนือจากที่อยู่ในรายการพารามิเตอร์และในเนมสเปซส่วนกลาง
แม้ว่าจะดูเหมือนว่า lambdas เป็นฟังก์ชันเวอร์ชันบรรทัดเดียว แต่ก็ไม่เทียบเท่ากับคำสั่งแบบอินไลน์ใน C หรือ C ++ ซึ่งมีจุดประสงค์เพื่อการจัดสรรสแต็กโดยการส่งผ่านฟังก์ชันในระหว่างการเรียกใช้ด้วยเหตุผลด้านประสิทธิภาพ
ไวยากรณ์
ไวยากรณ์ของ lambda ฟังก์ชันมีเพียงคำสั่งเดียวซึ่งมีดังต่อไปนี้ -
lambda [arg1 [,arg2,.....argn]]:expression
ต่อไปนี้เป็นตัวอย่างเพื่อแสดงให้เห็นว่า lambda รูปแบบของฟังก์ชันการทำงาน -
#!/usr/bin/python3
# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2
# Now you can call sum as a function
print ("Value of total : ", sum( 10, 20 ))
print ("Value of total : ", sum( 20, 20 ))
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Value of total : 30
Value of total : 40
คำชี้แจงการคืนสินค้า
คำสั่งส่งคืน [นิพจน์] ออกจากฟังก์ชันซึ่งเป็นทางเลือกที่จะส่งผ่านนิพจน์กลับไปยังผู้เรียก คำสั่ง return ที่ไม่มีอาร์กิวเมนต์เหมือนกับ return None
ตัวอย่างทั้งหมดที่ระบุด้านล่างจะไม่คืนค่าใด ๆ คุณสามารถคืนค่าจากฟังก์ชันได้ดังนี้ -
#!/usr/bin/python3
# Function definition is here
def sum( arg1, arg2 ):
# Add both the parameters and return them."
total = arg1 + arg2
print ("Inside the function : ", total)
return total
# Now you can call sum function
total = sum( 10, 20 )
print ("Outside the function : ", total )
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Inside the function : 30
Outside the function : 30
ขอบเขตของตัวแปร
ตัวแปรทั้งหมดในโปรแกรมอาจไม่สามารถเข้าถึงได้จากทุกตำแหน่งในโปรแกรมนั้น ขึ้นอยู่กับตำแหน่งที่คุณประกาศตัวแปร
ขอบเขตของตัวแปรจะกำหนดส่วนของโปรแกรมที่คุณสามารถเข้าถึงตัวระบุเฉพาะได้ มีขอบเขตพื้นฐานสองประการของตัวแปรใน Python -
- ตัวแปรส่วนกลาง
- ตัวแปรท้องถิ่น
ตัวแปรส่วนกลางเทียบกับท้องถิ่น
ตัวแปรที่กำหนดภายในเนื้อความของฟังก์ชันมีขอบเขตเฉพาะที่และตัวแปรที่กำหนดไว้ภายนอกมีขอบเขตส่วนกลาง
ซึ่งหมายความว่าตัวแปรโลคัลสามารถเข้าถึงได้เฉพาะภายในฟังก์ชันที่มีการประกาศเท่านั้นในขณะที่ตัวแปรส่วนกลางสามารถเข้าถึงได้ทั่วทั้งเนื้อหาของโปรแกรมโดยฟังก์ชันทั้งหมด เมื่อคุณเรียกใช้ฟังก์ชันตัวแปรที่ประกาศภายในจะถูกนำเข้าสู่ขอบเขต ต่อไปนี้เป็นตัวอย่างง่ายๆ -
#!/usr/bin/python3
total = 0 # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
# Add both the parameters and return them."
total = arg1 + arg2; # Here total is local variable.
print ("Inside the function local total : ", total)
return total
# Now you can call sum function
sum( 10, 20 )
print ("Outside the function global total : ", total )
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Inside the function local total : 30
Outside the function global total : 0
โมดูลช่วยให้คุณสามารถจัดระเบียบโค้ด 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 ต่างๆในไฟล์เหล่านั้นจากนั้นคุณสามารถสร้างแพ็คเกจของคุณจากคลาสเหล่านั้นได้
บทนี้ครอบคลุมฟังก์ชัน I / O พื้นฐานทั้งหมดที่มีอยู่ใน Python 3 สำหรับฟังก์ชันเพิ่มเติมโปรดดูเอกสาร Python มาตรฐาน
การพิมพ์ไปที่หน้าจอ
วิธีที่ง่ายที่สุดในการสร้างเอาต์พุตคือการใช้คำสั่งพิมพ์ซึ่งคุณสามารถส่งนิพจน์ศูนย์หรือมากกว่าโดยคั่นด้วยเครื่องหมายจุลภาค ฟังก์ชันนี้จะแปลงนิพจน์ที่คุณส่งไปเป็นสตริงและเขียนผลลัพธ์เป็นเอาต์พุตมาตรฐานดังนี้ -
#!/usr/bin/python3
print ("Python is really a great language,", "isn't it?")
สิ่งนี้ให้ผลลัพธ์ต่อไปนี้บนหน้าจอมาตรฐานของคุณ -
Python is really a great language, isn't it?
การอ่านอินพุตคีย์บอร์ด
Python 2 มีฟังก์ชันในตัวสองฟังก์ชันในการอ่านข้อมูลจากอินพุตมาตรฐานซึ่งโดยค่าเริ่มต้นมาจากแป้นพิมพ์ ฟังก์ชันเหล่านี้คือinput() และ raw_input()
ใน Python 3 ฟังก์ชัน raw_input () เลิกใช้งานแล้ว ยิ่งไปกว่านั้นฟังก์ชัน input () จะอ่านข้อมูลจากแป้นพิมพ์เป็นสตริงโดยไม่คำนึงว่าจะมีเครื่องหมายอัญประกาศ ('' หรือ "") หรือไม่ก็ตาม
ฟังก์ชั่นการป้อนข้อมูล
input([prompt]) ฟังก์ชันเทียบเท่ากับ raw_input ยกเว้นว่าจะถือว่าอินพุตเป็นนิพจน์ Python ที่ถูกต้องและส่งคืนผลลัพธ์ที่ประเมินให้คุณ
#!/usr/bin/python3
>>> x = input("something:")
something:10
>>> x
'10'
>>> x = input("something:")
something:'10' #entered data treated as string with or without ''
>>> x
"'10'"
การเปิดและปิดไฟล์
จนถึงขณะนี้คุณได้อ่านและเขียนไปยังอินพุตและเอาต์พุตมาตรฐาน ตอนนี้เราจะดูวิธีการใช้ไฟล์ข้อมูลจริง
Python มีฟังก์ชันพื้นฐานและวิธีการที่จำเป็นในการจัดการไฟล์ตามค่าเริ่มต้น คุณสามารถจัดการไฟล์ส่วนใหญ่ได้โดยใช้ไฟล์file วัตถุ.
ฟังก์ชันเปิด
ก่อนจะอ่านหรือเขียนไฟล์ได้คุณต้องเปิดไฟล์โดยใช้ฟังก์ชัน open () ในตัวของ Python ฟังก์ชันนี้จะสร้างไฟล์file ซึ่งจะใช้เรียกวิธีการสนับสนุนอื่น ๆ ที่เกี่ยวข้อง
ไวยากรณ์
file object = open(file_name [, access_mode][, buffering])
นี่คือรายละเอียดพารามิเตอร์ -
file_name - อาร์กิวเมนต์ file_name คือค่าสตริงที่มีชื่อของไฟล์ที่คุณต้องการเข้าถึง
access_mode- access_mode จะกำหนดโหมดที่จะต้องเปิดไฟล์เช่นอ่านเขียนผนวกและอื่น ๆ รายการค่าที่เป็นไปได้ทั้งหมดจะแสดงไว้ด้านล่างในตาราง นี่เป็นพารามิเตอร์ทางเลือกและโหมดการเข้าถึงไฟล์ดีฟอลต์คือ read (r)
buffering- หากตั้งค่าการบัฟเฟอร์เป็น 0 จะไม่มีการบัฟเฟอร์เกิดขึ้น หากค่าการบัฟเฟอร์คือ 1 การบัฟเฟอร์บรรทัดจะดำเนินการในขณะที่เข้าถึงไฟล์ หากคุณระบุค่าบัฟเฟอร์เป็นจำนวนเต็มมากกว่า 1 การดำเนินการบัฟเฟอร์จะดำเนินการกับขนาดบัฟเฟอร์ที่ระบุ หากเป็นค่าลบขนาดบัฟเฟอร์จะเป็นค่าเริ่มต้นของระบบ (ลักษณะการทำงานเริ่มต้น)
นี่คือรายการโหมดต่างๆในการเปิดไฟล์ -
ซีเนียร์ | โหมดและคำอธิบาย |
---|---|
1 | r เปิดไฟล์สำหรับอ่านอย่างเดียว ตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของไฟล์ นี่คือโหมดเริ่มต้น |
2 | rb เปิดไฟล์เพื่ออ่านเฉพาะในรูปแบบไบนารี ตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของไฟล์ นี่คือโหมดเริ่มต้น |
3 | r+ เปิดไฟล์สำหรับทั้งการอ่านและการเขียน ตัวชี้ไฟล์วางไว้ที่จุดเริ่มต้นของไฟล์ |
4 | rb+ เปิดไฟล์สำหรับทั้งการอ่านและการเขียนในรูปแบบไบนารี ตัวชี้ไฟล์วางไว้ที่จุดเริ่มต้นของไฟล์ |
5 | w เปิดไฟล์สำหรับเขียนเท่านั้น เขียนทับไฟล์หากมีไฟล์อยู่ หากไม่มีไฟล์ให้สร้างไฟล์ใหม่สำหรับเขียน |
6 | wb เปิดไฟล์สำหรับเขียนในรูปแบบไบนารีเท่านั้น เขียนทับไฟล์หากมีไฟล์อยู่ หากไม่มีไฟล์ให้สร้างไฟล์ใหม่สำหรับเขียน |
7 | w+ เปิดไฟล์สำหรับทั้งการเขียนและการอ่าน เขียนทับไฟล์ที่มีอยู่ถ้าไฟล์นั้นมีอยู่ หากไม่มีไฟล์ให้สร้างไฟล์ใหม่สำหรับการอ่านและเขียน |
8 | wb+ เปิดไฟล์สำหรับทั้งการเขียนและการอ่านในรูปแบบไบนารี เขียนทับไฟล์ที่มีอยู่ถ้าไฟล์นั้นมีอยู่ หากไม่มีไฟล์ให้สร้างไฟล์ใหม่สำหรับการอ่านและเขียน |
9 | a เปิดไฟล์เพื่อต่อท้าย ตัวชี้ไฟล์จะอยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ นั่นคือไฟล์อยู่ในโหมดผนวก หากไม่มีไฟล์อยู่ระบบจะสร้างไฟล์ใหม่สำหรับการเขียน |
10 | ab เปิดไฟล์สำหรับการต่อท้ายในรูปแบบไบนารี ตัวชี้ไฟล์จะอยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ นั่นคือไฟล์อยู่ในโหมดผนวก หากไม่มีไฟล์อยู่ระบบจะสร้างไฟล์ใหม่สำหรับการเขียน |
11 | a+ เปิดไฟล์สำหรับการต่อท้ายและการอ่าน ตัวชี้ไฟล์จะอยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ ไฟล์จะเปิดขึ้นในโหมดผนวก หากไม่มีไฟล์อยู่ไฟล์จะสร้างไฟล์ใหม่สำหรับการอ่านและเขียน |
12 | ab+ เปิดไฟล์สำหรับทั้งการต่อท้ายและการอ่านในรูปแบบไบนารี ตัวชี้ไฟล์จะอยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ ไฟล์จะเปิดขึ้นในโหมดผนวก หากไม่มีไฟล์อยู่ไฟล์จะสร้างไฟล์ใหม่สำหรับการอ่านและเขียน |
แอตทริบิวต์วัตถุของไฟล์
เมื่อไฟล์ถูกเปิดขึ้นและคุณมีอ็อบเจ็กต์ไฟล์เดียวคุณจะได้รับข้อมูลต่างๆที่เกี่ยวข้องกับไฟล์นั้น
นี่คือรายการของคุณลักษณะทั้งหมดที่เกี่ยวข้องกับวัตถุไฟล์ -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | file.closed ส่งคืนจริงถ้าไฟล์ถูกปิดมิฉะนั้นจะเป็นเท็จ |
2 | file.mode ส่งกลับโหมดการเข้าถึงที่เปิดไฟล์ |
3 | file.name ส่งคืนชื่อของไฟล์ |
Note - ไม่รองรับแอตทริบิวต์ softspace ใน Python 3.x
ตัวอย่าง
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)
print ("Closed or not : ", fo.closed)
print ("Opening mode : ", fo.mode)
fo.close()
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Name of the file: foo.txt
Closed or not : False
Opening mode : wb
วิธีปิด ()
เมธอด close () ของอ็อบเจ็กต์ไฟล์จะล้างข้อมูลที่ไม่ได้เขียนและปิดอ็อบเจ็กต์ไฟล์หลังจากนั้นไม่สามารถทำการเขียนได้อีก
Python ปิดไฟล์โดยอัตโนมัติเมื่อวัตถุอ้างอิงของไฟล์ถูกกำหนดใหม่ให้กับไฟล์อื่น เป็นแนวทางปฏิบัติที่ดีในการใช้เมธอด close () เพื่อปิดไฟล์
ไวยากรณ์
fileObject.close();
ตัวอย่าง
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)
# Close opened file
fo.close()
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Name of the file: foo.txt
การอ่านและเขียนไฟล์
อ็อบเจ็กต์ไฟล์จัดเตรียมชุดวิธีการเข้าถึงเพื่อทำให้ชีวิตของเราง่ายขึ้น เราจะมาดูวิธีการใช้งานread() และ write() วิธีการอ่านและเขียนไฟล์
วิธีการเขียน ()
write()วิธีการเขียนสตริงใด ๆ ลงในไฟล์ที่เปิด สิ่งสำคัญคือต้องสังเกตว่าสตริง Python สามารถมีข้อมูลไบนารีไม่ใช่แค่ข้อความ
วิธี write () ไม่ได้เพิ่มอักขระขึ้นบรรทัดใหม่ ('\ n') ที่ส่วนท้ายของสตริง -
ไวยากรณ์
fileObject.write(string);
ที่นี่พารามิเตอร์ที่ผ่านคือเนื้อหาที่จะเขียนลงในไฟล์ที่เปิด
ตัวอย่าง
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "w")
fo.write( "Python is a great language.\nYeah its great!!\n")
# Close opend file
fo.close()
วิธีการข้างต้นจะสร้างไฟล์ foo.txt และจะเขียนเนื้อหาที่กำหนดในไฟล์นั้นและสุดท้ายก็จะปิดไฟล์นั้น หากคุณจะเปิดไฟล์นี้จะมีเนื้อหาดังต่อไปนี้ -
Python is a great language.
Yeah its great!!
วิธีการอ่าน ()
read()วิธีการอ่านสตริงจากไฟล์ที่เปิดอยู่ สิ่งสำคัญคือต้องสังเกตว่าสตริง Python สามารถมีข้อมูลไบนารีได้ นอกเหนือจากข้อมูลข้อความ
ไวยากรณ์
fileObject.read([count]);
ที่นี่พารามิเตอร์ที่ผ่านคือจำนวนไบต์ที่จะอ่านจากไฟล์ที่เปิด วิธีนี้จะเริ่มอ่านจากจุดเริ่มต้นของไฟล์และหากไม่มีการนับจำนวนก็จะพยายามอ่านให้มากที่สุดอาจจะจนจบไฟล์
ตัวอย่าง
ให้เราใช้ไฟล์foo.txtที่เราสร้างไว้ด้านบน
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)
# Close opened file
fo.close()
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Read String is : Python is
ตำแหน่งไฟล์
วิธีบอก ()บอกตำแหน่งปัจจุบันภายในไฟล์ กล่าวอีกนัยหนึ่งการอ่านหรือเขียนครั้งต่อไปจะเกิดขึ้นที่ไบต์จำนวนมากตั้งแต่จุดเริ่มต้นของไฟล์
วิธีการค้นหา (offset [, from])จะเปลี่ยนตำแหน่งไฟล์ปัจจุบัน offsetอาร์กิวเมนต์ระบุจำนวนไบต์ที่จะย้าย from อาร์กิวเมนต์ระบุตำแหน่งอ้างอิงจากตำแหน่งที่จะย้ายไบต์
ถ้าจากถูกตั้งค่าเป็น 0 จุดเริ่มต้นของไฟล์จะถูกใช้เป็นตำแหน่งอ้างอิง หากตั้งค่าเป็น 1 ตำแหน่งปัจจุบันจะใช้เป็นตำแหน่งอ้างอิง หากตั้งค่าเป็น 2 จุดสิ้นสุดของไฟล์จะถูกใช้เป็นตำแหน่งอ้างอิง
ตัวอย่าง
ให้เราใช้ไฟล์foo.txtที่เราสร้างไว้ด้านบน
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)
# Check current position
position = fo.tell()
print ("Current file position : ", position)
# Reposition pointer at the beginning once again
position = fo.seek(0, 0)
str = fo.read(10)
print ("Again read String is : ", str)
# Close opened file
fo.close()
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Read String is : Python is
Current file position : 10
Again read String is : Python is
การเปลี่ยนชื่อและการลบไฟล์
Python os โมดูลมีวิธีการที่ช่วยคุณดำเนินการประมวลผลไฟล์เช่นการเปลี่ยนชื่อและลบไฟล์
ในการใช้โมดูลนี้คุณต้องนำเข้าก่อนจากนั้นจึงเรียกใช้ฟังก์ชันที่เกี่ยวข้องได้
วิธีการเปลี่ยนชื่อ ()
rename() วิธีการรับสองอาร์กิวเมนต์ชื่อไฟล์ปัจจุบันและชื่อไฟล์ใหม่
ไวยากรณ์
os.rename(current_file_name, new_file_name)
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างการเปลี่ยนชื่อไฟล์ที่มีอยู่test1.txt -
#!/usr/bin/python3
import os
# Rename a file from test1.txt to test2.txt
os.rename( "test1.txt", "test2.txt" )
วิธีลบ ()
คุณสามารถใช้ไฟล์ remove() วิธีการลบไฟล์โดยระบุชื่อของไฟล์ที่จะลบเป็นอาร์กิวเมนต์
ไวยากรณ์
os.remove(file_name)
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างในการลบไฟล์test2.txtที่มีอยู่-
#!/usr/bin/python3
import os
# Delete file test2.txt
os.remove("text2.txt")
ไดเรกทอรีใน Python
ไฟล์ทั้งหมดอยู่ในไดเร็กทอรีต่างๆและ Python ก็ไม่มีปัญหาในการจัดการไฟล์เหล่านี้เช่นกัน os โมดูลมีหลายวิธีที่ช่วยคุณสร้างลบและเปลี่ยนไดเร็กทอรี
วิธี mkdir ()
คุณสามารถใช้ไฟล์ mkdir() วิธีการของ osโมดูลเพื่อสร้างไดเร็กทอรีในไดเร็กทอรีปัจจุบัน คุณต้องระบุอาร์กิวเมนต์ให้กับเมธอดนี้ซึ่งมีชื่อของไดเร็กทอรีที่จะสร้าง
ไวยากรณ์
os.mkdir("newdir")
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างในการสร้างการทดสอบไดเร็กทอรีในไดเร็กทอรีปัจจุบัน -
#!/usr/bin/python3
import os
# Create a directory "test"
os.mkdir("test")
วิธีการ chdir ()
คุณสามารถใช้เมธอดchdir ()เพื่อเปลี่ยนไดเร็กทอรีปัจจุบัน chdir () method รับอาร์กิวเมนต์ซึ่งเป็นชื่อของไดเร็กทอรีที่คุณต้องการสร้างไดเร็กทอรีปัจจุบัน
ไวยากรณ์
os.chdir("newdir")
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างในการเข้าสู่ไดเรกทอรี "/ home / newdir" -
#!/usr/bin/python3
import os
# Changing a directory to "/home/newdir"
os.chdir("/home/newdir")
getcwd () วิธีการ
getcwd() วิธีการแสดงไดเร็กทอรีการทำงานปัจจุบัน
ไวยากรณ์
os.getcwd()
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างเพื่อให้ไดเร็กทอรีปัจจุบัน -
#!/usr/bin/python3
import os
# This would give location of the current directory
os.getcwd()
วิธี rmdir ()
rmdir() วิธีการลบไดเร็กทอรีซึ่งส่งผ่านเป็นอาร์กิวเมนต์ในเมธอด
ก่อนที่จะลบไดเร็กทอรีควรลบเนื้อหาทั้งหมดในนั้นออก
ไวยากรณ์
os.rmdir('dirname')
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างในการลบไดเร็กทอรี "/ tmp / test" จำเป็นต้องระบุชื่อไดเร็กทอรีแบบเต็มมิฉะนั้นจะค้นหาไดเร็กทอรีนั้นในไดเร็กทอรีปัจจุบัน
#!/usr/bin/python3
import os
# This would remove "/tmp/test" directory.
os.rmdir( "/tmp/test" )
วิธีการที่เกี่ยวข้องกับไฟล์และไดเรกทอรี
มีแหล่งข้อมูลสำคัญสามแหล่งซึ่งมีวิธีการยูทิลิตี้ที่หลากหลายเพื่อจัดการและจัดการไฟล์และไดเร็กทอรีบนระบบปฏิบัติการ Windows และ Unix มีดังนี้ -
วิธีการของ File Object
file วัตถุมีฟังก์ชั่นในการจัดการไฟล์
OS Object Methods
สิ่งนี้มีวิธีการประมวลผลไฟล์และไดเร็กทอรี
Python มีคุณสมบัติที่สำคัญมากสองประการในการจัดการข้อผิดพลาดที่ไม่คาดคิดในโปรแกรม Python ของคุณและเพื่อเพิ่มความสามารถในการดีบัก -
Exception Handling- สิ่งนี้จะกล่าวถึงในบทช่วยสอนนี้ นี่คือรายการข้อยกเว้นมาตรฐานที่สามารถใช้ได้ในหลาม - ข้อยกเว้นมาตรฐาน
Assertions- สิ่งนี้จะกล่าวถึงในAssertions ในบทช่วยสอนPython 3
ข้อยกเว้นมาตรฐาน
นี่คือรายการข้อยกเว้นมาตรฐานที่มีอยู่ใน Python -
ซีเนียร์ | ชื่อและคำอธิบายข้อยกเว้น |
---|---|
1 | Exception คลาสพื้นฐานสำหรับข้อยกเว้นทั้งหมด |
2 | StopIteration เพิ่มขึ้นเมื่อเมธอด next () ของตัววนซ้ำไม่ชี้ไปที่วัตถุใด ๆ |
3 | SystemExit เพิ่มขึ้นโดยฟังก์ชัน sys.exit () |
4 | StandardError คลาสพื้นฐานสำหรับข้อยกเว้นในตัวทั้งหมดยกเว้น StopIteration และ SystemExit |
5 | ArithmeticError คลาสฐานสำหรับข้อผิดพลาดทั้งหมดที่เกิดขึ้นสำหรับการคำนวณตัวเลข |
6 | OverflowError เพิ่มขึ้นเมื่อการคำนวณเกินขีด จำกัด สูงสุดสำหรับประเภทตัวเลข |
7 | FloatingPointError เพิ่มขึ้นเมื่อการคำนวณทศนิยมล้มเหลว |
8 | ZeroDivisonError เพิ่มขึ้นเมื่อการหารหรือโมดูโลด้วยศูนย์เกิดขึ้นสำหรับประเภทตัวเลขทั้งหมด |
9 | AssertionError ยกขึ้นในกรณีที่คำสั่ง Assert ล้มเหลว |
10 | AttributeError เพิ่มขึ้นในกรณีที่การอ้างอิงแอตทริบิวต์หรือการมอบหมายล้มเหลว |
11 | EOFError เพิ่มขึ้นเมื่อไม่มีอินพุตจากฟังก์ชัน raw_input () หรืออินพุต () และถึงจุดสิ้นสุดของไฟล์ |
12 | ImportError เพิ่มขึ้นเมื่อคำสั่งนำเข้าล้มเหลว |
13 | KeyboardInterrupt เพิ่มขึ้นเมื่อผู้ใช้ขัดจังหวะการทำงานของโปรแกรมโดยปกติจะกด Ctrl + c |
14 | LookupError คลาสพื้นฐานสำหรับข้อผิดพลาดในการค้นหาทั้งหมด |
15 | IndexError เพิ่มขึ้นเมื่อไม่พบดัชนีในลำดับ |
16 | KeyError เพิ่มขึ้นเมื่อไม่พบคีย์ที่ระบุในพจนานุกรม |
17 | NameError เพิ่มขึ้นเมื่อไม่พบตัวระบุในเนมสเปซโลคัลหรือโกลบอล |
18 | UnboundLocalError เพิ่มขึ้นเมื่อพยายามเข้าถึงตัวแปรโลคัลในฟังก์ชันหรือวิธีการ แต่ไม่มีการกำหนดค่าให้ |
19 | EnvironmentError คลาสพื้นฐานสำหรับข้อยกเว้นทั้งหมดที่เกิดขึ้นนอกสภาพแวดล้อม Python |
20 | IOError เพิ่มขึ้นเมื่อการดำเนินการอินพุต / เอาต์พุตล้มเหลวเช่นคำสั่งพิมพ์หรือฟังก์ชัน open () เมื่อพยายามเปิดไฟล์ที่ไม่มีอยู่ |
21 | OSError เพิ่มขึ้นสำหรับข้อผิดพลาดที่เกี่ยวข้องกับระบบปฏิบัติการ |
22 | SyntaxError เพิ่มขึ้นเมื่อมีข้อผิดพลาดในไวยากรณ์ Python |
23 | IndentationError เพิ่มขึ้นเมื่อไม่ได้ระบุการเยื้องอย่างถูกต้อง |
24 | SystemError เพิ่มขึ้นเมื่อล่ามพบปัญหาภายใน แต่เมื่อพบข้อผิดพลาดนี้ตัวแปล Python ไม่ออก |
25 | SystemExit เพิ่มขึ้นเมื่อล่าม Python เลิกใช้งานโดยใช้ฟังก์ชัน sys.exit () หากไม่ได้รับการจัดการในโค้ดทำให้ล่ามออก |
26 | TypeError เพิ่มขึ้นเมื่อมีการพยายามดำเนินการหรือฟังก์ชันที่ไม่ถูกต้องสำหรับชนิดข้อมูลที่ระบุ |
27 | ValueError เพิ่มขึ้นเมื่อฟังก์ชันในตัวสำหรับชนิดข้อมูลมีประเภทของอาร์กิวเมนต์ที่ถูกต้อง แต่อาร์กิวเมนต์มีการระบุค่าที่ไม่ถูกต้อง |
28 | RuntimeError เพิ่มขึ้นเมื่อข้อผิดพลาดที่สร้างขึ้นไม่อยู่ในหมวดหมู่ใด ๆ |
29 | NotImplementedError เกิดขึ้นเมื่อวิธีนามธรรมที่ต้องนำไปใช้ในคลาสที่สืบทอดมาไม่ได้ถูกนำมาใช้จริง |
การยืนยันใน Python
การยืนยันคือการตรวจสอบความมีสติที่คุณสามารถเปิดหรือปิดเมื่อคุณทดสอบโปรแกรมเสร็จแล้ว
วิธีที่ง่ายที่สุดในการคิดการยืนยันคือการเปรียบเสมือนกับก raise-ifคำสั่ง (หรือเพื่อให้ถูกต้องมากขึ้นคำสั่งเพิ่มถ้าไม่) มีการทดสอบนิพจน์และหากผลลัพธ์เป็นเท็จจะมีการเพิ่มข้อยกเว้น
การยืนยันดำเนินการโดยคำสั่ง assert ซึ่งเป็นคีย์เวิร์ดใหม่ล่าสุดของ Python ซึ่งเปิดตัวในเวอร์ชัน 1.5
โปรแกรมเมอร์มักวางคำยืนยันไว้ที่จุดเริ่มต้นของฟังก์ชันเพื่อตรวจสอบอินพุตที่ถูกต้องและหลังจากเรียกใช้ฟังก์ชันเพื่อตรวจสอบเอาต์พุตที่ถูกต้อง
คำแถลงยืนยัน
เมื่อพบคำสั่งยืนยัน Python จะประเมินนิพจน์ประกอบซึ่งหวังว่าจะเป็นจริง ถ้านิพจน์เป็นเท็จ Python จะเพิ่มข้อยกเว้นAssertionError
ไวยากรณ์สำหรับการยืนยันคือ -
assert Expression[, Arguments]
หากการยืนยันล้มเหลว Python จะใช้ ArgumentExpression เป็นอาร์กิวเมนต์สำหรับ AssertionError ข้อยกเว้น AssertionError สามารถจับและจัดการได้เหมือนกับข้อยกเว้นอื่น ๆ โดยใช้คำสั่ง try-except หากไม่ได้รับการจัดการจะยุติโปรแกรมและสร้างการตรวจสอบย้อนกลับ
ตัวอย่าง
นี่คือฟังก์ชันที่แปลงอุณหภูมิที่กำหนดจากองศาเคลวินเป็นองศาฟาเรนไฮต์ เนื่องจาก 0 ° K เย็นที่สุดเท่าที่จะได้รับฟังก์ชั่นนี้จะป้องกันไม่ให้อุณหภูมิติดลบ -
#!/usr/bin/python3
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
ข้อยกเว้นคืออะไร?
ข้อยกเว้นคือเหตุการณ์ที่เกิดขึ้นระหว่างการทำงานของโปรแกรมที่ขัดขวางขั้นตอนปกติของคำสั่งของโปรแกรม โดยทั่วไปเมื่อสคริปต์ Python พบกับสถานการณ์ที่ไม่สามารถรับมือได้จะทำให้เกิดข้อยกเว้น ข้อยกเว้นคือวัตถุ Python ที่แสดงถึงข้อผิดพลาด
เมื่อสคริปต์ Python เกิดข้อยกเว้นก็ต้องจัดการข้อยกเว้นทันทีมิฉะนั้นจะยุติและออกจากระบบ
การจัดการข้อยกเว้น
หากคุณมีรหัสที่น่าสงสัยซึ่งอาจทำให้เกิดข้อยกเว้นคุณสามารถป้องกันโปรแกรมของคุณได้โดยการวางรหัสที่น่าสงสัยในไฟล์try:บล็อก. หลังจากลอง: บล็อกรวมไฟล์except: ตามด้วยบล็อกของรหัสที่จัดการปัญหาได้อย่างสวยงามที่สุด
ไวยากรณ์
นี่คือไวยากรณ์ง่ายๆของการลอง .... ยกเว้น ... elseบล็อก -
try:
You do your operations here
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
ต่อไปนี้เป็นประเด็นสำคัญบางประการเกี่ยวกับไวยากรณ์ดังกล่าวข้างต้น -
คำสั่ง try ครั้งเดียวสามารถมีได้หลายคำสั่งยกเว้น สิ่งนี้มีประโยชน์เมื่อ try block มีคำสั่งที่อาจทำให้เกิดข้อยกเว้นประเภทต่างๆ
คุณยังสามารถระบุข้อยกเว้นทั่วไปซึ่งจัดการข้อยกเว้นใด ๆ
หลังข้อยกเว้นคุณสามารถรวมอนุประโยคอื่นได้ โค้ดใน else-block จะดำเนินการหากโค้ดใน try: block ไม่ทำให้เกิดข้อยกเว้น
else-block เป็นสถานที่ที่ดีสำหรับโค้ดที่ไม่จำเป็นต้องใช้ try: block's protection
ตัวอย่าง
ตัวอย่างนี้เปิดไฟล์เขียนเนื้อหาในไฟล์และออกมาอย่างสวยงามเพราะไม่มีปัญหาเลย -
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
fh.close()
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Written content in the file successfully
ตัวอย่าง
ตัวอย่างนี้พยายามเปิดไฟล์ที่คุณไม่มีสิทธิ์ในการเขียนดังนั้นจึงมีข้อยกเว้น -
#!/usr/bin/python3
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Error: can't find file or read data
ข้อยกเว้นที่ไม่มีข้อยกเว้น
คุณยังสามารถใช้คำสั่งยกเว้นโดยไม่มีข้อยกเว้นที่กำหนดไว้ดังต่อไปนี้ -
try:
You do your operations here
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
ก. แบบนี้ try-exceptคำสั่งจับข้อยกเว้นทั้งหมดที่เกิดขึ้น การใช้คำสั่ง try-except แบบนี้ไม่ถือเป็นแนวทางปฏิบัติในการเขียนโปรแกรมที่ดีเนื่องจากสามารถจับข้อยกเว้นทั้งหมดได้ แต่ไม่ได้ทำให้โปรแกรมเมอร์ระบุสาเหตุของปัญหาที่อาจเกิดขึ้นได้
ข้อยกเว้นที่มีข้อยกเว้นหลายข้อ
คุณยังสามารถใช้คำสั่งยกเว้นเดียวกันเพื่อจัดการข้อยกเว้นต่างๆได้ดังนี้ -
try:
You do your operations here
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
ข้อพยายามในที่สุด
คุณสามารถใช้ไฟล์ finally: บล็อกพร้อมกับ try:บล็อก. finally:block เป็นที่สำหรับใส่โค้ดที่ต้องรันไม่ว่า try-block จะมีข้อยกเว้นหรือไม่ก็ตาม ไวยากรณ์ของคำสั่ง try-ในที่สุดคือ -
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Note- คุณสามารถระบุข้อยกเว้นหรืออนุประโยคสุดท้าย แต่ไม่ใช่ทั้งสองอย่าง คุณไม่สามารถใช้ประโยคอื่นร่วมกับอนุประโยคสุดท้ายได้
ตัวอย่าง
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print ("Error: can\'t find file or read data")
fh.close()
หากคุณไม่ได้รับอนุญาตให้เปิดไฟล์ในโหมดการเขียนสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Error: can't find file or read data
ตัวอย่างเดียวกันสามารถเขียนได้อย่างหมดจดมากขึ้นดังนี้ -
#!/usr/bin/python3
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print ("Going to close the file")
fh.close()
except IOError:
print ("Error: can\'t find file or read data")
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
Going to close the file
เมื่อเกิดข้อยกเว้นในบล็อกลองการดำเนินการจะส่งผ่านไปยังบล็อกสุดท้ายทันที หลังจากดำเนินการคำสั่งทั้งหมดในบล็อกสุดท้ายข้อยกเว้นจะถูกเพิ่มขึ้นอีกครั้งและจะถูกจัดการในคำสั่งยกเว้นหากมีอยู่ในชั้นถัดไปของคำสั่งtry-except
อาร์กิวเมนต์ของข้อยกเว้น
ข้อยกเว้นสามารถมีอาร์กิวเมนต์ซึ่งเป็นค่าที่ให้ข้อมูลเพิ่มเติมเกี่ยวกับปัญหา เนื้อหาของอาร์กิวเมนต์แตกต่างกันไปตามข้อยกเว้น คุณจับอาร์กิวเมนต์ของข้อยกเว้นโดยการจัดหาตัวแปรในข้อยกเว้นดังต่อไปนี้ -
try:
You do your operations here
......................
except ExceptionType as Argument:
You can print value of Argument here...
หากคุณเขียนโค้ดเพื่อจัดการกับข้อยกเว้นเดียวคุณสามารถมีตัวแปรตามชื่อของข้อยกเว้นในคำสั่งยกเว้น หากคุณกำลังดักจับข้อยกเว้นหลายรายการคุณสามารถมีตัวแปรตามทูเพิลของข้อยกเว้น
ตัวแปรนี้ได้รับค่าของข้อยกเว้นซึ่งส่วนใหญ่ประกอบด้วยสาเหตุของข้อยกเว้น ตัวแปรสามารถรับค่าเดียวหรือหลายค่าในรูปแบบทูเพิล ทูเปิลนี้มักประกอบด้วยสตริงข้อผิดพลาดหมายเลขข้อผิดพลาดและตำแหน่งข้อผิดพลาด
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างสำหรับข้อยกเว้นเดียว -
#!/usr/bin/python3
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError as Argument:
print ("The argument does not contain numbers\n", Argument)
# Call above function here.
temp_convert("xyz")
สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
การเพิ่มข้อยกเว้น
คุณสามารถเพิ่มข้อยกเว้นได้หลายวิธีโดยใช้คำสั่งเพิ่ม ไวยากรณ์ทั่วไปสำหรับraise คำสั่งมีดังนี้ -
ไวยากรณ์
raise [Exception [, args [, traceback]]]
ที่นี่Exceptionคือประเภทของข้อยกเว้น (ตัวอย่างเช่น NameError) และอาร์กิวเมนต์คือค่าสำหรับอาร์กิวเมนต์ข้อยกเว้น อาร์กิวเมนต์เป็นทางเลือก; หากไม่ได้ระบุอาร์กิวเมนต์ข้อยกเว้นคือไม่มี
อาร์กิวเมนต์สุดท้าย traceback ยังเป็นทางเลือก (และแทบไม่ได้ใช้ในทางปฏิบัติ) และถ้ามีอยู่เป็นอ็อบเจ็กต์การย้อนกลับที่ใช้สำหรับข้อยกเว้น
ตัวอย่าง
ข้อยกเว้นอาจเป็นสตริงคลาสหรืออ็อบเจ็กต์ ข้อยกเว้นส่วนใหญ่ที่ Python core เพิ่มขึ้นคือคลาสโดยมีอาร์กิวเมนต์ที่เป็นอินสแตนซ์ของคลาส การกำหนดข้อยกเว้นใหม่ทำได้ค่อนข้างง่ายและทำได้ดังนี้ -
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
Note- เพื่อที่จะจับข้อยกเว้นประโยค "ยกเว้น" ต้องอ้างถึงข้อยกเว้นเดียวกันที่โยนเป็นวัตถุคลาสหรือสตริงธรรมดา ตัวอย่างเช่นในการจับข้อยกเว้นข้างต้นเราต้องเขียนข้อยกเว้นดังนี้ -
try:
Business Logic here...
except Exception as e:
Exception handling here using e.args...
else:
Rest of the code here...
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้การเพิ่มข้อยกเว้น -
#!/usr/bin/python3
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
try:
l = functionName(-10)
print ("level = ",l)
except Exception as e:
print ("error in level argument",e.args[0])
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้
error in level argument -10
ข้อยกเว้นที่ผู้ใช้กำหนด
Python ยังช่วยให้คุณสร้างข้อยกเว้นของคุณเองได้โดยรับคลาสจากข้อยกเว้นในตัวมาตรฐาน
นี่คือตัวอย่างที่เกี่ยวข้องกับRuntimeerror นี่ชั้นจะถูกสร้างขึ้นที่ subclassed จากRuntimeerror สิ่งนี้มีประโยชน์เมื่อคุณต้องการแสดงข้อมูลที่เฉพาะเจาะจงมากขึ้นเมื่อพบข้อยกเว้น
ในบล็อก try ข้อยกเว้นที่ผู้ใช้กำหนดจะถูกยกขึ้นและถูกจับในบล็อกยกเว้น ตัวแปรอีใช้ในการสร้างอินสแตนซ์ของระดับชั้นNetworkerror
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
ดังนั้นเมื่อคุณกำหนดคลาสข้างต้นแล้วคุณสามารถเพิ่มข้อยกเว้นได้ดังนี้ -
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args
Python เป็นภาษาเชิงวัตถุมาตั้งแต่ครั้งที่มีอยู่ ด้วยเหตุนี้การสร้างและใช้คลาสและวัตถุจึงเป็นเรื่องง่าย บทนี้ช่วยให้คุณเป็นผู้เชี่ยวชาญในการใช้การสนับสนุนการเขียนโปรแกรมเชิงวัตถุของ Python
หากคุณไม่เคยมีประสบการณ์เกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ (OO) มาก่อนคุณอาจต้องการปรึกษาหลักสูตรเบื้องต้นเกี่ยวกับเรื่องนี้หรืออย่างน้อยก็มีการสอนเกี่ยวกับเรื่องนี้เพื่อให้คุณเข้าใจแนวคิดพื้นฐาน
อย่างไรก็ตามนี่เป็นบทแนะนำเล็ก ๆ ของ Object-Oriented Programming (OOP) เพื่อช่วยคุณ -
ภาพรวมของคำศัพท์ OOP
Class- ต้นแบบที่ผู้ใช้กำหนดเองสำหรับอ็อบเจ็กต์ที่กำหนดชุดแอ็ตทริบิวต์ที่ระบุลักษณะของอ็อบเจ็กต์ใด ๆ ของคลาส แอตทริบิวต์คือสมาชิกข้อมูล (ตัวแปรคลาสและตัวแปรอินสแตนซ์) และวิธีการเข้าถึงผ่านสัญกรณ์จุด
Class variable- ตัวแปรที่ใช้ร่วมกันโดยอินสแตนซ์ทั้งหมดของคลาส ตัวแปรคลาสถูกกำหนดภายในคลาส แต่อยู่นอกเมธอดของคลาส ตัวแปรคลาสไม่ได้ใช้บ่อยเท่ากับตัวแปรอินสแตนซ์
Data member - ตัวแปรคลาสหรือตัวแปรอินสแตนซ์ที่เก็บข้อมูลที่เกี่ยวข้องกับคลาสและอ็อบเจ็กต์
Function overloading- การกำหนดพฤติกรรมมากกว่าหนึ่งอย่างให้กับฟังก์ชันหนึ่ง ๆ การดำเนินการจะแตกต่างกันไปตามประเภทของวัตถุหรือข้อโต้แย้งที่เกี่ยวข้อง
Instance variable - ตัวแปรที่กำหนดภายในวิธีการและเป็นของอินสแตนซ์ปัจจุบันของคลาสเท่านั้น
Inheritance - การถ่ายโอนคุณสมบัติของคลาสไปยังคลาสอื่น ๆ ที่ได้มาจากคลาส
Instance- วัตถุส่วนบุคคลของคลาสหนึ่ง ๆ วัตถุ obj ที่เป็นของคลาส Circle เช่นอินสแตนซ์ของคลาส Circle
Instantiation - การสร้างอินสแตนซ์ของคลาส
Method - ฟังก์ชันพิเศษที่กำหนดไว้ในนิยามคลาส
Object- อินสแตนซ์เฉพาะของโครงสร้างข้อมูลที่กำหนดโดยคลาส ออบเจ็กต์ประกอบด้วยสมาชิกข้อมูล (ตัวแปรคลาสและตัวแปรอินสแตนซ์) และวิธีการ
Operator overloading - การกำหนดมากกว่าหนึ่งฟังก์ชันให้กับตัวดำเนินการเฉพาะ
การสร้างชั้นเรียน
ระดับคำสั่งสร้างนิยามคลาสใหม่ ชื่อของคลาสจะตามหลังคลาสคีย์เวิร์ดตามด้วยเครื่องหมายจุดคู่ดังนี้ -
class ClassName:
'Optional class documentation string'
class_suite
คลาสนี้มีสตริงเอกสารซึ่งสามารถเข้าถึงได้ทาง ClassName.__doc__.
class_suite ประกอบด้วยคำสั่งส่วนประกอบทั้งหมดที่กำหนดสมาชิกคลาสแอตทริบิวต์ข้อมูลและฟังก์ชัน
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างคลาส Python อย่างง่าย -
class Employee:
'Common base class for all employees'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print ("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print ("Name : ", self.name, ", Salary: ", self.salary)
ตัวแปรempCountเป็นตัวแปรคลาสที่มีการแชร์ค่าระหว่างอินสแตนซ์ทั้งหมดของ a ในคลาสนี้ ซึ่งสามารถเข้าถึงได้ในรูปแบบEmployee.empCountจากในชั้นเรียนหรือนอกชั้นเรียน
วิธีแรก__init __ ()เป็นวิธีพิเศษซึ่งเรียกว่า class constructor หรือ initialization method ที่ Python เรียกเมื่อคุณสร้างอินสแตนซ์ใหม่ของคลาสนี้
คุณประกาศวิธีการเรียนอื่น ๆ เช่นฟังก์ชั่นปกติมีข้อยกเว้นว่าอาร์กิวเมนต์แรกแต่ละวิธีเป็นตัวเอง Python เพิ่มอาร์กิวเมนต์selfในรายการให้คุณ คุณไม่จำเป็นต้องรวมไว้เมื่อคุณเรียกใช้วิธีการ
การสร้างวัตถุอินสแตนซ์
ในการสร้างอินสแตนซ์ของคลาสคุณเรียกใช้คลาสโดยใช้ชื่อคลาสและส่งผ่านอาร์กิวเมนต์ใด ๆ ก็ตามที่เมธอด__init__ยอมรับ
This would create first object of Employee class
emp1 = Employee("Zara", 2000)
This would create second object of Employee class
emp2 = Employee("Manni", 5000)
การเข้าถึงแอตทริบิวต์
คุณเข้าถึงแอตทริบิวต์ของวัตถุโดยใช้ตัวดำเนินการจุดกับวัตถุ ตัวแปรคลาสจะเข้าถึงได้โดยใช้ชื่อคลาสดังนี้ -
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)
ตอนนี้รวบรวมแนวคิดทั้งหมดเข้าด้วยกัน -
#!/usr/bin/python3
class Employee:
'Common base class for all employees'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print ("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print ("Name : ", self.name, ", Salary: ", self.salary)
#This would create first object of Employee class"
emp1 = Employee("Zara", 2000)
#This would create second object of Employee class"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Name : Zara ,Salary: 2000
Name : Manni ,Salary: 5000
Total Employee 2
คุณสามารถเพิ่มลบหรือแก้ไขแอตทริบิวต์ของคลาสและออบเจ็กต์ได้ตลอดเวลา -
emp1.salary = 7000 # Add an 'salary' attribute.
emp1.name = 'xyz' # Modify 'age' attribute.
del emp1.salary # Delete 'age' attribute.
แทนที่จะใช้คำสั่งปกติเพื่อเข้าถึงแอตทริบิวต์คุณสามารถใช้ฟังก์ชันต่อไปนี้ -
getattr(obj, name[, default]) - เพื่อเข้าถึงคุณลักษณะของวัตถุ
hasattr(obj,name) - เพื่อตรวจสอบว่ามีแอตทริบิวต์อยู่หรือไม่
setattr(obj,name,value)- เพื่อตั้งค่าแอตทริบิวต์ หากไม่มีแอตทริบิวต์ก็จะถูกสร้างขึ้น
delattr(obj, name) - เพื่อลบแอตทริบิวต์
hasattr(emp1, 'salary') # Returns true if 'salary' attribute exists
getattr(emp1, 'salary') # Returns value of 'salary' attribute
setattr(emp1, 'salary', 7000) # Set attribute 'salary' at 7000
delattr(emp1, 'salary') # Delete attribute 'salary'
แอตทริบิวต์คลาสในตัว
ทุกคลาส Python จะติดตามแอตทริบิวต์ในตัวและสามารถเข้าถึงได้โดยใช้ dot operator เหมือนกับแอตทริบิวต์อื่น ๆ -
__dict__ - พจนานุกรมที่มีเนมสเปซของชั้นเรียน
__doc__ - สตริงเอกสารประกอบคลาสหรือไม่มีหากไม่ได้กำหนด
__name__ - ชื่อชั้น
__module__- ชื่อโมดูลที่กำหนดคลาสไว้ แอตทริบิวต์นี้คือ "__main__" ในโหมดโต้ตอบ
__bases__ - ทูเปิลว่างเปล่าที่อาจมีคลาสพื้นฐานตามลำดับที่เกิดขึ้นในรายการคลาสพื้นฐาน
สำหรับชั้นเรียนข้างต้นให้เราพยายามเข้าถึงคุณลักษณะเหล่านี้ทั้งหมด -
#!/usr/bin/python3
class Employee:
'Common base class for all employees'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print ("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print ("Name : ", self.name, ", Salary: ", self.salary)
emp1 = Employee("Zara", 2000)
emp2 = Employee("Manni", 5000)
print ("Employee.__doc__:", Employee.__doc__)
print ("Employee.__name__:", Employee.__name__)
print ("Employee.__module__:", Employee.__module__)
print ("Employee.__bases__:", Employee.__bases__)
print ("Employee.__dict__:", Employee.__dict__ )
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Employee.__doc__: Common base class for all employees
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {
'displayCount': <function Employee.displayCount at 0x0160D2B8>,
'__module__': '__main__', '__doc__': 'Common base class for all employees',
'empCount': 2, '__init__':
<function Employee.__init__ at 0x0124F810>, 'displayEmployee':
<function Employee.displayEmployee at 0x0160D300>,
'__weakref__':
<attribute '__weakref__' of 'Employee' objects>, '__dict__':
<attribute '__dict__' of 'Employee' objects>
}
การทำลายวัตถุ (การเก็บขยะ)
Python จะลบอ็อบเจ็กต์ที่ไม่จำเป็น (ประเภทในตัวหรืออินสแตนซ์คลาส) โดยอัตโนมัติเพื่อเพิ่มพื้นที่หน่วยความจำ กระบวนการที่ Python เรียกคืนบล็อกหน่วยความจำที่ไม่ได้ใช้งานอีกต่อไปเป็นระยะเรียกว่า Garbage Collection
ตัวรวบรวมขยะของ Python ทำงานระหว่างการเรียกใช้โปรแกรมและจะถูกทริกเกอร์เมื่อจำนวนการอ้างอิงของวัตถุถึงศูนย์ จำนวนการอ้างอิงของออบเจ็กต์จะเปลี่ยนไปเมื่อจำนวนนามแฝงที่ชี้ไปที่วัตถุนั้นเปลี่ยนไป
จำนวนการอ้างอิงของออบเจ็กต์จะเพิ่มขึ้นเมื่อมีการกำหนดชื่อใหม่หรือวางไว้ในคอนเทนเนอร์ (รายการทูเพิลหรือพจนานุกรม) จำนวนการอ้างอิงของออบเจ็กต์จะลดลงเมื่อลบด้วยdelการอ้างอิงถูกกำหนดใหม่หรือการอ้างอิงอยู่นอกขอบเขต เมื่อจำนวนการอ้างอิงของวัตถุถึงศูนย์ Python จะรวบรวมโดยอัตโนมัติ
a = 40 # Create object <40>
b = a # Increase ref. count of <40>
c = [b] # Increase ref. count of <40>
del a # Decrease ref. count of <40>
b = 100 # Decrease ref. count of <40>
c[0] = -1 # Decrease ref. count of <40>
โดยปกติคุณจะไม่สังเกตเห็นเมื่อตัวรวบรวมขยะทำลายอินสแตนซ์ที่ไม่มีที่มาและเรียกคืนพื้นที่ อย่างไรก็ตามคลาสสามารถใช้เมธอดพิเศษ__del __ ()เรียกว่า destructor ซึ่งถูกเรียกใช้เมื่ออินสแตนซ์กำลังจะถูกทำลาย วิธีนี้อาจใช้เพื่อล้างทรัพยากรที่ไม่ใช่หน่วยความจำที่อินสแตนซ์ใช้
ตัวอย่าง
ตัวทำลาย __del __ () นี้พิมพ์ชื่อคลาสของอินสแตนซ์ที่กำลังจะถูกทำลาย -
#!/usr/bin/python3
class Point:
def __init__( self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print (class_name, "destroyed")
pt1 = Point()
pt2 = pt1
pt3 = pt1
print (id(pt1), id(pt2), id(pt3)) # prints the ids of the obejcts
del pt1
del pt2
del pt3
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
140338326963984 140338326963984 140338326963984
Point destroyed
Note- ตามหลักการแล้วคุณควรกำหนดคลาสของคุณในไฟล์แยกต่างหากจากนั้นคุณควรนำเข้าในไฟล์โปรแกรมหลักของคุณโดยใช้คำสั่งนำเข้า
ในตัวอย่างข้างต้นสมมติว่าคำจำกัดความของคลาส Point อยู่ในpoint.pyและไม่มีโค้ดปฏิบัติการอื่นอยู่ในนั้น
#!/usr/bin/python3
import point
p1 = point.Point()
การสืบทอดคลาส
แทนที่จะเริ่มต้นจากศูนย์คุณสามารถสร้างคลาสโดยรับมาจากคลาสที่มีอยู่แล้วโดยระบุคลาสพาเรนต์ไว้ในวงเล็บหลังชื่อคลาสใหม่
คลาสย่อยจะสืบทอดคุณลักษณะของคลาสแม่และคุณสามารถใช้แอ็ตทริบิวต์เหล่านั้นเหมือนกับว่าถูกกำหนดไว้ในคลาสลูก คลาสย่อยยังสามารถแทนที่สมาชิกข้อมูลและเมธอดจากพาเรนต์
ไวยากรณ์
คลาสที่ได้รับจะประกาศเหมือนกับคลาสแม่ของพวกเขา อย่างไรก็ตามรายการของคลาสพื้นฐานที่จะสืบทอดจะได้รับหลังจากชื่อคลาส -
class SubClassName (ParentClass1[, ParentClass2, ...]):
'Optional class documentation string'
class_suite
ตัวอย่าง
#!/usr/bin/python3
class Parent: # define parent class
parentAttr = 100
def __init__(self):
print ("Calling parent constructor")
def parentMethod(self):
print ('Calling parent method')
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print ("Parent attribute :", Parent.parentAttr)
class Child(Parent): # define child class
def __init__(self):
print ("Calling child constructor")
def childMethod(self):
print ('Calling child method')
c = Child() # instance of child
c.childMethod() # child calls its method
c.parentMethod() # calls parent's method
c.setAttr(200) # again call parent's method
c.getAttr() # again call parent's method
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200
ในทำนองเดียวกันคุณสามารถขับเคลื่อนคลาสจากคลาสพาเรนต์หลาย ๆ คลาสได้ดังนี้ -
class A: # define your class A
.....
class B: # define your calss B
.....
class C(A, B): # subclass of A and B
.....
คุณสามารถใช้ฟังก์ชัน issubclass () หรือ isinstance () เพื่อตรวจสอบความสัมพันธ์ของสองคลาสและอินสแตนซ์
issubclass(sub, sup) ฟังก์ชันบูลีนจะส่งกลับค่า True หากคลาสย่อยที่กำหนด sub เป็นคลาสย่อยของซูเปอร์คลาส sup.
isinstance(obj, Class)ฟังก์ชันบูลีนจะส่งคืนค่า True หากobjเป็นอินสแตนซ์ของคลาสคลาสหรือเป็นอินสแตนซ์ของคลาสย่อยของคลาส
วิธีการลบล้าง
คุณสามารถแทนที่เมธอดคลาสพาเรนต์ได้ตลอดเวลา เหตุผลหนึ่งในการลบล้างเมธอดของผู้ปกครองคือคุณอาจต้องการฟังก์ชันพิเศษหรือแตกต่างกันในคลาสย่อยของคุณ
ตัวอย่าง
#!/usr/bin/python3
class Parent: # define parent class
def myMethod(self):
print ('Calling parent method')
class Child(Parent): # define child class
def myMethod(self):
print ('Calling child method')
c = Child() # instance of child
c.myMethod() # child calls overridden method
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Calling child method
วิธีการโอเวอร์โหลดฐาน
ตารางต่อไปนี้แสดงฟังก์ชันทั่วไปบางอย่างที่คุณสามารถแทนที่ในคลาสของคุณเองได้ -
ซีเนียร์ | วิธีการคำอธิบายและการโทรตัวอย่าง |
---|---|
1 | __init__ ( self [,args...] ) ตัวสร้าง (พร้อมอาร์กิวเมนต์ที่เป็นทางเลือก) ตัวอย่างการโทร: obj = className (args) |
2 | __del__( self ) Destructor ลบวัตถุ โทรตัวอย่าง: del obj |
3 | __repr__( self ) การแสดงสตริงที่ประเมินได้ โทรตัวอย่าง: repr (obj) |
4 | __str__( self ) การแสดงสตริงที่พิมพ์ได้ โทรตัวอย่าง: str (obj) |
5 | __cmp__ ( self, x ) การเปรียบเทียบวัตถุ โทรตัวอย่าง: cmp (obj, x) |
ตัวดำเนินการมากเกินไป
สมมติว่าคุณได้สร้างคลาส Vector เพื่อใช้แทนเวกเตอร์สองมิติ จะเกิดอะไรขึ้นเมื่อคุณใช้ตัวดำเนินการบวกเพื่อเพิ่ม Python ส่วนใหญ่จะตะโกนใส่คุณ
อย่างไรก็ตามคุณสามารถกำหนดเมธอด__add__ในคลาสของคุณเพื่อทำการบวกเวกเตอร์จากนั้นตัวดำเนินการบวกจะทำงานตามความคาดหวัง -
ตัวอย่าง
#!/usr/bin/python3
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Vector(7,8)
การซ่อนข้อมูล
แอตทริบิวต์ของอ็อบเจ็กต์อาจมองเห็นได้หรือไม่ก็ได้นอกนิยามคลาส คุณต้องตั้งชื่อแอตทริบิวต์ด้วยเครื่องหมายขีดล่างสองอันจากนั้นบุคคลภายนอกจะมองไม่เห็นแอตทริบิวต์เหล่านั้นโดยตรง
ตัวอย่าง
#!/usr/bin/python3
class JustCounter:
__secretCount = 0
def count(self):
self.__secretCount += 1
print (self.__secretCount)
counter = JustCounter()
counter.count()
counter.count()
print (counter.__secretCount)
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
1
2
Traceback (most recent call last):
File "test.py", line 12, in <module>
print counter.__secretCount
AttributeError: JustCounter instance has no attribute '__secretCount'
Python ปกป้องสมาชิกเหล่านั้นด้วยการเปลี่ยนชื่อภายในเพื่อรวมชื่อคลาส คุณสามารถเข้าถึงคุณลักษณะเช่นobject._className__attrName หากคุณจะแทนที่บรรทัดสุดท้ายของคุณดังต่อไปนี้แสดงว่าเหมาะสำหรับคุณ -
.........................
print (counter._JustCounter__secretCount)
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
1
2
2
แสดงออกปกติเป็นลำดับพิเศษของตัวละครที่จะช่วยให้คุณจับคู่หรือหาสายอื่น ๆ หรือชุดของสตริงโดยใช้ไวยากรณ์พิเศษที่จัดขึ้นในรูปแบบ นิพจน์ทั่วไปใช้กันอย่างแพร่หลายในโลก UNIX
โมดูล reให้การสนับสนุนอย่างเต็มที่สำหรับนิพจน์ทั่วไปเหมือน Perl ใน Python re โมดูลทำให้เกิดข้อยกเว้น re.error หากเกิดข้อผิดพลาดขณะคอมไพล์หรือใช้นิพจน์ทั่วไป
เราจะกล่าวถึงฟังก์ชันที่สำคัญสองอย่างซึ่งจะใช้ในการจัดการกับนิพจน์ทั่วไป อย่างไรก็ตามสิ่งเล็ก ๆ ก่อน: มีอักขระหลายตัวซึ่งจะมีความหมายพิเศษเมื่อใช้ในนิพจน์ทั่วไป เพื่อหลีกเลี่ยงความสับสนขณะจัดการกับนิพจน์ทั่วไปเราจะใช้ Raw Strings เป็นr'expression'.
รูปแบบพื้นฐานที่ตรงกับอักขระเดี่ยว
ซีเนียร์ | นิพจน์และการจับคู่ |
---|---|
1 | a, X, 9, < อักขระธรรมดาก็ตรงกับตัวเองทุกประการ |
2 | . (a period) จับคู่อักขระเดี่ยวใด ๆ ยกเว้นขึ้นบรรทัดใหม่ '\ n' |
3 | \w จับคู่อักขระ "word": ตัวอักษรหรือตัวเลขหรือขีดล่าง [a-zA-Z0-9_] |
4 | \W จับคู่อักขระที่ไม่ใช่คำใด ๆ |
5 | \b ขอบเขตระหว่างคำและไม่ใช่คำ |
6 | \s จับคู่อักขระช่องว่างเดียว - เว้นวรรค, ขึ้นบรรทัดใหม่, ย้อนกลับ, แท็บ |
7 | \S จับคู่อักขระที่ไม่ใช่ช่องว่างใด ๆ |
8 | \t, \n, \r แท็บขึ้นบรรทัดใหม่ย้อนกลับ |
9 | \d เลขฐานสิบ [0-9] |
10 | ^ ตรงกับจุดเริ่มต้นของสตริง |
11 | $ จับคู่ส่วนท้ายของสตริง |
12 | \ ยับยั้ง "ความพิเศษ" ของตัวละคร |
แฟล็กการคอมไพล์
แฟล็กการคอมไพล์ช่วยให้คุณปรับเปลี่ยนลักษณะบางอย่างของการทำงานของนิพจน์ทั่วไป แฟล็กมีอยู่ในโมดูล re ภายใต้ชื่อสองชื่อชื่อยาวเช่นIGNORECASE และรูปแบบตัวอักษรสั้น ๆ เช่น I
ซีเนียร์ | ธงและความหมาย |
---|---|
1 | ASCII, A ทำให้หลาย Escape เช่น \ w, b, \ s และ \ d จับคู่กับอักขระ ASCII ที่มีคุณสมบัติตามลำดับเท่านั้น |
2 | DOTALL, S จับคู่อักขระใด ๆ รวมทั้งขึ้นบรรทัดใหม่ |
3 | IGNORECASE, I ทำการจับคู่แบบไม่คำนึงถึงขนาดตัวพิมพ์ |
4 | LOCALE, L ทำการจับคู่ที่ทราบภาษา |
5 | MULTILINE, M การจับคู่หลายบรรทัดส่งผลต่อ ^ และ $ |
6 | VERBOSE, X (for ‘extended’) เปิดใช้งาน REs แบบละเอียดซึ่งสามารถจัดระเบียบได้อย่างสะอาดตาและเข้าใจได้ง่ายขึ้น |
ฟังก์ชั่นการจับคู่
ฟังก์ชั่นนี้ความพยายามเพื่อให้ตรงกับ RE รูปแบบเพื่อสตริงที่มีตัวธง
นี่คือไวยากรณ์สำหรับฟังก์ชันนี้ -
re.match(pattern, string, flags = 0)
นี่คือคำอธิบายของพารามิเตอร์ -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | pattern นี่คือนิพจน์ทั่วไปที่จะจับคู่ |
2 | string นี่คือสตริงซึ่งจะถูกค้นหาเพื่อให้ตรงกับรูปแบบที่จุดเริ่มต้นของสตริง |
3 | flags คุณสามารถระบุแฟล็กต่างๆโดยใช้บิตหรือ (|) นี่คือตัวดัดแปลงซึ่งแสดงอยู่ในตารางด้านล่าง |
re.matchผลตอบแทนที่ฟังก์ชั่นmatch คัดค้านความสำเร็จ Noneเมื่อล้มเหลว เราใช้ฟังก์ชันgroup (num)หรือgroups ()ของmatch วัตถุเพื่อให้ได้นิพจน์ที่ตรงกัน
ซีเนียร์ | วิธีจับคู่วัตถุและคำอธิบาย |
---|---|
1 | group(num = 0) วิธีนี้ส่งคืนการจับคู่ทั้งหมด (หรือตัวเลขกลุ่มย่อยเฉพาะ) |
2 | groups() วิธีนี้จะส่งคืนกลุ่มย่อยที่ตรงกันทั้งหมดในทูเปิล (ว่างเปล่าหากไม่มี) |
ตัวอย่าง
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
else:
print ("No match!!")
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
ฟังก์ชันการค้นหา
นี้ฟังก์ชันการค้นหาเกิดขึ้นครั้งแรกของ RE รูปแบบภายในสตริงที่มีตัวธง
นี่คือไวยากรณ์สำหรับฟังก์ชันนี้ -
re.search(pattern, string, flags = 0)
นี่คือคำอธิบายของพารามิเตอร์ -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | pattern นี่คือนิพจน์ทั่วไปที่จะจับคู่ |
2 | string นี่คือสตริงซึ่งจะถูกค้นหาเพื่อจับคู่รูปแบบที่ใดก็ได้ในสตริง |
3 | flags คุณสามารถระบุแฟล็กต่างๆโดยใช้บิตหรือ (|) นี่คือตัวดัดแปลงซึ่งแสดงอยู่ในตารางด้านล่าง |
re.searchผลตอบแทนที่ฟังก์ชั่นmatch คัดค้านความสำเร็จ noneเมื่อล้มเหลว เราใช้ฟังก์ชันgroup (num)หรือgroups ()ของmatch วัตถุเพื่อให้ได้นิพจน์ที่ตรงกัน
ซีเนียร์ | วิธีจับคู่วัตถุและคำอธิบาย |
---|---|
1 | group(num = 0) วิธีนี้ส่งคืนการจับคู่ทั้งหมด (หรือตัวเลขกลุ่มย่อยเฉพาะ) |
2 | groups() วิธีนี้จะส่งคืนกลุ่มย่อยที่ตรงกันทั้งหมดในทูเปิล (ว่างเปล่าหากไม่มี) |
ตัวอย่าง
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print ("Nothing found!!")
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
การจับคู่กับการค้นหา
Python นำเสนอการดำเนินการดั้งเดิมสองแบบที่แตกต่างกันตามนิพจน์ทั่วไป: match ตรวจสอบการจับคู่เฉพาะที่จุดเริ่มต้นของสตริงในขณะที่ search ตรวจสอบการจับคู่ที่ใดก็ได้ในสตริง (นี่คือสิ่งที่ Perl ทำโดยค่าเริ่มต้น)
ตัวอย่าง
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
print ("search --> searchObj.group() : ", searchObj.group())
else:
print ("Nothing found!!")
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
No match!!
search --> matchObj.group() : dogs
ค้นหาและแทนที่
ที่สำคัญที่สุดอย่างหนึ่ง re วิธีการที่ใช้นิพจน์ทั่วไปคือ sub.
ไวยากรณ์
re.sub(pattern, repl, string, max=0)
วิธีการนี้จะแทนที่เกิดขึ้นทั้งหมดของ RE รูปแบบในสตริงกับreplแทนเหตุการณ์ทั้งหมดเว้นแต่สูงสุดที่มีให้ วิธีนี้ส่งคืนสตริงที่แก้ไข
ตัวอย่าง
#!/usr/bin/python3
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)
# Remove anything other than digits
num = re.sub(r'\D', "", phone)
print ("Phone Num : ", num)
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Phone Num : 2004-959-559
Phone Num : 2004959559
การปรับเปลี่ยนนิพจน์ทั่วไป: แฟล็กตัวเลือก
ลิเทอรัลนิพจน์ทั่วไปอาจรวมถึงโมดิฟายเออร์เสริมเพื่อควบคุมลักษณะต่างๆของการจับคู่ ตัวแก้ไขถูกระบุเป็นแฟล็กทางเลือก คุณสามารถให้ตัวดัดแปลงหลายตัวโดยใช้เฉพาะหรือ (|) ดังที่แสดงไว้ก่อนหน้านี้และอาจแสดงโดยหนึ่งในนั้น
ซีเนียร์ | ตัวปรับแต่งและคำอธิบาย |
---|---|
1 | re.I ทำการจับคู่แบบไม่คำนึงถึงขนาดตัวพิมพ์ |
2 | re.L แปลความหมายของคำตามภาษาปัจจุบัน การตีความนี้มีผลต่อกลุ่มตัวอักษร (\ w และ \ W) ตลอดจนพฤติกรรมขอบเขตคำ (\ b และ \ B) |
3 | re.M ทำให้ $ ตรงกับจุดสิ้นสุดของบรรทัด (ไม่ใช่แค่จุดสิ้นสุดของสตริง) และทำให้ ^ ตรงกับจุดเริ่มต้นของบรรทัดใด ๆ (ไม่ใช่แค่จุดเริ่มต้นของสตริง) |
4 | re.S ทำให้จุด (จุด) ตรงกับอักขระใด ๆ รวมทั้งขึ้นบรรทัดใหม่ |
5 | re.U ตีความตัวอักษรตามชุดอักขระ Unicode แฟล็กนี้มีผลต่อพฤติกรรมของ \ w, \ W, \ b, B |
6 | re.X อนุญาตให้ใช้ไวยากรณ์นิพจน์ทั่วไปที่ "น่ารักกว่า" โดยจะไม่สนใจช่องว่าง (ยกเว้นภายในชุด [] หรือเมื่อใช้เครื่องหมายแบ็กสแลชที่หลีกเลี่ยง) และถือว่า # ที่ไม่ใช้ Escape เป็นเครื่องหมายแสดงความคิดเห็น |
รูปแบบนิพจน์ทั่วไป
ยกเว้นอักขระควบคุม (+ ? . * ^ $ ( ) [ ] { } | \)อักขระทั้งหมดตรงกับตัวเอง คุณสามารถหลีกเลี่ยงอักขระควบคุมโดยนำหน้าด้วยแบ็กสแลช
ตารางต่อไปนี้แสดงรายการไวยากรณ์ของนิพจน์ทั่วไปที่มีอยู่ใน Python -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | ^ ตรงกับจุดเริ่มต้นของบรรทัด |
2 | $ ตรงกับจุดสิ้นสุดของบรรทัด |
3 | . จับคู่อักขระเดี่ยวใด ๆ ยกเว้นขึ้นบรรทัดใหม่ การใช้ตัวเลือก m ช่วยให้จับคู่ขึ้นบรรทัดใหม่ได้เช่นกัน |
4 | [...] จับคู่อักขระเดี่ยวใด ๆ ในวงเล็บ |
5 | [^...] จับคู่อักขระเดี่ยวใด ๆ ที่ไม่อยู่ในวงเล็บ |
6 | re* จับคู่ 0 หรือมากกว่าที่เกิดขึ้นของนิพจน์ก่อนหน้า |
7 | re+ จับคู่นิพจน์ก่อนหน้า 1 รายการขึ้นไป |
8 | re? จับคู่นิพจน์ที่อยู่ก่อนหน้า 0 หรือ 1 ครั้ง |
9 | re{ n} ตรงกับจำนวน n ของนิพจน์ที่เกิดขึ้นก่อนหน้า |
10 | re{ n,} จับคู่ n เหตุการณ์หรือมากกว่าที่เกิดขึ้นก่อนหน้า |
11 | re{ n, m} จับคู่อย่างน้อย n และมากที่สุด m ที่เกิดขึ้นของนิพจน์ก่อนหน้า |
12 | a|b จับคู่ a หรือ b |
13 | (re) จัดกลุ่มนิพจน์ทั่วไปและจดจำข้อความที่ตรงกัน |
14 | (?imx) สลับตัวเลือก i, m หรือ x ชั่วคราวภายในนิพจน์ทั่วไป หากอยู่ในวงเล็บจะมีผลเฉพาะพื้นที่นั้นเท่านั้น |
15 | (?-imx) ปิดตัวเลือก i, m หรือ x ชั่วคราวภายในนิพจน์ทั่วไป หากอยู่ในวงเล็บจะมีผลเฉพาะพื้นที่นั้นเท่านั้น |
16 | (?: re) จัดกลุ่มนิพจน์ทั่วไปโดยไม่จำข้อความที่ตรงกัน |
17 | (?imx: re) สลับตัวเลือก i, m หรือ x ชั่วคราวภายในวงเล็บ |
18 | (?-imx: re) ปิดตัวเลือก i, m หรือ x ชั่วคราวภายในวงเล็บ |
19 | (?#...) แสดงความคิดเห็น. |
20 | (?= re) ระบุตำแหน่งโดยใช้รูปแบบ ไม่มีช่วง |
21 | (?! re) ระบุตำแหน่งโดยใช้การปฏิเสธรูปแบบ ไม่มีช่วง |
22 | (?> re) จับคู่รูปแบบอิสระโดยไม่ต้องย้อนรอย |
23 | \w จับคู่อักขระคำ |
24 | \W จับคู่อักขระที่ไม่ใช่คำหลัก |
25 | \s ตรงกับช่องว่าง เทียบเท่ากับ [\ t \ n \ r \ f] |
26 | \S ตรงกับ nonwhitespace |
27 | \d ตรงกับตัวเลข เทียบเท่ากับ [0-9] |
28 | \D ตรงกับ nondigits |
29 | \A ตรงกับจุดเริ่มต้นของสตริง |
30 | \Z ตรงกับจุดสิ้นสุดของสตริง หากมีขึ้นบรรทัดใหม่จะตรงกับก่อนขึ้นบรรทัดใหม่ |
31 | \z ตรงกับจุดสิ้นสุดของสตริง |
32 | \G ตรงกับจุดที่นัดสุดท้ายจบ |
33 | \b จับคู่ขอบเขตของคำเมื่ออยู่นอกวงเล็บ จับคู่ backspace (0x08) เมื่ออยู่ในวงเล็บ |
34 | \B ตรงกับขอบเขตที่ไม่ใช่คำ |
35 | \n, \t, etc. จับคู่การขึ้นบรรทัดใหม่การคืนค่าขนส่งแท็บ ฯลฯ |
36 | \1...\9 ตรงกับนิพจน์ย่อยที่จัดกลุ่มที่ n |
37 | \10 จับคู่นิพจน์ย่อยที่จัดกลุ่มที่ n ถ้าตรงกันแล้ว มิฉะนั้นหมายถึงการแทนค่าฐานแปดของรหัสอักขระ |
ตัวอย่างนิพจน์ทั่วไป
อักขระตามตัวอักษร
ซีเนียร์ | ตัวอย่างและคำอธิบาย |
---|---|
1 | python ตรงกับ "python" |
คลาสตัวละคร
ซีเนียร์ | ตัวอย่างและคำอธิบาย |
---|---|
1 | [Pp]ython จับคู่ "Python" หรือ "python" |
2 | rub[ye] จับคู่ "ทับทิม" หรือ "รูบ" |
3 | [aeiou] จับคู่สระตัวพิมพ์เล็กตัวใดตัวหนึ่ง |
4 | [0-9] จับคู่ตัวเลขใด ๆ เหมือนกับ [0123456789] |
5 | [a-z] จับคู่ตัวอักษร ASCII ตัวพิมพ์เล็ก |
6 | [A-Z] จับคู่ตัวอักษร ASCII ตัวพิมพ์ใหญ่ใด ๆ |
7 | [a-zA-Z0-9] ตรงกับข้อใด ๆ ข้างต้น |
8 | [^aeiou] จับคู่สิ่งอื่นที่ไม่ใช่สระตัวพิมพ์เล็ก |
9 | [^0-9] จับคู่สิ่งอื่นที่ไม่ใช่ตัวเลข |
คลาสตัวละครพิเศษ
ซีเนียร์ | ตัวอย่างและคำอธิบาย |
---|---|
1 | . จับคู่อักขระใด ๆ ยกเว้นขึ้นบรรทัดใหม่ |
2 | \d จับคู่ตัวเลข: [0-9] |
3 | \D จับคู่ nondigit: [^ 0-9] |
4 | \s จับคู่อักขระเว้นวรรค: [\ t \ r \ n \ f] |
5 | \S ตรงกับ nonwhitespace: [^ \ t \ r \ n \ f] |
6 | \w จับคู่อักขระคำเดียว: [A-Za-z0-9_] |
7 | \W จับคู่อักขระที่ไม่ใช่คำหลัก: [^ A-Za-z0-9_] |
กรณีการทำซ้ำ
ซีเนียร์ | ตัวอย่างและคำอธิบาย |
---|---|
1 | ruby? จับคู่ "ถู" หรือ "ทับทิม": y เป็นทางเลือก |
2 | ruby* จับคู่ "ถู" บวก 0 หรือมากกว่า ys |
3 | ruby+ จับคู่ "ถู" บวก 1 ys ขึ้นไป |
4 | \d{3} จับคู่ 3 หลักทุกประการ |
5 | \d{3,} จับคู่ 3 หลักขึ้นไป |
6 | \d{3,5} จับคู่ 3, 4 หรือ 5 หลัก |
การทำซ้ำ Nongreedy
สิ่งนี้ตรงกับจำนวนการทำซ้ำน้อยที่สุด -
ซีเนียร์ | ตัวอย่างและคำอธิบาย |
---|---|
1 | <.*> การทำซ้ำแบบโลภ: ตรงกับ "<python> perl>" |
2 | <.*?> Nongreedy: ตรงกับ "<python>" ใน "<python> perl>" |
การจัดกลุ่มด้วยวงเล็บ
ซีเนียร์ | ตัวอย่างและคำอธิบาย |
---|---|
1 | \D\d+ ไม่มีกลุ่ม: + ซ้ำ \ d |
2 | (\D\d)+ จัดกลุ่ม: + ซ้ำคู่ \ D \ d |
3 | ([Pp]ython(,)?)+ จับคู่ "Python", "Python, python, python" ฯลฯ |
การอ้างอิงย้อนกลับ
สิ่งนี้จะจับคู่กลุ่มที่ตรงกันก่อนหน้านี้อีกครั้ง -
ซีเนียร์ | ตัวอย่างและคำอธิบาย |
---|---|
1 | ([Pp])ython&\1ails จับคู่ python & pails หรือ Python & Pails |
2 | (['"])[^\1]*\1 Single or double-quoted string. \1 matches whatever the 1st group matched. \2 matches whatever the 2nd group matched, etc. |
Alternatives
Sr.No. | Example & Description |
---|---|
1 | python|perl Match "python" or "perl" |
2 | rub(y|le) Match "ruby" or "ruble" |
3 | Python(!+|\?) "Python" followed by one or more ! or one ? |
Anchors
This needs to specify match position.
Sr.No. | Example & Description |
---|---|
1 | ^Python Match "Python" at the start of a string or internal line |
2 | Python$ Match "Python" at the end of a string or line |
3 | \APython Match "Python" at the start of a string |
4 | Python\Z Match "Python" at the end of a string |
5 | \bPython\b Match "Python" at a word boundary |
6 | \brub\B \B is nonword boundary: match "rub" in "rube" and "ruby" but not alone |
7 | Python(?=!) Match "Python", if followed by an exclamation point. |
8 | Python(?!!) Match "Python", if not followed by an exclamation point. |
Special Syntax with Parentheses
Sr.No. | Example & Description |
---|---|
1 | R(?#comment) Matches "R". All the rest is a comment |
2 | R(?i)uby Case-insensitive while matching "uby" |
3 | R(?i:uby) Same as above |
4 | rub(?:y|le)) Group only without creating \1 backreference |
Common Gateway Interface หรือ CGI เป็นชุดของมาตรฐานที่กำหนดวิธีแลกเปลี่ยนข้อมูลระหว่างเว็บเซิร์ฟเวอร์และสคริปต์ที่กำหนดเอง ข้อมูลจำเพาะ CGI ได้รับการดูแลโดย NCSA
CGI คืออะไร?
Common Gateway Interface หรือ CGI เป็นมาตรฐานสำหรับโปรแกรมเกตเวย์ภายนอกเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ข้อมูลเช่นเซิร์ฟเวอร์ HTTP
เวอร์ชันปัจจุบันคือ CGI / 1.1 และ CGI / 1.2 อยู่ระหว่างการดำเนินการ
การท่องเว็บ
เพื่อทำความเข้าใจแนวคิดของ CGI ให้เราดูว่าจะเกิดอะไรขึ้นเมื่อเราคลิกไฮเปอร์ลิงก์เพื่อเรียกดูหน้าเว็บหรือ URL ที่ต้องการ
เบราว์เซอร์ของคุณติดต่อกับเว็บเซิร์ฟเวอร์ HTTP และต้องการ URL เช่นชื่อไฟล์
เว็บเซิร์ฟเวอร์แยกวิเคราะห์ URL และค้นหาชื่อไฟล์ หากพบไฟล์นั้นให้ส่งกลับไปที่เบราว์เซอร์มิฉะนั้นจะส่งข้อความแสดงข้อผิดพลาดที่ระบุว่าคุณร้องขอไฟล์ผิด
เว็บเบราว์เซอร์รับการตอบสนองจากเว็บเซิร์ฟเวอร์และแสดงไฟล์ที่ได้รับหรือข้อความแสดงข้อผิดพลาด
อย่างไรก็ตามเป็นไปได้ที่จะตั้งค่าเซิร์ฟเวอร์ HTTP ดังนั้นเมื่อใดก็ตามที่มีการร้องขอไฟล์ในไดเร็กทอรีหนึ่งไฟล์จะไม่ถูกส่งกลับ แทนที่จะเรียกใช้งานเป็นโปรแกรมและสิ่งใดก็ตามที่เอาต์พุตของโปรแกรมจะถูกส่งกลับเพื่อให้เบราว์เซอร์ของคุณแสดง ฟังก์ชันนี้เรียกว่า Common Gateway Interface หรือ CGI และโปรแกรมเรียกว่าสคริปต์ CGI โปรแกรม CGI เหล่านี้สามารถเป็น Python Script, PERL Script, Shell Script, C หรือ C ++ เป็นต้น
แผนภาพสถาปัตยกรรม CGI
การสนับสนุนและการกำหนดค่าเว็บเซิร์ฟเวอร์
ก่อนที่คุณจะดำเนินการเขียนโปรแกรม CGI ตรวจสอบให้แน่ใจว่าเว็บเซิร์ฟเวอร์ของคุณรองรับ CGI และได้รับการกำหนดค่าให้จัดการกับโปรแกรม CGI โปรแกรม CGI ทั้งหมดที่จะเรียกใช้โดยเซิร์ฟเวอร์ HTTP จะถูกเก็บไว้ในไดเร็กทอรีที่กำหนดค่าไว้ล่วงหน้า ไดเร็กทอรีนี้เรียกว่า CGI Directory และตามแบบแผนจะถูกตั้งชื่อเป็น / var / www / cgi-bin ตามแบบแผนไฟล์ CGI มีนามสกุลเป็น.cgi, แต่คุณสามารถเก็บไฟล์ของคุณด้วยนามสกุล python .py เช่นกัน.
โดยค่าเริ่มต้นเซิร์ฟเวอร์ Linux ถูกกำหนดค่าให้รันเฉพาะสคริปต์ในไดเร็กทอรี cgi-bin ใน / var / www หากคุณต้องการระบุไดเร็กทอรีอื่นเพื่อรันสคริปต์ CGI ของคุณให้คอมเมนต์บรรทัดต่อไปนี้ในไฟล์ httpd.conf -
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/cgi-bin">
Options All
</Directory>
ในที่นี้เราถือว่าคุณมี Web Server และทำงานได้สำเร็จและคุณสามารถรันโปรแกรม CGI อื่น ๆ เช่น Perl หรือ Shell เป็นต้น
โปรแกรม CGI ครั้งแรก
นี่คือลิงค์ที่เรียบง่ายซึ่งจะเชื่อมโยงไปยังสคริปต์ CGI เรียกhello.py ไฟล์นี้ถูกเก็บไว้ในไดเร็กทอรี / var / www / cgi-bin และมีเนื้อหาดังต่อไปนี้ ก่อนเรียกใช้โปรแกรม CGI ของคุณตรวจสอบให้แน่ใจว่าคุณได้เปลี่ยนโหมดของไฟล์โดยใช้ไฟล์chmod 755 hello.py คำสั่ง UNIX เพื่อทำให้ไฟล์เรียกทำงานได้
#!/usr/bin/python
print ("Content-type:text/html\r\n\r\n")
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! This is my first CGI program</h2>')
print ('</body>')
print ('</html>')
Note- บรรทัดแรกในสคริปต์ต้องเป็นพา ธ ไปยังไฟล์ปฏิบัติการ Python ใน Linux ควรเป็น #! / usr / bin / python3
ป้อน URL ต่อไปนี้ในเบราว์เซอร์ของคุณ
http://localhost:8080/cgi-bin/hello.py
สวัสดี Word! นี่เป็นโปรแกรม CGI แรกของฉัน |
สคริปต์ hello.py นี้เป็นสคริปต์ Python แบบธรรมดาซึ่งเขียนผลลัพธ์ในไฟล์ STDOUT นั่นคือหน้าจอ มีคุณลักษณะที่สำคัญและพิเศษอย่างหนึ่งซึ่งเป็นบรรทัดแรกที่จะพิมพ์Content-type:text/html\r\n\r\n. บรรทัดนี้ถูกส่งกลับไปที่เบราว์เซอร์และระบุประเภทเนื้อหาที่จะแสดงบนหน้าจอเบราว์เซอร์
ตอนนี้คุณต้องเข้าใจแนวคิดพื้นฐานของ CGI และคุณสามารถเขียนโปรแกรม CGI ที่ซับซ้อนได้โดยใช้ Python สคริปต์นี้สามารถโต้ตอบกับระบบภายนอกอื่น ๆ เพื่อแลกเปลี่ยนข้อมูลเช่น RDBMS
ส่วนหัว HTTP
เส้น Content-type:text/html\r\n\r\nเป็นส่วนหนึ่งของส่วนหัว HTTP ซึ่งส่งไปยังเบราว์เซอร์เพื่อทำความเข้าใจเนื้อหา ส่วนหัว HTTP ทั้งหมดจะอยู่ในรูปแบบต่อไปนี้ -
HTTP Field Name: Field Content
For Example
Content-type: text/html\r\n\r\n
มีส่วนหัว HTTP ที่สำคัญอื่น ๆ อีกเล็กน้อยซึ่งคุณจะใช้บ่อยในการเขียนโปรแกรม CGI ของคุณ
ซีเนียร์ | ส่วนหัวและคำอธิบาย |
---|---|
1 | Content-type: สตริง MIME ที่กำหนดรูปแบบของไฟล์ที่ส่งคืน ตัวอย่างคือ Content-type: text / html |
2 | Expires: Date วันที่ข้อมูลไม่ถูกต้อง เบราว์เซอร์ใช้เพื่อตัดสินใจว่าจะต้องรีเฟรชหน้าเมื่อใด สตริงวันที่ที่ถูกต้องอยู่ในรูปแบบ 01 มกราคม 1998 12:00:00 GMT |
3 | Location: URL URL ที่ส่งคืนแทน URL ที่ร้องขอ คุณสามารถใช้ฟิลด์นี้เพื่อเปลี่ยนเส้นทางคำขอไปยังไฟล์ใดก็ได้ |
4 | Last-modified: Date วันที่แก้ไขทรัพยากรครั้งล่าสุด |
5 | Content-length: N ความยาวเป็นไบต์ของข้อมูลที่ส่งกลับ เบราว์เซอร์ใช้ค่านี้เพื่อรายงานเวลาดาวน์โหลดโดยประมาณสำหรับไฟล์ |
6 | Set-Cookie: String ตั้งค่าคุกกี้ที่ส่งผ่านสตริง |
ตัวแปรสภาพแวดล้อม CGI
โปรแกรม CGI ทั้งหมดสามารถเข้าถึงตัวแปรสภาพแวดล้อมต่อไปนี้ ตัวแปรเหล่านี้มีบทบาทสำคัญในขณะที่เขียนโปรแกรม CGI
ซีเนียร์ | ชื่อตัวแปรและคำอธิบาย |
---|---|
1 | CONTENT_TYPE ชนิดข้อมูลของเนื้อหา ใช้เมื่อไคลเอ็นต์ส่งเนื้อหาที่แนบไปยังเซิร์ฟเวอร์ ตัวอย่างเช่นการอัปโหลดไฟล์ |
2 | CONTENT_LENGTH ความยาวของข้อมูลแบบสอบถาม มีให้สำหรับคำขอ POST เท่านั้น |
3 | HTTP_COOKIE ส่งคืนชุดคุกกี้ในรูปแบบของคู่คีย์และค่า |
4 | HTTP_USER_AGENT ฟิลด์ User-Agent request-header มีข้อมูลเกี่ยวกับตัวแทนผู้ใช้ที่มาจากคำร้องขอ เป็นชื่อของเว็บเบราว์เซอร์ |
5 | PATH_INFO เส้นทางสำหรับสคริปต์ CGI |
6 | QUERY_STRING ข้อมูลที่เข้ารหัส URL ที่ส่งมาพร้อมกับการร้องขอเมธอด GET |
7 | REMOTE_ADDR ที่อยู่ IP ของโฮสต์ระยะไกลที่ทำการร้องขอ นี่คือการบันทึกที่มีประโยชน์หรือสำหรับการตรวจสอบสิทธิ์ |
8 | REMOTE_HOST ชื่อแบบเต็มของโฮสต์ที่ทำการร้องขอ หากไม่มีข้อมูลนี้คุณสามารถใช้ REMOTE_ADDR เพื่อรับที่อยู่ IR ได้ |
9 | REQUEST_METHOD วิธีการที่ใช้ในการร้องขอ วิธีการทั่วไปคือ GET และ POST |
10 | SCRIPT_FILENAME เส้นทางแบบเต็มไปยังสคริปต์ CGI |
11 | SCRIPT_NAME ชื่อของสคริปต์ CGI |
12 | SERVER_NAME ชื่อโฮสต์หรือที่อยู่ IP ของเซิร์ฟเวอร์ |
13 | SERVER_SOFTWARE ชื่อและเวอร์ชันของซอฟต์แวร์ที่เซิร์ฟเวอร์กำลังเรียกใช้ |
นี่คือโปรแกรม CGI ขนาดเล็กเพื่อแสดงรายการตัวแปร CGI ทั้งหมด คลิกลิงก์นี้เพื่อดูผลลัพธ์รับสภาพแวดล้อม
#!/usr/bin/python
import os
print ("Content-type: text/html\r\n\r\n");
print ("<font size=+1>Environment</font><\br>");
for param in os.environ.keys():
print ("<b>%20s</b>: %s<\br>" % (param, os.environ[param]))
รับและโพสต์วิธีการ
คุณต้องเจอสถานการณ์ต่างๆมากมายเมื่อคุณต้องส่งข้อมูลบางอย่างจากเบราว์เซอร์ของคุณไปยังเว็บเซิร์ฟเวอร์และท้ายที่สุดไปยังโปรแกรม CGI ของคุณ บ่อยที่สุดเบราว์เซอร์ใช้สองวิธีสองวิธีส่งข้อมูลนี้ไปยังเว็บเซิร์ฟเวอร์ วิธีการเหล่านี้คือ GET Method และ POST Method
การส่งผ่านข้อมูลโดยใช้วิธี GET
เมธอด GET จะส่งข้อมูลผู้ใช้ที่เข้ารหัสต่อท้ายคำขอเพจ หน้าและข้อมูลที่เข้ารหัสจะถูกคั่นด้วยเครื่องหมาย? ตัวละครดังนี้ -
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
เมธอด GET เป็นวิธีการเริ่มต้นในการส่งผ่านข้อมูลจากเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์และจะสร้างสตริงแบบยาวที่ปรากฏในกล่อง Location: ของเบราว์เซอร์ของคุณ อย่าใช้เมธอด GET หากคุณมีรหัสผ่านหรือข้อมูลที่ละเอียดอ่อนอื่น ๆ เพื่อส่งผ่านไปยังเซิร์ฟเวอร์ เมธอด GET มีข้อ จำกัด ด้านขนาด: สามารถส่งอักขระได้ 1024 ตัวในสตริงคำขอเท่านั้น เมธอด GET จะส่งข้อมูลโดยใช้ส่วนหัว QUERY_STRING และสามารถเข้าถึงได้ในโปรแกรม CGI ของคุณผ่านตัวแปรสภาพแวดล้อม QUERY_STRING
คุณสามารถส่งผ่านข้อมูลได้เพียงแค่เชื่อมคู่คีย์และค่าร่วมกับ URL ใด ๆ หรือคุณสามารถใช้แท็ก HTML <FORM> เพื่อส่งผ่านข้อมูลโดยใช้เมธอด GET
ตัวอย่าง URL แบบง่าย: รับวิธีการ
นี่คือ URL ง่ายๆซึ่งส่งผ่านค่าสองค่าไปยังโปรแกรม hello_get.py โดยใช้เมธอด GET
/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALIด้านล่างนี้คือ hello_get.pyสคริปต์เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์ เรากำลังจะใช้cgi โมดูลซึ่งทำให้ง่ายต่อการเข้าถึงข้อมูลที่ส่งผ่าน -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print ("Content-type:text/html\r\n\r\n")
print ("<html>")
print ("<head>")
print ("<title>Hello - Second CGI Program</title>")
print ("</head>")
print ("<body>")
print ("<h2>Hello %s %s</h2>" % (first_name, last_name))
print ("</body>")
print ("</html>")
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
สวัสดี ZARA ALI |
ตัวอย่างแบบฟอร์มอย่างง่าย: GET Method
ตัวอย่างนี้ส่งผ่านค่าสองค่าโดยใช้รูปแบบ HTML และปุ่มส่ง เราใช้สคริปต์ CGI เดียวกัน hello_get.py เพื่อจัดการอินพุตนี้
<form action = "/cgi-bin/hello_get.py" method = "get">
First Name: <input type = "text" name = "first_name"> <br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
นี่คือผลลัพธ์จริงของแบบฟอร์มด้านบนคุณป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่งเพื่อดูผลลัพธ์
การส่งข้อมูลโดยใช้วิธี POST
วิธีการส่งข้อมูลไปยังโปรแกรม CGI ที่น่าเชื่อถือกว่าโดยทั่วไปคือวิธีการโพสต์ ข้อมูลนี้จะบรรจุข้อมูลในลักษณะเดียวกับเมธอด GET แต่แทนที่จะส่งเป็นสตริงข้อความหลังจาก a? ใน URL จะส่งเป็นข้อความแยกต่างหาก ข้อความนี้มาในสคริปต์ CGI ในรูปแบบของอินพุตมาตรฐาน
ด้านล่างนี้คือสคริปต์ hello_get.py เดียวกับที่จัดการ GET และวิธีการ POST
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"
ให้เราใช้ตัวอย่างเดียวกับด้านบนอีกครั้งซึ่งส่งผ่านค่าสองค่าโดยใช้ HTML FORM และปุ่มส่ง เราใช้สคริปต์ CGI เดียวกัน hello_get.py เพื่อจัดการอินพุตนี้
<form action = "/cgi-bin/hello_get.py" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
นี่คือผลลัพธ์จริงของแบบฟอร์มด้านบน คุณป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่งเพื่อดูผลลัพธ์
การส่งข้อมูลช่องทำเครื่องหมายไปยังโปรแกรม CGI
ช่องทำเครื่องหมายถูกใช้เมื่อจำเป็นต้องเลือกมากกว่าหนึ่งตัวเลือก
นี่คือตัวอย่างโค้ด HTML สำหรับฟอร์มที่มีช่องทำเครื่องหมายสองช่อง -
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on" /> Maths
<input type = "checkbox" name = "physics" value = "on" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ด้านล่างนี้คือสคริปต์ checkbox.cgi เพื่อจัดการอินพุตที่เว็บเบราว์เซอร์กำหนดสำหรับปุ่มช่องทำเครื่องหมาย
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('maths'):
math_flag = "ON"
else:
math_flag = "OFF"
if form.getvalue('physics'):
physics_flag = "ON"
else:
physics_flag = "OFF"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"
การส่งผ่านข้อมูลปุ่มตัวเลือกไปยังโปรแกรม CGI
ปุ่มวิทยุจะใช้เมื่อต้องเลือกเพียงตัวเลือกเดียว
นี่คือตัวอย่างโค้ด HTML สำหรับแบบฟอร์มที่มีปุ่มตัวเลือกสองปุ่ม -
<form action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank">
<input type = "radio" name = "subject" value = "maths" /> Maths
<input type = "radio" name = "subject" value = "physics" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ด้านล่างนี้คือสคริปต์ radiobutton.py เพื่อจัดการอินพุตที่เว็บเบราว์เซอร์กำหนดสำหรับปุ่มตัวเลือก -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('subject'):
subject = form.getvalue('subject')
else:
subject = "Not set"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
การส่งผ่านข้อมูลพื้นที่ข้อความไปยังโปรแกรม CGI
องค์ประกอบ TEXTAREA ถูกใช้เมื่อต้องส่งข้อความหลายบรรทัดไปยังโปรแกรม CGI
นี่คือตัวอย่างโค้ด HTML สำหรับแบบฟอร์มที่มีกล่อง TEXTAREA -
<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank">
<textarea name = "textcontent" cols = "40" rows = "4">
Type your text here...
</textarea>
<input type = "submit" value = "Submit" />
</form>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ด้านล่างนี้เป็นสคริปต์ textarea.cgi เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์ -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('textcontent'):
text_content = form.getvalue('textcontent')
else:
text_content = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"
การส่งผ่านข้อมูลแบบหล่นลงไปยังโปรแกรม CGI
Drop Down Box ใช้เมื่อเรามีตัวเลือกมากมาย แต่จะเลือกเพียงหนึ่งหรือสองตัวเท่านั้น
นี่คือตัวอย่างโค้ด HTML สำหรับแบบฟอร์มที่มีช่องแบบเลื่อนลง -
<form action = "/cgi-bin/dropdown.py" method = "post" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit"/>
</form>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ด้านล่างนี้คือสคริปต์ dropdown.py เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('dropdown'):
subject = form.getvalue('dropdown')
else:
subject = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
การใช้คุกกี้ใน CGI
โปรโตคอล HTTP เป็นโปรโตคอลไร้สัญชาติ สำหรับเว็บไซต์เชิงพาณิชย์จำเป็นต้องดูแลรักษาข้อมูลเซสชันระหว่างหน้าต่างๆ ตัวอย่างเช่นการลงทะเบียนผู้ใช้หนึ่งคนจะสิ้นสุดลงหลังจากเสร็จสิ้นหลายหน้า จะรักษาข้อมูลเซสชันของผู้ใช้ในทุกหน้าเว็บได้อย่างไร?
ในหลาย ๆ สถานการณ์การใช้คุกกี้เป็นวิธีที่มีประสิทธิภาพที่สุดในการจดจำและติดตามการตั้งค่าการซื้อค่าคอมมิชชั่นและข้อมูลอื่น ๆ ที่จำเป็นสำหรับประสบการณ์ของผู้เยี่ยมชมหรือสถิติไซต์ที่ดีขึ้น
มันทำงานอย่างไร?
เซิร์ฟเวอร์ของคุณส่งข้อมูลบางส่วนไปยังเบราว์เซอร์ของผู้เยี่ยมชมในรูปแบบของคุกกี้ เบราว์เซอร์อาจยอมรับคุกกี้ หากเป็นเช่นนั้นระบบจะจัดเก็บเป็นบันทึกข้อความธรรมดาในฮาร์ดไดรฟ์ของผู้เยี่ยมชม ตอนนี้เมื่อผู้เยี่ยมชมเข้ามาที่หน้าอื่นในไซต์ของคุณคุกกี้จะพร้อมสำหรับการเรียกคืน เมื่อดึงข้อมูลเซิร์ฟเวอร์ของคุณจะรู้ / จำสิ่งที่เก็บไว้
คุกกี้คือบันทึกข้อมูลข้อความธรรมดาของฟิลด์ความยาวตัวแปร 5 ช่อง -
Expires- วันที่คุกกี้จะหมดอายุ หากว่างเปล่าคุกกี้จะหมดอายุเมื่อผู้เยี่ยมชมออกจากเบราว์เซอร์
Domain - ชื่อโดเมนของไซต์ของคุณ
Path- เส้นทางไปยังไดเรกทอรีหรือหน้าเว็บที่ตั้งค่าคุกกี้ ซึ่งอาจว่างเปล่าหากคุณต้องการดึงคุกกี้จากไดเร็กทอรีหรือเพจใด ๆ
Secure- หากช่องนี้มีคำว่า "ปลอดภัย" คุกกี้จะสามารถเรียกค้นได้ด้วยเซิร์ฟเวอร์ที่ปลอดภัยเท่านั้น หากฟิลด์นี้ว่างแสดงว่าไม่มีข้อ จำกัด ดังกล่าว
Name=Value - คุกกี้ถูกตั้งค่าและเรียกดูในรูปแบบของคู่คีย์และค่า
การตั้งค่าคุกกี้
การส่งคุกกี้ไปยังเบราว์เซอร์นั้นง่ายมาก คุกกี้เหล่านี้จะถูกส่งไปพร้อมกับ HTTP Header ก่อนไปยังฟิลด์ Content-type สมมติว่าคุณต้องการตั้งค่า UserID และรหัสผ่านเป็นคุกกี้ การตั้งค่าคุกกี้ทำได้ดังนี้ -
#!/usr/bin/python
print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT;\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....
จากตัวอย่างนี้คุณต้องเข้าใจวิธีตั้งค่าคุกกี้ เราใช้Set-Cookie HTTP header เพื่อตั้งค่าคุกกี้
เป็นทางเลือกในการตั้งค่าแอตทริบิวต์คุกกี้เช่น Expires, Domain และ Path เป็นที่น่าสังเกตว่าคุกกี้ถูกตั้งค่าก่อนที่จะส่งสายเวทย์มนตร์"Content-type:text/html\r\n\r\n.
การดึงคุกกี้
มันง่ายมากที่จะดึงคุกกี้ชุดทั้งหมด คุกกี้จะถูกเก็บไว้ในตัวแปรสภาพแวดล้อม CGI HTTP_COOKIE และจะมีรูปแบบต่อไปนี้ -
key1 = value1;key2 = value2;key3 = value3....
นี่คือตัวอย่างวิธีการดึงข้อมูลคุกกี้
#!/usr/bin/python
# Import modules for CGI handling
from os import environ
import cgi, cgitb
if environ.has_key('HTTP_COOKIE'):
for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
(key, value ) = split(cookie, '=');
if key == "UserID":
user_id = value
if key == "Password":
password = value
print "User ID = %s" % user_id
print "Password = %s" % password
สิ่งนี้ก่อให้เกิดผลลัพธ์ต่อไปนี้สำหรับคุกกี้ที่กำหนดโดยสคริปต์ด้านบน -
User ID = XYZ
Password = XYZ123
ตัวอย่างการอัปโหลดไฟล์
ในการอัปโหลดไฟล์รูปแบบ HTML ต้องมีแอตทริบิวต์ enctype ตั้งค่าเป็น multipart/form-data. แท็กอินพุตที่มีประเภทไฟล์จะสร้างปุ่ม "เรียกดู"
<html>
<body>
<form enctype = "multipart/form-data"
action = "save_file.py" method = "post">
<p>File: <input type = "file" name = "filename" /></p>
<p><input type = "submit" value = "Upload" /></p>
</form>
</body>
</html>
ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้ -
ตัวอย่างด้านบนถูกปิดใช้งานโดยเจตนาเพื่อบันทึกผู้ที่อัปโหลดไฟล์บนเซิร์ฟเวอร์ของเรา แต่คุณสามารถลองใช้โค้ดด้านบนกับเซิร์ฟเวอร์ของคุณได้
นี่คือสคริปต์ save_file.py เพื่อจัดการการอัปโหลดไฟล์ -
#!/usr/bin/python
import cgi, os
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
# Get filename here.
fileitem = form['filename']
# Test if the file was uploaded
if fileitem.filename:
# strip leading path from file name to avoid
# directory traversal attacks
fn = os.path.basename(fileitem.filename)
open('/tmp/' + fn, 'wb').write(fileitem.file.read())
message = 'The file "' + fn + '" was uploaded successfully'
else:
message = 'No file was uploaded'
print """\
Content-Type: text/html\n
<html>
<body>
<p>%s</p>
</body>
</html>
""" % (message,)
หากคุณเรียกใช้สคริปต์ข้างต้นบน Unix / Linux คุณต้องดูแลการเปลี่ยนตัวคั่นไฟล์ดังต่อไปนี้มิฉะนั้นบนเครื่อง windows ของคุณเหนือคำสั่ง open () ควรทำงานได้ดี
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
วิธีเพิ่มกล่องโต้ตอบ "ดาวน์โหลดไฟล์"
บางครั้งคุณต้องการให้ตัวเลือกที่ผู้ใช้สามารถคลิกลิงก์และจะปรากฏกล่องโต้ตอบ "ดาวน์โหลดไฟล์" ให้กับผู้ใช้แทนที่จะแสดงเนื้อหาจริง นี่เป็นเรื่องง่ายมากและสามารถทำได้ผ่านส่วนหัว HTTP ส่วนหัว HTTP นี้แตกต่างจากส่วนหัวที่กล่าวถึงในส่วนก่อนหน้า
ตัวอย่างเช่นหากคุณต้องการสร้างไฟล์ FileName ดาวน์โหลดไฟล์ได้จากลิงค์ที่กำหนดจากนั้นไวยากรณ์จะเป็นดังนี้ -
#!/usr/bin/python
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go here.
fo = open("foo.txt", "rb")
str = fo.read();
print str
# Close opend file
fo.close()
หวังว่าคุณจะสนุกกับบทช่วยสอนนี้ ถ้าใช่โปรดส่งข้อเสนอแนะของคุณมาที่: ติดต่อเรา
มาตรฐาน Python สำหรับอินเทอร์เฟซฐานข้อมูลคือ Python DB-API อินเทอร์เฟซฐานข้อมูล Python ส่วนใหญ่เป็นไปตามมาตรฐานนี้
คุณสามารถเลือกฐานข้อมูลที่เหมาะสมสำหรับแอปพลิเคชันของคุณ Python Database API รองรับเซิร์ฟเวอร์ฐานข้อมูลที่หลากหลายเช่น -
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
นี่คือรายการสินค้าจากอินเตอร์เฟซฐานข้อมูลหลาม - งูหลามการเชื่อมต่อฐานข้อมูลและ API คุณต้องดาวน์โหลดโมดูล DB API แยกต่างหากสำหรับแต่ละฐานข้อมูลที่คุณต้องการเข้าถึง ตัวอย่างเช่นหากคุณต้องการเข้าถึงฐานข้อมูล Oracle และฐานข้อมูล MySQL คุณต้องดาวน์โหลดทั้งโมดูลฐานข้อมูล Oracle และ MySQL
DB API มีมาตรฐานขั้นต่ำสำหรับการทำงานกับฐานข้อมูลโดยใช้โครงสร้าง Python และไวยากรณ์ทุกที่ที่ทำได้ API นี้มีดังต่อไปนี้ -
- การนำเข้าโมดูล API
- รับการเชื่อมต่อกับฐานข้อมูล
- การออกคำสั่ง SQL และกระบวนงานที่เก็บไว้
- กำลังปิดการเชื่อมต่อ
Python มีการรองรับ SQLite ในตัว ในส่วนนี้เราจะเรียนรู้แนวคิดทั้งหมดโดยใช้ MySQL โมดูล MySQLdb ซึ่งเป็นอินเทอร์เฟซยอดนิยมกับ MySQL ไม่สามารถทำงานร่วมกับ Python 3 ได้เราจะใช้โมดูลPyMySQLแทน
PyMySQL คืออะไร?
PyMySQL เป็นอินเทอร์เฟซสำหรับเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูล MySQL จาก Python ใช้ Python Database API v2.0 และมีไลบรารีไคลเอนต์ Pure-Python MySQL เป้าหมายของ PyMySQL คือการแทนที่ MySQLdb แบบดรอปอิน
ฉันจะติดตั้ง PyMySQL ได้อย่างไร
ก่อนดำเนินการต่อคุณต้องแน่ใจว่าคุณได้ติดตั้ง PyMySQL บนเครื่องของคุณแล้ว เพียงพิมพ์สิ่งต่อไปนี้ในสคริปต์ Python ของคุณและดำเนินการ -
#!/usr/bin/python3
import pymysql
หากให้ผลลัพธ์ดังต่อไปนี้แสดงว่าไม่ได้ติดตั้งโมดูล MySQLdb -
Traceback (most recent call last):
File "test.py", line 3, in <module>
Import pymysql
ImportError: No module named pymysql
รุ่นล่าสุดที่เสถียรมีอยู่ใน PyPI และสามารถติดตั้งด้วย pip -
pip install pymysql
อีกทางเลือกหนึ่ง (เช่นหากไม่มี pip) สามารถดาวน์โหลด tarball ได้จากGitHubและติดตั้งด้วย Setuptools ดังนี้ -
$ # X.X is the desired pymysql version (e.g. 0.5 or 0.6).
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz $ cd PyMySQL*
$ python setup.py install $ # The folder PyMySQL* can be safely removed now.
Note - ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ root ในการติดตั้งโมดูลด้านบน
การเชื่อมต่อฐานข้อมูล
ก่อนเชื่อมต่อกับฐานข้อมูล MySQL โปรดตรวจสอบประเด็นต่อไปนี้ -
คุณได้สร้างฐานข้อมูล TESTDB
คุณได้สร้างตาราง EMPLOYEE ใน TESTDB
ตารางนี้มีฟิลด์ FIRST_NAME, LAST_NAME, AGE, SEX และ INCOME
ID ผู้ใช้ "testuser" และรหัสผ่าน "test123" ถูกตั้งค่าให้เข้าถึง TESTDB
โมดูล Python PyMySQL ได้รับการติดตั้งอย่างถูกต้องบนเครื่องของคุณ
คุณได้อ่านบทช่วยสอน MySQL เพื่อทำความเข้าใจเกี่ยวกับ MySQL Basics
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างการเชื่อมต่อกับฐานข้อมูล MySQL "TESTDB" -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")
# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print ("Database version : %s " % data)
# disconnect from server
db.close()
ในขณะที่รันสคริปต์นี้จะสร้างผลลัพธ์ต่อไปนี้
Database version : 5.5.20-log
หากสร้างการเชื่อมต่อกับแหล่งข้อมูลแล้ว Connection Object จะถูกส่งคืนและบันทึกลงใน db สำหรับการใช้งานต่อไปมิฉะนั้น dbถูกตั้งค่าเป็นไม่มี ต่อไป,db วัตถุถูกใช้เพื่อสร้างไฟล์ cursorซึ่งจะใช้ในการดำเนินการสืบค้น SQL สุดท้ายก่อนที่จะออกมาต้องแน่ใจว่าการเชื่อมต่อฐานข้อมูลถูกปิดและปล่อยทรัพยากร
การสร้างตารางฐานข้อมูล
เมื่อสร้างการเชื่อมต่อฐานข้อมูลแล้วเราก็พร้อมที่จะสร้างตารางหรือบันทึกลงในตารางฐานข้อมูลโดยใช้ execute วิธีการของเคอร์เซอร์ที่สร้างขึ้น
ตัวอย่าง
ให้เราสร้างตารางฐานข้อมูลพนักงาน -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# disconnect from server
db.close()
การทำงานของ INSERT
จำเป็นต้องใช้ INSERT Operation เมื่อคุณต้องการสร้างระเบียนของคุณลงในตารางฐานข้อมูล
ตัวอย่าง
ตัวอย่างต่อไปนี้เรียกใช้คำสั่งSQL INSERTเพื่อสร้างเรกคอร์ดในตาราง EMPLOYEE -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
ตัวอย่างข้างต้นสามารถเขียนได้ดังนี้เพื่อสร้างแบบสอบถาม SQL แบบไดนามิก -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
ตัวอย่าง
ส่วนรหัสต่อไปนี้เป็นรูปแบบการดำเนินการอื่นที่คุณสามารถส่งผ่านพารามิเตอร์ได้โดยตรง -
..................................
user_id = "test123"
password = "password"
con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................
อ่านการทำงาน
การอ่านการดำเนินการบนฐานข้อมูลหมายถึงการดึงข้อมูลที่เป็นประโยชน์จากฐานข้อมูล
เมื่อสร้างการเชื่อมต่อฐานข้อมูลแล้วคุณก็พร้อมที่จะทำการสืบค้นในฐานข้อมูลนี้ คุณสามารถใช้อย่างใดอย่างหนึ่งfetchone() วิธีการดึงข้อมูลบันทึกเดียวหรือ fetchall() วิธีการดึงค่าหลายค่าจากตารางฐานข้อมูล
fetchone()- ดึงข้อมูลแถวถัดไปของชุดผลการค้นหา ชุดผลลัพธ์คือวัตถุที่ส่งคืนเมื่อวัตถุเคอร์เซอร์ถูกใช้เพื่อสอบถามตาราง
fetchall()- ดึงข้อมูลแถวทั้งหมดในชุดผลลัพธ์ หากมีการแยกแถวบางแถวออกจากชุดผลลัพธ์แล้วแถวนั้นจะดึงข้อมูลแถวที่เหลือจากชุดผลลัพธ์
rowcount - นี่คือแอตทริบิวต์แบบอ่านอย่างเดียวและส่งกลับจำนวนแถวที่ได้รับผลกระทบจากเมธอด execute ()
ตัวอย่าง
ขั้นตอนต่อไปนี้สอบถามบันทึกทั้งหมดจากตารางพนักงานที่มีเงินเดือนมากกว่า 1,000 -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > '%d'" % (1000)
try:
# Execute the SQL command
cursor.execute(sql)
# Fetch all the rows in a list of lists.
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# Now print fetched result
print ("fname = %s,lname = %s,age = %d,sex = %s,income = %d" % \
(fname, lname, age, sex, income ))
except:
print ("Error: unable to fetch data")
# disconnect from server
db.close()
เอาต์พุต
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
fname = Mac, lname = Mohan, age = 20, sex = M, income = 2000
อัปเดตการทำงาน
UPDATE การทำงานบนฐานข้อมูลหมายถึงการอัปเดตระเบียนตั้งแต่หนึ่งรายการขึ้นไปซึ่งมีอยู่แล้วในฐานข้อมูล
ขั้นตอนต่อไปนี้จะอัปเดตระเบียนทั้งหมดที่มี SEX เป็น 'M'. ที่นี่เราเพิ่มอายุของผู้ชายทุกคนขึ้นหนึ่งปี
ตัวอย่าง
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
WHERE SEX = '%c'" % ('M')
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
ลบการดำเนินการ
จำเป็นต้องดำเนินการ DELETE เมื่อคุณต้องการลบบางระเบียนออกจากฐานข้อมูลของคุณ ต่อไปนี้เป็นขั้นตอนในการลบบันทึกทั้งหมดจาก EMPLOYEE ที่ AGE มากกว่า 20 -
ตัวอย่าง
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
การทำธุรกรรม
ธุรกรรมเป็นกลไกที่ทำให้ข้อมูลมีความสอดคล้องกัน ธุรกรรมมีคุณสมบัติสี่ประการดังต่อไปนี้ -
Atomicity - ไม่ว่าธุรกรรมจะเสร็จสมบูรณ์หรือไม่มีอะไรเกิดขึ้นเลย
Consistency - ธุรกรรมต้องเริ่มต้นในสถานะที่สอดคล้องกันและปล่อยให้ระบบอยู่ในสถานะที่สอดคล้องกัน
Isolation - ผลลัพธ์ระดับกลางของธุรกรรมจะไม่ปรากฏนอกธุรกรรมปัจจุบัน
Durability - เมื่อทำธุรกรรมแล้วผลกระทบจะคงอยู่แม้ระบบจะล้มเหลวก็ตาม
Python DB API 2.0 มีสองวิธีในการคอมมิตหรือย้อนกลับธุรกรรม
ตัวอย่าง
คุณรู้วิธีดำเนินธุรกรรมแล้ว นี่คือตัวอย่างที่คล้ายกัน -
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
COMMIT การดำเนินการ
Commit คือการดำเนินการซึ่งให้สัญญาณสีเขียวไปยังฐานข้อมูลเพื่อทำการเปลี่ยนแปลงให้เสร็จสิ้นและหลังจากการดำเนินการนี้จะไม่มีการเปลี่ยนกลับ
นี่คือตัวอย่างง่ายๆในการเรียกไฟล์ commit วิธี.
db.commit()
การทำงานของ ROLLBACK
หากคุณไม่พอใจกับการเปลี่ยนแปลงอย่างน้อยหนึ่งรายการและต้องการเปลี่ยนกลับการเปลี่ยนแปลงเหล่านั้นอย่างสมบูรณ์ให้ใช้ไฟล์ rollback() วิธี.
นี่คือตัวอย่างง่ายๆในการเรียกไฟล์ rollback() วิธี.
db.rollback()
กำลังยกเลิกการเชื่อมต่อฐานข้อมูล
ในการยกเลิกการเชื่อมต่อฐานข้อมูลให้ใช้เมธอด close ()
db.close()
หากการเชื่อมต่อกับฐานข้อมูลถูกปิดโดยผู้ใช้ด้วยเมธอด close () ธุรกรรมที่ค้างอยู่จะถูกย้อนกลับโดย DB อย่างไรก็ตามแทนที่จะขึ้นอยู่กับรายละเอียดการใช้งาน DB ในระดับที่ต่ำกว่าแอปพลิเคชันของคุณจะดีกว่าหากเรียกคอมมิตหรือย้อนกลับอย่างชัดเจน
การจัดการข้อผิดพลาด
มีหลายแหล่งที่มาของข้อผิดพลาด ตัวอย่างบางส่วน ได้แก่ ข้อผิดพลาดทางไวยากรณ์ในคำสั่ง SQL ที่เรียกใช้งานความล้มเหลวในการเชื่อมต่อหรือการเรียกใช้วิธีการดึงข้อมูลสำหรับหมายเลขอ้างอิงคำสั่งที่ยกเลิกไปแล้วหรือเสร็จสิ้นแล้ว
DB API กำหนดข้อผิดพลาดจำนวนหนึ่งที่ต้องมีอยู่ในแต่ละโมดูลฐานข้อมูล ตารางต่อไปนี้แสดงรายการข้อยกเว้นเหล่านี้
ซีเนียร์ | ข้อยกเว้นและคำอธิบาย |
---|---|
1 | Warning ใช้สำหรับปัญหาที่ไม่ร้ายแรง ต้องมีคลาสย่อย StandardError |
2 | Error คลาสพื้นฐานสำหรับข้อผิดพลาด ต้องมีคลาสย่อย StandardError |
3 | InterfaceError ใช้สำหรับข้อผิดพลาดในโมดูลฐานข้อมูลไม่ใช่ตัวฐานข้อมูล ต้องมีข้อผิดพลาดของคลาสย่อย |
4 | DatabaseError ใช้สำหรับข้อผิดพลาดในฐานข้อมูล ต้องมีข้อผิดพลาดของคลาสย่อย |
5 | DataError คลาสย่อยของ DatabaseError ที่อ้างถึงข้อผิดพลาดในข้อมูล |
6 | OperationalError คลาสย่อยของ DatabaseError ที่อ้างถึงข้อผิดพลาดเช่นการสูญเสียการเชื่อมต่อกับฐานข้อมูล โดยทั่วไปข้อผิดพลาดเหล่านี้อยู่นอกการควบคุมของ Python scripter |
7 | IntegrityError คลาสย่อยของ DatabaseError สำหรับสถานการณ์ที่จะทำลายความสมบูรณ์เชิงสัมพันธ์เช่นข้อ จำกัด เฉพาะหรือคีย์ต่างประเทศ |
8 | InternalError คลาสย่อยของ DatabaseError ที่อ้างถึงข้อผิดพลาดภายในโมดูลฐานข้อมูลเช่นเคอร์เซอร์ไม่ทำงานอีกต่อไป |
9 | ProgrammingError คลาสย่อยของ DatabaseError ที่อ้างถึงข้อผิดพลาดเช่นชื่อตารางที่ไม่ถูกต้องและสิ่งอื่น ๆ ที่สามารถตำหนิคุณได้อย่างปลอดภัย |
10 | NotSupportedError คลาสย่อยของ DatabaseError ที่อ้างถึงการพยายามเรียกใช้ฟังก์ชันที่ไม่รองรับ |
สคริปต์ Python ของคุณควรจัดการกับข้อผิดพลาดเหล่านี้ แต่ก่อนที่จะใช้ข้อยกเว้นใด ๆ ข้างต้นตรวจสอบให้แน่ใจว่า MySQLdb ของคุณรองรับข้อยกเว้นนั้น คุณสามารถรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้ได้โดยอ่านข้อกำหนด DB API 2.0
Python ให้การเข้าถึงบริการเครือข่ายสองระดับ ในระดับต่ำคุณสามารถเข้าถึงการสนับสนุนซ็อกเก็ตพื้นฐานในระบบปฏิบัติการพื้นฐานซึ่งช่วยให้คุณใช้งานไคลเอนต์และเซิร์ฟเวอร์สำหรับทั้งโปรโตคอลที่เน้นการเชื่อมต่อและไม่มีการเชื่อมต่อ
Python ยังมีไลบรารีที่ให้การเข้าถึงระดับที่สูงขึ้นไปยังโปรโตคอลเครือข่ายระดับแอปพลิเคชันเฉพาะเช่น FTP, HTTP และอื่น ๆ
บทนี้ให้ความเข้าใจเกี่ยวกับแนวคิดที่มีชื่อเสียงที่สุดในระบบเครือข่าย - การเขียนโปรแกรมซ็อกเก็ต
Sockets คืออะไร?
ซ็อกเก็ตเป็นจุดสิ้นสุดของช่องทางการสื่อสารแบบสองทิศทาง ซ็อกเก็ตอาจสื่อสารภายในกระบวนการระหว่างกระบวนการในเครื่องเดียวกันหรือระหว่างกระบวนการในทวีปต่างๆ
อาจนำซ็อกเก็ตไปใช้กับแชนเนลประเภทต่างๆ: ซ็อกเก็ตโดเมน Unix, TCP, UDP และอื่น ๆ ซ็อกเก็ตห้องสมุดให้เรียนที่เฉพาะเจาะจงสำหรับการจัดการระบบขนส่งทั่วไปเช่นเดียวกับอินเตอร์เฟซสำหรับการจัดการทั่วไปส่วนที่เหลือ
Sockets มีคำศัพท์ของตัวเอง -
ซีเนียร์ | ข้อกำหนดและคำอธิบาย |
---|---|
1 | domain ตระกูลของโปรโตคอลที่ใช้เป็นกลไกการขนส่ง ค่าเหล่านี้เป็นค่าคงที่เช่น AF_INET, PF_INET, PF_UNIX, PF_X25 เป็นต้น |
2 | type ประเภทของการสื่อสารระหว่างปลายทางทั้งสองโดยทั่วไปคือ SOCK_STREAM สำหรับโปรโตคอลที่เน้นการเชื่อมต่อและ SOCK_DGRAM สำหรับโปรโตคอลที่ไม่มีการเชื่อมต่อ |
3 | protocol โดยทั่วไปเป็นศูนย์อาจใช้เพื่อระบุตัวแปรของโปรโตคอลภายในโดเมนและประเภท |
4 | hostname ตัวระบุของอินเทอร์เฟซเครือข่าย -
|
5 | port แต่ละเซิร์ฟเวอร์จะรับฟังไคลเอ็นต์ที่เรียกใช้พอร์ตอย่างน้อยหนึ่งพอร์ต พอร์ตอาจเป็นหมายเลขพอร์ต Fixnum สตริงที่มีหมายเลขพอร์ตหรือชื่อของบริการ |
โมดูลซ็อกเก็ต
ในการสร้างซ็อกเก็ตคุณต้องใช้ฟังก์ชัน socket.socket () ที่มีอยู่ในโมดูลซ็อกเก็ตซึ่งมีไวยากรณ์ทั่วไป -
s = socket.socket (socket_family, socket_type, protocol = 0)
นี่คือคำอธิบายของพารามิเตอร์ -
socket_family - นี่คือ AF_UNIX หรือ AF_INET ตามที่อธิบายไว้ก่อนหน้านี้
socket_type - นี่คือ SOCK_STREAM หรือ SOCK_DGRAM
protocol - โดยปกติจะถูกปล่อยทิ้งไว้โดยเริ่มต้นเป็น 0
เมื่อคุณมีวัตถุซ็อกเก็ตแล้วคุณสามารถใช้ฟังก์ชันที่จำเป็นเพื่อสร้างโปรแกรมไคลเอนต์หรือเซิร์ฟเวอร์ของคุณ ต่อไปนี้เป็นรายการฟังก์ชันที่จำเป็น -
วิธีการซ็อกเก็ตเซิร์ฟเวอร์
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | s.bind() วิธีนี้ผูกแอดเดรส (ชื่อโฮสต์คู่หมายเลขพอร์ต) กับซ็อกเก็ต |
2 | s.listen() วิธีนี้ตั้งค่าและเริ่มตัวฟัง TCP |
3 | s.accept() สิ่งนี้ยอมรับการเชื่อมต่อไคลเอนต์ TCP แบบไม่อดทนรอจนกว่าการเชื่อมต่อจะมาถึง (การบล็อก) |
วิธีการซ็อกเก็ตไคลเอนต์
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | s.connect() วิธีนี้เริ่มการเชื่อมต่อเซิร์ฟเวอร์ TCP อย่างแข็งขัน |
วิธีการทั่วไปของซ็อกเก็ต
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | s.recv() วิธีนี้ได้รับข้อความ TCP |
2 | s.send() วิธีนี้ส่งข้อความ TCP |
3 | s.recvfrom() วิธีนี้ได้รับข้อความ UDP |
4 | s.sendto() วิธีนี้ส่งข้อความ UDP |
5 | s.close() วิธีนี้จะปิดซ็อกเก็ต |
6 | socket.gethostname() ส่งคืนชื่อโฮสต์ |
เซิร์ฟเวอร์ที่เรียบง่าย
ในการเขียนอินเทอร์เน็ตเซิร์ฟเวอร์เราใช้ไฟล์ socketฟังก์ชันที่มีอยู่ในโมดูลซ็อกเก็ตเพื่อสร้างอ็อบเจ็กต์ซ็อกเก็ต จากนั้นอ็อบเจ็กต์ซ็อกเก็ตจะถูกใช้เพื่อเรียกใช้ฟังก์ชันอื่น ๆ เพื่อตั้งค่าเซิร์ฟเวอร์ซ็อกเก็ต
ตอนนี้โทร bind(hostname, port)ฟังก์ชันเพื่อระบุพอร์ตสำหรับบริการของคุณบนโฮสต์ที่กำหนด
จากนั้นเรียกใช้วิธีการยอมรับของวัตถุที่ส่งคืน วิธีนี้รอจนกว่าไคลเอ็นต์จะเชื่อมต่อกับพอร์ตที่คุณระบุจากนั้นส่งคืนอ็อบเจ็กต์การเชื่อมต่อที่แสดงถึงการเชื่อมต่อกับไคลเอ็นต์นั้น
#!/usr/bin/python3 # This is server.py file
import socket
# create a socket object
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# bind to the port
serversocket.bind((host, port))
# queue up to 5 requests
serversocket.listen(5)
while True:
# establish a connection
clientsocket,addr = serversocket.accept()
print("Got a connection from %s" % str(addr))
msg = 'Thank you for connecting'+ "\r\n"
clientsocket.send(msg.encode('ascii'))
clientsocket.close()
ลูกค้าธรรมดา
ให้เราเขียนโปรแกรมไคลเอนต์ที่ง่ายมากซึ่งจะเปิดการเชื่อมต่อกับพอร์ต 12345 ที่กำหนดและโฮสต์ที่กำหนด มันง่ายมากในการสร้างไคลเอนต์ซ็อกเก็ตโดยใช้ฟังก์ชันโมดูลซ็อกเก็ตของ Python
socket.connect(hosname, port )เปิดเชื่อมต่อ TCP ชื่อโฮสต์บนพอร์ต เมื่อคุณเปิดซ็อกเก็ตแล้วคุณสามารถอ่านได้เหมือนกับอ็อบเจ็กต์ IO ใด ๆ เมื่อเสร็จแล้วอย่าลืมปิดเช่นเดียวกับที่คุณปิดไฟล์
ตัวอย่าง
รหัสต่อไปนี้เป็นไคลเอนต์ที่เรียบง่ายมากที่เชื่อมต่อกับโฮสต์และพอร์ตที่กำหนดอ่านข้อมูลที่มีอยู่จากซ็อกเก็ตแล้วออก -
#!/usr/bin/python3 # This is client.py file
import socket
# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# connection to hostname on the port.
s.connect((host, port))
# Receive no more than 1024 bytes
msg = s.recv(1024)
s.close()
print (msg.decode('ascii'))
ตอนนี้เรียกใช้ server.py นี้ในพื้นหลังจากนั้นเรียกใช้ client.py ด้านบนเพื่อดูผลลัพธ์
# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py
เอาต์พุต
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting
โมดูลอินเทอร์เน็ต Python
รายชื่อโมดูลที่สำคัญบางอย่างในการเขียนโปรแกรม Python Network / Internet มีดังต่อไปนี้ -
มาตรการ | ฟังก์ชันทั่วไป | หมายเลขพอร์ต | โมดูล Python |
---|---|---|---|
HTTP | หน้าเว็บ | 80 | HTTplib, urllib, xmlrpclib |
NNTP | ข่าว Usenet | 119 | nntplib |
FTP | การถ่ายโอนไฟล์ | 20 | ftplib, urllib |
SMTP | การส่งอีเมล | 25 | smtplib |
POP3 | กำลังเรียกอีเมล | 110 | ป๊อปลิบ |
IMAP4 | กำลังเรียกอีเมล | 143 | imaplib |
Telnet | บรรทัดคำสั่ง | 23 | เทลเน็ตลิบ |
โกเฟอร์ | การถ่ายโอนเอกสาร | 70 | gopherlib, urllib |
โปรดตรวจสอบไลบรารีทั้งหมดที่กล่าวถึงข้างต้นเพื่อทำงานกับโปรโตคอล FTP, SMTP, POP และ IMAP
อ่านเพิ่มเติม
นี่เป็นการเริ่มต้นอย่างรวดเร็วด้วย Socket Programming มันเป็นเรื่องที่มากมาย ขอแนะนำให้ไปที่ลิงค์ต่อไปนี้เพื่อดูรายละเอียดเพิ่มเติม -
การเขียนโปรแกรมระบบปฏิบัติการยูนิกซ์ซ็อกเก็ต
งูหลามซ็อกเก็ตและห้องสมุดโมดูล
Simple Mail Transfer Protocol (SMTP) เป็นโปรโตคอลที่จัดการการส่งอีเมลและการกำหนดเส้นทางอีเมลระหว่างเมลเซิร์ฟเวอร์
Python ให้ smtplib โมดูลซึ่งกำหนดอ็อบเจ็กต์เซสชันไคลเอ็นต์ SMTP ที่สามารถใช้เพื่อส่งเมลไปยังเครื่องอินเทอร์เน็ตใด ๆ ที่มีดีมอนตัวฟัง SMTP หรือ ESMTP
นี่คือไวยากรณ์ง่ายๆในการสร้างวัตถุ SMTP ซึ่งสามารถใช้ในการส่งอีเมลในภายหลังได้ -
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
นี่คือรายละเอียดของพารามิเตอร์ -
host- นี่คือโฮสต์ที่ใช้เซิร์ฟเวอร์ SMTP ของคุณ คุณสามารถระบุที่อยู่ IP ของโฮสต์หรือชื่อโดเมนเช่น tutorialspoint.com นี่เป็นอาร์กิวเมนต์ที่เป็นทางเลือก
port- หากคุณกำลังจัดเตรียมอาร์กิวเมนต์ของโฮสต์คุณจะต้องระบุพอร์ตที่เซิร์ฟเวอร์ SMTP กำลังรับฟัง โดยปกติพอร์ตนี้จะเป็น 25
local_hostname- หากเซิร์ฟเวอร์ SMTP ของคุณกำลังทำงานบนเครื่องของคุณคุณสามารถระบุตัวเลือกเฉพาะlocalhostได้
วัตถุ SMTP มีวิธีการที่เรียกว่าอินสแตนซ์ sendmailซึ่งโดยปกติจะใช้ในการส่งข้อความทางไปรษณีย์ ต้องใช้สามพารามิเตอร์ -
ส่ง - สตริงกับที่อยู่ของผู้ส่ง
รับ - รายการของสตริงหนึ่งสำหรับผู้รับแต่ละคน
ข้อความ - ข้อความเป็นสตริงที่จัดรูปแบบตามที่ระบุใน RFCs ต่างๆ
ตัวอย่าง
นี่คือวิธีง่ายๆในการส่งอีเมลโดยใช้สคริปต์ Python ลองสักครั้ง -
#!/usr/bin/python3
import smtplib
sender = '[email protected]'
receivers = ['[email protected]']
message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except SMTPException:
print "Error: unable to send email"
ที่นี่คุณได้วางอีเมลพื้นฐานไว้ในข้อความโดยใช้เครื่องหมายคำพูดสามชุดดูแลจัดรูปแบบส่วนหัวให้ถูกต้อง อีเมลต้องการไฟล์From, Toและก Subject ส่วนหัวแยกออกจากเนื้อหาของอีเมลด้วยบรรทัดว่าง
ในการส่งเมลคุณใช้smtpObjเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ SMTP บนเครื่องท้องถิ่น จากนั้นใช้sendmailวิธีพร้อมกับข้อความจากที่อยู่และที่อยู่ปลายทางเป็นพารามิเตอร์ (แม้ว่าจากและไปยังที่อยู่ที่อยู่ใน e-mail ของตัวเองเหล่านี้จะไม่ใช้เสมอเส้นทางอีเมล)
หากคุณไม่ได้ใช้เซิร์ฟเวอร์ SMTP บนเครื่องภายในของคุณคุณสามารถใช้ไคลเอ็นต์smtplibเพื่อสื่อสารกับเซิร์ฟเวอร์ SMTP ระยะไกล เว้นแต่คุณจะใช้บริการเว็บเมล (เช่น gmail หรือ Yahoo! Mail) ผู้ให้บริการอีเมลของคุณจะต้องให้รายละเอียดเซิร์ฟเวอร์อีเมลขาออกที่คุณสามารถให้ได้ดังต่อไปนี้ -
mail = smtplib.SMTP('smtp.gmail.com', 587)
การส่งอีเมล HTML โดยใช้ Python
เมื่อคุณส่งข้อความโดยใช้ Python เนื้อหาทั้งหมดจะถือว่าเป็นข้อความธรรมดา แม้ว่าคุณจะรวมแท็ก HTML ไว้ในข้อความ แต่แท็กนั้นจะแสดงเป็นข้อความธรรมดาและแท็ก HTML จะไม่ได้รับการจัดรูปแบบตามไวยากรณ์ของ HTML อย่างไรก็ตาม Python มีตัวเลือกในการส่งข้อความ HTML เป็นข้อความ HTML จริง
ในขณะส่งข้อความอีเมลคุณสามารถระบุเวอร์ชัน Mime ประเภทเนื้อหาและชุดอักขระเพื่อส่งอีเมล HTML
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างในการส่งเนื้อหา HTML เป็นอีเมล ลองสักครั้ง -
#!/usr/bin/python3
import smtplib
message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except SMTPException:
print "Error: unable to send email"
การส่งไฟล์แนบเป็นอีเมล
ในการส่งอีเมลที่มีเนื้อหาผสมต้องตั้งค่า Content-type ส่วนหัวของ multipart/mixed. จากนั้นสามารถระบุข้อความและส่วนไฟล์แนบได้ภายในboundaries.
ขอบเขตเริ่มต้นด้วยยัติภังค์สองตัวตามด้วยหมายเลขเฉพาะซึ่งไม่สามารถปรากฏในส่วนข้อความของอีเมลได้ ขอบเขตสุดท้ายที่แสดงถึงส่วนสุดท้ายของอีเมลจะต้องลงท้ายด้วยยัติภังค์สองตัว
ไฟล์ที่แนบควรเข้ารหัสด้วยนามสกุล pack("m") ฟังก์ชันที่มีการเข้ารหัสฐาน 64 ก่อนส่ง
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างที่ส่งไฟล์ /tmp/test.txtเป็นไฟล์แนบ ลองสักครั้ง -
#!/usr/bin/python3
import smtplib
import base64
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent) # base64
sender = '[email protected]'
reciever = '[email protected]'
marker = "AUNIQUEMARKER"
body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, reciever, message)
print "Successfully sent email"
except Exception:
print ("Error: unable to send email")
การรันหลายเธรดคล้ายกับการรันโปรแกรมต่างๆพร้อมกัน แต่มีข้อดีดังต่อไปนี้ -
เธรดหลายเธรดภายในกระบวนการใช้พื้นที่ข้อมูลเดียวกันกับเธรดหลักดังนั้นจึงสามารถแชร์ข้อมูลหรือสื่อสารระหว่างกันได้ง่ายกว่าหากเป็นกระบวนการแยกกัน
เธรดบางครั้งเรียกว่ากระบวนการที่มีน้ำหนักเบาและไม่จำเป็นต้องใช้หน่วยความจำเหนือศีรษะมากนัก มีราคาถูกกว่ากระบวนการ
เธรดมีจุดเริ่มต้นลำดับการดำเนินการและข้อสรุป มีตัวชี้คำสั่งที่คอยติดตามว่าในบริบทของมันทำงานอยู่ที่ใด
สามารถจองล่วงหน้า (ถูกขัดจังหวะ)
สามารถพักการทำงานชั่วคราว (หรือที่เรียกว่า sleep) ในขณะที่เธรดอื่นกำลังทำงานอยู่ซึ่งเรียกว่ายอม
เธรดมีสองประเภทที่แตกต่างกัน -
- เคอร์เนลเธรด
- เธรดผู้ใช้
เคอร์เนลเธรดเป็นส่วนหนึ่งของระบบปฏิบัติการในขณะที่เธรดพื้นที่ผู้ใช้ไม่ได้ใช้งานในเคอร์เนล
มีโมดูลสองโมดูลที่รองรับการใช้เธรดใน Python3 -
- _thread
- threading
โมดูลเธรดถูก "เลิกใช้งาน" มาเป็นเวลานานแล้ว ผู้ใช้ควรใช้โมดูลเธรดแทน ดังนั้นใน Python 3 โมดูล "เธรด" จึงไม่สามารถใช้งานได้อีกต่อไป อย่างไรก็ตามได้เปลี่ยนชื่อเป็น "_thread" สำหรับความเข้ากันได้ย้อนหลังใน Python3
เริ่มหัวข้อใหม่
ในการวางไข่เธรดอื่นคุณต้องเรียกใช้วิธีการต่อไปนี้ที่มีอยู่ในโมดูลเธรด -
_thread.start_new_thread ( function, args[, kwargs] )
การเรียกเมธอดนี้ช่วยให้สามารถสร้างเธรดใหม่ทั้งใน Linux และ Windows ได้อย่างรวดเร็วและมีประสิทธิภาพ
ผลตอบแทนที่ได้โทรวิธีทันทีและด้ายเด็กจะเริ่มต้นและฟังก์ชั่นการโทรกับรายการผ่านของargs เมื่อฟังก์ชันคืนค่าเธรดจะสิ้นสุดลง
ในที่นี้argsคือ tuple ของอาร์กิวเมนต์ ใช้ทูเพิลว่างเพื่อเรียกใช้ฟังก์ชันโดยไม่ส่งผ่านอาร์กิวเมนต์ใด ๆ kwargsเป็นพจนานุกรมทางเลือกของอาร์กิวเมนต์คำหลัก
ตัวอย่าง
#!/usr/bin/python3
import _thread
import time
# Define a function for the thread
def print_time( threadName, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print ("%s: %s" % ( threadName, time.ctime(time.time()) ))
# Create two threads as follows
try:
_thread.start_new_thread( print_time, ("Thread-1", 2, ) )
_thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
print ("Error: unable to start thread")
while 1:
pass
เอาต์พุต
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Thread-1: Fri Feb 19 09:41:39 2016
Thread-2: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:43 2016
Thread-2: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:47 2016
Thread-2: Fri Feb 19 09:41:49 2016
Thread-2: Fri Feb 19 09:41:53 2016
โปรแกรมจะวนซ้ำไม่สิ้นสุด คุณจะต้องกด ctrl-c เพื่อหยุด
แม้ว่าจะมีประสิทธิภาพมากสำหรับการทำเกลียวระดับต่ำ แต่โมดูลเธรดมีข้อ จำกัด มากเมื่อเทียบกับโมดูลเธรดรุ่นใหม่
โมดูลเธรด
โมดูลเธรดรุ่นใหม่ที่มาพร้อมกับ Python 2.4 ให้การสนับสนุนเธรดระดับสูงที่มีประสิทธิภาพและมีประสิทธิภาพมากกว่าโมดูลเธรดที่กล่าวถึงในส่วนก่อนหน้านี้
เกลียวโมดูล exposes วิธีการทั้งหมดของด้ายโมดูลและมีวิธีการเพิ่มเติมบางอย่าง -
threading.activeCount() - ส่งคืนจำนวนของวัตถุเธรดที่ใช้งานอยู่
threading.currentThread() - ส่งคืนจำนวนของวัตถุเธรดในการควบคุมเธรดของผู้โทร
threading.enumerate() - ส่งคืนรายการของวัตถุเธรดทั้งหมดที่กำลังใช้งานอยู่
นอกเหนือจากวิธีการแล้วโมดูลเธรดยังมีคลาสเธรดที่ใช้เธรด วิธีการที่จัดเตรียมโดยคลาสเธรดมีดังนี้ -
run() - วิธีการ run () เป็นจุดเริ่มต้นสำหรับเธรด
start() - เมธอด start () เริ่มต้นเธรดโดยเรียกใช้เมธอด run
join([time]) - การเข้าร่วม () รอให้เธรดสิ้นสุดลง
isAlive() - วิธี isAlive () ตรวจสอบว่าเธรดยังคงทำงานอยู่หรือไม่
getName() - เมธอด getName () ส่งคืนชื่อของเธรด
setName() - เมธอด setName () ตั้งชื่อของเธรด
การสร้างเธรดโดยใช้โมดูลเธรด
ในการใช้เธรดใหม่โดยใช้โมดูลเธรดคุณต้องทำสิ่งต่อไปนี้ -
กำหนดประเภทรองใหม่ของกระทู้ชั้นเรียน
แทนที่เมธอด __init __ (self [, args])เพื่อเพิ่มอาร์กิวเมนต์เพิ่มเติม
จากนั้นแทนที่เมธอด run (self [, args]) เพื่อใช้สิ่งที่เธรดควรทำเมื่อเริ่มต้น
เมื่อคุณสร้างคลาสย่อยของเธรดใหม่แล้วคุณสามารถสร้างอินสแตนซ์ของมันแล้วเริ่มเธรดใหม่โดยเรียกใช้start ()ซึ่งจะเรียกเมธอดrun ()
ตัวอย่าง
#!/usr/bin/python3
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("Starting " + self.name)
print_time(self.name, self.counter, 5)
print ("Exiting " + self.name)
def print_time(threadName, delay, counter):
while counter:
if exitFlag:
threadName.exit()
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("Exiting Main Thread")
ผลลัพธ์
เมื่อเรารันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังนี้ -
Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:00:21 2016
Thread-2: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:23 2016
Thread-2: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:25 2016
Exiting Thread-1
Thread-2: Fri Feb 19 10:00:26 2016
Thread-2: Fri Feb 19 10:00:28 2016
Thread-2: Fri Feb 19 10:00:30 2016
Exiting Thread-2
Exiting Main Thread
การซิงโครไนซ์เธรด
โมดูลเธรดที่มาพร้อมกับ Python มีกลไกการล็อกที่ง่ายต่อการใช้งานซึ่งช่วยให้คุณสามารถซิงโครไนซ์เธรดได้ การล็อกใหม่ถูกสร้างขึ้นโดยเรียกใช้เมธอดLock ()ซึ่งจะคืนค่าล็อกใหม่
วิธีการรับ (การบล็อก)ของอ็อบเจ็กต์การล็อกใหม่ถูกใช้เพื่อบังคับให้เธรดทำงานพร้อมกัน พารามิเตอร์การบล็อกที่เป็นทางเลือกช่วยให้คุณสามารถควบคุมว่าเธรดรอเพื่อรับการล็อกหรือไม่
หากตั้งค่าการบล็อกเป็น 0 เธรดจะคืนค่าทันทีด้วยค่า 0 หากไม่สามารถรับการล็อกได้และด้วย 1 หากได้รับการล็อก หากตั้งค่าการบล็อกเป็น 1 เธรดจะบล็อกและรอให้คลายล็อก
ปล่อย ()วิธีการของวัตถุล็อคใหม่จะถูกใช้ในการปลดล็อคเมื่อมันไม่จำเป็น
ตัวอย่าง
#!/usr/bin/python3
import threading
import time
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("Starting " + self.name)
# Get lock to synchronize threads
threadLock.acquire()
print_time(self.name, self.counter, 3)
# Free lock to release next thread
threadLock.release()
def print_time(threadName, delay, counter):
while counter:
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
threadLock = threading.Lock()
threads = []
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
# Add threads to thread list
threads.append(thread1)
threads.append(thread2)
# Wait for all threads to complete
for t in threads:
t.join()
print ("Exiting Main Thread")
เอาต์พุต
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:04:14 2016
Thread-1: Fri Feb 19 10:04:15 2016
Thread-1: Fri Feb 19 10:04:16 2016
Thread-2: Fri Feb 19 10:04:18 2016
Thread-2: Fri Feb 19 10:04:20 2016
Thread-2: Fri Feb 19 10:04:22 2016
Exiting Main Thread
คิวลำดับความสำคัญแบบมัลติเธรด
คิวโมดูลช่วยให้คุณสามารถสร้างวัตถุคิวใหม่ที่สามารถถือจำนวนเฉพาะของรายการ มีวิธีการต่อไปนี้ในการควบคุมคิว -
get() - get () ลบและส่งคืนไอเท็มจากคิว
put() - ใส่เพิ่มรายการในคิว
qsize() - qsize () ส่งคืนจำนวนรายการที่อยู่ในคิวปัจจุบัน
empty()- empty () ส่งคืน True ถ้าคิวว่าง มิฉะนั้นเท็จ
full()- full () จะคืนค่า True หากคิวเต็ม มิฉะนั้นเท็จ
ตัวอย่าง
#!/usr/bin/python3
import queue
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, q):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.q = q
def run(self):
print ("Starting " + self.name)
process_data(self.name, self.q)
print ("Exiting " + self.name)
def process_data(threadName, q):
while not exitFlag:
queueLock.acquire()
if not workQueue.empty():
data = q.get()
queueLock.release()
print ("%s processing %s" % (threadName, data))
else:
queueLock.release()
time.sleep(1)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1
# Create new threads
for tName in threadList:
thread = myThread(threadID, tName, workQueue)
thread.start()
threads.append(thread)
threadID += 1
# Fill the queue
queueLock.acquire()
for word in nameList:
workQueue.put(word)
queueLock.release()
# Wait for queue to empty
while not workQueue.empty():
pass
# Notify threads it's time to exit
exitFlag = 1
# Wait for all threads to complete
for t in threads:
t.join()
print ("Exiting Main Thread")
เอาต์พุต
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread
XML เป็นภาษาโอเพ่นซอร์สแบบพกพาที่ช่วยให้โปรแกรมเมอร์สามารถพัฒนาแอปพลิเคชันที่แอปพลิเคชันอื่นสามารถอ่านได้โดยไม่คำนึงถึงระบบปฏิบัติการและ / หรือภาษาพัฒนาการ
XML คืออะไร?
Extensible Markup Language (XML) เป็นภาษามาร์กอัปเหมือนกับ HTML หรือ SGML สิ่งนี้แนะนำโดย World Wide Web Consortium และพร้อมใช้งานในรูปแบบมาตรฐานเปิด
XML มีประโยชน์อย่างยิ่งสำหรับการติดตามข้อมูลจำนวนน้อยถึงปานกลางโดยไม่ต้องใช้แบ็คโบนที่ใช้ SQL
สถาปัตยกรรม XML Parser และ API
ไลบรารีมาตรฐาน Python มีชุดอินเทอร์เฟซที่เรียบง่าย แต่มีประโยชน์ในการทำงานกับ XML
API พื้นฐานและข้อมูล XML ที่ใช้กันอย่างแพร่หลายที่สุดสองรายการคืออินเทอร์เฟซ SAX และ DOM
Simple API for XML (SAX)- ที่นี่คุณลงทะเบียนการโทรกลับสำหรับเหตุการณ์ที่น่าสนใจจากนั้นให้โปรแกรมแยกวิเคราะห์ดำเนินการผ่านเอกสาร สิ่งนี้มีประโยชน์เมื่อเอกสารของคุณมีขนาดใหญ่หรือคุณมีข้อ จำกัด ด้านหน่วยความจำมันจะแยกวิเคราะห์ไฟล์เมื่ออ่านจากดิสก์และไฟล์ทั้งหมดจะไม่ถูกเก็บไว้ในหน่วยความจำ
Document Object Model (DOM) API - นี่เป็นคำแนะนำของ World Wide Web Consortium ซึ่งไฟล์ทั้งหมดจะถูกอ่านลงในหน่วยความจำและจัดเก็บในรูปแบบลำดับชั้น (ตามต้นไม้) เพื่อแสดงคุณสมบัติทั้งหมดของเอกสาร XML
เห็นได้ชัดว่า SAX ไม่สามารถประมวลผลข้อมูลได้เร็วเท่ากับ DOM เมื่อทำงานกับไฟล์ขนาดใหญ่ ในทางกลับกันการใช้ DOM เพียงอย่างเดียวสามารถฆ่าทรัพยากรของคุณได้โดยเฉพาะอย่างยิ่งหากใช้กับไฟล์ขนาดเล็กจำนวนมาก
SAX เป็นแบบอ่านอย่างเดียวในขณะที่ DOM อนุญาตให้เปลี่ยนแปลงไฟล์ XML เนื่องจาก API ที่แตกต่างกันทั้งสองนี้เสริมกันอย่างแท้จริงจึงไม่มีเหตุผลว่าทำไมคุณจึงไม่สามารถใช้ API ทั้งสองสำหรับโครงการขนาดใหญ่ได้
สำหรับตัวอย่างโค้ด XML ทั้งหมดของเราให้เราใช้ไฟล์ XML แบบง่ายmovies.xmlเป็นอินพุต -
<collection shelf = "New Arrivals">
<movie title = "Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title = "Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title = "Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
การแยกวิเคราะห์ XML ด้วย SAX API
SAX เป็นอินเทอร์เฟซมาตรฐานสำหรับการแยกวิเคราะห์ XML ที่ขับเคลื่อนด้วยเหตุการณ์ การแยกวิเคราะห์ XML กับ SAX โดยทั่วไปคุณต้องสร้าง ContentHandler ของคุณเองโดย subclassing xml.sax.ContentHandler
ContentHandlerของคุณจัดการแท็กและคุณลักษณะเฉพาะของรสชาติ XML ของคุณ อ็อบเจ็กต์ ContentHandler จัดเตรียมเมธอดในการจัดการเหตุการณ์การแยกวิเคราะห์ต่างๆ ตัวแยกวิเคราะห์ของตัวเองเรียกใช้เมธอด ContentHandler เมื่อแยกวิเคราะห์ไฟล์ XML
วิธีการstartDocumentและendDocumentจะเรียกว่าที่เริ่มต้นและจุดสิ้นสุดของไฟล์ XML ที่ อักขระวิธีการ(ข้อความ)ถูกส่งผ่านข้อมูลอักขระของไฟล์ XML ผ่านข้อความพารามิเตอร์
ContentHandler ถูกเรียกที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละองค์ประกอบ ถ้าตัวแยกวิเคราะห์ไม่ได้อยู่ในโหมดเนมสเปซเมธอดstartElement (แท็กแอตทริบิวต์)และendElement (แท็ก)จะถูกเรียก มิฉะนั้นจะมีการเรียกวิธีการstartElementNSและendElementNSที่เกี่ยวข้อง ที่นี่แท็กคือแท็กองค์ประกอบและแอตทริบิวต์คือวัตถุแอตทริบิวต์
วิธีการที่สำคัญอื่น ๆ ที่ต้องทำความเข้าใจก่อนดำเนินการต่อ -
วิธี make_parser
วิธีการต่อไปนี้สร้างออบเจ็กต์ตัวแยกวิเคราะห์ใหม่และส่งคืน ออบเจ็กต์ตัวแยกวิเคราะห์ที่สร้างขึ้นจะเป็นประเภทตัวแยกวิเคราะห์แรกที่ระบบจะค้นหา
xml.sax.make_parser( [parser_list] )
นี่คือรายละเอียดของพารามิเตอร์ -
parser_list - อาร์กิวเมนต์ที่เป็นทางเลือกประกอบด้วยรายการตัววิเคราะห์ที่จะใช้ซึ่งทั้งหมดต้องใช้เมธอด make_parser
วิธีการแยกวิเคราะห์
วิธีการต่อไปนี้จะสร้างตัวแยกวิเคราะห์ SAX และใช้เพื่อแยกวิเคราะห์เอกสาร
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
นี่คือรายละเอียดของพารามิเตอร์ -
xmlfile - นี่คือชื่อของไฟล์ XML ที่จะอ่าน
contenthandler - ต้องเป็นวัตถุ ContentHandler
errorhandler - หากระบุตัวจัดการข้อผิดพลาดต้องเป็นวัตถุ SAX ErrorHandler
วิธีการ parseString
มีอีกวิธีหนึ่งในการสร้างตัวแยกวิเคราะห์ SAX และแยกวิเคราะห์ที่ระบุ XML string.
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
นี่คือรายละเอียดของพารามิเตอร์ -
xmlstring - นี่คือชื่อของสตริง XML ที่จะอ่าน
contenthandler - ต้องเป็นวัตถุ ContentHandler
errorhandler - หากระบุตัวจัดการข้อผิดพลาดต้องเป็นวัตถุ SAX ErrorHandler
ตัวอย่าง
#!/usr/bin/python3
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print ("*****Movie*****")
title = attributes["title"]
print ("Title:", title)
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print ("Type:", self.type)
elif self.CurrentData == "format":
print ("Format:", self.format)
elif self.CurrentData == "year":
print ("Year:", self.year)
elif self.CurrentData == "rating":
print ("Rating:", self.rating)
elif self.CurrentData == "stars":
print ("Stars:", self.stars)
elif self.CurrentData == "description":
print ("Description:", self.description)
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# create an XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# override the default ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")
เอาต์พุต
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
สำหรับรายละเอียดทั้งหมดเกี่ยวกับเอกสาร SAX API โปรดดูPython SAX APIมาตรฐาน
การแยกวิเคราะห์ XML ด้วย DOM API
Document Object Model ("DOM") เป็น API ข้ามภาษาจาก World Wide Web Consortium (W3C) สำหรับการเข้าถึงและแก้ไขเอกสาร XML
DOM มีประโยชน์อย่างยิ่งสำหรับแอปพลิเคชันการเข้าถึงโดยสุ่ม SAX อนุญาตให้คุณดูเอกสารครั้งละหนึ่งบิตเท่านั้น หากคุณกำลังดูองค์ประกอบ SAX หนึ่งคุณจะไม่สามารถเข้าถึงองค์ประกอบอื่นได้
นี่คือวิธีที่ง่ายที่สุดในการโหลดเอกสาร XML อย่างรวดเร็วและสร้างวัตถุขนาดเล็กโดยใช้โมดูล xml.dom อ็อบเจ็กต์ minidom มีวิธีการแยกวิเคราะห์อย่างง่ายที่สร้างแผนผัง DOM จากไฟล์ XML ได้อย่างรวดเร็ว
วลีตัวอย่างเรียกใช้ฟังก์ชัน parse (file [, parser]) ของอ็อบเจ็กต์ minidom เพื่อแยกวิเคราะห์ไฟล์ XML ซึ่งกำหนดโดยไฟล์ลงในอ็อบเจ็กต์แผนผัง DOM
ตัวอย่าง
#!/usr/bin/python3
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print ("Root element : %s" % collection.getAttribute("shelf"))
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
print ("*****Movie*****")
if movie.hasAttribute("title"):
print ("Title: %s" % movie.getAttribute("title"))
type = movie.getElementsByTagName('type')[0]
print ("Type: %s" % type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print ("Format: %s" % format.childNodes[0].data)
rating = movie.getElementsByTagName('rating')[0]
print ("Rating: %s" % rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print ("Description: %s" % description.childNodes[0].data)
เอาต์พุต
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
สำหรับรายละเอียดทั้งหมดเกี่ยวกับเอกสาร DOM API โปรดดูPython DOM APIมาตรฐาน
Python มีตัวเลือกต่างๆสำหรับการพัฒนาส่วนต่อประสานผู้ใช้แบบกราฟิก (GUI) คุณสมบัติที่สำคัญที่สุดอยู่ด้านล่าง
Tkinter- Tkinter เป็นส่วนต่อประสาน Python กับชุดเครื่องมือ Tk GUI ที่มาพร้อมกับ Python เราจะดูตัวเลือกนี้ในบทนี้
wxPython- นี่คืออินเทอร์เฟซ Python แบบโอเพ่นซอร์สสำหรับ wxWidgets GUI toolkit คุณสามารถค้นหากวดวิชาที่สมบูรณ์เกี่ยวกับ wxPython ที่นี่
PyQt− นี่เป็นอินเทอร์เฟซ Python สำหรับไลบรารี Qt GUI ข้ามแพลตฟอร์มยอดนิยม TutorialsPoint มีการกวดวิชาที่ดีมากใน PyQt ที่นี่
JPython - JPython เป็นพอร์ต Python สำหรับ Java ซึ่งทำให้สคริปต์ Python สามารถเข้าถึงไลบรารีคลาส Java บนเครื่องท้องถิ่นได้อย่างราบรื่น http://www.jython.org.
มีอินเทอร์เฟซอื่น ๆ อีกมากมายซึ่งคุณสามารถหาได้จากอินเทอร์เน็ต
การเขียนโปรแกรม Tkinter
Tkinter เป็นไลบรารี GUI มาตรฐานสำหรับ Python Python เมื่อรวมกับ Tkinter เป็นวิธีที่ง่ายและรวดเร็วในการสร้างแอปพลิเคชัน GUI Tkinter นำเสนออินเทอร์เฟซเชิงวัตถุที่มีประสิทธิภาพให้กับชุดเครื่องมือ Tk GUI
การสร้างแอปพลิเคชัน GUI โดยใช้ Tkinter เป็นเรื่องง่าย สิ่งที่คุณต้องทำคือทำตามขั้นตอนต่อไปนี้ -
นำเข้าโมดูลTkinter
สร้างหน้าต่างหลักของแอปพลิเคชัน GUI
เพิ่มวิดเจ็ตที่กล่าวถึงข้างต้นอย่างน้อยหนึ่งรายการในแอปพลิเคชัน GUI
เข้าสู่ลูปเหตุการณ์หลักเพื่อดำเนินการกับแต่ละเหตุการณ์ที่เรียกโดยผู้ใช้
ตัวอย่าง
#!/usr/bin/python3
import tkinter # note that module name has changed from Tkinter in Python 2 to tkinter in Python 3
top = tkinter.Tk()
# Code to add widgets will go here...
top.mainloop()
สิ่งนี้จะสร้างหน้าต่างต่อไปนี้ -
วิดเจ็ต Tkinter
Tkinter มีการควบคุมต่างๆเช่นปุ่มป้ายกำกับและกล่องข้อความที่ใช้ในแอปพลิเคชัน GUI การควบคุมเหล่านี้มักเรียกว่าวิดเจ็ต
ขณะนี้มีวิดเจ็ต 15 ประเภทใน Tkinter เรานำเสนอวิดเจ็ตเหล่านี้พร้อมทั้งคำอธิบายสั้น ๆ ในตารางต่อไปนี้ -
ซีเนียร์ | ตัวดำเนินการและคำอธิบาย |
---|---|
1 | ปุ่ม วิดเจ็ตปุ่มใช้เพื่อแสดงปุ่มในแอปพลิเคชันของคุณ |
2 | ผ้าใบ วิดเจ็ต Canvas ใช้เพื่อวาดรูปร่างเช่นเส้นวงรีรูปหลายเหลี่ยมและสี่เหลี่ยมในแอปพลิเคชันของคุณ |
3 | ปุ่มตรวจสอบ วิดเจ็ต Checkbutton ใช้เพื่อแสดงตัวเลือกต่างๆเป็นช่องทำเครื่องหมาย ผู้ใช้สามารถเลือกได้ครั้งละหลายตัวเลือก |
4 | รายการ วิดเจ็ต Entry ใช้เพื่อแสดงฟิลด์ข้อความบรรทัดเดียวสำหรับรับค่าจากผู้ใช้ |
5 | กรอบ วิดเจ็ต Frame ใช้เป็นวิดเจ็ตคอนเทนเนอร์เพื่อจัดระเบียบวิดเจ็ตอื่น ๆ |
6 | ฉลาก วิดเจ็ต Label ใช้เพื่อจัดเตรียมคำบรรยายบรรทัดเดียวสำหรับวิดเจ็ตอื่น ๆ นอกจากนี้ยังสามารถมีรูปภาพ |
7 | Listbox วิดเจ็ต Listbox ใช้เพื่อจัดเตรียมรายการตัวเลือกให้กับผู้ใช้ |
8 | เมนู วิดเจ็ต Menubutton ใช้เพื่อแสดงเมนูในแอปพลิเคชันของคุณ |
9 | เมนู วิดเจ็ตเมนูใช้เพื่อจัดเตรียมคำสั่งต่างๆให้กับผู้ใช้ คำสั่งเหล่านี้มีอยู่ใน Menubutton |
10 | ข้อความ วิดเจ็ตข้อความใช้เพื่อแสดงฟิลด์ข้อความหลายบรรทัดสำหรับการยอมรับค่าจากผู้ใช้ |
11 | Radiobutton วิดเจ็ต Radiobutton ใช้เพื่อแสดงตัวเลือกต่างๆเป็นปุ่มตัวเลือก ผู้ใช้สามารถเลือกได้ครั้งละหนึ่งตัวเลือกเท่านั้น |
12 | มาตราส่วน วิดเจ็ตมาตราส่วนใช้เพื่อจัดเตรียมวิดเจ็ตตัวเลื่อน |
13 | แถบเลื่อน วิดเจ็ต Scrollbar ใช้เพื่อเพิ่มความสามารถในการเลื่อนไปยังวิดเจ็ตต่างๆเช่นกล่องรายการ |
14 | ข้อความ วิดเจ็ตข้อความใช้เพื่อแสดงข้อความในหลายบรรทัด |
15 | ระดับสูง วิดเจ็ต Toplevel ใช้เพื่อจัดเตรียมคอนเทนเนอร์หน้าต่างแยกต่างหาก |
16 | Spinbox วิดเจ็ต Spinbox เป็นตัวแปรของวิดเจ็ต Tkinter Entry มาตรฐานซึ่งสามารถใช้เพื่อเลือกจากจำนวนค่าคงที่ |
17 | PanedWindow PanedWindow คือวิดเจ็ตคอนเทนเนอร์ที่อาจมีบานหน้าต่างจำนวนเท่าใดก็ได้โดยจัดเรียงในแนวนอนหรือแนวตั้ง |
18 | LabelFrame Labelframe เป็นวิดเจ็ตคอนเทนเนอร์แบบธรรมดา จุดประสงค์หลักคือทำหน้าที่เป็นตัวเว้นระยะหรือคอนเทนเนอร์สำหรับการจัดวางหน้าต่างที่ซับซ้อน |
19 | tkMessageBox โมดูลนี้ใช้เพื่อแสดงกล่องข้อความในแอปพลิเคชันของคุณ |
แอตทริบิวต์มาตรฐาน
ให้เราดูว่าคุณลักษณะทั่วไปบางประการเช่นขนาดสีและแบบอักษรมีการระบุไว้อย่างไร
Dimensions
Colors
Fonts
Anchors
รูปแบบการบรรเทา
Bitmaps
Cursors
การจัดการรูปทรงเรขาคณิต
วิดเจ็ต Tkinter ทั้งหมดสามารถเข้าถึงวิธีการจัดการรูปทรงเรขาคณิตเฉพาะซึ่งมีจุดประสงค์ในการจัดระเบียบวิดเจ็ตทั่วทั้งพื้นที่วิดเจ็ตพาเรนต์ Tkinter แสดงคลาสตัวจัดการเรขาคณิตต่อไปนี้แพ็คกริดและสถานที่
วิธีแพ็ค () - ตัวจัดการรูปทรงเรขาคณิตนี้จะจัดระเบียบวิดเจ็ตในบล็อกก่อนที่จะวางไว้ในวิดเจ็ตหลัก
วิธีกริด () - ตัวจัดการรูปทรงเรขาคณิตนี้จัดระเบียบวิดเจ็ตในโครงสร้างที่เหมือนตารางในวิดเจ็ตหลัก
สถานที่ () วิธีการ - ตัวจัดการรูปทรงเรขาคณิตนี้จัดระเบียบวิดเจ็ตโดยวางไว้ในตำแหน่งเฉพาะในวิดเจ็ตหลัก
โค้ดใด ๆ ที่คุณเขียนโดยใช้ภาษาที่คอมไพล์เช่น C, C ++ หรือ Java สามารถรวมหรือนำเข้าในสคริปต์ Python อื่นได้ รหัสนี้ถือเป็น "ส่วนขยาย"
โมดูลส่วนขยาย Python ไม่มีอะไรมากไปกว่าไลบรารี C ปกติ ในเครื่อง Unix ไลบรารีเหล่านี้มักจะลงท้ายด้วย.so(สำหรับวัตถุที่ใช้ร่วมกัน) ในเครื่อง Windows โดยทั่วไปคุณจะเห็น.dll (สำหรับไลบรารีที่เชื่อมโยงแบบไดนามิก)
ข้อกำหนดเบื้องต้นสำหรับการเขียนส่วนขยาย
ในการเริ่มเขียนส่วนขยายของคุณคุณจะต้องมีไฟล์ส่วนหัวของ Python
ในเครื่อง Unix โดยปกติจะต้องติดตั้งแพ็คเกจเฉพาะสำหรับนักพัฒนาเช่น.
ผู้ใช้ Windows จะได้รับส่วนหัวเหล่านี้เป็นส่วนหนึ่งของแพ็กเกจเมื่อใช้โปรแกรมติดตั้งไบนารี Python
นอกจากนี้สมมติว่าคุณมีความรู้เกี่ยวกับ C หรือ C ++ เป็นอย่างดีในการเขียน Python Extension โดยใช้การเขียนโปรแกรม C
ขั้นแรกให้ดูที่ส่วนขยาย Python
สำหรับการดูโมดูลส่วนขยาย Python เป็นครั้งแรกคุณต้องจัดกลุ่มรหัสของคุณเป็นสี่ส่วน -
ไฟล์ส่วนหัวPython.h .
ฟังก์ชัน C ที่คุณต้องการแสดงเป็นอินเทอร์เฟซจากโมดูลของคุณ
ตารางที่แมปชื่อฟังก์ชันของคุณเนื่องจากนักพัฒนา Python มองว่าเป็นฟังก์ชัน C ภายในโมดูลส่วนขยาย
ฟังก์ชันการเริ่มต้น
ไฟล์ส่วนหัว Python.h
คุณต้องรวมไฟล์ส่วนหัวPython.hไว้ในไฟล์ซอร์ส C ของคุณซึ่งช่วยให้คุณสามารถเข้าถึง Python API ภายในที่ใช้เชื่อมต่อโมดูลของคุณเข้ากับตัวแปล
อย่าลืมใส่ Python.h ก่อนส่วนหัวอื่น ๆ ที่คุณอาจต้องการ คุณต้องทำตามรวมด้วยฟังก์ชันที่คุณต้องการเรียกใช้จาก Python
ฟังก์ชั่น C
ลายเซ็นของการใช้งาน C ในฟังก์ชันของคุณจะใช้รูปแบบใดรูปแบบหนึ่งในสามรูปแบบต่อไปนี้
static PyObject *MyFunction( PyObject *self, PyObject *args );
static PyObject *MyFunctionWithKeywords(PyObject *self,
PyObject *args,
PyObject *kw);
static PyObject *MyFunctionWithNoArgs( PyObject *self );
การประกาศก่อนหน้าแต่ละรายการส่งคืนวัตถุ Python ไม่มีสิ่งที่เรียกว่าฟังก์ชันโมฆะใน Python เนื่องจากมีอยู่ใน C หากคุณไม่ต้องการให้ฟังก์ชันของคุณส่งคืนค่าให้คืนค่า C ที่เทียบเท่ากับ PythonNoneมูลค่า. ส่วนหัว Python กำหนดมาโคร Py_RETURN_NONE ที่ทำสิ่งนี้ให้เรา
ชื่อของฟังก์ชัน C ของคุณอาจเป็นชื่ออะไรก็ได้ตามที่คุณต้องการเนื่องจากไม่มีให้เห็นนอกโมดูลส่วนขยาย พวกเขาถูกกำหนดให้เป็นฟังก์ชันคงที่
โดยปกติฟังก์ชัน C ของคุณจะถูกตั้งชื่อโดยการรวมโมดูล Python และชื่อฟังก์ชันเข้าด้วยกันดังที่แสดงไว้ที่นี่ -
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Do your stuff here. */
Py_RETURN_NONE;
}
นี้เป็นฟังก์ชั่นที่เรียกว่างูหลามfuncภายในโมดูลโมดูล คุณจะใส่พอยน์เตอร์สำหรับฟังก์ชัน C ของคุณลงในตารางวิธีการสำหรับโมดูลที่มักจะมาถัดไปในซอร์สโค้ดของคุณ
ตารางการแมปวิธีการ
ตารางวิธีนี้เป็นอาร์เรย์ของโครงสร้าง PyMethodDef อย่างง่าย โครงสร้างนั้นมีลักษณะดังนี้ -
struct PyMethodDef {
char *ml_name;
PyCFunction ml_meth;
int ml_flags;
char *ml_doc;
};
นี่คือคำอธิบายของสมาชิกของโครงสร้างนี้ -
ml_name - นี่คือชื่อของฟังก์ชันตามที่ล่าม Python นำเสนอเมื่อใช้ในโปรแกรม Python
ml_meth - นี่คือที่อยู่ของฟังก์ชันที่มีลายเซ็นใด ๆ ที่อธิบายไว้ในส่วนก่อนหน้า
ml_flags - สิ่งนี้จะบอกล่ามว่าใช้ ml_meth ลายเซ็นใดในสามลายเซ็น
แฟล็กนี้มักมีค่า METH_VARARGS
แฟล็กนี้สามารถเป็นแบบบิตหรือด้วย METH_KEYWORDS หากคุณต้องการอนุญาตให้ใช้อาร์กิวเมนต์คำหลักในฟังก์ชันของคุณ
นอกจากนี้ยังสามารถมีค่าของ METH_NOARGS ที่ระบุว่าคุณไม่ต้องการยอมรับข้อโต้แย้งใด ๆ
ml_doc - นี่คือ docstring สำหรับฟังก์ชันซึ่งอาจเป็น NULL หากคุณไม่อยากเขียน
ตารางนี้จะต้องถูกยกเลิกด้วย Sentinel ที่ประกอบด้วยค่า NULL และ 0 สำหรับสมาชิกที่เหมาะสม
ตัวอย่าง
สำหรับฟังก์ชันที่กำหนดไว้ข้างต้นเรามีตารางการแมปวิธีการดังต่อไปนี้ -
static PyMethodDef module_methods[] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ NULL, NULL, 0, NULL }
};
ฟังก์ชัน Initialization
ส่วนสุดท้ายของโมดูลส่วนขยายของคุณคือฟังก์ชันการเริ่มต้น ฟังก์ชันนี้เรียกโดย Python interpreter เมื่อโหลดโมดูล จำเป็นต้องมีการตั้งชื่อฟังก์ชันinitModuleโดยที่โมดูลคือชื่อของโมดูล
ฟังก์ชันการเริ่มต้นจำเป็นต้องส่งออกจากไลบรารีที่คุณจะสร้าง ส่วนหัว Python กำหนด PyMODINIT_FUNC เพื่อรวมคาถาที่เหมาะสมสำหรับสิ่งที่จะเกิดขึ้นสำหรับสภาพแวดล้อมเฉพาะที่เรากำลังรวบรวม สิ่งที่คุณต้องทำคือใช้เมื่อกำหนดฟังก์ชัน
ฟังก์ชันการเริ่มต้น C ของคุณโดยทั่วไปมีโครงสร้างโดยรวมดังต่อไปนี้ -
PyMODINIT_FUNC initModule() {
Py_InitModule3(func, module_methods, "docstring...");
}
นี่คือคำอธิบายของ Py_InitModule3 ฟังก์ชัน -
func - นี่คือฟังก์ชันที่จะส่งออก
module_methods - นี่คือชื่อตารางการแมปที่กำหนดไว้ด้านบน
docstring - นี่คือความคิดเห็นที่คุณต้องการแสดงในส่วนขยายของคุณ
เมื่อรวมทั้งหมดนี้เข้าด้วยกันจะมีลักษณะดังนี้ -
#include <Python.h>
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Do your stuff here. */
Py_RETURN_NONE;
}
static PyMethodDef module_methods[] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ NULL, NULL, 0, NULL }
};
PyMODINIT_FUNC initModule() {
Py_InitModule3(func, module_methods, "docstring...");
}
ตัวอย่าง
ตัวอย่างง่ายๆที่ใช้ประโยชน์จากแนวคิดข้างต้นทั้งหมด -
#include <Python.h>
static PyObject* helloworld(PyObject* self)
{
return Py_BuildValue("s", "Hello, Python extensions!!");
}
static char helloworld_docs[] =
"helloworld( ): Any message you want to put here!!\n";
static PyMethodDef helloworld_funcs[] = {
{"helloworld", (PyCFunction)helloworld,
METH_NOARGS, helloworld_docs},
{NULL}
};
void inithelloworld(void)
{
Py_InitModule3("helloworld", helloworld_funcs,
"Extension module example!");
}
ที่นี่มีการใช้ฟังก์ชันPy_BuildValueเพื่อสร้างค่า Python บันทึกโค้ดด้านบนในไฟล์ hello.c เราจะดูวิธีการคอมไพล์และติดตั้งโมดูลนี้เพื่อเรียกใช้จากสคริปต์ Python
การสร้างและติดตั้งส่วนขยาย
distutilsแพคเกจจะทำให้มันง่ายมากที่จะแจกจ่ายโมดูลหลามทั้งบริสุทธิ์หลามและการขยายโมดูลในวิธีการมาตรฐาน โมดูลมีการแจกจ่ายในรูปแบบซอร์สสร้างและติดตั้งผ่านสคริปต์การตั้งค่าที่มักเรียกว่าsetup.pyเป็น
สำหรับโมดูลข้างต้นคุณต้องเตรียมสคริปต์ setup.py ต่อไปนี้ -
from distutils.core import setup, Extension
setup(name = 'helloworld', version = '1.0', \
ext_modules = [Extension('helloworld', ['hello.c'])])
ตอนนี้ใช้คำสั่งต่อไปนี้ซึ่งจะดำเนินการขั้นตอนการคอมไพเลอร์และการเชื่อมโยงที่จำเป็นทั้งหมดด้วยคำสั่งและแฟล็กคอมไพเลอร์และลิงค์เกอร์ที่ถูกต้องและคัดลอกไลบรารีไดนามิกที่เป็นผลลัพธ์ไปยังไดเร็กทอรีที่เหมาะสม
$ python setup.py install
ในระบบที่ใช้ Unix คุณมักจะต้องรันคำสั่งนี้ในฐานะรูทเพื่อให้มีสิทธิ์ในการเขียนลงในไดเร็กทอรี site-package โดยปกติแล้วจะไม่มีปัญหาใน Windows
การนำเข้าส่วนขยาย
เมื่อคุณติดตั้งส่วนขยายของคุณคุณจะสามารถนำเข้าและเรียกส่วนขยายนั้นในสคริปต์ Python ของคุณได้ดังนี้ -
ตัวอย่าง
#!/usr/bin/python3
import helloworld
print helloworld.helloworld()
เอาต์พุต
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Hello, Python extensions!!
พารามิเตอร์ฟังก์ชันการส่งผ่าน
เนื่องจากคุณมักต้องการกำหนดฟังก์ชันที่ยอมรับอาร์กิวเมนต์คุณสามารถใช้ลายเซ็นอื่นสำหรับฟังก์ชัน C ของคุณได้ ตัวอย่างเช่นฟังก์ชันต่อไปนี้ที่รับพารามิเตอร์จำนวนหนึ่งจะถูกกำหนดเช่นนี้ -
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Parse args and do something interesting here. */
Py_RETURN_NONE;
}
ตารางวิธีการที่มีรายการสำหรับฟังก์ชันใหม่จะมีลักษณะดังนี้ -
static PyMethodDef module_methods[] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ "func", module_func, METH_VARARGS, NULL },
{ NULL, NULL, 0, NULL }
};
คุณสามารถใช้ฟังก์ชันAPI PyArg_ParseTupleเพื่อแยกอาร์กิวเมนต์จากตัวชี้ PyObject หนึ่งตัวที่ส่งผ่านไปยังฟังก์ชัน C ของคุณ
อาร์กิวเมนต์แรกของ PyArg_ParseTuple คืออาร์กิวเมนต์ args นี่คือวัตถุที่คุณจะได้รับการแยก อาร์กิวเมนต์ที่สองคือสตริงรูปแบบที่อธิบายอาร์กิวเมนต์ตามที่คุณคาดหวังให้ปรากฏ แต่ละอาร์กิวเมนต์แสดงด้วยอักขระตั้งแต่หนึ่งตัวขึ้นไปในสตริงรูปแบบดังนี้
static PyObject *module_func(PyObject *self, PyObject *args) {
int i;
double d;
char *s;
if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)) {
return NULL;
}
/* Do something interesting here. */
Py_RETURN_NONE;
}
เอาต์พุต
การรวบรวมเวอร์ชันใหม่ของโมดูลของคุณและการนำเข้าช่วยให้คุณสามารถเรียกใช้ฟังก์ชันใหม่ด้วยอาร์กิวเมนต์ประเภทใดก็ได้ -
module.func(1, s = "three", d = 2.0)
module.func(i = 1, d = 2.0, s = "three")
module.func(s = "three", d = 2.0, i = 1)
คุณอาจมีรูปแบบต่างๆมากขึ้น
ฟังก์ชัน PyArg_ParseTuple
นี่คือลายเซ็นมาตรฐานสำหรับไฟล์ PyArg_ParseTuple ฟังก์ชัน -
int PyArg_ParseTuple(PyObject* tuple,char* format,...)
ฟังก์ชันนี้จะคืนค่า 0 สำหรับข้อผิดพลาดและค่าไม่เท่ากับ 0 สำหรับความสำเร็จ Tuple คือ PyObject * ซึ่งเป็นอาร์กิวเมนต์ที่สองของฟังก์ชัน C รูปแบบที่นี่คือสตริง C ที่อธิบายอาร์กิวเมนต์ที่จำเป็นและเป็นทางเลือก
นี่คือรายการรหัสรูปแบบสำหรับไฟล์ PyArg_ParseTuple ฟังก์ชัน -
รหัส | ประเภท C | ความหมาย |
---|---|---|
ค | ถ่าน | สตริง Python ที่มีความยาว 1 กลายเป็น C char |
ง | สองเท่า | Python float กลายเป็น C double |
ฉ | ลอย | Python float กลายเป็น C float |
ผม | int | Python int กลายเป็น C int |
ล | ยาว | Python int กลายเป็น C ยาว |
ล | ยาวนาน | Python int กลายเป็น C long |
โอ | PyObject * | รับการอ้างอิงที่ยืมมาแบบไม่เป็นโมฆะสำหรับอาร์กิวเมนต์ Python |
เอส | ถ่าน * | สตริง Python ที่ไม่มี nulls ฝังลงใน C char * |
s # | ถ่าน * + int | สตริง Python เป็นที่อยู่และความยาว C |
เสื้อ # | ถ่าน * + int | บัฟเฟอร์ส่วนเดียวแบบอ่านอย่างเดียวถึงที่อยู่และความยาว C |
ยู | Py_UNICODE * | Python Unicode ที่ไม่มี nulls ฝังเป็น C |
ยู# | Py_UNICODE * + int | ที่อยู่และความยาวของ Python Unicode C |
w # | ถ่าน * + int | อ่าน / เขียนบัฟเฟอร์ส่วนเดียวไปยังที่อยู่ C และความยาว |
z | ถ่าน * | เช่นเดียวกับ s ยอมรับว่าไม่มี (ตั้งค่า C char * เป็น NULL) |
z # | ถ่าน * + int | เช่นเดียวกับ s # ยอมรับว่าไม่มี (ตั้งค่า C char * เป็น NULL) |
(... ) | ตาม ... | ลำดับ Python จะถือว่าเป็นหนึ่งอาร์กิวเมนต์ต่อรายการ |
| | อาร์กิวเมนต์ต่อไปนี้เป็นทางเลือก | |
: | สิ้นสุดรูปแบบตามด้วยชื่อฟังก์ชันสำหรับข้อความแสดงข้อผิดพลาด | |
; | สิ้นสุดรูปแบบตามด้วยข้อความแสดงข้อผิดพลาดทั้งหมด |
การคืนค่า
Py_BuildValueใช้รูปแบบสตริงเหมือนกับที่PyArg_ParseTupleทำ แทนที่จะส่งที่อยู่ของค่าที่คุณกำลังสร้างคุณจะส่งผ่านค่าจริง นี่คือตัวอย่างที่แสดงวิธีใช้ฟังก์ชันเพิ่ม -
static PyObject *foo_add(PyObject *self, PyObject *args) {
int a;
int b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("i", a + b);
}
นี่คือสิ่งที่ดูเหมือนว่าถ้าใช้ใน Python -
def add(a, b):
return (a + b)
คุณสามารถคืนค่าสองค่าจากฟังก์ชันของคุณได้ดังนี้ สิ่งนี้จะถูกบันทึกโดยใช้รายการใน Python
static PyObject *foo_add_subtract(PyObject *self, PyObject *args) {
int a;
int b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("ii", a + b, a - b);
}
นี่คือสิ่งที่ดูเหมือนว่าถ้าใช้ใน Python -
def add_subtract(a, b):
return (a + b, a - b)
Py_BuildValueฟังก์ชั่น
นี่คือลายเซ็นมาตรฐานสำหรับ Py_BuildValue ฟังก์ชัน -
PyObject* Py_BuildValue(char* format,...)
รูปแบบที่นี่คือสตริง C ที่อธิบายถึงวัตถุ Python ที่จะสร้าง อาร์กิวเมนต์ของPy_BuildValueต่อไปนี้คือค่า C ที่สร้างผลลัพธ์ PyObject *ผลคือการอ้างอิงใหม่
ตารางต่อไปนี้แสดงรายการสตริงรหัสที่ใช้กันทั่วไปซึ่งรวมศูนย์หรือมากกว่าในรูปแบบสตริง
รหัส | ประเภท C | ความหมาย |
---|---|---|
ค | ถ่าน | AC char กลายเป็นสตริง Python ที่มีความยาว 1 |
ง | สองเท่า | AC double จะกลายเป็น Python float |
ฉ | ลอย | ลูกลอย AC กลายเป็นลูกลอย Python |
ผม | int | AC int กลายเป็น Python int |
ล | ยาว | AC ยาวกลายเป็น Python int |
น | PyObject * | ส่งผ่านวัตถุ Python และขโมยข้อมูลอ้างอิง |
โอ | PyObject * | ส่งผ่านวัตถุ Python และเพิ่มขึ้นตามปกติ |
O & | แปลง + โมฆะ * | การแปลงโดยพลการ |
เอส | ถ่าน * | C 0 สิ้นสุด char * เป็นสตริง Python หรือ NULL ถึง None |
s # | ถ่าน * + int | C char * และความยาวเป็นสตริง Python หรือ NULL ถึง None |
ยู | Py_UNICODE * | C-wide สตริงที่สิ้นสุดด้วย null เป็น Python Unicode หรือ NULL ถึง None |
ยู# | Py_UNICODE * + int | สตริงกว้าง C และความยาวเป็น Python Unicode หรือ NULL ถึง None |
w # | ถ่าน * + int | อ่าน / เขียนบัฟเฟอร์ส่วนเดียวไปยังที่อยู่ C และความยาว |
z | ถ่าน * | เช่นเดียวกับ s ยอมรับว่าไม่มี (ตั้งค่า C char * เป็น NULL) |
z # | ถ่าน * + int | เช่นเดียวกับ s # ยอมรับว่าไม่มี (ตั้งค่า C char * เป็น NULL) |
(... ) | ตาม ... | สร้าง Python tuple จากค่า C |
[... ] | ตาม ... | สร้างรายการ Python จากค่า C |
{... } | ตาม ... | สร้างพจนานุกรม Python จากค่า C สลับคีย์และค่า |
รหัส {... } สร้างพจนานุกรมจากค่า C จำนวนคู่สลับกันระหว่างคีย์และค่า ตัวอย่างเช่น Py_BuildValue ("{issi}", 23, "zig", "zag", 42) จะส่งคืนพจนานุกรมเช่น {23: 'zig', 'zag': 42} ของ Python