Python 3 - Hướng dẫn nhanh

Mô-đun __future__

Python 3.x đã giới thiệu một số từ khóa và tính năng không tương thích với Python 2 có thể được nhập qua mô-đun __future__ được tích hợp sẵn trong Python 2. Bạn nên sử dụng nhập __future__, nếu bạn đang lên kế hoạch hỗ trợ Python 3.x cho mã của mình.

Ví dụ: nếu chúng ta muốn hành vi chia số nguyên của Python 3.x trong Python 2, hãy thêm câu lệnh nhập sau.

from __future__ import division

Chức năng in

Thay đổi đáng chú ý nhất và được biết đến rộng rãi nhất trong Python 3 là cách printchức năng được sử dụng. Sử dụng dấu ngoặc đơn () với hàm in hiện là bắt buộc. Nó là tùy chọn trong Python 2.

print "Hello World" #is acceptable in Python 2
print ("Hello World") # in Python 3, print must be followed by ()

Theo mặc định, hàm print () sẽ chèn một dòng mới vào cuối. Trong Python 2, nó có thể được ngăn chặn bằng cách đặt ',' vào cuối. Trong Python 3, "end = ''" thêm dấu cách thay vì dòng mới.

print x,           # Trailing comma suppresses newline in Python 2
print(x, end=" ")  # Appends a space instead of a newline in Python 3

Đọc đầu vào từ bàn phím

Python 2 có hai phiên bản hàm đầu vào, input()raw_input(). Hàm input () xử lý dữ liệu nhận được dưới dạng chuỗi nếu nó được bao gồm trong dấu ngoặc kép '' hoặc "", nếu không, dữ liệu được coi là số.

Trong Python 3, hàm raw_input () không được dùng nữa. Hơn nữa, dữ liệu nhận được luôn được coi là chuỗi.

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

Bộ phận số nguyên

Trong Python 2, kết quả của phép chia hai số nguyên được làm tròn thành số nguyên gần nhất. Kết quả là, 3/2 sẽ hiển thị 1. Để có được phép chia dấu phẩy động, tử số hoặc mẫu số phải được sử dụng rõ ràng như float. Do đó, 3.0 / 2 hoặc 3 / 2.0 hoặc 3.0 / 2.0 sẽ dẫn đến 1.5

Python 3 đánh giá 3/2 là 1.5 theo mặc định, điều này trực quan hơn cho các lập trình viên mới.

Biểu diễn Unicode

Python 2 yêu cầu bạn đánh dấu một chuỗi bằng au nếu bạn muốn lưu trữ nó dưới dạng Unicode.

Python 3 lưu trữ các chuỗi dưới dạng Unicode, theo mặc định. Chúng ta có chuỗi Unicode (utf-8) và 2 lớp byte: mảng byte và mảng byte.

xrange () Hàm đã bị loại bỏ

Trong Python 2, phạm vi () trả về một danh sách và xrange () trả về một đối tượng sẽ chỉ tạo các mục trong phạm vi khi cần thiết, tiết kiệm bộ nhớ.

Trong Python 3, hàm range () bị loại bỏ và xrange () đã được đổi tên thành range (). Ngoài ra, đối tượng range () hỗ trợ cắt trong Python 3.2 trở lên.

nêu ra ngoại lệ

Python 2 chấp nhận cả hai ký hiệu, cú pháp 'cũ' và 'mới'; Python 3 gây ra lỗi SyntaxError nếu chúng ta không đặt đối số ngoại lệ trong dấu ngoặc đơn.

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

Đối số trong Ngoại lệ

Trong Python 3, các đối số cho ngoại lệ phải được khai báo bằng từ khóa 'as'.

except Myerror, err: # In Python2
except Myerror as err: #In Python 3

Hàm next () và phương thức .next ()

Trong Python 2, cho phép next () như một phương thức của đối tượng trình tạo. Trong Python 2, hàm next (), để lặp qua đối tượng trình tạo, cũng được chấp nhận. Tuy nhiên, trong Python 3, tiếp theo (0 như một phương thức trình tạo bị ngừng và tăng 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

Tiện ích 2to3

Cùng với trình thông dịch Python 3, tập lệnh 2to3.py thường được cài đặt trong thư mục công cụ / tập lệnh. Nó đọc mã nguồn Python 2.x và áp dụng một loạt các trình sửa lỗi để biến nó thành mã Python 3.x hợp lệ.

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 là một ngôn ngữ kịch bản cấp cao, được thông dịch, tương tác và hướng đối tượng. Python được thiết kế để dễ đọc. Nó sử dụng từ khóa tiếng Anh thường xuyên trong khi các ngôn ngữ khác sử dụng dấu chấm câu. Nó có ít cấu trúc cú pháp hơn các ngôn ngữ khác.

  • Python is Interpreted- Python được xử lý trong thời gian chạy bởi trình thông dịch. Bạn không cần phải biên dịch chương trình của mình trước khi thực thi nó. Điều này tương tự với PERL và PHP.

  • Python is Interactive - Bạn thực sự có thể ngồi trước lời nhắc Python và tương tác trực tiếp với trình thông dịch để viết chương trình của mình.

  • Python is Object-Oriented - Python hỗ trợ kiểu hướng đối tượng hoặc kỹ thuật lập trình đóng gói mã bên trong các đối tượng.

  • Python is a Beginner's Language - Python là một ngôn ngữ tuyệt vời cho các lập trình viên mới bắt đầu và hỗ trợ phát triển một loạt các ứng dụng từ xử lý văn bản đơn giản đến trình duyệt WWW đến trò chơi.

Lịch sử của Python

Python được phát triển bởi Guido van Rossum vào cuối những năm 80 và đầu những năm 90 tại Viện Nghiên cứu Quốc gia về Toán học và Khoa học Máy tính ở Hà Lan.

  • Python có nguồn gốc từ nhiều ngôn ngữ khác, bao gồm ABC, Modula-3, C, C ++, Algol-68, SmallTalk và Unix shell và các ngôn ngữ script khác.

  • Python có bản quyền. Giống như Perl, mã nguồn Python hiện có sẵn theo Giấy phép Công cộng GNU (GPL).

  • Python hiện được duy trì bởi một nhóm phát triển cốt lõi tại viện, mặc dù Guido van Rossum vẫn giữ một vai trò quan trọng trong việc định hướng sự phát triển của nó.

  • Python 1.0 được phát hành vào tháng 11 năm 1994. Năm 2000, Python 2.0 được phát hành. Python 2.7.11 là phiên bản mới nhất của Python 2.

  • Trong khi đó, Python 3.0 được phát hành vào năm 2008. Python 3 không tương thích ngược với Python 2. Trọng tâm trong Python 3 là loại bỏ các cấu trúc và mô-đun lập trình trùng lặp để "Nên có một - và tốt nhất là chỉ một - cách rõ ràng để làm điều đó. " Python 3.5.1 là phiên bản mới nhất của Python 3.

Các tính năng của Python

Các tính năng của Python bao gồm:

  • Easy-to-learn- Python có ít từ khóa, cấu trúc đơn giản và cú pháp được xác định rõ ràng. Điều này cho phép học sinh tiếp thu ngôn ngữ nhanh chóng.

  • Easy-to-read - Mã Python được xác định rõ ràng hơn và có thể nhìn thấy bằng mắt.

  • Easy-to-maintain - Mã nguồn của Python khá dễ bảo trì.

  • A broad standard library - Phần lớn thư viện của Python rất di động và tương thích đa nền tảng trên UNIX, Windows và Macintosh.

  • Interactive Mode - Python có hỗ trợ chế độ tương tác cho phép kiểm tra tương tác và gỡ lỗi các đoạn mã.

  • Portable - Python có thể chạy trên nhiều nền tảng phần cứng và có giao diện giống nhau trên tất cả các nền tảng.

  • Extendable- Bạn có thể thêm các mô-đun cấp thấp vào trình thông dịch Python. Các mô-đun này cho phép các lập trình viên thêm vào hoặc tùy chỉnh các công cụ của họ để hiệu quả hơn.

  • Databases - Python cung cấp giao diện cho tất cả các cơ sở dữ liệu thương mại lớn.

  • GUI Programming - Python hỗ trợ các ứng dụng GUI có thể được tạo và chuyển sang nhiều lệnh gọi hệ thống, thư viện và hệ thống cửa sổ, chẳng hạn như Windows MFC, Macintosh và hệ thống X Window của Unix.

  • Scalable - Python cung cấp một cấu trúc tốt hơn và hỗ trợ cho các chương trình lớn hơn so với kịch bản shell.

Ngoài các tính năng nêu trên, Python có một danh sách lớn các tính năng tốt. Một, một số được liệt kê dưới đây -

  • Nó hỗ trợ các phương pháp lập trình có cấu trúc và chức năng cũng như OOP.

  • Nó có thể được sử dụng như một ngôn ngữ kịch bản hoặc có thể được biên dịch thành mã byte để xây dựng các ứng dụng lớn.

  • Nó cung cấp các kiểu dữ liệu động cấp rất cao và hỗ trợ kiểm tra kiểu động.

  • Nó hỗ trợ thu gom rác tự động.

  • Nó có thể dễ dàng tích hợp với C, C ++, COM, ActiveX, CORBA và Java.

Python 3 có sẵn cho Windows, Mac OS và hầu hết các phiên bản của hệ điều hành Linux. Mặc dù Python 2 có sẵn cho nhiều hệ điều hành khác, hỗ trợ Python 3 vẫn chưa được cung cấp cho chúng hoặc đã bị loại bỏ.

Thiết lập môi trường cục bộ

Mở cửa sổ dòng lệnh và nhập "python" để tìm hiểu xem nó đã được cài đặt chưa và phiên bản nào đã được cài đặt.

Bắt Python

Nền tảng Windows

Các bản thảo của phiên bản mới nhất của Python 3 (Python 3.5.1) có sẵn trên trang tải xuống này

Các tùy chọn cài đặt khác nhau sau đây có sẵn.

  • Tệp zip có thể nhúng Windows x86-64
  • Trình cài đặt thực thi Windows x86-64
  • Trình cài đặt dựa trên web Windows x86-64
  • Tệp zip có thể nhúng Windows x86
  • Trình cài đặt thực thi Windows x86
  • Trình cài đặt dựa trên web Windows x86

Note- Để cài đặt Python 3.5.1, yêu cầu hệ điều hành tối thiểu là Windows 7 với SP1. Đối với phiên bản 3.0 đến 3.4.x Windows XP có thể chấp nhận được.

Nền tảng Linux

Các hương vị khác nhau của Linux sử dụng các trình quản lý gói khác nhau để cài đặt các gói mới.

Trên Ubuntu Linux, Python 3 được cài đặt bằng lệnh sau từ thiết bị đầu cuối.

$sudo apt-get install python3-minimal

Cài đặt từ nguồn

Tải xuống tarball mã nguồn Gzipped từ URL tải xuống của 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

hệ điều hành Mac

Tải xuống trình cài đặt Mac OS từ URL này - https://www.python.org/downloads/mac-osx/

  • Trình cài đặt Mac OS X 64-bit / 32-bit - python-3.5.1-macosx10.6.pkg
  • Trình cài đặt Mac OS X 32-bit i386 / PPC - python-3.5.1-macosx10.5.pkg

Nhấp đúp vào tệp gói này và làm theo hướng dẫn của trình hướng dẫn để cài đặt.

Mã nguồn, mã nhị phân, tài liệu, tin tức, v.v. cập nhật và mới nhất hiện có trên trang web chính thức của Python -

Python Official Website - https://www.python.org/

Bạn có thể tải xuống tài liệu Python từ trang web sau. Tài liệu có sẵn ở các định dạng HTML, PDF và PostScript.

Python Documentation Website- www.python.org/doc/

Thiết lập PATH

Chương trình và các tệp thực thi khác có thể nằm trong nhiều thư mục. Do đó, hệ điều hành cung cấp một đường dẫn tìm kiếm liệt kê các thư mục mà nó tìm kiếm các tệp thực thi.

Các tính năng quan trọng là -

  • Đường dẫn được lưu trữ trong một biến môi trường, là một chuỗi có tên được duy trì bởi hệ điều hành. Biến này chứa thông tin có sẵn cho trình bao lệnh và các chương trình khác.

  • Biến đường dẫn được đặt tên là PATH trong Unix hoặc Path trong Windows (Unix phân biệt chữ hoa chữ thường; Windows thì không).

  • Trong Mac OS, trình cài đặt xử lý chi tiết đường dẫn. Để gọi trình thông dịch Python từ bất kỳ thư mục cụ thể nào, bạn phải thêm thư mục Python vào đường dẫn của mình.

Thiết lập đường dẫn tại Unix / Linux

Để thêm thư mục Python vào đường dẫn cho một phiên cụ thể trong Unix -

  • In the csh shell - gõ setenv PATH "$ PATH: / usr / local / bin / python3" và nhấn Enter.

  • In the bash shell (Linux) - gõ export PYTHONPATH = / usr / local / bin / python3.4 và nhấn Enter.

  • In the sh or ksh shell - gõ PATH = "$ PATH: / usr / local / bin / python3" và nhấn Enter.

Note - / usr / local / bin / python3 là đường dẫn của thư mục Python.

Thiết lập đường dẫn trên Windows

Để thêm thư mục Python vào đường dẫn cho một phiên cụ thể trong Windows -

  • At the command prompt - gõ đường dẫn% path%; C: \ Python và nhấn Enter.

Note - C: \ Python là đường dẫn của thư mục Python

Biến môi trường Python

Dưới đây là các biến môi trường quan trọng, được Python công nhận:

Sr.No. Biến & Mô tả
1

PYTHONPATH

Nó có vai trò tương tự như PATH. Biến này cho trình thông dịch Python biết vị trí các tệp mô-đun được nhập vào một chương trình. Nó phải bao gồm thư mục thư viện nguồn Python và các thư mục chứa mã nguồn Python. PYTHONPATH đôi khi được cài đặt trước bởi trình cài đặt Python.

2

PYTHONSTARTUP

Nó chứa đường dẫn của một tệp khởi tạo chứa mã nguồn Python. Nó được thực thi mỗi khi bạn khởi động trình thông dịch. Nó được đặt tên là .pythonrc.py trong Unix và nó chứa các lệnh tải các tiện ích hoặc sửa đổi PYTHONPATH.

3

PYTHONCASEOK

Nó được sử dụng trong Windows để hướng dẫn Python tìm kết quả khớp không phân biệt chữ hoa chữ thường đầu tiên trong một câu lệnh nhập. Đặt biến này thành bất kỳ giá trị nào để kích hoạt nó.

4

PYTHONHOME

Nó là một đường dẫn tìm kiếm mô-đun thay thế. Nó thường được nhúng trong thư mục PYTHONSTARTUP hoặc PYTHONPATH để giúp chuyển đổi thư viện mô-đun dễ dàng.

Chạy Python

Có ba cách khác nhau để bắt đầu Python:

Phiên dịch tương tác

Bạn có thể khởi động Python từ Unix, DOS hoặc bất kỳ hệ thống nào khác cung cấp cho bạn trình thông dịch dòng lệnh hoặc cửa sổ trình bao.

Đi vào python dòng lệnh.

Bắt đầu viết mã ngay trong trình thông dịch tương tác.

$python             # Unix/Linux
or
python%             # Unix/Linux
or
C:>python           # Windows/DOS

Đây là danh sách tất cả các tùy chọn dòng lệnh có sẵn:

Sr.No. Tùy chọn & Mô tả
1

-d

cung cấp đầu ra gỡ lỗi

2

-O

tạo bytecode được tối ưu hóa (dẫn đến các tệp .pyo)

3

-S

không chạy trang web nhập để tìm đường dẫn Python khi khởi động

4

-v

đầu ra chi tiết (theo dõi chi tiết trên báo cáo nhập khẩu)

5

-X

vô hiệu hóa các ngoại lệ tích hợp dựa trên lớp (chỉ sử dụng chuỗi); lỗi thời bắt đầu từ phiên bản 1.6

6

-c cmd

chạy tập lệnh Python được gửi dưới dạng chuỗi cmd

7

file

chạy tập lệnh Python từ tệp đã cho

Tập lệnh từ dòng lệnh

Một tập lệnh Python có thể được thực thi tại dòng lệnh bằng cách gọi trình thông dịch trên ứng dụng của bạn, như được hiển thị trong ví dụ sau.

$python  script.py          # Unix/Linux
or
python% script.py           # Unix/Linux
or 
C:>python script.py         # Windows/DOS

Note - Đảm bảo chế độ cho phép tệp cho phép thực thi.

Môi trường phát triển tích hợp

Bạn cũng có thể chạy Python từ môi trường Giao diện người dùng đồ họa (GUI), nếu bạn có ứng dụng GUI trên hệ thống của mình hỗ trợ Python.

  • Unix - IDLE là Unix IDE đầu tiên dành cho Python.

  • Windows - PythonWin là giao diện Windows đầu tiên dành cho Python và là một IDE có GUI.

  • Macintosh - Phiên bản Python của Macintosh cùng với IDLE IDE có sẵn trên trang web chính, có thể tải xuống dưới dạng tệp MacBinary hoặc BinHex'd.

Nếu bạn không thể thiết lập môi trường đúng cách, bạn có thể nhờ sự trợ giúp của quản trị viên hệ thống của mình. Đảm bảo rằng môi trường Python được thiết lập đúng cách và hoạt động hoàn toàn tốt.

Note - Tất cả các ví dụ được đưa ra trong các chương tiếp theo được thực thi với phiên bản Python 3.4.1 có sẵn trên Windows 7 và Ubuntu Linux.

Chúng tôi đã thiết lập môi trường Lập trình Python trực tuyến, để bạn có thể thực thi tất cả các ví dụ có sẵn trực tuyến trong khi học lý thuyết. Vui lòng sửa đổi bất kỳ ví dụ nào và thực hiện trực tuyến.

Ngôn ngữ Python có nhiều điểm tương đồng với Perl, C và Java. Tuy nhiên, có một số khác biệt nhất định giữa các ngôn ngữ.

Chương trình Python đầu tiên

Hãy để chúng tôi thực thi các chương trình trong các chế độ lập trình khác nhau.

Lập trình chế độ tương tác

Gọi trình thông dịch mà không truyền tệp kịch bản làm tham số sẽ đưa ra lời nhắc sau:

$ 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.
>>>

Nhập văn bản sau vào lời nhắc Python và nhấn Enter -

>>> print ("Hello, Python!")

Nếu bạn đang chạy phiên bản Python cũ hơn (Python 2.x), hãy sử dụng dấu ngoặc đơn như inprintchức năng là tùy chọn. Điều này tạo ra kết quả sau:

Hello, Python!

Lập trình chế độ tập lệnh

Việc gọi trình thông dịch với một tham số tập lệnh bắt đầu thực thi tập lệnh và tiếp tục cho đến khi tập lệnh kết thúc. Khi tập lệnh kết thúc, trình thông dịch không còn hoạt động.

Hãy để chúng tôi viết một chương trình Python đơn giản trong một tập lệnh. Các tệp Python có phần mở rộng.py. Nhập mã nguồn sau vào tệp test.py -

print ("Hello, Python!")

Chúng tôi giả định rằng bạn đã đặt trình thông dịch Python trong PATHBiến đổi. Bây giờ, hãy thử chạy chương trình này như sau:

On Linux

$ python test.py

Điều này tạo ra kết quả sau:

Hello, Python!

On Windows

C:\Python34>Python test.py

Điều này tạo ra kết quả sau:

Hello, Python!

Hãy để chúng tôi thử một cách khác để thực thi một tập lệnh Python trong Linux. Đây là tệp test.py đã sửa đổi -

#!/usr/bin/python3
print ("Hello, Python!")

Chúng tôi giả định rằng bạn có sẵn trình thông dịch Python trong thư mục / usr / bin. Bây giờ, hãy thử chạy chương trình này như sau:

$ chmod +x test.py # This is to make file executable $./test.py

Điều này tạo ra kết quả sau:

Hello, Python!

Số nhận dạng Python

Định danh Python là tên được sử dụng để xác định một biến, hàm, lớp, mô-đun hoặc đối tượng khác. Mã định danh bắt đầu bằng chữ cái A đến Z hoặc từ a đến z hoặc dấu gạch dưới (_) theo sau là không hoặc nhiều chữ cái, dấu gạch dưới và chữ số (0 đến 9).

Python không cho phép các ký tự dấu câu như @, $ và% trong các mã định danh. Python là một ngôn ngữ lập trình phân biệt chữ hoa chữ thường. Vì vậy,Manpowermanpower là hai mã định danh khác nhau trong Python.

Dưới đây là các quy ước đặt tên cho số nhận dạng Python:

  • Tên lớp bắt đầu bằng một chữ cái viết hoa. Tất cả các số nhận dạng khác bắt đầu bằng một chữ cái viết thường.

  • Bắt đầu một số nhận dạng với một dấu gạch dưới ở đầu cho biết rằng số nhận dạng là riêng tư.

  • Bắt đầu một số nhận dạng với hai dấu gạch dưới ở đầu cho biết một số nhận dạng riêng tư mạnh.

  • Nếu số nhận dạng cũng kết thúc bằng hai dấu gạch dưới ở cuối thì số nhận dạng là tên đặc biệt do ngôn ngữ xác định.

Từ dành riêng

Danh sách sau đây hiển thị các từ khóa Python. Đây là những từ dành riêng và bạn không thể sử dụng chúng làm hằng số hoặc biến hoặc bất kỳ tên định danh nào khác. Tất cả các từ khóa Python chỉ chứa các chữ cái thường.

người thực thi không phải
như cuối cùng hoặc là
khẳng định cho vượt qua
phá vỡ từ in
lớp học toàn cầu nâng cao
tiếp tục nếu trở về
phản đối nhập khẩu thử
del trong trong khi
elif với
khác lambda năng suất
ngoại trừ

Dòng và thụt lề

Python không sử dụng dấu ngoặc nhọn ({}) để chỉ ra các khối mã cho định nghĩa lớp và hàm hoặc điều khiển luồng. Các khối mã được biểu thị bằng cách thụt lề dòng, được thực thi nghiêm ngặt.

Số lượng khoảng trắng trong thụt lề có thể thay đổi, nhưng tất cả các câu lệnh trong khối phải được thụt vào cùng một lượng. Ví dụ -

if True:
   print ("True")

else:
   print ("False")

Tuy nhiên, khối sau tạo ra lỗi:

if True:
   print ("Answer")
   print ("True")

else:
   print "(Answer")
   print ("False")

Do đó, trong Python, tất cả các dòng liên tục được thụt lề với cùng số khoảng trắng sẽ tạo thành một khối. Ví dụ sau có các khối câu lệnh khác nhau:

Note- Đừng cố gắng hiểu logic vào thời điểm này. Chỉ cần đảm bảo rằng bạn hiểu các khối khác nhau ngay cả khi chúng không có dấu ngoặc nhọn.

#!/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)

Tuyên bố nhiều dòng

Các câu lệnh trong Python thường kết thúc bằng một dòng mới. Tuy nhiên, Python cho phép sử dụng ký tự tiếp tục dòng (\) để biểu thị rằng dòng sẽ tiếp tục. Ví dụ -

total = item_one + \
        item_two + \
        item_three

Các câu lệnh nằm trong dấu ngoặc [], {} hoặc () không cần sử dụng ký tự tiếp tục dòng. Ví dụ -

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']

Trích dẫn bằng Python

Python chấp nhận các dấu ngoặc kép ('), kép (") và ba (' '' hoặc" "") để biểu thị các ký tự của chuỗi, miễn là cùng một loại dấu ngoặc kép bắt đầu và kết thúc chuỗi.

Dấu ngoặc kép được sử dụng để kéo dài chuỗi trên nhiều dòng. Ví dụ: tất cả những điều sau đây đều hợp pháp -

word = 'word'
sentence = "This is a sentence."
paragraph = """This is a paragraph. It is
made up of multiple lines and sentences."""

Nhận xét bằng Python

Một dấu thăng (#) không nằm trong một chuỗi ký tự là phần đầu của một nhận xét. Tất cả các ký tự sau dấu #, cho đến cuối dòng vật lý, là một phần của nhận xét và trình thông dịch Python bỏ qua chúng.

#!/usr/bin/python3

# First comment
print ("Hello, Python!") # second comment

Điều này tạo ra kết quả sau:

Hello, Python!

Bạn có thể nhập nhận xét trên cùng một dòng sau một câu lệnh hoặc biểu thức -

name = "Madisetti" # This is again comment

Python không có tính năng bình luận nhiều dòng. Bạn phải nhận xét từng dòng riêng lẻ như sau:

# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.

Sử dụng dòng trống

Một dòng chỉ chứa khoảng trắng, có thể kèm theo chú thích, được gọi là dòng trống và Python hoàn toàn bỏ qua nó.

Trong phiên thông dịch tương tác, bạn phải nhập một dòng vật lý trống để kết thúc một câu lệnh nhiều dòng.

Đang chờ người dùng

Dòng sau của chương trình hiển thị lời nhắc và câu nói “Nhấn phím enter để thoát”, sau đó đợi người dùng thực hiện hành động -

#!/usr/bin/python3

input("\n\nPress the enter key to exit.")

Ở đây, "\ n \ n" được sử dụng để tạo hai dòng mới trước khi hiển thị dòng thực. Khi người dùng nhấn phím, chương trình sẽ kết thúc. Đây là một thủ thuật hay để giữ cho cửa sổ bảng điều khiển mở cho đến khi người dùng sử dụng xong một ứng dụng.

Nhiều câu lệnh trên một dòng

Dấu chấm phẩy (;) cho phép nhiều câu lệnh trên một dòng cho trước mà không câu lệnh nào bắt đầu một khối mã mới. Đây là đoạn trích mẫu sử dụng dấu chấm phẩy -

import sys; x = 'foo'; sys.stdout.write(x + '\n')

Nhiều nhóm câu lệnh dưới dạng bộ

Các nhóm câu lệnh riêng lẻ, tạo nên một khối mã duy nhất được gọi là suitesbằng Python. Các câu lệnh phức hợp hoặc phức tạp, chẳng hạn như if, while, def và class yêu cầu một dòng tiêu đề và một bộ.

Các dòng tiêu đề bắt đầu câu lệnh (với từ khóa) và kết thúc bằng dấu hai chấm (:) và được theo sau bởi một hoặc nhiều dòng tạo nên bộ. Ví dụ -

if expression : 
   suite
elif expression : 
   suite 
else : 
   suite

Đối số dòng lệnh

Nhiều chương trình có thể được chạy để cung cấp cho bạn một số thông tin cơ bản về cách chúng nên được chạy. Python cho phép bạn làm điều này với -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. ]

Bạn cũng có thể lập trình tập lệnh của mình theo cách mà nó phải chấp nhận các tùy chọn khác nhau. Đối số dòng lệnh là một chủ đề nâng cao. Hãy để chúng tôi hiểu nó.

Các biến không là gì ngoài các vị trí bộ nhớ dành riêng để lưu trữ các giá trị. Có nghĩa là khi bạn tạo một biến, bạn dành một số không gian trong bộ nhớ.

Dựa trên kiểu dữ liệu của một biến, trình thông dịch phân bổ bộ nhớ và quyết định những gì có thể được lưu trữ trong bộ nhớ dành riêng. Do đó, bằng cách gán các kiểu dữ liệu khác nhau cho các biến, bạn có thể lưu trữ số nguyên, số thập phân hoặc ký tự trong các biến này.

Gán giá trị cho các biến

Các biến Python không cần khai báo rõ ràng để dành không gian bộ nhớ. Việc khai báo xảy ra tự động khi bạn gán giá trị cho một biến. Dấu bằng (=) dùng để gán giá trị cho các biến.

Toán hạng ở bên trái của toán tử = là tên của biến và toán hạng ở bên phải của toán tử = là giá trị được lưu trữ trong biến. Ví dụ -

#!/usr/bin/python3

counter = 100          # An integer assignment
miles   = 1000.0       # A floating point
name    = "John"       # A string

print (counter)
print (miles)
print (name)

Ở đây, 100, 1000.0 và "John" là những giá trị được gán cho quầy, dặm, và các biến tên tương ứng. Điều này tạo ra kết quả sau:

100
1000.0
John

Nhiều nhiệm vụ

Python cho phép bạn chỉ định một giá trị duy nhất cho một số biến đồng thời.

Ví dụ -

a = b = c = 1

Ở đây, một đối tượng số nguyên được tạo với giá trị 1 và tất cả ba biến được gán cho cùng một vị trí bộ nhớ. Bạn cũng có thể gán nhiều đối tượng cho nhiều biến. Ví dụ -

a, b, c = 1, 2, "john"

Ở đây, hai đối tượng số nguyên có giá trị 1 và 2 lần lượt được gán cho các biến a và b, và một đối tượng chuỗi có giá trị "john" được gán cho biến c.

Loại dữ liệu chuẩn

Dữ liệu được lưu trong bộ nhớ có thể có nhiều loại. Ví dụ: tuổi của một người được lưu trữ dưới dạng giá trị số và địa chỉ của người đó được lưu trữ dưới dạng ký tự chữ và số. Python có nhiều kiểu dữ liệu tiêu chuẩn khác nhau được sử dụng để xác định các hoạt động có thể có trên chúng và phương pháp lưu trữ cho từng kiểu dữ liệu đó.

Python có năm kiểu dữ liệu tiêu chuẩn -

  • Numbers
  • String
  • List
  • Tuple
  • Dictionary

Số Python

Kiểu dữ liệu số lưu trữ các giá trị số. Đối tượng số được tạo khi bạn gán giá trị cho chúng. Ví dụ -

var1 = 1
var2 = 10

Bạn cũng có thể xóa tham chiếu đến một đối tượng số bằng cách sử dụng deltuyên bố. Cú pháp củadel tuyên bố là -

del var1[,var2[,var3[....,varN]]]]

Bạn có thể xóa một đối tượng hoặc nhiều đối tượng bằng cách sử dụng del tuyên bố.

Ví dụ -

del var
del var_a, var_b

Python hỗ trợ ba kiểu số khác nhau -

  • int (số nguyên có dấu)
  • float (giá trị thực dấu phẩy động)
  • phức tạp (số phức)

Tất cả các số nguyên trong Python3 được biểu diễn dưới dạng số nguyên dài. Do đó, không có loại số riêng biệt miễn là.

Ví dụ

Dưới đây là một số ví dụ về số -

int Phao nổi phức tạp
10 0,0 3,14j
100 15,20 45.j
-786 -21,9 9.322e-36j
080 32,3 + e18 .876j
-0490 -90. -.6545 + 0J
-0x260 -32,54e100 3e + 26J
0x69 70,2-E12 4,53e-7j

Số phức bao gồm một cặp số thực dấu phẩy động có thứ tự được ký hiệu là x + yj, trong đó x và y là các số thực và j là đơn vị ảo.

Chuỗi Python

Các chuỗi trong Python được xác định là một tập hợp các ký tự liền nhau được thể hiện trong dấu ngoặc kép. Python cho phép một cặp dấu nháy đơn hoặc dấu ngoặc kép. Các tập hợp con của chuỗi có thể được sử dụng bằng toán tử lát cắt ([] và [:]) với các chỉ mục bắt đầu từ 0 ở đầu chuỗi và hoạt động theo cách của chúng từ -1 đến cuối.

Dấu cộng (+) là toán tử nối chuỗi và dấu hoa thị (*) là toán tử lặp. Ví dụ -

#!/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

Điều này sẽ tạo ra kết quả sau:

Hello World!
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST

Danh sách Python

Danh sách là kiểu dữ liệu phức hợp linh hoạt nhất của Python. Một danh sách chứa các mục được phân tách bằng dấu phẩy và được đặt trong dấu ngoặc vuông ([]). Ở một mức độ nào đó, danh sách tương tự như mảng trong C. Một trong những điểm khác biệt giữa chúng là tất cả các mục thuộc một danh sách có thể có kiểu dữ liệu khác nhau.

Các giá trị được lưu trữ trong danh sách có thể được truy cập bằng toán tử lát cắt ([] và [:]) với các chỉ mục bắt đầu từ 0 ở đầu danh sách và hoạt động theo cách của chúng đến kết thúc -1. Dấu cộng (+) là toán tử nối danh sách và dấu hoa thị (*) là toán tử lặp. Ví dụ -

#!/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

Điều này tạo ra kết quả sau:

['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

Tuple là một kiểu dữ liệu chuỗi khác tương tự như danh sách. Một bộ giá trị bao gồm một số giá trị được phân tách bằng dấu phẩy. Tuy nhiên, không giống như danh sách, các bộ giá trị được đặt trong dấu ngoặc đơn.

Sự khác biệt chính giữa danh sách và bộ giá trị là - Danh sách được đặt trong dấu ngoặc ([]) và các phần tử cũng như kích thước của chúng có thể được thay đổi, trong khi bộ giá trị được đặt trong dấu ngoặc đơn (()) và không thể cập nhật. Tuples có thể được coi làread-onlydanh sách. Ví dụ -

#!/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

Điều này tạo ra kết quả sau:

('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')

Mã sau không hợp lệ với tuple, vì chúng tôi đã cố cập nhật một tuple, điều này không được phép. Trường hợp tương tự cũng có thể xảy ra với các danh sách -

#!/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

Từ điển Python

Các từ điển của Python là loại bảng băm. Chúng hoạt động giống như các mảng hoặc hàm băm kết hợp được tìm thấy trong Perl và bao gồm các cặp khóa-giá trị. Khóa từ điển có thể là bất kỳ loại Python nào, nhưng thường là số hoặc chuỗi. Mặt khác, giá trị có thể là bất kỳ đối tượng Python tùy ý nào.

Các từ điển được bao bởi dấu ngoặc nhọn ({}) và các giá trị có thể được gán và truy cập bằng cách sử dụng dấu ngoặc vuông ([]). Ví dụ -

#!/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

Điều này tạo ra kết quả sau:

This is one
This is two
{'name': 'john', 'dept': 'sales', 'code': 6734}
dict_keys(['name', 'dept', 'code'])
dict_values(['john', 'sales', 6734])

Từ điển không có khái niệm về thứ tự giữa các yếu tố. Không chính xác khi nói rằng các phần tử là "không theo trật tự"; chúng chỉ đơn giản là không có thứ tự.

Chuyển đổi loại dữ liệu

Đôi khi, bạn có thể cần thực hiện chuyển đổi giữa các loại được tích hợp sẵn. Để chuyển đổi giữa các kiểu, bạn chỉ cần sử dụng tên kiểu như một hàm.

Có một số hàm tích hợp để thực hiện chuyển đổi từ kiểu dữ liệu này sang kiểu dữ liệu khác. Các hàm này trả về một đối tượng mới đại diện cho giá trị được chuyển đổi.

Sr.No. Mô tả chức năng
1

int(x [,base])

Chuyển x thành số nguyên. Cơ sở xác định cơ sở nếu x là một chuỗi.

2

float(x)

Chuyển x thành số dấu phẩy động.

3

complex(real [,imag])

Tạo một số phức.

4

str(x)

Chuyển đổi đối tượng x thành biểu diễn chuỗi.

5

repr(x)

Chuyển đổi đối tượng x thành một chuỗi biểu thức.

6

eval(str)

Đánh giá một chuỗi và trả về một đối tượng.

7

tuple(s)

Chuyển đổi s thành một bộ giá trị.

số 8

list(s)

Chuyển đổi s thành một danh sách.

9

set(s)

Chuyển đổi s thành một tập hợp.

10

dict(d)

Tạo từ điển. d phải là một chuỗi các bộ giá trị (khóa, giá trị).

11

frozenset(s)

Chuyển đổi s thành tập hợp cố định.

12

chr(x)

Chuyển đổi một số nguyên thành một ký tự.

13

unichr(x)

Chuyển đổi một số nguyên thành một ký tự Unicode.

14

ord(x)

Chuyển đổi một ký tự thành giá trị nguyên của nó.

15

hex(x)

Chuyển đổi một số nguyên thành một chuỗi thập lục phân.

16

oct(x)

Chuyển đổi một số nguyên thành một chuỗi bát phân.

Toán tử là các cấu trúc, có thể thao tác giá trị của các toán hạng. Xét biểu thức 4 + 5 = 9. Ở đây, 4 và 5 được gọi là toán hạng và + được gọi là toán tử.

Các loại nhà điều hành

Ngôn ngữ Python hỗ trợ các loại toán tử sau:

  • Toán tử số học
  • Toán tử so sánh (quan hệ)
  • Người điều hành nhiệm vụ
  • Toán tử logic
  • Toán tử Bitwise
  • Nhà điều hành thành viên
  • Nhà điều hành danh tính

Hãy để chúng tôi xem xét tất cả các toán tử một.

Toán tử số học Python

Giả sử biến a giữ giá trị 10 và biến b giữ giá trị 21, sau đó -

Hiển thị ví dụ

Nhà điều hành Sự miêu tả Thí dụ
+ Bổ sung Thêm giá trị vào hai bên của toán tử. a + b = 31
- Phép trừ Trừ toán hạng bên phải khỏi toán hạng bên trái. a - b = -11
* Phép nhân Nhân các giá trị ở hai bên của toán tử a * b = 210
/ Bộ phận Chia toán hạng bên trái cho toán hạng bên phải b / a = 2,1
% Mô-đun Chia toán hạng bên trái cho toán hạng bên phải và trả về phần dư b% a = 1
** Số mũ Thực hiện phép tính lũy thừa (lũy thừa) trên các toán tử a ** b = 10 thành lũy thừa 20
// Phân chia tầng - Sự phân chia các toán hạng trong đó kết quả là thương số trong đó các chữ số sau dấu thập phân bị loại bỏ. Nhưng nếu một trong các toán hạng là số âm, thì kết quả sẽ được làm tròn, tức là, được làm tròn từ 0 (về phía âm vô cùng): 9 // 2 = 4 và 9.0 // 2.0 = 4.0, -11 // 3 = -4, -11.0 // 3 = -4.0

Toán tử so sánh Python

Các toán tử này so sánh các giá trị ở hai bên của chúng và quyết định mối quan hệ giữa chúng. Chúng còn được gọi là toán tử quan hệ.

Giả sử biến a giữ giá trị 10 và biến b giữ giá trị 20, sau đó -

Hiển thị ví dụ

Nhà điều hành Sự miêu tả Thí dụ
== Nếu giá trị của hai toán hạng bằng nhau thì điều kiện trở thành true. (a == b) không đúng.
! = Nếu giá trị của hai toán hạng không bằng nhau thì điều kiện trở thành true. (a! = b) là đúng.
> Nếu giá trị của toán hạng bên trái lớn hơn giá trị của toán hạng bên phải, thì điều kiện trở thành true. (a> b) không đúng.
< Nếu giá trị của toán hạng bên trái nhỏ hơn giá trị của toán hạng bên phải, thì điều kiện trở thành true. (a <b) là đúng.
> = Nếu giá trị của toán hạng bên trái lớn hơn hoặc bằng giá trị của toán hạng bên phải, thì điều kiện trở thành true. (a> = b) không đúng.
<= Nếu giá trị của toán hạng bên trái nhỏ hơn hoặc bằng giá trị của toán hạng bên phải, thì điều kiện trở thành true. (a <= b) là đúng.

Toán tử gán trong Python

Giả sử biến a giữ giá trị 10 và biến b giữ giá trị 20, sau đó -

Hiển thị ví dụ

Nhà điều hành Sự miêu tả Thí dụ
= Gán giá trị từ toán hạng bên phải cho toán hạng bên trái c = a + b gán giá trị của a + b vào c
+ = Thêm AND Nó thêm toán hạng bên phải vào toán hạng bên trái và gán kết quả cho toán hạng bên trái c + = a tương đương với c = c + a
- = Trừ AND Nó trừ toán hạng bên phải khỏi toán hạng bên trái và gán kết quả cho toán hạng bên trái c - = a tương đương với c = c - a
* = Nhân AND Nó nhân toán hạng bên phải với toán hạng bên trái và gán kết quả cho toán hạng bên trái c * = a tương đương với c = c * a
/ = Chia AND Nó chia toán hạng bên trái với toán hạng bên phải và gán kết quả cho toán hạng bên trái c / = a tương đương với c = c / ac / = a tương đương với c = c / a
% = Mô-đun AND Cần mô đun bằng cách sử dụng hai toán hạng và gán kết quả cho toán hạng bên trái c% = a tương đương với c = c% a
** = Số mũ AND Thực hiện phép tính lũy thừa (lũy thừa) trên các toán tử và gán giá trị cho toán hạng bên trái c ** = a tương đương với c = c ** a
// = Phân chia tầng Nó thực hiện phân chia tầng trên các toán tử và gán giá trị cho toán hạng bên trái c // = a tương đương với c = c // a

Toán tử Bitwise Python

Toán tử bitwise hoạt động trên các bit và thực hiện hoạt động từng bit. Giả sử nếu a = 60; và b = 13; Bây giờ ở định dạng nhị phân, chúng sẽ như sau:

a = 0011 1100

b = 0000 1101

-----------------

a & b = 0000 1100

a | b = 0011 1101

a ^ b = 0011 0001

~ a = 1100 0011

Hàm bin () tích hợp của Python có thể được sử dụng để lấy biểu diễn nhị phân của một số nguyên.

Các toán tử Bitwise sau được ngôn ngữ Python hỗ trợ:

Hiển thị ví dụ

Nhà điều hành Sự miêu tả Thí dụ
& Binary AND Toán tử sao chép một bit vào kết quả, nếu nó tồn tại trong cả hai toán hạng (a & b) (nghĩa là 0000 1100)
| Nhị phân HOẶC Nó sao chép một chút, nếu nó tồn tại trong một trong hai toán hạng. (a | b) = 61 (nghĩa là 0011 1101)
^ XOR nhị phân Nó sao chép bit, nếu nó được đặt trong một toán hạng nhưng không phải cả hai. (a ^ b) = 49 (nghĩa là 0011 0001)
~ Bổ sung số nhị phân Nó là một ngôi và có tác dụng 'lật' các bit. (~ a) = -61 (có nghĩa là 1100 0011 ở dạng phần bù của 2 do một số nhị phân có dấu.
<< Dịch chuyển sang trái nhị phân Giá trị của toán hạng bên trái được di chuyển sang trái bằng số bit được chỉ định bởi toán hạng bên phải. a << 2 = 240 (nghĩa là 1111 0000)
>> Dịch chuyển phải nhị phân Giá trị của toán hạng bên trái được di chuyển sang phải bằng số bit được chỉ định bởi toán hạng bên phải. a >> 2 = 15 (nghĩa là 0000 1111)

Toán tử logic Python

Các toán tử logic sau được ngôn ngữ Python hỗ trợ. Giả sử biếna giữ True và biến b giữ Sai thì -

Hiển thị ví dụ

Nhà điều hành Sự miêu tả Thí dụ
và logic AND Nếu cả hai toán hạng đều đúng thì điều kiện trở thành đúng. (a và b) là Sai.
hoặc logic HOẶC Nếu bất kỳ toán hạng nào trong hai toán hạng khác 0 thì điều kiện trở thành true. (a hoặc b) là Đúng.
không logic KHÔNG Được sử dụng để đảo ngược trạng thái logic của toán hạng của nó. Không phải (a và b) là True.

Các nhà khai thác tư cách thành viên Python

Các toán tử thành viên của Python kiểm tra tư cách thành viên trong một chuỗi, chẳng hạn như chuỗi, danh sách hoặc bộ giá trị. Có hai nhà khai thác thành viên như được giải thích bên dưới:

Hiển thị ví dụ

Nhà điều hành Sự miêu tả Thí dụ
trong Đánh giá thành true nếu nó tìm thấy một biến trong chuỗi đã chỉ định và false nếu không. x trong y, ở đây kết quả là 1 nếu x là thành viên của dãy y.
không có trong Đánh giá thành true nếu nó không tìm thấy một biến trong chuỗi được chỉ định và nếu không thì là false. x không thuộc y, ở đây không cho kết quả là 1 nếu x không phải là thành viên của dãy y.

Toán tử nhận dạng Python

Toán tử nhận dạng so sánh vị trí bộ nhớ của hai đối tượng. Có hai toán tử Identity như được giải thích bên dưới -

Hiển thị ví dụ

Nhà điều hành Sự miêu tả Thí dụ
Đánh giá thành true nếu các biến ở hai bên của toán tử trỏ đến cùng một đối tượng và false nếu ngược lại. x là y, đây is kết quả là 1 nếu id (x) bằng id (y).
không phải Đánh giá thành false nếu các biến ở hai bên của toán tử trỏ đến cùng một đối tượng và true nếu ngược lại. x không phải là y, ở đây is not kết quả là 1 nếu id (x) không bằng id (y).

Các toán tử Python ưu tiên

Bảng sau đây liệt kê tất cả các toán tử từ ưu tiên cao nhất đến thấp nhất.

Hiển thị ví dụ

Sr.No. Nhà điều hành & Mô tả
1

**

Luỹ thừa (nâng lên lũy thừa)

2

~ + -

Phần bù, cộng và trừ một bậc (tên phương thức cho hai phần cuối là + @ và - @)

3

* / % //

Nhân, chia, modulo và chia tầng

4

+ -

Cộng và trừ

5

>> <<

Dịch chuyển theo chiều bit phải và trái

6

&

Bitwise 'VÀ'

7

^ |

Bitwise độc ​​quyền 'OR' và thông thường 'OR'

số 8

<= < > >=

Toán tử so sánh

9

<> == !=

Toán tử bình đẳng

10

= %= /= //= -= += *= **=

Toán tử chuyển nhượng

11

is is not

Toán tử nhận dạng

12

in not in

Nhà điều hành thành viên

13

not or and

Toán tử logic

Ra quyết định là dự đoán các điều kiện xảy ra trong quá trình thực hiện một chương trình và các hành động cụ thể được thực hiện theo các điều kiện.

Cấu trúc quyết định đánh giá nhiều biểu thức, tạo ra kết quả là TRUE hoặc FALSE. Bạn cần xác định hành động nào cần thực hiện và câu lệnh nào sẽ thực hiện nếu kết quả là TRUE hoặc FALSE nếu ngược lại.

Sau đây là dạng chung của cấu trúc ra quyết định điển hình được tìm thấy trong hầu hết các ngôn ngữ lập trình:

Ngôn ngữ lập trình Python giả định bất kỳ non-zeronon-null giá trị TRUE và bất kỳ zero hoặc là null values dưới dạng giá trị FALSE.

Ngôn ngữ lập trình Python cung cấp các loại câu lệnh ra quyết định sau.

Sr.No. Tuyên bố & Mô tả
1 câu lệnh if

An if statement bao gồm một biểu thức boolean theo sau bởi một hoặc nhiều câu lệnh.

2 câu lệnh if ... else

An if statement có thể được theo sau bởi một tùy chọn else statement, thực thi khi biểu thức boolean là FALSE.

3 câu lệnh if lồng nhau

Bạn có thể sử dụng một if hoặc là else if tuyên bố bên trong khác if hoặc là else if các câu lệnh).

Hãy để chúng tôi đi qua từng tuyên bố ra quyết định một cách nhanh chóng.

Bộ sao kê đơn

Nếu bộ của một if mệnh đề chỉ bao gồm một dòng duy nhất, nó có thể đi cùng dòng với câu lệnh tiêu đề.

Thí dụ

Đây là một ví dụ về one-line if mệnh đề -

#!/usr/bin/python3

var = 100
if ( var  == 100 ) : print ("Value of expression is 100")
print ("Good bye!")

Đầu ra

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Value of expression is 100
Good bye!

Nói chung, các câu lệnh được thực hiện tuần tự - Câu lệnh đầu tiên trong một hàm được thực hiện trước tiên, tiếp theo là câu lệnh thứ hai, v.v. Có thể có một tình huống khi bạn cần thực thi một khối mã nhiều lần.

Các ngôn ngữ lập trình cung cấp các cấu trúc điều khiển khác nhau cho phép các đường dẫn thực thi phức tạp hơn.

Một câu lệnh lặp cho phép chúng ta thực hiện một câu lệnh hoặc một nhóm câu lệnh nhiều lần. Sơ đồ sau minh họa một câu lệnh lặp:

Ngôn ngữ lập trình Python cung cấp các loại vòng lặp sau để xử lý các yêu cầu về lặp.

Sr.No. Loại vòng lặp & Mô tả
1 trong khi lặp lại

Lặp lại một câu lệnh hoặc một nhóm câu lệnh trong khi một điều kiện đã cho là ĐÚNG. Nó kiểm tra điều kiện trước khi thực thi phần thân của vòng lặp.

2 vòng lặp for

Thực thi một chuỗi các câu lệnh nhiều lần và viết tắt mã quản lý biến vòng lặp.

3 vòng lồng nhau

Bạn có thể sử dụng một hoặc nhiều vòng lặp bên trong bất kỳ vòng lặp while hoặc for khác.

Tuyên bố kiểm soát vòng lặp

Các câu lệnh điều khiển vòng lặp thay đổi việc thực thi từ trình tự bình thường của nó. Khi việc thực thi rời khỏi một phạm vi, tất cả các đối tượng tự động được tạo trong phạm vi đó sẽ bị phá hủy.

Python hỗ trợ các câu lệnh điều khiển sau.

Sr.No. Tuyên bố & Mô tả Kiểm soát
1 tuyên bố ngắt

Kết thúc câu lệnh vòng lặp và chuyển việc thực thi câu lệnh ngay sau vòng lặp.

2 tiếp tục tuyên bố

Làm cho vòng lặp bỏ qua phần còn lại của phần thân và ngay lập tức kiểm tra lại tình trạng của nó trước khi nhắc lại.

3 câu lệnh vượt qua

Câu lệnh pass trong Python được sử dụng khi một câu lệnh được yêu cầu về mặt cú pháp nhưng bạn không muốn bất kỳ lệnh hoặc mã nào thực thi.

Chúng ta hãy xem qua các câu lệnh điều khiển vòng lặp một cách ngắn gọn.

Trình tạo lặp và Trình tạo

Iteratorlà một đối tượng cho phép lập trình viên duyệt qua tất cả các phần tử của một tập hợp, bất kể việc triển khai cụ thể của nó là gì. Trong Python, một đối tượng trình vòng lặp thực hiện hai phương thức,iter()next().

Các đối tượng String, List hoặc Tuple có thể được sử dụng để tạo một 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

A generator là một hàm tạo ra hoặc mang lại một chuỗi giá trị bằng cách sử dụng phương pháp lợi nhuận.

Khi một hàm tạo được gọi, nó sẽ trả về một đối tượng tạo mà thậm chí không bắt đầu thực hiện hàm. Khi phương thức next () được gọi lần đầu tiên, hàm bắt đầu thực thi cho đến khi nó đạt đến câu lệnh lợi nhuận, câu lệnh này sẽ trả về giá trị được tạo ra. Lợi nhuận theo dõi tức là ghi nhớ lần thực hiện cuối cùng và lần gọi next () thứ hai tiếp tục từ giá trị trước đó.

Thí dụ

Ví dụ sau đây xác định một trình tạo, tạo một trình lặp cho tất cả các số Fibonacci.

#!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()

Kiểu dữ liệu số lưu trữ các giá trị số. Chúng là kiểu dữ liệu bất biến. Điều này có nghĩa là, việc thay đổi giá trị của kiểu dữ liệu số dẫn đến một đối tượng mới được cấp phát.

Đối tượng số được tạo khi bạn gán giá trị cho chúng. Ví dụ -

var1 = 1
var2 = 10

Bạn cũng có thể xóa tham chiếu đến một đối tượng số bằng cách sử dụng deltuyên bố. Cú pháp củadel tuyên bố là -

del var1[,var2[,var3[....,varN]]]]

Bạn có thể xóa một đối tượng hoặc nhiều đối tượng bằng cách sử dụng deltuyên bố. Ví dụ -

del var
del var_a, var_b

Python hỗ trợ các kiểu số khác nhau -

  • int (signed integers) - Chúng thường chỉ được gọi là số nguyên hoặc ints. Chúng là các số nguyên dương hoặc âm không có dấu thập phân. Số nguyên trong Python 3 có kích thước không giới hạn. Python 2 có hai kiểu số nguyên - int và long. Không có 'long integer'trong Python 3 nữa.

  • float (floating point real values)- Còn được gọi là số thực, chúng biểu diễn các số thực và được viết bằng dấu thập phân chia phần nguyên và phần phân số. Dấu phẩy cũng có thể ở dạng ký hiệu khoa học, với E hoặc e biểu thị lũy thừa của 10 (2,5e2 = 2,5 x 10 2 = 250).

  • complex (complex numbers)- có dạng a + bJ, trong đó a và b là số thực và J (hoặc j) đại diện cho căn bậc hai của -1 (là một số ảo). Phần thực của số là a và phần ảo là b. Số phức không được sử dụng nhiều trong lập trình Python.

Có thể biểu diễn một số nguyên ở dạng thập lục phân hoặc bát phân

>>> number = 0xA0F #Hexa-decimal
>>> number
2575

>>> number = 0o37 #Octal
>>> number
31

Ví dụ

Dưới đây là một số ví dụ về các con số.

int Phao nổi phức tạp
10 0,0 3,14j
100 15,20 45.j
-786 -21,9 9.322e-36j
080 32,3 + e18 .876j
-0490 -90. -.6545 + 0J
-0 × 260 -32,54e100 3e + 26J
0 × 69 70,2-E12 4,53e-7j

Số phức bao gồm một cặp số thực dấu phẩy động có thứ tự được ký hiệu là a + bj, trong đó a là phần thực và b là phần ảo của số phức.

Chuyển đổi loại số

Python chuyển đổi các số bên trong một biểu thức có chứa các kiểu hỗn hợp thành một kiểu chung để đánh giá. Đôi khi, bạn cần ép buộc một số rõ ràng từ kiểu này sang kiểu khác để thỏa mãn các yêu cầu của tham số toán tử hoặc hàm.

  • Kiểu int(x) để chuyển x thành một số nguyên thuần túy.

  • Kiểu long(x) để chuyển x thành một số nguyên dài.

  • Kiểu float(x) để chuyển x thành số dấu phẩy động.

  • Kiểu complex(x) để chuyển x thành số phức với phần thực x và phần ảo bằng 0.

  • Kiểu complex(x, y)để chuyển x và y thành một số phức với phần thực x và phần ảo y. x và y là biểu thức số

Các hàm toán học

Python bao gồm các hàm sau để thực hiện các phép tính toán học.

Sr.No. Chức năng & Trả về (Mô tả)
1 abs (x)

Giá trị tuyệt đối của x: khoảng cách (dương) giữa x và 0.

2 ceil (x)

Mức trần của x: số nguyên nhỏ nhất không nhỏ hơn x.

3

cmp(x, y)

-1 nếu x <y, 0 nếu x == y hoặc 1 nếu x> y. Deprecated trong Python 3. Thay vào đó hãy sử dụng return (x>y)-(x<y).

4 exp (x)

Cấp số nhân của x: e x

5 fabs (x)

Giá trị tuyệt đối của x.

6 tầng (x)

Tầng của x: số nguyên lớn nhất không lớn hơn x.

7 log (x)

Lôgarit tự nhiên của x, với x> 0.

số 8 log10 (x)

Lôgarit cơ số 10 của x với x> 0.

9 tối đa (x1, x2, ...)

Đối số lớn nhất của nó: giá trị gần nhất với dương vô cùng

10 tối thiểu (x1, x2, ...)

Giá trị nhỏ nhất trong số các đối số của nó: giá trị gần nhất với âm vô cùng.

11 modf (x)

Phần phân số và phần nguyên của x trong một bộ hai mục. Cả hai phần đều có cùng dấu là x. Phần nguyên được trả về dưới dạng số thực.

12 pow (x, y)

Giá trị của x ** y.

13 vòng (x [, n])

xđược làm tròn đến n chữ số từ dấu thập phân. Python làm tròn từ 0 với tư cách là một tie-breaker: vòng (0,5) là 1,0 và vòng (-0,5) là -1,0.

14 sqrt (x)

Căn bậc hai của x với x> 0.

Hàm số ngẫu nhiên

Số ngẫu nhiên được sử dụng cho các ứng dụng trò chơi, mô phỏng, thử nghiệm, bảo mật và quyền riêng tư. Python bao gồm các hàm sau đây thường được sử dụng.

Sr.No. Mô tả chức năng
1 sự lựa chọn (seq)

Một mục ngẫu nhiên từ một danh sách, bộ hoặc chuỗi.

2 randrange ([bắt đầu,] dừng [, bước])

Một phần tử được chọn ngẫu nhiên từ phạm vi (bắt đầu, dừng, bước).

3 ngẫu nhiên ()

Một số thực ngẫu nhiên r, sao cho 0 nhỏ hơn hoặc bằng r và r nhỏ hơn 1

4 hạt giống ([x])

Đặt giá trị bắt đầu số nguyên được sử dụng để tạo số ngẫu nhiên. Gọi hàm này trước khi gọi bất kỳ hàm mô-đun ngẫu nhiên nào khác. Trả về Không có.

5 xáo trộn (lst)

Sắp xếp ngẫu nhiên các mục của một danh sách. Trả về Không có.

6 đồng phục (x, y)

Một số thực ngẫu nhiên r, sao cho x nhỏ hơn hoặc bằng r và r nhỏ hơn y.

Hàm lượng giác

Python bao gồm các hàm sau để thực hiện các phép tính lượng giác.

Sr.No. Mô tả chức năng
1 acos (x)

Trả về cosin cung của x, tính bằng radian.

2 asin (x)

Trả về sin cung của x, tính bằng radian.

3 atan (x)

Trả về tiếp tuyến cung của x, tính bằng radian.

4 atan2 (y, x)

Trả về atan (y / x), tính bằng radian.

5 cos (x)

Trả về cosin của x radian.

6 giả thuyết (x, y)

Trả về định mức Euclide, sqrt (x * x + y * y).

7 sin (x)

Trả về sin của x radian.

số 8 tan (x)

Trả về tiếp tuyến của x radian.

9 độ (x)

Chuyển đổi góc x từ radian sang độ.

10 radian (x)

Chuyển đổi góc x từ độ sang radian.

Hằng số toán học

Mô-đun cũng xác định hai hằng số toán học -

Sr.No. Hằng số & Mô tả
1

pi

Hằng số toán học pi.

2

e

Hằng số toán học e.

Chuỗi là một trong những loại phổ biến nhất trong Python. Chúng ta có thể tạo chúng đơn giản bằng cách đặt các ký tự trong dấu ngoặc kép. Python xử lý các dấu ngoặc kép giống như dấu ngoặc kép. Tạo chuỗi cũng đơn giản như gán giá trị cho một biến. Ví dụ -

var1 = 'Hello World!'
var2 = "Python Programming"

Truy cập giá trị trong chuỗi

Python không hỗ trợ kiểu ký tự; chúng được coi là chuỗi có độ dài một, do đó cũng được coi là chuỗi con.

Để truy cập các chuỗi con, hãy sử dụng dấu ngoặc vuông để cắt cùng với chỉ mục hoặc chỉ số để lấy chuỗi con của bạn. Ví dụ -

#!/usr/bin/python3

var1 = 'Hello World!'
var2 = "Python Programming"

print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

var1[0]:  H
var2[1:5]:  ytho

Cập nhật chuỗi

Bạn có thể "cập nhật" một chuỗi hiện có bằng cách (lại) gán một biến cho một chuỗi khác. Giá trị mới có thể liên quan đến giá trị trước đó của nó hoặc với một chuỗi hoàn toàn khác. Ví dụ -

#!/usr/bin/python3

var1 = 'Hello World!'
print ("Updated String :- ", var1[:6] + 'Python')

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Updated String :-  Hello Python

Nhân vật thoát

Bảng sau là danh sách các ký tự thoát hoặc không in được có thể được biểu diễn bằng ký hiệu dấu gạch chéo ngược.

Một nhân vật trốn thoát được giải thích; trong một trích dẫn đơn cũng như các chuỗi trích dẫn kép.

Ký hiệu gạch chéo ngược Ký tự thập lục phân Sự miêu tả
\ a 0x07 Chuông hoặc cảnh báo
\ b 0x08 Backspace
\ cx Control-x
\ Cx Control-x
\ e 0x1b Bỏ trốn
\ f 0x0c Thức ăn dạng
\ M- \ Cx Meta-Control-x
\ n 0x0a Dòng mới
\ nnn Ký hiệu bát phân, trong đó n nằm trong phạm vi 0,7
\ r 0x0d Vận chuyển trở lại
\S 0x20 Không gian
\ t 0x09 Chuyển hướng
\ v 0x0b Tab dọc
\ x Nhân vật x
\ xnn Ký hiệu thập lục phân, trong đó n nằm trong phạm vi 0,9, af hoặc AF

Chuỗi toán tử đặc biệt

Giả sử biến chuỗi a giữ 'Xin chào' và biến b giữ 'Python', sau đó -

Nhà điều hành Sự miêu tả Thí dụ
+ Nối - Thêm các giá trị ở hai bên của toán tử a + b sẽ cho HelloPython
* Lặp lại - Tạo chuỗi mới, nối nhiều bản sao của cùng một chuỗi a * 2 sẽ cung cấp - Xin chào
[] Slice - Cung cấp cho nhân vật từ chỉ số nhất định a [1] sẽ cho e
[:] Range Slice - Cung cấp các ký tự từ phạm vi đã cho a [1: 4] sẽ cho ell
trong Tư cách thành viên - Trả về true nếu một ký tự tồn tại trong chuỗi đã cho H in a will give 1
không có trong Tư cách thành viên - Trả về true nếu một ký tự không tồn tại trong chuỗi đã cho M not in a will give 1
r / R Chuỗi thô - Loại bỏ ý nghĩa thực tế của các ký tự Escape. Cú pháp cho chuỗi thô hoàn toàn giống như đối với chuỗi thông thường, ngoại trừ toán tử chuỗi thô, ký tự "r" đứng trước dấu ngoặc kép. Chữ "r" có thể là chữ thường (r) hoặc chữ hoa (R) và phải được đặt ngay trước dấu ngoặc kép đầu tiên. in r '\ n' bản in \ n và in R '\ n' bản in \ n
% Định dạng - Thực hiện định dạng chuỗi Xem ở phần tiếp theo

Toán tử định dạng chuỗi

Một trong những tính năng thú vị nhất của Python là toán tử định dạng chuỗi%. Toán tử này là duy nhất cho các chuỗi và bù đắp cho gói có các hàm từ họ printf () của C. Sau đây là một ví dụ đơn giản -

#!/usr/bin/python3

print ("My name is %s and weight is %d kg!" % ('Zara', 21))

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

My name is Zara and weight is 21 kg!

Đây là danh sách tập hợp đầy đủ các ký hiệu có thể được sử dụng cùng với% -

Sr.No. Định dạng Biểu tượng & Chuyển đổi
1

%c

tính cách

2

%s

chuyển đổi chuỗi qua str () trước khi định dạng

3

%i

số nguyên thập phân có dấu

4

%d

số nguyên thập phân có dấu

5

%u

số nguyên thập phân không dấu

6

%o

số nguyên bát phân

7

%x

số nguyên thập lục phân (chữ thường)

số 8

%X

số nguyên thập lục phân (chữ cái UPPERcase)

9

%e

ký hiệu hàm mũ (với chữ thường 'e')

10

%E

ký hiệu hàm mũ (với UPPERcase 'E')

11

%f

số thực dấu phẩy động

12

%g

ngắn hơn% f và% e

13

%G

ngắn hơn% f và% E

Các biểu tượng và chức năng được hỗ trợ khác được liệt kê trong bảng sau:

Sr.No. Biểu tượng & Chức năng
1

*

đối số chỉ định chiều rộng hoặc độ chính xác

2

-

lời biện minh trái

3

+

hiển thị dấu hiệu

4

<sp>

để trống trước một số dương

5

#

thêm số 0 ở đầu bát phân ('0') hoặc '0x' hoặc '0X' ở đầu thập lục phân, tùy thuộc vào việc sử dụng 'x' hay 'X'.

6

0

pad từ bên trái với các số không (thay vì dấu cách)

7

%

'%%' để lại cho bạn một chữ '%' duy nhất

số 8

(var)

biến ánh xạ (đối số từ điển)

9

m.n.

m là tổng chiều rộng tối thiểu và n là số chữ số hiển thị sau dấu thập phân (nếu ứng dụng)

Báo giá gấp ba

Dấu ngoặc kép của Python được giải cứu bằng cách cho phép các chuỗi kéo dài nhiều dòng, bao gồm nguyên văn NEWLINEs, TAB và bất kỳ ký tự đặc biệt nào khác.

Cú pháp cho dấu ngoặc kép bao gồm ba dấu ngoặc kép liên tiếp single or double dấu ngoặc kép.

#!/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)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả như sau. Lưu ý cách mọi ký tự đặc biệt đã được chuyển đổi thành dạng in của nó, ngay đến NEWLINE cuối cùng ở cuối chuỗi giữa "lên". và đóng dấu ngoặc kép. Cũng lưu ý rằng NEWLINEs xảy ra với dấu xuống dòng rõ ràng ở cuối dòng hoặc mã thoát của nó (\ 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.

Các chuỗi thô không coi dấu gạch chéo ngược là một ký tự đặc biệt. Mọi ký tự bạn đưa vào một chuỗi thô vẫn theo cách bạn đã viết -

#!/usr/bin/python3

print ('C:\\nowhere')

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

C:\nowhere

Bây giờ chúng ta hãy sử dụng chuỗi thô. Chúng tôi sẽ đưa biểu thức vàor'expression' như sau -

#!/usr/bin/python3

print (r'C:\\nowhere')

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

C:\\nowhere

Chuỗi Unicode

Trong Python 3, tất cả các chuỗi được biểu diễn bằng Unicode, trong Python 2 được lưu trữ bên trong dưới dạng ASCII 8-bit, do đó cần phải đính kèm 'u' để tạo thành Unicode. Nó không còn cần thiết bây giờ.

Phương thức chuỗi tích hợp

Python bao gồm các phương thức tích hợp sau để thao tác các chuỗi:

Sr.No. Phương pháp & Mô tả
1 viết hoa ()

Viết hoa chữ cái đầu tiên của chuỗi

2 trung tâm (chiều rộng, lấp đầy)

Trả về một chuỗi được đệm bằng fillchar với chuỗi ban đầu được căn giữa thành tổng số cột chiều rộng .

3 count (str, xin = 0, end = len (string))

Đếm số lần str xuất hiện trong chuỗi hoặc trong một chuỗi con của chuỗi nếu chỉ mục bắt đầu xin phép và kết thúc chỉ mục kết thúc được đưa ra.

4 giải mã (mã hóa = 'UTF-8', lỗi = 'nghiêm ngặt')

Giải mã chuỗi bằng codec đã đăng ký để mã hóa. mã hóa mặc định thành mã hóa chuỗi mặc định.

5 mã hóa (mã hóa = 'UTF-8', lỗi = 'nghiêm ngặt')

Trả về phiên bản chuỗi được mã hóa của chuỗi; về lỗi, mặc định là tăng ValueError trừ khi lỗi được đưa ra bằng 'bỏ qua' hoặc 'thay thế'.

6 endwith (hậu tố, xin = 0, end = len (chuỗi))

Xác định xem chuỗi hoặc một chuỗi con của chuỗi (nếu chỉ mục bắt đầu cầu xin và kết thúc chỉ mục kết thúc được đưa ra) kết thúc bằng hậu tố; trả về true nếu vậy và false nếu không.

7 expandtabs (kích thước tab = 8)

Mở rộng các tab trong chuỗi thành nhiều khoảng trắng; mặc định là 8 khoảng trắng cho mỗi tab nếu kích thước tab không được cung cấp.

số 8 find (str, xin = 0 end = len (string))

Xác định xem str xảy ra trong chuỗi hay trong một chuỗi con của chuỗi nếu chỉ mục bắt đầu cầu xin và kết thúc chỉ mục kết thúc được trả về chỉ số nếu tìm thấy và -1 nếu ngược lại.

9 index (str, xin = 0, end = len (string))

Tương tự như find (), nhưng tăng một ngoại lệ nếu không tìm thấy str.

10 isalnum ()

Trả về true nếu chuỗi có ít nhất 1 ký tự và tất cả các ký tự đều là chữ và số và ngược lại là false.

11 isalpha ()

Trả về true nếu chuỗi có ít nhất 1 ký tự và tất cả các ký tự đều là bảng chữ cái và ngược lại là false.

12 isdigit ()

Trả về true nếu chuỗi chỉ chứa các chữ số và trả về false nếu không.

13 thấp hơn()

Trả về true nếu chuỗi có ít nhất 1 ký tự được viết hoa và tất cả các ký tự được viết hoa đều là chữ thường và ngược lại là false.

14 isnumeric ()

Trả về true nếu một chuỗi unicode chỉ chứa các ký tự số và trả về false nếu ngược lại.

15 isspace ()

Trả về true nếu chuỗi chỉ chứa các ký tự khoảng trắng và ngược lại là false.

16 istitle ()

Trả về true nếu chuỗi được đặt đúng "titlecased" và false nếu không.

17 isupper ()

Trả về true nếu chuỗi có ít nhất một ký tự được viết hoa và tất cả các ký tự được viết hoa đều là chữ hoa và ngược lại là false.

18 tham gia (seq)

Hợp nhất (nối) các biểu diễn chuỗi của các phần tử trong chuỗi seq thành một chuỗi, với chuỗi phân cách.

19 len (string)

Trả về độ dài của chuỗi

20 ljust (chiều rộng [, lấp đầy])

Trả về một chuỗi có đệm dấu cách với chuỗi ban đầu được căn trái cho tổng số cột chiều rộng.

21 thấp hơn()

Chuyển đổi tất cả các chữ hoa trong chuỗi thành chữ thường.

22 lstrip ()

Loại bỏ tất cả khoảng trắng đầu trong chuỗi.

23 maketrans ()

Trả về một bảng dịch được sử dụng trong chức năng dịch.

24 max (str)

Trả về ký tự chữ cái tối đa từ chuỗi str.

25 min (str)

Trả về ký tự chữ cái min từ chuỗi str.

26 thay thế (cũ, mới [, max])

Thay thế tất cả các lần xuất hiện cũ trong chuỗi bằng các lần xuất hiện mới hoặc nhiều nhất là tối đa nếu số lần xuất hiện tối đa cho trước.

27 rfind (str, xin = 0, end = len (string))

Tương tự như find (), nhưng tìm kiếm ngược trong chuỗi.

28 rindex (str, xin = 0, end = len (string))

Tương tự như index (), nhưng tìm kiếm ngược trong chuỗi.

29 điều chỉnh (chiều rộng, [, fillchar])

Trả về một chuỗi có đệm dấu cách với chuỗi ban đầu được căn phải cho tổng số cột chiều rộng.

30 rstrip ()

Loại bỏ tất cả khoảng trắng ở cuối của chuỗi.

31 split (str = "", num = string.count (str))

Tách chuỗi theo dấu phân cách str (khoảng trắng nếu không được cung cấp) và trả về danh sách các chuỗi con; chia thành nhiều nhất num chuỗi con nếu đã cho.

32 đường phân chia (num = string.count ('\ n'))

Tách toàn bộ chuỗi (hoặc số) NEWLINEs và trả về danh sách từng dòng đã loại bỏ NEWLINEs.

33 startwith (str, xin = 0, end = len (string))

Xác định nếu chuỗi hoặc một chuỗi con của chuỗi (nếu chỉ mục bắt đầu cầu xin và kết thúc chỉ mục kết thúc được đưa ra) bắt đầu bằng chuỗi con str; trả về true nếu vậy và false nếu không.

34 dải ([ký tự])

Thực hiện cả lstrip () và rstrip () trên chuỗi

35 swapcase ()

Đảo ngược trường hợp cho tất cả các chữ cái trong chuỗi.

36 tiêu đề()

Trả về phiên bản "in titlecased" của chuỗi, nghĩa là tất cả các từ bắt đầu bằng chữ hoa và phần còn lại là chữ thường.

37 dịch (bảng, deletechars = "")

Dịch chuỗi theo bảng dịch str (256 ký tự), loại bỏ các ký tự trong chuỗi del.

38 phía trên()

Chuyển đổi chữ thường trong chuỗi thành chữ hoa.

39 zfill (chiều rộng)

Trả về chuỗi ban đầu được đánh dấu bằng số 0 cho tổng số ký tự chiều rộng; dành cho các số, zfill () giữ lại bất kỳ dấu nào đã cho (ít hơn một số không).

40 isdecimal ()

Trả về true nếu một chuỗi unicode chỉ chứa các ký tự thập phân và ngược lại là false.

Cấu trúc dữ liệu cơ bản nhất trong Python là sequence. Mỗi phần tử của một dãy được gán một số - vị trí hoặc chỉ số của nó. Chỉ mục đầu tiên bằng 0, chỉ mục thứ hai là một, v.v.

Python có sáu loại trình tự tích hợp sẵn, nhưng những loại phổ biến nhất là danh sách và bộ dữ liệu, chúng ta sẽ thấy trong hướng dẫn này.

Có một số điều bạn có thể làm với tất cả các loại trình tự. Các hoạt động này bao gồm lập chỉ mục, cắt, thêm, nhân và kiểm tra tư cách thành viên. Ngoài ra, Python có các hàm tích hợp để tìm độ dài của một chuỗi và để tìm các phần tử lớn nhất và nhỏ nhất của nó.

Danh sách Python

Danh sách là kiểu dữ liệu linh hoạt nhất có sẵn trong Python, có thể được viết dưới dạng danh sách các giá trị (mục) được phân tách bằng dấu phẩy giữa các dấu ngoặc vuông. Điều quan trọng về danh sách là các mục trong danh sách không được cùng loại.

Tạo danh sách đơn giản như đặt các giá trị được phân tách bằng dấu phẩy khác nhau giữa các dấu ngoặc vuông. Ví dụ -

list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5 ];
list3 = ["a", "b", "c", "d"];

Tương tự như chỉ số chuỗi, chỉ mục danh sách bắt đầu từ 0 và danh sách có thể được chia nhỏ, nối, v.v.

Truy cập các giá trị trong danh sách

Để truy cập các giá trị trong danh sách, hãy sử dụng dấu ngoặc vuông để cắt cùng với chỉ mục hoặc các chỉ mục để lấy giá trị có sẵn tại chỉ mục đó. Ví dụ -

#!/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])

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

list1[0]:  physics
list2[1:5]:  [2, 3, 4, 5]

Cập nhật danh sách

Bạn có thể cập nhật một hoặc nhiều phần tử của danh sách bằng cách đưa ra lát cắt ở phía bên trái của toán tử gán và bạn có thể thêm vào các phần tử trong danh sách bằng phương thức append (). Ví dụ -

#!/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 - Phương thức append () được thảo luận trong phần tiếp theo.

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Value available at index 2 :  1997
New value available at index 2 :  2001

Xóa phần tử danh sách

Để xóa một phần tử danh sách, bạn có thể sử dụng deltuyên bố nếu bạn biết chính xác (các) phần tử bạn đang xóa. Bạn có thể sử dụng phương thức remove () nếu bạn không biết chính xác mục nào cần xóa. Ví dụ -

#!/usr/bin/python3

list = ['physics', 'chemistry', 1997, 2000]
print (list)

del list[2]
print ("After deleting value at index 2 : ", list)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 :  ['physics', 'chemistry', 2000]

Note - Phương thức remove () được thảo luận trong phần tiếp theo.

Hoạt động danh sách cơ bản

Danh sách phản hồi các toán tử + và * giống như chuỗi; chúng cũng có nghĩa là nối và lặp lại ở đây, ngoại trừ kết quả là một danh sách mới, không phải một chuỗi.

Trên thực tế, danh sách phản hồi tất cả các hoạt động trình tự chung mà chúng ta đã sử dụng trên các chuỗi trong chương trước.

Biểu thức Python Các kết quả Sự miêu tả
len ([1, 2, 3]) 3 Chiều dài
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] Kết nối
['Xin chào!'] * 4 ["Xin chào!", "Xin chào!", "Xin chào!", "Xin chào!"] Sự lặp lại
3 trong [1, 2, 3] Thật Tư cách thành viên
for x in [1,2,3]: print (x, end = '') 1 2 3 Lặp lại

Lập chỉ mục, Cắt lát và Ma trận

Vì danh sách là chuỗi, nên việc lập chỉ mục và phân loại hoạt động giống như cách đối với danh sách cũng như đối với chuỗi.

Giả sử đầu vào sau -

L = ['C++'', 'Java', 'Python']

Biểu thức Python Các kết quả Sự miêu tả
L [2] 'Python' Offsets bắt đầu từ 0
L [-2] 'Java' Phủ định: đếm từ bên phải
L [1:] ['Java', 'Python'] Slicing tìm nạp các phần

Chức năng và phương pháp danh sách tích hợp

Python bao gồm các hàm danh sách sau:

Sr.No. Mô tả chức năng
1 len (danh sách)

Cung cấp tổng độ dài của danh sách.

2 max (danh sách)

Trả về mục từ danh sách với giá trị tối đa.

3 tối thiểu (danh sách)

Trả về mục từ danh sách với giá trị nhỏ nhất.

4 danh sách (seq)

Chuyển đổi một bộ thành danh sách.

Python bao gồm các phương thức danh sách sau:

Sr.No. Phương pháp & Mô tả
1 list.append (obj)

Thêm đối tượng obj vào danh sách

2 list.count (obj)

Trả về số lần đối tượng xuất hiện trong danh sách

3 list.extend (seq)

Thêm nội dung của seq vào danh sách

4 list.index (obj)

Trả về chỉ số thấp nhất trong danh sách mà obj xuất hiện

5 list.insert (chỉ mục, obj)

Chèn đối tượng đối tượng vào danh sách tại chỉ mục bù đắp

6 list.pop (obj = list [-1])

Xóa và trả về đối tượng hoặc đối tượng cuối cùng khỏi danh sách

7 list.remove (obj)

Xóa đối tượng khỏi danh sách

số 8 list.reverse ()

Đảo ngược các đối tượng của danh sách tại chỗ

9 list.sort ([func])

Sắp xếp các đối tượng của danh sách, sử dụng func so sánh nếu cho

Một bộ tuple là một tập hợp các đối tượng có thứ tự và bất biến. Tuples là các chuỗi, giống như danh sách. Sự khác biệt chính giữa các bộ giá trị và các danh sách là các bộ giá trị không thể thay đổi không giống như các danh sách. Các bộ dữ liệu sử dụng dấu ngoặc đơn, trong khi danh sách sử dụng dấu ngoặc vuông.

Việc tạo một bộ giá trị cũng đơn giản như đặt các giá trị được phân tách bằng dấu phẩy khác nhau. Theo tùy chọn, bạn cũng có thể đặt các giá trị được phân tách bằng dấu phẩy này giữa các dấu ngoặc đơn. Ví dụ -

tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"

Bộ giá trị trống được viết dưới dạng hai dấu ngoặc đơn không chứa gì -

tup1 = ();

Để viết một bộ giá trị chứa một giá trị duy nhất, bạn phải bao gồm dấu phẩy, mặc dù chỉ có một giá trị -

tup1 = (50,)

Giống như chỉ số chuỗi, chỉ số tuple bắt đầu từ 0 và chúng có thể được cắt, nối, v.v.

Truy cập giá trị trong Tuples

Để truy cập các giá trị trong bộ tuple, hãy sử dụng dấu ngoặc vuông để cắt cùng với chỉ mục hoặc các chỉ mục để lấy giá trị có sẵn tại chỉ mục đó. Ví dụ -

#!/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])

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

tup1[0]:  physics
tup2[1:5]:  (2, 3, 4, 5)

Đang cập nhật Tuples

Tuple là bất biến, có nghĩa là bạn không thể cập nhật hoặc thay đổi giá trị của các phần tử tuple. Bạn có thể lấy các phần của các bộ giá trị hiện có để tạo các bộ giá trị mới như ví dụ sau minh họa:

#!/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)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

(12, 34.56, 'abc', 'xyz')

Xóa phần tử Tuple

Không thể xóa các phần tử tuple riêng lẻ. Tất nhiên, không có gì sai khi kết hợp một bộ dữ liệu khác với các phần tử không mong muốn bị loại bỏ.

Để loại bỏ rõ ràng toàn bộ tuple, chỉ cần sử dụng deltuyên bố. Ví dụ -

#!/usr/bin/python3

tup = ('physics', 'chemistry', 1997, 2000);

print (tup)
del tup;
print ("After deleting tup : ")
print (tup)

Điều này tạo ra kết quả sau.

Note- Một ngoại lệ được nêu ra. Điều này là do saudel tup, tuple không tồn tại nữa.

('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

Thao tác Tuples cơ bản

Tuples phản hồi các toán tử + và * giống như các chuỗi; chúng cũng có nghĩa là nối và lặp lại ở đây, ngoại trừ kết quả là một bộ giá trị mới, không phải một chuỗi.

Trên thực tế, các bộ giá trị đáp ứng tất cả các hoạt động trình tự chung mà chúng ta đã sử dụng trên các chuỗi trong chương trước.

Biểu thức Python Các kết quả Sự miêu tả
len ((1, 2, 3)) 3 Chiều dài
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) Kết nối
('Xin chào!',) * 4 ("Xin chào!", "Xin chào!", "Xin chào!", "Xin chào!") Sự lặp lại
3 trong (1, 2, 3) Thật Tư cách thành viên
for x in (1,2,3): print (x, end = '') 1 2 3 Lặp lại

Lập chỉ mục, Slicing và Ma trận

Vì các bộ giá trị là các chuỗi, nên việc lập chỉ mục và phân loại hoạt động theo cùng một cách đối với các bộ giá trị như đối với các chuỗi, giả sử đầu vào sau:

T=('C++', 'Java', 'Python')

Biểu thức Python Các kết quả Sự miêu tả
T [2] 'Python' Offsets bắt đầu từ 0
T [-2] 'Java' Phủ định: đếm từ bên phải
T [1:] ('Java', 'Python') Slicing tìm nạp các phần

Không có dấu phân cách bao quanh

Không có Dấu phân cách bao quanh là bất kỳ tập hợp nhiều đối tượng, được phân tách bằng dấu phẩy, được viết mà không có ký hiệu xác định, tức là dấu ngoặc cho danh sách, dấu ngoặc cho bộ giá trị, v.v., mặc định là bộ giá trị, như được chỉ ra trong các ví dụ ngắn này.

Chức năng Tuple Tích hợp

Python bao gồm các hàm tuple sau:

Sr.No. Mô tả chức năng
1 cmp (tuple1, tuple2)

So sánh các phần tử của cả hai bộ giá trị.

2 len (tuple)

Cung cấp tổng chiều dài của tuple.

3 max (tuple)

Trả về mục từ bộ giá trị lớn nhất.

4 min (tuple)

Trả về mục từ bộ giá trị nhỏ nhất.

5 tuple (seq)

Chuyển đổi một danh sách thành nhiều bộ.

Mỗi khóa được phân tách khỏi giá trị của nó bằng dấu hai chấm (:), các mục được phân tách bằng dấu phẩy và toàn bộ khóa được đặt trong dấu ngoặc nhọn. Một từ điển trống không có bất kỳ mục nào được viết chỉ bằng hai dấu ngoặc nhọn, như sau: {}.

Các khóa là duy nhất trong từ điển trong khi các giá trị có thể không. Các giá trị của từ điển có thể thuộc bất kỳ kiểu nào, nhưng các khóa phải thuộc kiểu dữ liệu bất biến như chuỗi, số hoặc bộ giá trị.

Truy cập các giá trị trong từ điển

Để truy cập các phần tử từ điển, bạn có thể sử dụng dấu ngoặc vuông quen thuộc cùng với khóa để lấy giá trị của nó. Sau đây là một ví dụ đơn giản -

#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

dict['Name']:  Zara
dict['Age']:  7

Nếu chúng tôi cố gắng truy cập một mục dữ liệu bằng khóa, không phải là một phần của từ điển, chúng tôi sẽ gặp lỗi như sau:

#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
print ("dict['Alice']: ", dict['Alice'])

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

dict['Zara']:
Traceback (most recent call last):
   File "test.py", line 4, in <module>
      print "dict['Alice']: ", dict['Alice'];
KeyError: 'Alice'

Cập nhật từ điển

Bạn có thể cập nhật từ điển bằng cách thêm mục nhập mới hoặc cặp khóa-giá trị, sửa đổi mục nhập hiện có hoặc xóa mục nhập hiện có như được minh họa trong ví dụ đơn giản dưới đây.

#!/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'])

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

dict['Age']:  8
dict['School']:  DPS School

Xóa các thành phần từ điển

Bạn có thể xóa từng phần tử từ điển hoặc xóa toàn bộ nội dung của từ điển. Bạn cũng có thể xóa toàn bộ từ điển chỉ trong một thao tác.

Để xóa toàn bộ từ điển một cách rõ ràng, chỉ cần sử dụng deltuyên bố. Sau đây là một ví dụ đơn giản -

#!/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'])

Điều này tạo ra kết quả sau.

Một ngoại lệ được nêu ra vì sau del dict, từ điển không tồn tại nữa.

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 - Phương thức del () được thảo luận trong phần tiếp theo.

Thuộc tính của khóa từ điển

Giá trị từ điển không có hạn chế. Chúng có thể là bất kỳ đối tượng Python tùy ý nào, đối tượng chuẩn hoặc đối tượng do người dùng định nghĩa. Tuy nhiên, điều này không đúng với các phím.

Có hai điểm quan trọng cần nhớ về khóa từ điển -

(a)Nhiều hơn một mục nhập cho mỗi khóa không được phép. Điều này có nghĩa là không cho phép khóa trùng lặp. Khi gặp các khóa trùng lặp trong quá trình gán, nhiệm vụ cuối cùng sẽ thắng. Ví dụ -

#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}
print ("dict['Name']: ", dict['Name'])

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

dict['Name']:  Manni

(b)Các phím phải là bất biến. Điều này có nghĩa là bạn có thể sử dụng chuỗi, số hoặc bộ giá trị làm khóa từ điển nhưng những thứ như ['key'] không được phép. Sau đây là một ví dụ đơn giản -

#!/usr/bin/python3

dict = {['Name']: 'Zara', 'Age': 7}
print ("dict['Name']: ", dict['Name'])

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      dict = {['Name']: 'Zara', 'Age': 7}
TypeError: list objects are unhashable

Các hàm và phương thức từ điển tích hợp sẵn

Python bao gồm các hàm từ điển sau:

Sr.No. Mô tả chức năng
1 cmp (dict1, dict2)

Không còn khả dụng trong Python 3.

2 len (dict)

Cung cấp tổng độ dài của từ điển. Con số này sẽ bằng với số lượng mục trong từ điển.

3 str (dict)

Tạo ra một biểu diễn chuỗi có thể in của từ điển

4 loại (biến)

Trả về kiểu của biến đã truyền. Nếu biến được truyền là từ điển, thì nó sẽ trả về một loại từ điển.

Python bao gồm các phương thức từ điển sau:

Sr.No. Phương pháp & Mô tả
1 dict.clear ()

Loại bỏ tất cả các phần tử của từ điển dict

2 dict.copy ()

Trả về một bản sao ngắn của từ điển dict

3 dict.fromkeys ()

Tạo một từ điển mới với các khóa từ seq và các giá trị được đặt thành giá trị .

4 dict.get (key, default = Không có)

Đối với khóa chính, trả về giá trị hoặc giá trị mặc định nếu khóa không có trong từ điển

5 dict.has_key (phím)

Loại bỏ, sử dụng trong hoạt động để thay thế.

6 dict.items ()

Trả về danh sách các cặp tuple (khóa, giá trị) của dict

7 dict.keys ()

Trả về danh sách các khóa của từ điển dict

số 8 dict.setdefault (khóa, mặc định = Không có)

Tương tự như get (), nhưng sẽ đặt dict [key] = default nếu key chưa có trong dict

9 dict.update (dict2)

Thêm các cặp khóa-giá trị của từ điển dict2 vào dict

10 dict.values ​​()

Trả về danh sách các giá trị của từ điển dict

Một chương trình Python có thể xử lý ngày và giờ theo một số cách. Chuyển đổi giữa các định dạng ngày tháng là một công việc thường xuyên đối với máy tính. Các mô-đun lịch và thời gian của Python giúp theo dõi ngày và giờ.

Tick ​​là gì?

Khoảng thời gian là số dấu phẩy động tính bằng đơn vị giây. Thời gian cụ thể được biểu thị bằng giây kể từ 12:00 sáng, ngày 1 tháng 1 năm 1970 (kỷ nguyên).

Có một phổ biến timemô-đun có sẵn bằng Python cung cấp các hàm để làm việc với thời gian và để chuyển đổi giữa các biểu diễn. Chức năngtime.time() trả về thời gian hệ thống hiện tại trong tích tắc kể từ 12:00 sáng, ngày 1 tháng 1 năm 1970 (kỷ nguyên).

Thí dụ

#!/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)

Điều này sẽ tạo ra một kết quả như sau:

Number of ticks since 12:00am, January 1, 1970: 1455508609.34375

Số học ngày tháng rất dễ thực hiện với tích tắc. Tuy nhiên, các ngày trước kỷ nguyên không thể được trình bày dưới dạng này. Ngày trong tương lai xa cũng không thể được biểu diễn theo cách này - điểm giới hạn là vào năm 2038 đối với UNIX và Windows.

TimeTuple là gì?

Nhiều hàm thời gian của Python xử lý thời gian dưới dạng một bộ gồm 9 số, như được hiển thị bên dưới:

Mục lục Cánh đồng Giá trị
0 Năm 4 chữ số 2016
1 tháng 1 đến 12
2 ngày 1 đến 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()

Bản thử trực tiếp
#!/usr/bin/python3
import time

localtime = time.asctime( time.localtime(time.time()) )
print ("Local current time :", localtime)

Điều này sẽ tạo ra kết quả sau:

Local current time : Mon Feb 15 09:34:03 2016

Nhận lịch trong một tháng

Mô-đun lịch cung cấp nhiều phương pháp để chơi với lịch hàng năm và hàng tháng. Ở đây, chúng tôi in lịch cho một tháng nhất định (tháng 1 năm 2008) -

#!/usr/bin/python3
import calendar

cal = calendar.month(2016, 2)
print ("Here is the calendar:")
print (cal)

Điều này sẽ tạo ra kết quả sau:

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

Mô-đun thời gian

Có một phổ biến timemô-đun có sẵn bằng Python, cung cấp các hàm để làm việc với thời gian và chuyển đổi giữa các biểu diễn. Đây là danh sách tất cả các phương pháp có sẵn.

Sr.No. Mô tả chức năng
1 time.altzone

Chênh lệch của múi giờ DST cục bộ, tính bằng giây về phía tây của UTC, nếu múi giờ được xác định. Điều này là âm nếu múi giờ DST địa phương nằm ở phía đông UTC (như ở Tây Âu, bao gồm cả Vương quốc Anh). Sử dụng điều này nếu ánh sáng ban ngày không phải là ánh sáng ban ngày.

2 time.asctime ([tupletime])

Chấp nhận bộ điều thời gian và trả về một chuỗi 24 ký tự có thể đọc được, chẳng hạn như 'Thứ ba ngày 11 tháng 12 18:07:14 2008'.

3 đồng hồ thời gian( )

Trả về thời gian hiện tại của CPU dưới dạng số giây dấu phẩy động. Để đo lường chi phí tính toán của các cách tiếp cận khác nhau, giá trị của time.clock hữu ích hơn so với time.time ().

4 time.ctime ([giây])

Giống như asctime (localtime (giây)) và không có đối số giống như asctime ()

5 time.gmtime ([giây])

Chấp nhận thời gian được biểu thị bằng giây kể từ kỷ nguyên và trả về bộ thời gian t với thời gian UTC. Lưu ý - t.tm_isdst luôn là 0

6 time.localtime ([giây])

Chấp nhận thời gian được biểu thị bằng giây kể từ kỷ nguyên và trả về bộ thời gian t với giờ địa phương (t.tm_isdst là 0 hoặc 1, tùy thuộc vào việc áp dụng DST cho giây tức thì theo quy tắc cục bộ).

7 time.mktime (tupletime)

Chấp nhận thời điểm được biểu thị dưới dạng bộ điều chỉnh thời gian theo giờ địa phương và trả về giá trị dấu phẩy động với thời điểm được biểu thị bằng giây kể từ kỷ nguyên.

số 8 time.sleep (giây)

Tạm dừng chuỗi cuộc gọi trong giây giây.

9 time.strftime (fmt [, tupletime])

Chấp nhận một thời điểm được biểu thị dưới dạng bộ thời gian theo giờ cục bộ và trả về một chuỗi biểu thị thời điểm đó như được chỉ định bởi chuỗi fmt.

10 time.strptime (str, fmt = '% a% b% d% H:% M:% S% Y')

Phân tích cú pháp str theo chuỗi định dạng fmt và trả về tức thì ở định dạng tuple thời gian.

11 time.time ()

Trả về thời gian hiện tại tức thì, một số giây dấu phẩy động kể từ kỷ nguyên.

12 time.tzset ()

Đặt lại các quy tắc chuyển đổi thời gian được sử dụng bởi các quy trình thư viện. Biến môi trường TZ chỉ định cách thực hiện điều này.

Có hai thuộc tính quan trọng có sẵn với mô-đun thời gian. Họ là -

Sr.No. Thuộc tính & Mô tả
1

time.timezone

Thuộc tính time.timezone là khoảng thời gian chênh lệch tính bằng giây của múi giờ địa phương (không có DST) từ UTC (> 0 ở Châu Mỹ; <= 0 ở hầu hết Châu Âu, Châu Á, Châu Phi).

2

time.tzname

Thuộc tính time.tzname là một cặp chuỗi phụ thuộc vào ngôn ngữ, là tên của múi giờ địa phương không có và có DST, tương ứng.

Mô-đun lịch

Mô-đun lịch cung cấp các chức năng liên quan đến lịch, bao gồm các chức năng in lịch văn bản cho một tháng hoặc năm nhất định.

Theo mặc định, lịch lấy Thứ Hai là ngày đầu tiên trong tuần và Chủ Nhật là ngày cuối cùng. Để thay đổi điều này, hãy gọicalendar.setfirstweekday() chức năng.

Đây là danh sách các chức năng có sẵn với calendar mô-đun -

Sr.No. Mô tả chức năng
1

calendar.calendar(year,w = 2,l = 1,c = 6)

Trả về một chuỗi nhiều dòng có lịch cho năm được định dạng thành ba cột cách nhau bằng c dấu cách. w là chiều rộng tính bằng ký tự của mỗi ngày; mỗi dòng có độ dài 21 * w + 18 + 2 * c. l là số dòng cho mỗi tuần.

2

calendar.firstweekday( )

Trả về cài đặt hiện tại cho ngày trong tuần bắt đầu mỗi tuần. Theo mặc định, khi lịch được nhập lần đầu tiên, giá trị này là 0, nghĩa là thứ Hai.

3

calendar.isleap(year)

Trả về True nếu năm là năm nhuận; ngược lại, Sai.

4

calendar.leapdays(y1,y2)

Trả về tổng số ngày nhuận trong các năm trong phạm vi (y1, y2).

5

calendar.month(year,month,w = 2,l = 1)

Trả về một chuỗi nhiều dòng với lịch cho tháng tháng trong năm, một dòng mỗi tuần cộng với hai dòng tiêu đề. w là chiều rộng tính bằng ký tự của mỗi ngày; mỗi dòng có độ dài 7 * w + 6. l là số dòng cho mỗi tuần.

6

calendar.monthcalendar(year,month)

Trả về một danh sách các số nguyên. Mỗi danh sách phụ biểu thị một tuần. Các ngày bên ngoài tháng tháng trong năm được đặt thành 0; các ngày trong tháng được đặt thành ngày trong tháng, 1 trở lên.

7

calendar.monthrange(year,month)

Trả về hai số nguyên. Mã đầu tiên là mã của ngày trong tuần của ngày đầu tiên của tháng trong năm; cái thứ hai là số ngày trong tháng. Mã ngày trong tuần là 0 (Thứ Hai) đến 6 (Chủ Nhật); số tháng là 1 đến 12.

số 8

calendar.prcal(year,w = 2,l = 1,c = 6)

Như in lịch.calendar (năm, w, l, c).

9

calendar.prmonth(year,month,w = 2,l = 1)

Giống như in lịch. Tháng (năm, tháng, tuần, l).

10

calendar.setfirstweekday(weekday)

Đặt ngày đầu tiên của mỗi tuần thành mã ngày trong tuần là ngày trong tuần. Mã các ngày trong tuần là 0 (Thứ Hai) đến 6 (Chủ Nhật).

11

calendar.timegm(tupletime)

Nghịch đảo của time.gmtime: chấp nhận một thời gian tức thì ở dạng bộ thời gian và trả về cùng một thời điểm dưới dạng một số giây dấu phẩy động kể từ kỷ nguyên.

12

calendar.weekday(year,month,day)

Trả về mã ngày trong tuần cho ngày đã cho. Mã ngày trong tuần là 0 (Thứ Hai) đến 6 (Chủ Nhật); số tháng là 1 (tháng 1) đến 12 (tháng 12).

Các mô-đun và chức năng khác

Nếu bạn quan tâm, thì ở đây bạn sẽ tìm thấy danh sách các mô-đun và chức năng quan trọng khác để chơi với ngày và giờ trong Python -

  • Mô-đun ngày giờ
  • Mô-đun pytz
  • Mô-đun dateutil

Hàm là một khối mã có tổ chức, có thể sử dụng lại được dùng để thực hiện một hành động có liên quan. Các chức năng cung cấp mô-đun tốt hơn cho ứng dụng của bạn và mức độ tái sử dụng mã cao.

Như bạn đã biết, Python cung cấp cho bạn nhiều hàm tích hợp sẵn như print (), v.v. nhưng bạn cũng có thể tạo các hàm của riêng mình. Các hàm này được gọi là các hàm do người dùng định nghĩa.

Xác định một chức năng

Bạn có thể xác định các chức năng để cung cấp chức năng cần thiết. Dưới đây là các quy tắc đơn giản để xác định một hàm trong Python.

  • Các khối chức năng bắt đầu bằng từ khóa def theo sau là tên hàm và dấu ngoặc đơn (()).

  • Mọi tham số hoặc đối số đầu vào phải được đặt trong các dấu ngoặc đơn này. Bạn cũng có thể xác định các tham số bên trong các dấu ngoặc đơn này.

  • Câu lệnh đầu tiên của một hàm có thể là một câu lệnh tùy chọn - chuỗi tài liệu của hàm hoặc docstring .

  • Khối mã trong mọi hàm đều bắt đầu bằng dấu hai chấm (:) và được thụt lề.

  • Câu lệnh return [biểu thức] thoát khỏi một hàm, tùy chọn chuyển lại một biểu thức cho người gọi. Câu lệnh trả về không có đối số cũng giống như câu lệnh trả về Không có.

Cú pháp

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

Theo mặc định, các tham số có một hành vi vị trí và bạn cần thông báo cho chúng theo thứ tự mà chúng đã được xác định.

Thí dụ

Hàm sau nhận một chuỗi làm tham số đầu vào và in nó trên màn hình chuẩn.

def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

Gọi một hàm

Việc xác định một hàm sẽ đặt tên cho nó, xác định các tham số sẽ được đưa vào hàm và cấu trúc các khối mã.

Khi cấu trúc cơ bản của một hàm được hoàn thiện, bạn có thể thực thi nó bằng cách gọi nó từ một hàm khác hoặc trực tiếp từ dấu nhắc Python. Sau đây là một ví dụ để gọiprintme() chức năng -

#!/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")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

This is first call to the user defined function!
Again second call to the same function

Chuyển qua tham chiếu so với giá trị

Tất cả các tham số (đối số) trong ngôn ngữ Python được truyền bằng tham chiếu. Nó có nghĩa là nếu bạn thay đổi những gì một tham số đề cập đến trong một hàm, thay đổi cũng phản ánh lại trong hàm đang gọi. Ví dụ -

#!/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)

Ở đây, chúng tôi đang duy trì tham chiếu của đối tượng đã truyền và các giá trị nối thêm trong cùng một đối tượng. Do đó, điều này sẽ tạo ra kết quả sau:

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]

Có một ví dụ nữa trong đó đối số đang được truyền bằng tham chiếu và tham chiếu đang được ghi đè bên trong hàm được gọi.

#!/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)

Thông số mylistlà cục bộ của hàm changeme. Thay đổi danh sách của tôi trong hàm không ảnh hưởng đến danh sách của tôi. Hàm không thực hiện được gì và cuối cùng điều này sẽ tạo ra kết quả sau:

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

Đối số hàm

Bạn có thể gọi một hàm bằng cách sử dụng các loại đối số chính thức sau:

  • Đối số bắt buộc
  • Đối số từ khóa
  • Đối số mặc định
  • Đối số có độ dài thay đổi

Đối số bắt buộc

Các đối số bắt buộc là các đối số được truyền cho một hàm theo đúng thứ tự vị trí. Ở đây, số đối số trong lệnh gọi hàm phải khớp chính xác với định nghĩa hàm.

Để gọi hàm printme(), bạn chắc chắn cần phải chuyển một đối số, nếu không nó sẽ đưa ra lỗi cú pháp như sau:

#!/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()

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Traceback (most recent call last):
   File "test.py", line 11, in <module>
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

Đối số từ khóa

Các đối số từ khóa có liên quan đến các lệnh gọi hàm. Khi bạn sử dụng các đối số từ khóa trong một lệnh gọi hàm, trình gọi sẽ xác định các đối số bằng tên tham số.

Điều này cho phép bạn bỏ qua các đối số hoặc sắp xếp chúng không theo thứ tự vì trình thông dịch Python có thể sử dụng các từ khóa được cung cấp để khớp các giá trị với các tham số. Bạn cũng có thể gọi từ khóa đếnprintme() hoạt động theo những cách sau:

#!/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")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

My string

Ví dụ sau đây cho ta một bức tranh rõ ràng hơn. Lưu ý rằng thứ tự của các tham số không quan trọng.

#!/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" )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Name:  miki
Age  50

Đối số mặc định

Đối số mặc định là đối số giả định giá trị mặc định nếu giá trị không được cung cấp trong lệnh gọi hàm cho đối số đó. Ví dụ sau đây đưa ra một ý tưởng về các đối số mặc định, nó sẽ in ra tuổi mặc định nếu nó không được thông qua -

#!/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" )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Name:  miki
Age  50
Name:  miki
Age  35

Đối số có độ dài thay đổi

Bạn có thể cần xử lý một hàm cho nhiều đối số hơn bạn đã chỉ định trong khi xác định hàm. Các đối số này được gọi là đối số có độ dài thay đổi và không có tên trong định nghĩa hàm, không giống như các đối số bắt buộc và mặc định.

Cú pháp cho một hàm với các đối số biến không phải từ khóa được đưa ra dưới đây:

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

Dấu hoa thị (*) được đặt trước tên biến chứa các giá trị của tất cả các đối số biến không có từ khóa. Bộ giá trị này vẫn trống nếu không có đối số bổ sung nào được chỉ định trong khi gọi hàm. Sau đây là một ví dụ đơn giản -

#!/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 )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Output is:
10
Output is:
70
60
50

Các chức năng ẩn danh

Các hàm này được gọi là ẩn danh vì chúng không được khai báo theo cách chuẩn bằng cách sử dụng deftừ khóa. Bạn có thể dùnglambda từ khóa để tạo các hàm ẩn danh nhỏ.

  • Biểu mẫu Lambda có thể nhận bất kỳ số lượng đối số nào nhưng chỉ trả về một giá trị ở dạng biểu thức. Chúng không thể chứa lệnh hoặc nhiều biểu thức.

  • Một hàm ẩn danh không thể là một lệnh gọi trực tiếp để in vì lambda yêu cầu một biểu thức.

  • Các hàm Lambda có không gian tên cục bộ riêng của chúng và không thể truy cập các biến khác với các biến trong danh sách tham số của chúng và các biến trong không gian tên chung.

  • Mặc dù có vẻ như lambdas là phiên bản một dòng của một hàm, nhưng chúng không tương đương với các câu lệnh nội tuyến trong C hoặc C ++, có mục đích là để phân bổ ngăn xếp bằng cách truyền hàm, trong khi gọi vì lý do hiệu suất.

Cú pháp

Cú pháp của lambda các hàm chỉ chứa một câu lệnh duy nhất, như sau:

lambda [arg1 [,arg2,.....argn]]:expression

Sau đây là một ví dụ để chỉ ra cách lambda dạng chức năng hoạt động -

#!/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 ))

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Value of total :  30
Value of total :  40

Tuyên bố trở lại

Câu lệnh return [biểu thức] thoát khỏi một hàm, tùy chọn chuyển lại một biểu thức cho người gọi. Câu lệnh trả về không có đối số cũng giống như câu lệnh trả về Không có.

Tất cả các ví dụ dưới đây không trả về bất kỳ giá trị nào. Bạn có thể trả về một giá trị từ một hàm như sau:

#!/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 )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Inside the function :  30
Outside the function :  30

Phạm vi của các biến

Tất cả các biến trong một chương trình có thể không truy cập được ở tất cả các vị trí trong chương trình đó. Điều này phụ thuộc vào nơi bạn đã khai báo một biến.

Phạm vi của một biến xác định phần của chương trình mà bạn có thể truy cập vào một số nhận dạng cụ thể. Có hai phạm vi cơ bản của các biến trong Python:

  • Biến toàn cục
  • Biến cục bộ

Biến toàn cục so với biến cục bộ

Các biến được xác định bên trong thân hàm có phạm vi cục bộ và các biến được xác định bên ngoài có phạm vi toàn cục.

Điều này có nghĩa là các biến cục bộ chỉ có thể được truy cập bên trong hàm mà chúng được khai báo, trong khi các biến toàn cục có thể được truy cập trong toàn bộ phần thân chương trình bởi tất cả các hàm. Khi bạn gọi một hàm, các biến được khai báo bên trong nó sẽ được đưa vào phạm vi. Sau đây là một ví dụ đơn giản -

#!/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 )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Inside the function local total :  30
Outside the function global total :  0

Một mô-đun cho phép bạn tổ chức hợp lý mã Python của mình. Nhóm mã liên quan thành một mô-đun làm cho mã dễ hiểu và dễ sử dụng hơn. Mô-đun là một đối tượng Python với các thuộc tính được đặt tên tùy ý mà bạn có thể liên kết và tham chiếu.

Đơn giản, một mô-đun là một tệp bao gồm mã Python. Một mô-đun có thể xác định các hàm, lớp và biến. Một mô-đun cũng có thể bao gồm mã chạy được.

Thí dụ

Mã Python cho mô-đun có tên aname thường nằm trong tệp tênaname.py. Đây là một ví dụ về một mô-đun đơn giản, support.py -

def print_func( par ):
   print "Hello : ", par
   return

Báo cáo nhập khẩu

Bạn có thể sử dụng bất kỳ tệp nguồn Python nào làm mô-đun bằng cách thực hiện câu lệnh nhập trong một số tệp nguồn Python khác. Cácimport có cú pháp sau:

import module1[, module2[,... moduleN]

Khi trình thông dịch gặp một câu lệnh nhập, nó sẽ nhập mô-đun nếu mô-đun có trong đường dẫn tìm kiếm. Đường dẫn tìm kiếm là danh sách các thư mục mà trình thông dịch tìm kiếm trước khi nhập mô-đun. Ví dụ: để nhập mô-đun hello.py, bạn cần đặt lệnh sau ở đầu tập lệnh:

#!/usr/bin/python3

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Hello : Zara

Mô-đun chỉ được tải một lần, bất kể số lần nó được nhập. Điều này ngăn việc thực thi mô-đun lặp lại, nếu nhiều lần nhập xảy ra.

Báo cáo từ ... nhập khẩu

Python's fromcâu lệnh cho phép bạn nhập các thuộc tính cụ thể từ một mô-đun vào không gian tên hiện tại. Cácfrom...import có cú pháp sau:

from modname import name1[, name2[, ... nameN]]

Ví dụ: để nhập hàm fibonacci từ mô-đun fib, hãy sử dụng câu lệnh sau:

#!/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]

Câu lệnh này không nhập toàn bộ mô-đun fib vào không gian tên hiện tại; nó chỉ giới thiệu mục fibonacci từ mô-đun fib vào bảng ký hiệu chung của mô-đun nhập.

Câu lệnh from ... import *

Cũng có thể nhập tất cả các tên từ một mô-đun vào không gian tên hiện tại bằng cách sử dụng câu lệnh nhập sau:

from modname import *

Điều này cung cấp một cách dễ dàng để nhập tất cả các mục từ một mô-đun vào không gian tên hiện tại; tuy nhiên, câu lệnh này nên được sử dụng một cách tiết kiệm.

Thực thi mô-đun dưới dạng tập lệnh

Trong một mô-đun, tên của mô-đun (dưới dạng một chuỗi) có sẵn dưới dạng giá trị của biến toàn cục __name__. Mã trong mô-đun sẽ được thực thi, giống như khi bạn nhập nó, nhưng với __name__ được đặt thành "__main__".

Thêm mã này vào cuối mô-đun của bạn -

#!/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)

Khi bạn chạy đoạn mã trên, kết quả sau sẽ được hiển thị.

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Định vị mô-đun

Khi bạn nhập một mô-đun, trình thông dịch Python sẽ tìm kiếm mô-đun theo các trình tự sau:

  • Thư mục hiện tại.

  • Nếu không tìm thấy mô-đun, Python sẽ tìm kiếm từng thư mục trong biến shell PYTHONPATH.

  • Nếu vẫn thất bại, Python sẽ kiểm tra đường dẫn mặc định. Trên UNIX, đường dẫn mặc định này thường là / usr / local / lib / python3 /.

Đường dẫn tìm kiếm mô-đun được lưu trữ trong hệ thống mô-đun hệ thống dưới dạng sys.pathBiến đổi. Biến sys.path chứa thư mục hiện tại, PYTHONPATH và giá trị mặc định phụ thuộc vào cài đặt.

Biến PYTHONPATH

PYTHONPATH là một biến môi trường, bao gồm một danh sách các thư mục. Cú pháp của PYTHONPATH giống như cú pháp của biến shell PATH.

Đây là một PYTHONPATH điển hình từ hệ thống Windows -

set PYTHONPATH = c:\python34\lib;

Và đây là một PYTHONPATH điển hình từ hệ thống UNIX -

set PYTHONPATH = /usr/local/lib/python

Không gian tên và phạm vi

Biến là tên (định danh) ánh xạ tới các đối tượng. Không gian tên là một từ điển của các tên biến (khóa) và các đối tượng (giá trị) tương ứng của chúng.

  • Một câu lệnh Python có thể truy cập các biến trong không gian tên cục bộ và trong không gian tên chung . Nếu một biến cục bộ và một biến toàn cục có cùng tên, thì biến cục bộ sẽ che khuất biến toàn cục.

  • Mỗi hàm có không gian tên cục bộ riêng của nó. Các phương thức lớp tuân theo quy tắc xác định phạm vi giống như các hàm thông thường.

  • Python đưa ra các phỏng đoán có học về việc các biến là cục bộ hay toàn cục. Nó giả định rằng bất kỳ biến nào được gán giá trị trong một hàm là cục bộ.

  • Do đó, để gán giá trị cho một biến toàn cục trong một hàm, trước tiên bạn phải sử dụng câu lệnh toàn cục.

  • Câu lệnh global VarName cho Python biết rằng VarName là một biến toàn cục. Python ngừng tìm kiếm không gian tên cục bộ cho biến.

Ví dụ, chúng tôi xác định một biến Money trong không gian tên chung. Trong hàm Money, chúng tôi gán cho Money một giá trị, do đó Python giả định Money là một biến cục bộ.

Tuy nhiên, chúng tôi đã truy cập giá trị của biến cục bộ Money trước khi đặt nó, vì vậy kết quả là một UnboundLocalError. Bỏ chú thích câu lệnh toàn cục sẽ khắc phục được sự cố.

#!/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)

Hàm dir ()

Hàm tích hợp dir () trả về một danh sách các chuỗi đã được sắp xếp có chứa các tên được xác định bởi một mô-đun.

Danh sách chứa tên của tất cả các mô-đun, biến và hàm được xác định trong một mô-đun. Sau đây là một ví dụ đơn giản -

#!/usr/bin/python3

# Import built-in module math
import math

content = dir(math)
print (content)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

['__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']

Ở đây, biến chuỗi đặc biệt __name__ là tên của mô-đun và __file__ là tên tệp mà từ đó mô-đun đã được tải.

Các hàm global () và local ()

Các globals()locals() các hàm có thể được sử dụng để trả về tên trong không gian tên toàn cục và cục bộ tùy thuộc vào vị trí từ nơi chúng được gọi.

  • Nếu locals() được gọi từ bên trong một hàm, nó sẽ trả về tất cả các tên có thể được truy cập cục bộ từ hàm đó.

  • Nếu globals() được gọi từ bên trong một hàm, nó sẽ trả về tất cả các tên có thể được truy cập toàn cục từ hàm đó.

Kiểu trả về của cả hai hàm này là từ điển. Do đó, tên có thể được trích xuất bằng cách sử dụngkeys() chức năng.

Hàm reload ()

Khi một mô-đun được nhập vào tập lệnh, mã trong phần cấp cao nhất của mô-đun chỉ được thực thi một lần.

Do đó, nếu bạn muốn thực thi lại mã cấp cao nhất trong một mô-đun, bạn có thể sử dụng hàm reload () . Hàm reload () nhập lại một mô-đun đã nhập trước đó. Cú pháp của hàm reload () là:

reload(module_name)

Ở đây, module_name là tên của mô-đun bạn muốn tải lại và không phải là chuỗi chứa tên mô-đun. Ví dụ: để tải lại mô-đun hello, hãy làm như sau:

reload(hello)

Các gói bằng Python

Một gói là một cấu trúc thư mục tệp phân cấp xác định một môi trường ứng dụng Python duy nhất bao gồm các mô-đun và các gói con và các gói con, v.v.

Xem xét một tệp Pots.py có sẵn trong thư mục Điện thoại. Tệp này có dòng mã nguồn sau:

#!/usr/bin/python3

def Pots():
print ("I'm Pots Phone")

Tương tự, chúng ta có hai tệp khác có các chức năng khác nhau có cùng tên như trên. Họ là -

  • Tệp Phone / Isdn.py có hàm Isdn ()

  • Tệp điện thoại / G3.py có chức năng G3 ()

Bây giờ, hãy tạo thêm một tệp __init__.py trong thư mục Điện thoại -

  • Phone/__init__.py

Để cung cấp tất cả các chức năng của bạn khi bạn đã nhập Điện thoại, bạn cần đặt các câu lệnh nhập rõ ràng trong __init__.py như sau:

from Pots import Pots
from Isdn import Isdn
from G3 import G3

Sau khi bạn thêm các dòng này vào __init__.py, bạn sẽ có tất cả các lớp này khi nhập gói Điện thoại.

#!/usr/bin/python3

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone

Trong ví dụ trên, chúng tôi đã lấy ví dụ về một hàm duy nhất trong mỗi tệp, nhưng bạn có thể giữ nhiều hàm trong tệp của mình. Bạn cũng có thể xác định các lớp Python khác nhau trong các tệp đó và sau đó bạn có thể tạo các gói của mình từ các lớp đó.

Chương này bao gồm tất cả các hàm I / O cơ bản có sẵn trong Python 3. Để biết thêm các hàm, vui lòng tham khảo tài liệu Python chuẩn.

In ra màn hình

Cách đơn giản nhất để tạo ra kết quả là sử dụng câu lệnh print trong đó bạn có thể chuyển không hoặc nhiều biểu thức được phân tách bằng dấu phẩy. Hàm này chuyển đổi các biểu thức bạn chuyển thành một chuỗi và ghi kết quả vào đầu ra chuẩn như sau:

#!/usr/bin/python3

print ("Python is really a great language,", "isn't it?")

Điều này tạo ra kết quả sau trên màn hình tiêu chuẩn của bạn:

Python is really a great language, isn't it?

Đọc đầu vào bàn phím

Python 2 có hai chức năng tích hợp để đọc dữ liệu từ đầu vào tiêu chuẩn, theo mặc định là từ bàn phím. Các chức năng này làinput()raw_input()

Trong Python 3, hàm raw_input () không được dùng nữa. Hơn nữa, các hàm input () đọc dữ liệu từ bàn phím dưới dạng chuỗi, bất kể nó có được đặt trong dấu ngoặc kép ('' hoặc "") hay không.

Chức năng đầu vào

Các input([prompt]) hàm tương đương với raw_input, ngoại trừ việc nó giả định rằng đầu vào là một biểu thức Python hợp lệ và trả về kết quả đã đánh giá cho bạn.

#!/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'"

Mở và đóng tệp

Cho đến bây giờ, bạn đã đọc và ghi vào đầu vào và đầu ra tiêu chuẩn. Bây giờ, chúng ta sẽ xem cách sử dụng các tệp dữ liệu thực tế.

Python cung cấp các hàm và phương thức cơ bản cần thiết để thao tác các tệp theo mặc định. Bạn có thể thực hiện hầu hết các thao tác trên tệp bằng cách sử dụngfile vật.

Chức năng mở

Trước khi có thể đọc hoặc ghi một tệp, bạn phải mở tệp đó bằng hàm open () tích hợp sẵn của Python. Hàm này tạo ra mộtfile đối tượng, sẽ được sử dụng để gọi các phương thức hỗ trợ khác được liên kết với nó.

Cú pháp

file object = open(file_name [, access_mode][, buffering])

Đây là thông số chi tiết -

  • file_name - Đối số tên tệp là một giá trị chuỗi chứa tên của tệp mà bạn muốn truy cập.

  • access_mode- Access_mode xác định chế độ mà tệp phải được mở, tức là, đọc, ghi, nối thêm, v.v. Danh sách đầy đủ các giá trị có thể được đưa ra bên dưới trong bảng. Đây là một tham số tùy chọn và chế độ truy cập tệp mặc định là đọc (r).

  • buffering- Nếu giá trị đệm được đặt thành 0, không có quá trình đệm diễn ra. Nếu giá trị bộ đệm là 1, bộ đệm dòng được thực hiện trong khi truy cập tệp. Nếu bạn chỉ định giá trị bộ đệm là một số nguyên lớn hơn 1, thì hành động đệm được thực hiện với kích thước bộ đệm được chỉ định. Nếu âm, kích thước bộ đệm là mặc định của hệ thống (hành vi mặc định).

Dưới đây là danh sách các chế độ mở tệp khác nhau -

Sr.No. Chế độ & Mô tả
1

r

Mở tệp chỉ để đọc. Con trỏ tệp được đặt ở đầu tệp. Đây là chế độ mặc định.

2

rb

Mở tệp chỉ để đọc ở định dạng nhị phân. Con trỏ tệp được đặt ở đầu tệp. Đây là chế độ mặc định.

3

r+

Mở tệp để đọc và ghi. Con trỏ tệp được đặt ở đầu tệp.

4

rb+

Mở tệp để đọc và ghi ở định dạng nhị phân. Con trỏ tệp được đặt ở đầu tệp.

5

w

Mở tệp chỉ để ghi. Ghi đè tệp nếu tệp tồn tại. Nếu tệp không tồn tại, hãy tạo một tệp mới để ghi.

6

wb

Mở tệp chỉ để ghi ở định dạng nhị phân. Ghi đè tệp nếu tệp tồn tại. Nếu tệp không tồn tại, hãy tạo một tệp mới để ghi.

7

w+

Mở tệp để ghi và đọc. Ghi đè tệp hiện có nếu tệp tồn tại. Nếu tệp không tồn tại, hãy tạo một tệp mới để đọc và ghi.

số 8

wb+

Mở tệp để ghi và đọc ở định dạng nhị phân. Ghi đè tệp hiện có nếu tệp tồn tại. Nếu tệp không tồn tại, hãy tạo một tệp mới để đọc và ghi.

9

a

Mở một tệp để bổ sung. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tức là, tệp đang ở chế độ nối thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để ghi.

10

ab

Mở tệp để thêm vào ở định dạng nhị phân. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tức là, tệp đang ở chế độ nối thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để ghi.

11

a+

Mở một tệp để bổ sung và đọc. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tệp sẽ mở ở chế độ nối thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để đọc và ghi.

12

ab+

Mở tệp để bổ sung và đọc ở định dạng nhị phân. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tệp sẽ mở ở chế độ nối thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để đọc và ghi.

Thuộc tính đối tượng tệp

Sau khi tệp được mở và bạn có một đối tượng tệp , bạn có thể nhận được nhiều thông tin khác nhau liên quan đến tệp đó.

Đây là danh sách tất cả các thuộc tính liên quan đến một đối tượng tệp -

Sr.No. Thuộc tính & Mô tả
1

file.closed

Trả về true nếu tệp được đóng, nếu không thì trả về false.

2

file.mode

Trả về chế độ truy cập mà tệp đã được mở.

3

file.name

Trả về tên của tệp.

Note - thuộc tính softspace không được hỗ trợ trong Python 3.x

Thí dụ

#!/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()

Điều này tạo ra kết quả sau:

Name of the file:  foo.txt
Closed or not :  False
Opening mode :  wb

Phương thức close ()

Phương thức close () của một đối tượng tệp sẽ xóa mọi thông tin không được viết ra và đóng đối tượng tệp, sau đó không thể ghi được nữa.

Python tự động đóng tệp khi đối tượng tham chiếu của tệp được gán lại cho một tệp khác. Bạn nên sử dụng phương thức close () để đóng tệp.

Cú pháp

fileObject.close();

Thí dụ

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)

# Close opened file
fo.close()

Điều này tạo ra kết quả sau:

Name of the file:  foo.txt

Đọc và ghi tệp

Đối tượng tệp cung cấp một tập hợp các phương thức truy cập để giúp cuộc sống của chúng ta dễ dàng hơn. Chúng tôi sẽ xem cách sử dụngread()write() phương pháp đọc và ghi tệp.

The write() Method

The write() method writes any string to an open file. It is important to note that Python strings can have binary data and not just text.

The write() method does not add a newline character ('\n') to the end of the string −

Syntax

fileObject.write(string);

Here, passed parameter is the content to be written into the opened file.

Example

#!/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()

The above method would create foo.txt file and would write given content in that file and finally it would close that file. If you would open this file, it would have the following content −

Python is a great language.
Yeah its great!!

The read() Method

The read() method reads a string from an open file. It is important to note that Python strings can have binary data. apart from text data.

Syntax

fileObject.read([count]);

Here, passed parameter is the number of bytes to be read from the opened file. This method starts reading from the beginning of the file and if count is missing, then it tries to read as much as possible, maybe until the end of file.

Example

Let us take a file foo.txt, which we created above.

#!/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()

This produces the following result −

Read String is :  Python is

File Positions

The tell() method tells you the current position within the file; in other words, the next read or write will occur at that many bytes from the beginning of the file.

The seek(offset[, from]) method changes the current file position. The offset argument indicates the number of bytes to be moved. The from argument specifies the reference position from where the bytes are to be moved.

If from is set to 0, the beginning of the file is used as the reference position. If it is set to 1, the current position is used as the reference position. If it is set to 2 then the end of the file would be taken as the reference position.

Example

Let us take a file foo.txt, which we created above.

#!/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()

This produces the following result −

Read String is :  Python is
Current file position :  10
Again read String is :  Python is

Renaming and Deleting Files

Python os module provides methods that help you perform file-processing operations, such as renaming and deleting files.

To use this module, you need to import it first and then you can call any related functions.

The rename() Method

The rename() method takes two arguments, the current filename and the new filename.

Syntax

os.rename(current_file_name, new_file_name)

Example

Following is an example to rename an existing file test1.txt

#!/usr/bin/python3
import os

# Rename a file from test1.txt to test2.txt
os.rename( "test1.txt", "test2.txt" )

The remove() Method

You can use the remove() method to delete files by supplying the name of the file to be deleted as the argument.

Syntax

os.remove(file_name)

Example

Following is an example to delete an existing file test2.txt

#!/usr/bin/python3
import os

# Delete file test2.txt
os.remove("text2.txt")

Directories in Python

All files are contained within various directories, and Python has no problem handling these too. The os module has several methods that help you create, remove, and change directories.

The mkdir() Method

You can use the mkdir() method of the os module to create directories in the current directory. You need to supply an argument to this method, which contains the name of the directory to be created.

Syntax

os.mkdir("newdir")

Example

Following is an example to create a directory test in the current directory −

#!/usr/bin/python3
import os

# Create a directory "test"
os.mkdir("test")

The chdir() Method

You can use the chdir() method to change the current directory. The chdir() method takes an argument, which is the name of the directory that you want to make the current directory.

Syntax

os.chdir("newdir")

Example

Following is an example to go into "/home/newdir" directory −

#!/usr/bin/python3
import os

# Changing a directory to "/home/newdir"
os.chdir("/home/newdir")

The getcwd() Method

The getcwd() method displays the current working directory.

Syntax

os.getcwd()

Example

Following is an example to give current directory −

#!/usr/bin/python3
import os

# This would give location of the current directory
os.getcwd()

The rmdir() Method

The rmdir() method deletes the directory, which is passed as an argument in the method.

Before removing a directory, all the contents in it should be removed.

Syntax

os.rmdir('dirname')

Example

Following is an example to remove the "/tmp/test" directory. It is required to give fully qualified name of the directory, otherwise it would search for that directory in the current directory.

#!/usr/bin/python3
import os

# This would  remove "/tmp/test"  directory.
os.rmdir( "/tmp/test"  )

File and Directory Related Methods

There are three important sources, which provide a wide range of utility methods to handle and manipulate files & directories on Windows and Unix operating systems. They are as follows −

  • File Object Methods

    The file object provides functions to manipulate files.

  • OS Object Methods

    This provides methods to process files as well as directories.

Python provides two very important features to handle any unexpected error in your Python programs and to add debugging capabilities in them −

  • Exception Handling − This would be covered in this tutorial. Here is a list standard Exceptions available in Python − Standard Exceptions.

  • Assertions − This would be covered in Assertions in Python 3 tutorial.

Standard Exceptions

Here is a list of Standard Exceptions available in Python. −

Sr.No. Exception Name & Description
1

Exception

Base class for all exceptions

2

StopIteration

Raised when the next() method of an iterator does not point to any object.

3

SystemExit

Raised by the sys.exit() function.

4

StandardError

Base class for all built-in exceptions except StopIteration and SystemExit.

5

ArithmeticError

Base class for all errors that occur for numeric calculation.

6

OverflowError

Raised when a calculation exceeds maximum limit for a numeric type.

7

FloatingPointError

Raised when a floating point calculation fails.

8

ZeroDivisonError

Raised when division or modulo by zero takes place for all numeric types.

9

AssertionError

Raised in case of failure of the Assert statement.

10

AttributeError

Raised in case of failure of attribute reference or assignment.

11

EOFError

Raised when there is no input from either the raw_input() or input() function and the end of file is reached.

12

ImportError

Raised when an import statement fails.

13

KeyboardInterrupt

Raised when the user interrupts program execution, usually by pressing Ctrl+c.

14

LookupError

Base class for all lookup errors.

15

IndexError

Raised when an index is not found in a sequence.

16

KeyError

Raised when the specified key is not found in the dictionary.

17

NameError

Raised when an identifier is not found in the local or global namespace.

18

UnboundLocalError

Raised when trying to access a local variable in a function or method but no value has been assigned to it.

19

EnvironmentError

Base class for all exceptions that occur outside the Python environment.

20

IOError

Raised when an input/ output operation fails, such as the print statement or the open() function when trying to open a file that does not exist.

21

OSError

Raised for operating system-related errors.

22

SyntaxError

Raised when there is an error in Python syntax.

23

IndentationError

Raised when indentation is not specified properly.

24

SystemError

Raised when the interpreter finds an internal problem, but when this error is encountered the Python interpreter does not exit.

25

SystemExit

Raised when Python interpreter is quit by using the sys.exit() function. If not handled in the code, causes the interpreter to exit.

26

TypeError

Raised when an operation or function is attempted that is invalid for the specified data type.

27

ValueError

Raised when the built-in function for a data type has the valid type of arguments, but the arguments have invalid values specified.

28

RuntimeError

Raised when a generated error does not fall into any category.

29

NotImplementedError

Raised when an abstract method that needs to be implemented in an inherited class is not actually implemented.

Khẳng định bằng Python

Xác nhận là một kiểm tra sự tỉnh táo mà bạn có thể bật hoặc tắt khi hoàn tất quá trình kiểm tra chương trình của mình.

  • Cách dễ nhất để nghĩ về một khẳng định là ví nó với một raise-ifcâu lệnh (hay chính xác hơn là câu lệnh raise-if-not). Một biểu thức được kiểm tra và nếu kết quả trả về sai, một ngoại lệ sẽ được đưa ra.

  • Các khẳng định được thực hiện bởi câu lệnh khẳng định, từ khóa mới nhất của Python, được giới thiệu trong phiên bản 1.5.

  • Các lập trình viên thường đặt các xác nhận vào đầu một hàm để kiểm tra đầu vào hợp lệ và sau một lệnh gọi hàm để kiểm tra đầu ra hợp lệ.

Tuyên bố khẳng định

Khi gặp câu lệnh khẳng định, Python sẽ đánh giá biểu thức đi kèm, điều này hy vọng là đúng. Nếu biểu thức là sai, Python sẽ đưa ra một ngoại lệ AssertionError .

Cú pháp để khẳng định là -

assert Expression[, Arguments]

Nếu xác nhận không thành công, Python sử dụng ArgumentExpression làm đối số cho AssertionError. Các ngoại lệ AssertionError có thể được bắt và xử lý giống như bất kỳ ngoại lệ nào khác, bằng cách sử dụng câu lệnh try-exception. Nếu chúng không được xử lý, chúng sẽ chấm dứt chương trình và tạo ra một truy nguyên.

Thí dụ

Đây là một chức năng chuyển đổi nhiệt độ nhất định từ độ Kelvin sang độ F. Vì 0 ° K càng lạnh càng tốt, hàm sẽ tắt nếu nó thấy nhiệt độ âm -

#!/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))

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

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!

Exception là gì?

Ngoại lệ là một sự kiện, xảy ra trong quá trình thực thi một chương trình làm gián đoạn luồng thông thường của các lệnh của chương trình. Nói chung, khi một tập lệnh Python gặp một tình huống mà nó không thể đối phó, nó sẽ tạo ra một ngoại lệ. Một ngoại lệ là một đối tượng Python đại diện cho một lỗi.

Khi một tập lệnh Python tạo ra một ngoại lệ, nó phải xử lý ngoại lệ đó ngay lập tức nếu không nó sẽ kết thúc và thoát.

Xử lý một ngoại lệ

Nếu bạn có một số mã đáng ngờ có thể tạo ra một ngoại lệ, bạn có thể bảo vệ chương trình của mình bằng cách đặt mã đáng ngờ vàotry:khối. Sau khi thử: khối, bao gồm mộtexcept: , theo sau là một khối mã xử lý vấn đề một cách tinh tế nhất có thể.

Cú pháp

Đây là cú pháp đơn giản của khối try .... ngoại trừ ... khác -

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.

Dưới đây là một số điểm quan trọng về cú pháp được đề cập ở trên -

  • Một câu lệnh try duy nhất có thể có nhiều câu lệnh ngoại trừ. Điều này rất hữu ích khi khối try chứa các câu lệnh có thể ném ra các loại ngoại lệ khác nhau.

  • Bạn cũng có thể cung cấp một mệnh đề ngoại trừ chung để xử lý bất kỳ ngoại lệ nào.

  • Sau (các) mệnh đề ngoại trừ, bạn có thể thêm một mệnh đề khác. Mã trong khối else thực thi nếu mã trong khối try: không tạo ra ngoại lệ.

  • Khối else là một nơi tốt cho mã không cần sự bảo vệ của try: block.

Thí dụ

Ví dụ này mở một tệp, ghi nội dung vào tệp và xuất hiện một cách duyên dáng vì không có vấn đề gì cả -

#!/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()

Điều này tạo ra kết quả sau:

Written content in the file successfully

Thí dụ

Ví dụ này cố gắng mở một tệp mà bạn không có quyền ghi, vì vậy nó tạo ra một ngoại lệ -

#!/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")

Điều này tạo ra kết quả sau:

Error: can't find file or read data

Điều khoản ngoại trừ không có ngoại lệ

Bạn cũng có thể sử dụng câu lệnh ngoại trừ không có ngoại lệ được định nghĩa như sau:

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.

Loại này của một try-exceptcâu lệnh bắt tất cả các ngoại lệ xảy ra. Mặc dù vậy, việc sử dụng loại câu lệnh thử ngoại trừ này không được coi là một phương pháp lập trình tốt, vì nó bắt được tất cả các trường hợp ngoại lệ nhưng không làm cho lập trình viên xác định được nguyên nhân gốc rễ của sự cố có thể xảy ra.

Mệnh đề ngoại trừ với nhiều ngoại lệ

Bạn cũng có thể sử dụng cùng một câu lệnh ngoại trừ để xử lý nhiều ngoại lệ như sau:

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.

Mệnh đề cuối cùng

Bạn có thể sử dụng một finally: khối cùng với một try:khối. Cácfinally:khối là nơi để đặt bất kỳ mã nào phải thực thi, cho dù khối thử có đưa ra ngoại lệ hay không. Cú pháp của câu lệnh try-last là:

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

Note- Bạn có thể cung cấp (các) mệnh đề ngoại trừ hoặc mệnh đề cuối cùng, nhưng không cung cấp cả hai. Bạn cũng không thể sử dụng mệnh đề else cùng với mệnh đề cuối cùng.

Thí dụ

#!/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()

Nếu bạn không có quyền mở tệp ở chế độ ghi, thì điều này sẽ tạo ra kết quả sau:

Error: can't find file or read data

Ví dụ tương tự có thể được viết rõ ràng hơn như sau:

#!/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")

Điều này tạo ra kết quả sau:

Going to close the file

Khi một ngoại lệ được ném vào khối try , việc thực thi ngay lập tức được chuyển đến khối cuối cùng . Sau khi tất cả các câu lệnh trong khối cuối cùng được thực thi, ngoại lệ được đưa ra một lần nữa và được xử lý trong các câu lệnh ngoại trừ nếu có trong lớp cao hơn tiếp theo của câu lệnh try- exception .

Lập luận về một ngoại lệ

Một ngoại lệ có thể có đối số , là giá trị cung cấp thông tin bổ sung về vấn đề. Nội dung của đối số khác nhau tùy theo ngoại lệ. Bạn nắm bắt đối số của một ngoại lệ bằng cách cung cấp một biến trong mệnh đề ngoại trừ như sau:

try:
   You do your operations here
   ......................
except ExceptionType as Argument:
   You can print value of Argument here...

Nếu bạn viết mã để xử lý một ngoại lệ duy nhất, bạn có thể có một biến theo tên của ngoại lệ trong câu lệnh Ngoại trừ. Nếu bạn đang bẫy nhiều ngoại lệ, bạn có thể có một biến theo sau bộ ngoại lệ.

Biến này nhận giá trị của ngoại lệ chủ yếu chứa nguyên nhân của ngoại lệ. Biến có thể nhận một giá trị duy nhất hoặc nhiều giá trị dưới dạng một bộ giá trị. Bộ mã này thường chứa chuỗi lỗi, số lỗi và vị trí lỗi.

Thí dụ

Sau đây là một ví dụ cho một ngoại lệ duy nhất -

#!/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")

Điều này tạo ra kết quả sau:

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

Nâng cao một ngoại lệ

Bạn có thể nêu ra các ngoại lệ theo một số cách bằng cách sử dụng câu lệnh tăng. Cú pháp chung choraise tuyên bố như sau:

Cú pháp

raise [Exception [, args [, traceback]]]

Ở đây, Exception là kiểu ngoại lệ (ví dụ: NameError) và đối số là giá trị cho đối số ngoại lệ. Đối số là tùy chọn; nếu không được cung cấp, đối số ngoại lệ là Không có.

Đối số cuối cùng, traceback, cũng là tùy chọn (và hiếm khi được sử dụng trong thực tế) và nếu có, là đối tượng theo dõi được sử dụng cho ngoại lệ.

Thí dụ

Ngoại lệ có thể là một chuỗi, một lớp hoặc một đối tượng. Hầu hết các ngoại lệ mà lõi Python nêu ra là các lớp, với một đối số là một thể hiện của lớp. Việc xác định các ngoại lệ mới khá dễ dàng và có thể được thực hiện như sau:

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- Để bắt một ngoại lệ, một mệnh đề "ngoại trừ" phải tham chiếu đến cùng một ngoại lệ được ném ra dưới dạng một đối tượng lớp hoặc một chuỗi đơn giản. Ví dụ, để nắm bắt ngoại lệ ở trên, chúng ta phải viết mệnh đề ngoại trừ như sau:

try:
   Business Logic here...
except Exception as e:
   Exception handling here using e.args...
else:
   Rest of the code here...

Ví dụ sau đây minh họa việc sử dụng nâng cao một ngoại lệ:

#!/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])

Điều này sẽ tạo ra kết quả sau

error in level argument -10

Ngoại lệ do người dùng xác định

Python cũng cho phép bạn tạo các ngoại lệ của riêng mình bằng cách dẫn xuất các lớp từ các ngoại lệ tích hợp tiêu chuẩn.

Đây là một ví dụ liên quan đến RuntimeError . Ở đây, một lớp được tạo ra được phân lớp từ RuntimeError . Điều này rất hữu ích khi bạn cần hiển thị thông tin cụ thể hơn khi bắt được ngoại lệ.

Trong khối try, ngoại lệ do người dùng xác định được nâng lên và bị mắc kẹt trong khối ngoại trừ. Biến e được sử dụng để tạo một thể hiện của lớp Networkerror .

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

Vì vậy, khi bạn đã xác định lớp ở trên, bạn có thể nâng cao ngoại lệ như sau:

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args

Python đã là một ngôn ngữ hướng đối tượng kể từ thời điểm nó tồn tại. Do đó, việc tạo và sử dụng các lớp và đối tượng hoàn toàn dễ dàng. Chương này giúp bạn trở thành chuyên gia trong việc sử dụng hỗ trợ lập trình hướng đối tượng của Python.

Nếu bạn chưa có bất kỳ kinh nghiệm nào về lập trình hướng đối tượng (OO) trước đây, bạn có thể muốn tham khảo một khóa học giới thiệu về nó hoặc ít nhất là một hướng dẫn nào đó để bạn nắm được các khái niệm cơ bản.

Tuy nhiên, đây là một giới thiệu nhỏ về Lập trình hướng đối tượng (OOP) để giúp bạn -

Tổng quan về thuật ngữ OOP

  • Class- Một nguyên mẫu do người dùng định nghĩa cho một đối tượng xác định một tập hợp các thuộc tính đặc trưng cho bất kỳ đối tượng nào của lớp. Các thuộc tính là thành viên dữ liệu (biến lớp và biến phiên bản) và phương thức, được truy cập thông qua ký hiệu dấu chấm.

  • Class variable- Một biến được chia sẻ bởi tất cả các trường hợp của một lớp. Các biến lớp được định nghĩa trong một lớp nhưng bên ngoài bất kỳ phương thức nào của lớp. Các biến lớp không được sử dụng thường xuyên như các biến cá thể.

  • Data member - Một biến lớp hoặc biến thể hiện chứa dữ liệu được liên kết với một lớp và các đối tượng của nó.

  • Function overloading- Việc gán nhiều hơn một hành vi cho một chức năng cụ thể. Thao tác được thực hiện khác nhau tùy theo loại đối tượng hoặc đối số có liên quan.

  • Instance variable - Một biến được định nghĩa bên trong một phương thức và chỉ thuộc về thể hiện hiện tại của một lớp.

  • Inheritance - Việc chuyển các đặc tính của một lớp sang các lớp khác có nguồn gốc từ nó.

  • Instance- Một đối tượng riêng của một giai cấp nhất định. Ví dụ, một đối tượng thuộc về Vòng tròn lớp là một thể hiện của Vòng tròn lớp.

  • Instantiation - Việc tạo một thể hiện của một lớp.

  • Method - Một loại hàm đặc biệt được định nghĩa trong định nghĩa lớp.

  • Object- Một thể hiện duy nhất của cấu trúc dữ liệu được định nghĩa bởi lớp của nó. Một đối tượng bao gồm cả thành viên dữ liệu (biến lớp và biến cá thể) và phương thức.

  • Operator overloading - Việc gán nhiều hơn một chức năng cho một toán tử cụ thể.

Tạo lớp học

Câu lệnh lớp tạo ra một định nghĩa lớp mới. Tên của lớp ngay sau lớp từ khóa, theo sau là dấu hai chấm như sau:

class ClassName:
   'Optional class documentation string'
   class_suite
  • Lớp có một chuỗi tài liệu, có thể được truy cập qua ClassName.__doc__.

  • Các class_suite bao gồm tất cả các câu lệnh thành phần xác định thành viên lớp, thuộc tính dữ liệu và chức năng.

Thí dụ

Sau đây là một ví dụ về một lớp Python đơn giản:

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)
  • Biến empCount là một biến lớp có giá trị được chia sẻ giữa tất cả các trường hợp của a trong lớp này. Điều này có thể được truy cập dưới dạng Employee.empCount từ bên trong lớp hoặc bên ngoài lớp.

  • Phương thức đầu tiên __init __ () là một phương thức đặc biệt, được gọi là phương thức khởi tạo hoặc phương thức khởi tạo lớp mà Python gọi khi bạn tạo một thể hiện mới của lớp này.

  • Bạn khai báo các phương thức lớp khác giống như các hàm bình thường với ngoại lệ là đối số đầu tiên của mỗi phương thức là chính nó . Python thêm tự đối số vào danh sách cho bạn; bạn không cần phải bao gồm nó khi bạn gọi các phương thức.

Tạo đối tượng phiên bản

Để tạo các thể hiện của một lớp, bạn gọi lớp đó bằng cách sử dụng tên lớp và truyền vào bất kỳ đối số nào mà phương thức __init__ của nó chấp nhận.

This would create first object of Employee class
emp1 = Employee("Zara", 2000)
This would create second object of Employee class
emp2 = Employee("Manni", 5000)

Truy cập các thuộc tính

Bạn truy cập các thuộc tính của đối tượng bằng toán tử dấu chấm với đối tượng. Biến lớp sẽ được truy cập bằng tên lớp như sau:

emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)

Bây giờ, đặt tất cả các khái niệm lại với nhau -

#!/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)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Name :  Zara ,Salary:  2000
Name :  Manni ,Salary:  5000
Total Employee 2

Bạn có thể thêm, xóa hoặc sửa đổi các thuộc tính của các lớp và đối tượng bất kỳ lúc nào -

emp1.salary = 7000  # Add an 'salary' attribute.
emp1.name = 'xyz'  # Modify 'age' attribute.
del emp1.salary  # Delete 'age' attribute.

Thay vì sử dụng các câu lệnh bình thường để truy cập các thuộc tính, bạn có thể sử dụng các hàm sau:

  • Các getattr(obj, name[, default]) - để truy cập thuộc tính của đối tượng.

  • Các hasattr(obj,name) - để kiểm tra xem một thuộc tính có tồn tại hay không.

  • Các setattr(obj,name,value)- để thiết lập một thuộc tính. Nếu thuộc tính không tồn tại, thì nó sẽ được tạo.

  • Các delattr(obj, name) - để xóa một thuộc tính.

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'

Thuộc tính lớp tích hợp

Mọi lớp Python đều tuân theo các thuộc tính có sẵn và chúng có thể được truy cập bằng toán tử dấu chấm giống như bất kỳ thuộc tính nào khác -

  • __dict__ - Từ điển chứa không gian tên của lớp.

  • __doc__ - Chuỗi tài liệu lớp hoặc không có, nếu không xác định.

  • __name__ - Tên lớp.

  • __module__- Tên mô-đun mà lớp được định nghĩa. Thuộc tính này là "__main__" ở chế độ tương tác.

  • __bases__ - Một bộ giá trị có thể trống chứa các lớp cơ sở, theo thứ tự xuất hiện của chúng trong danh sách lớp cơ sở.

Đối với lớp trên, chúng ta hãy thử truy cập vào tất cả các thuộc tính này -

#!/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__ )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

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>
}

Các đối tượng phá hủy (thu gom rác)

Python tự động xóa các đối tượng không cần thiết (các kiểu hoặc thể hiện lớp có sẵn) để giải phóng không gian bộ nhớ. Quá trình Python lấy lại định kỳ các khối bộ nhớ không còn được sử dụng nữa được gọi là Thu gom rác.

Bộ thu gom rác của Python chạy trong quá trình thực thi chương trình và được kích hoạt khi số lượng tham chiếu của đối tượng bằng không. Số lượng tham chiếu của một đối tượng thay đổi khi số lượng bí danh trỏ đến nó thay đổi.

Số lượng tham chiếu của một đối tượng tăng lên khi nó được gán một tên mới hoặc được đặt trong một vùng chứa (danh sách, tuple hoặc từ điển). Số lượng tham chiếu của đối tượng giảm khi nó bị xóa bằng del , tham chiếu của nó được gán lại hoặc tham chiếu của nó vượt ra khỏi phạm vi. Khi số lượng tham chiếu của một đối tượng bằng 0, Python sẽ tự động thu thập nó.

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>

Thông thường, bạn sẽ không nhận thấy khi trình thu gom rác phá hủy một cá thể mồ côi và lấy lại không gian của nó. Tuy nhiên, một lớp có thể triển khai phương thức đặc biệt __del __ () , được gọi là hàm hủy, được gọi khi cá thể sắp bị hủy. Phương pháp này có thể được sử dụng để dọn dẹp mọi tài nguyên không phải bộ nhớ được sử dụng bởi một phiên bản.

Thí dụ

Hàm hủy __del __ () này in ra tên lớp của một cá thể sắp bị hủy -

#!/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

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

140338326963984 140338326963984 140338326963984
Point destroyed

Note- Tốt nhất, bạn nên xác định các lớp của mình trong một tệp riêng biệt, sau đó bạn nên nhập chúng vào tệp chương trình chính của mình bằng cách sử dụng câu lệnh nhập .

Trong ví dụ trên, giả sử định nghĩa của một lớp Point được chứa trong point.py và không có mã thực thi nào khác trong đó.

#!/usr/bin/python3
import point

p1 = point.Point()

Kế thừa giai cấp

Thay vì bắt đầu từ đầu, bạn có thể tạo một lớp bằng cách dẫn xuất nó từ một lớp đã có từ trước bằng cách liệt kê lớp cha trong ngoặc đơn sau tên lớp mới.

Lớp con kế thừa các thuộc tính của lớp cha và bạn có thể sử dụng các thuộc tính đó như thể chúng được định nghĩa trong lớp con. Một lớp con cũng có thể ghi đè các thành viên và phương thức dữ liệu từ lớp cha.

Cú pháp

Các lớp có nguồn gốc được khai báo giống như lớp cha của chúng; tuy nhiên, danh sách các lớp cơ sở để kế thừa được đưa ra sau tên lớp:

class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite

Thí dụ

#!/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

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200

Theo cách tương tự, bạn có thể điều khiển một lớp từ nhiều lớp cha như sau:

class A:        # define your class A
.....

class B:         # define your calss B
.....

class C(A, B):   # subclass of A and B
.....

Bạn có thể sử dụng các hàm Issubclass () hoặc isinstance () để kiểm tra mối quan hệ của hai lớp và cá thể.

  • Các issubclass(sub, sup) hàm boolean trả về giá trị True, nếu lớp con đã cho sub thực sự là một lớp con của lớp cha sup.

  • Các isinstance(obj, Class)hàm boolean trả về True, nếu obj là một thể hiện của lớp Class hoặc là một thể hiện của một lớp con của Class

Phương pháp ghi đè

Bạn luôn có thể ghi đè các phương thức lớp cha của mình. Một lý do để ghi đè các phương thức của cha là bạn có thể muốn có chức năng đặc biệt hoặc khác trong lớp con của mình.

Thí dụ

#!/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

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Calling child method

Phương pháp quá tải cơ sở

Bảng sau liệt kê một số chức năng chung mà bạn có thể ghi đè trong các lớp của riêng mình -

Sr.No. Phương pháp, Mô tả & Cuộc gọi Mẫu
1

__init__ ( self [,args...] )

Hàm tạo (với bất kỳ đối số tùy chọn nào)

Cuộc gọi mẫu: obj = className (args)

2

__del__( self )

Trình hủy, xóa một đối tượng

Cuộc gọi mẫu: del obj

3

__repr__( self )

Biểu diễn chuỗi có thể đánh giá

Cuộc gọi mẫu: repr (obj)

4

__str__( self )

Biểu diễn chuỗi có thể in

Cuộc gọi mẫu: str (obj)

5

__cmp__ ( self, x )

Đối tượng so sánh

Cuộc gọi mẫu: cmp (obj, x)

Người vận hành quá tải

Giả sử bạn đã tạo một lớp Vector để biểu diễn các vectơ hai chiều. Điều gì xảy ra khi bạn sử dụng toán tử dấu cộng để thêm chúng? Nhiều khả năng Python sẽ hét vào mặt bạn.

Tuy nhiên, bạn có thể xác định phương thức __add__ trong lớp của mình để thực hiện phép cộng vectơ và sau đó toán tử cộng sẽ hoạt động như mong đợi -

Thí dụ

#!/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)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Vector(7,8)

Ẩn dữ liệu

Các thuộc tính của một đối tượng có thể hiển thị hoặc có thể không hiển thị bên ngoài định nghĩa lớp. Bạn cần đặt tên cho các thuộc tính bằng tiền tố gạch dưới kép và những thuộc tính đó sau đó sẽ không hiển thị trực tiếp với người ngoài.

Thí dụ

#!/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)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

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 bảo vệ các thành viên đó bằng cách thay đổi nội bộ tên để bao gồm tên lớp. Bạn có thể truy cập các thuộc tính như object._className__attrName . Nếu bạn thay thế dòng cuối cùng của mình như sau, thì nó phù hợp với bạn -

.........................
print (counter._JustCounter__secretCount)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

1
2
2

Một biểu thức chính quy là một chuỗi đặc biệt của nhân vật giúp bạn kết hợp hoặc tìm chuỗi khác hoặc bộ dây, sử dụng một cú pháp đặc biệt được tổ chức tại một mô hình. Biểu thức chính quy được sử dụng rộng rãi trong thế giới UNIX.

Mô-đun recung cấp hỗ trợ đầy đủ cho các biểu thức chính quy giống Perl trong Python. Cácre mô-đun tăng ngoại lệ re.error nếu có lỗi xảy ra khi biên dịch hoặc sử dụng biểu thức chính quy.

Chúng tôi sẽ đề cập đến hai hàm quan trọng, sẽ được sử dụng để xử lý các biểu thức chính quy. Tuy nhiên, một điều nhỏ trước tiên: Có nhiều ký tự khác nhau, sẽ có ý nghĩa đặc biệt khi chúng được sử dụng trong biểu thức chính quy. Để tránh bất kỳ sự nhầm lẫn nào trong khi xử lý các biểu thức chính quy, chúng tôi sẽ sử dụng Chuỗi thô nhưr'expression'.

Các mẫu cơ bản khớp với các ký tự đơn

Sr.No. Biểu thức & Kết hợp
1

a, X, 9, <

các nhân vật bình thường chỉ khớp chính xác với chính họ.

2

. (a period)

khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới '\ n'

3

\w

khớp với một ký tự "từ": một chữ cái hoặc chữ số hoặc gạch dưới [a-zA-Z0-9_].

4

\W

khớp với bất kỳ ký tự không phải từ nào.

5

\b

ranh giới giữa từ và không từ

6

\s

khớp với một ký tự khoảng trắng duy nhất - dấu cách, dòng mới, trả về, tab

7

\S

khớp với bất kỳ ký tự không có khoảng trắng nào.

số 8

\t, \n, \r

tab, dòng mới, trở lại

9

\d

chữ số thập phân [0-9]

10

^

khớp với phần đầu của chuỗi

11

$

khớp với cuối chuỗi

12

\

ức chế sự "đặc biệt" của một nhân vật.

Cờ tổng hợp

Cờ tổng hợp cho phép bạn sửa đổi một số khía cạnh về cách hoạt động của biểu thức chính quy. Cờ có sẵn trong mô-đun lại dưới hai tên, một tên dài chẳng hạn nhưIGNORECASE và dạng ngắn, một chữ cái, chẳng hạn như I.

Sr.No. Cờ & Ý nghĩa
1

ASCII, A

Làm cho một số thoát như \ w, \ b, \ s và \ d chỉ khớp trên các ký tự ASCII với thuộc tính tương ứng.

2

DOTALL, S

Tạo, khớp với bất kỳ ký tự nào, kể cả dòng mới

3

IGNORECASE, I

Thực hiện đối sánh không phân biệt chữ hoa chữ thường

4

LOCALE, L

Thực hiện một trận đấu nhận biết ngôn ngữ

5

MULTILINE, M

Đối sánh nhiều dòng, ảnh hưởng đến ^ và $

6

VERBOSE, X (for ‘extended’)

Bật RE dài dòng, có thể được sắp xếp gọn gàng và dễ hiểu hơn

Chức năng đối sánh

Hàm này cố gắng khớp mẫu RE thành chuỗi với các cờ tùy chọn .

Đây là cú pháp cho hàm này:

re.match(pattern, string, flags = 0)

Đây là mô tả của các tham số -

Sr.No. Mô tả về Thông Số
1

pattern

Đây là biểu thức chính quy được so khớp.

2

string

Đây là chuỗi, sẽ được tìm kiếm để khớp với mẫu ở đầu chuỗi.

3

flags

Bạn có thể chỉ định các cờ khác nhau bằng cách sử dụng bitwise OR (|). Đây là những bổ ngữ, được liệt kê trong bảng dưới đây.

Hàm re.match trả về mộtmatch đối tượng về sự thành công, Nonevề thất bại. Chúng tôi sử dụng hàm nhóm (num) hoặc nhóm () củamatch đối tượng để có được biểu thức phù hợp.

Sr.No. Đối sánh Phương pháp & Mô tả
1

group(num = 0)

Phương thức này trả về toàn bộ đối sánh (hoặc số nhóm con cụ thể)

2

groups()

Phương thức này trả về tất cả các nhóm con phù hợp trong một bộ (trống nếu không có bất kỳ nhóm nào)

Thí dụ

#!/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!!")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

Chức năng tìm kiếm

Hàm này tìm kiếm lần xuất hiện đầu tiên của mẫu RE trong chuỗi với các cờ tùy chọn .

Đây là cú pháp cho hàm này:

re.search(pattern, string, flags = 0)

Đây là mô tả của các tham số -

Sr.No. Mô tả về Thông Số
1

pattern

Đây là biểu thức chính quy được so khớp.

2

string

Đây là chuỗi, sẽ được tìm kiếm để khớp với mẫu ở bất kỳ đâu trong chuỗi.

3

flags

Bạn có thể chỉ định các cờ khác nhau bằng cách sử dụng bitwise OR (|). Đây là những bổ ngữ, được liệt kê trong bảng dưới đây.

Hàm re.search trả về mộtmatch đối tượng về sự thành công, nonevề thất bại. Chúng tôi sử dụng hàm nhóm (num) hoặc nhóm () củamatch đối tượng để có được biểu thức phù hợp.

Sr.No. Đối sánh Phương pháp & Mô tả
1

group(num = 0)

Phương thức này trả về toàn bộ đối sánh (hoặc số nhóm con cụ thể)

2

groups()

Phương thức này trả về tất cả các nhóm con phù hợp trong một bộ (trống nếu không có bất kỳ nhóm nào)

Thí dụ

#!/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!!")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

Tìm kiếm so khớp với tìm kiếm

Python cung cấp hai hoạt động nguyên thủy khác nhau dựa trên biểu thức chính quy: match chỉ kiểm tra kết quả khớp ở đầu chuỗi, trong khi search kiểm tra sự trùng khớp ở bất kỳ đâu trong chuỗi (đây là những gì Perl làm theo mặc định).

Thí dụ

#!/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!!")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

No match!!
search --> matchObj.group() :  dogs

Tìm kiếm và Thay thế

Một trong những điều quan trọng nhất re các phương thức sử dụng biểu thức chính quy là sub.

Cú pháp

re.sub(pattern, repl, string, max=0)

Phương thức này thay thế tất cả các lần xuất hiện của mẫu RE trong chuỗi bằng repl , thay thế tất cả các lần xuất hiện trừ khi cung cấp giá trị tối đa . Phương thức này trả về chuỗi đã sửa đổi.

Thí dụ

#!/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)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Phone Num :  2004-959-559
Phone Num :  2004959559

Công cụ sửa đổi biểu thức chính quy: Cờ tùy chọn

Các ký tự biểu thức chính quy có thể bao gồm một công cụ sửa đổi tùy chọn để kiểm soát các khía cạnh khác nhau của đối sánh. Các bổ ngữ được chỉ định dưới dạng cờ tùy chọn. Bạn có thể cung cấp nhiều công cụ sửa đổi bằng cách sử dụng OR (|) độc quyền, như được hiển thị trước đây và có thể được đại diện bởi một trong những công cụ này -

Sr.No. Công cụ sửa đổi & mô tả
1

re.I

Thực hiện đối sánh không phân biệt chữ hoa chữ thường.

2

re.L

Phiên dịch các từ theo ngôn ngữ hiện tại. Cách giải thích này ảnh hưởng đến nhóm chữ cái (\ w và \ W), cũng như hành vi ranh giới từ (\ b và \ B).

3

re.M

Làm cho $ khớp với phần cuối của một dòng (không chỉ phần cuối của chuỗi) và làm cho ^ khớp với phần đầu của bất kỳ dòng nào (không chỉ phần đầu của chuỗi).

4

re.S

Tạo một dấu chấm (dấu chấm) khớp với bất kỳ ký tự nào, kể cả dòng mới.

5

re.U

Phiên dịch các chữ cái theo bộ ký tự Unicode. Cờ này ảnh hưởng đến hoạt động của \ w, \ W, \ b, \ B.

6

re.X

Cho phép cú pháp biểu thức chính quy "dễ thương hơn". Nó bỏ qua khoảng trắng (ngoại trừ bên trong một tập hợp [] hoặc khi thoát ra bởi dấu gạch chéo ngược) và coi # không thoát như một điểm đánh dấu nhận xét.

Mẫu biểu thức chính quy

Ngoại trừ các ký tự điều khiển, (+ ? . * ^ $ ( ) [ ] { } | \), tất cả các ký tự đều khớp với nhau. Bạn có thể thoát một ký tự điều khiển bằng cách đặt trước nó một dấu gạch chéo ngược.

Bảng sau liệt kê cú pháp biểu thức chính quy có sẵn trong Python:

Sr.No. Mô tả về Thông Số
1

^

Đối sánh đầu dòng.

2

$

Đối sánh với cuối dòng.

3

.

Khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới. Sử dụng tùy chọn m cũng cho phép nó khớp với dòng mới.

4

[...]

Khớp bất kỳ ký tự đơn nào trong ngoặc.

5

[^...]

Đối sánh bất kỳ ký tự đơn nào không có trong dấu ngoặc

6

re*

Khớp với 0 hoặc nhiều lần xuất hiện của biểu thức trước.

7

re+

So khớp 1 hoặc nhiều lần xuất hiện của biểu thức trước.

số 8

re?

Khớp với 0 hoặc 1 lần xuất hiện của biểu thức trước.

9

re{ n}

Khớp chính xác n số lần xuất hiện của biểu thức trước.

10

re{ n,}

So khớp n hoặc nhiều lần xuất hiện của biểu thức trước.

11

re{ n, m}

Khớp ít nhất n và nhiều nhất m lần xuất hiện của biểu thức trước.

12

a|b

Đối sánh với a hoặc b.

13

(re)

Nhóm các biểu thức chính quy và ghi nhớ văn bản phù hợp.

14

(?imx)

Tạm thời chuyển đổi trên các tùy chọn i, m hoặc x trong một biểu thức chính quy. Nếu trong ngoặc đơn, chỉ vùng đó bị ảnh hưởng.

15

(?-imx)

Tạm thời tắt các tùy chọn i, m hoặc x trong một biểu thức chính quy. Nếu trong ngoặc đơn, chỉ vùng đó bị ảnh hưởng.

16

(?: re)

Nhóm các biểu thức chính quy mà không cần nhớ văn bản phù hợp.

17

(?imx: re)

Tạm thời chuyển đổi các tùy chọn i, m hoặc x trong dấu ngoặc đơn.

18

(?-imx: re)

Tạm thời tắt các tùy chọn i, m hoặc x trong dấu ngoặc đơn.

19

(?#...)

Bình luận.

20

(?= re)

Chỉ định vị trí bằng cách sử dụng một mẫu. Không có một phạm vi.

21

(?! re)

Chỉ định vị trí bằng cách sử dụng phủ định mẫu. Không có một phạm vi.

22

(?> re)

Khớp với mẫu độc lập mà không cần bẻ khóa ngược.

23

\w

Khớp các ký tự từ.

24

\W

Đối sánh các ký tự không phải từ khóa.

25

\s

Khớp khoảng trắng. Tương đương với [\ t \ n \ r \ f].

26

\S

Khớp với khoảng trắng.

27

\d

Khớp các chữ số. Tương đương với [0-9].

28

\D

Phù hợp với nondigits.

29

\A

Đối sánh với phần đầu của chuỗi.

30

\Z

Đối sánh với phần cuối của chuỗi. Nếu một dòng mới tồn tại, nó sẽ khớp ngay trước dòng mới.

31

\z

Đối sánh với phần cuối của chuỗi.

32

\G

Các trận đấu chỉ kết thúc trận đấu cuối cùng.

33

\b

Khớp các ranh giới từ khi nằm ngoài dấu ngoặc. Khớp với khoảng trắng lùi (0x08) khi bên trong dấu ngoặc.

34

\B

Khớp các ranh giới không phải từ.

35

\n, \t, etc.

Khớp với dòng mới, dấu xuống dòng, tab, v.v.

36

\1...\9

Đối sánh biểu thức con được nhóm thứ n.

37

\10

Đối sánh biểu thức con được nhóm thứ n nếu nó đã khớp. Mặt khác, đề cập đến biểu diễn bát phân của mã ký tự.

Ví dụ về Cụm từ Thông dụng

Ký tự chữ

Sr.No. Ví dụ & Mô tả
1

python

Ghép "con trăn".

Các lớp nhân vật

Sr.No. Ví dụ & Mô tả
1

[Pp]ython

Khớp "Python" hoặc "python"

2

rub[ye]

Khớp "ruby" hoặc "rube"

3

[aeiou]

Khớp với bất kỳ một nguyên âm chữ thường nào

4

[0-9]

Khớp với bất kỳ chữ số nào; giống với [0123456789]

5

[a-z]

Khớp với bất kỳ ký tự ASCII viết thường nào

6

[A-Z]

Khớp với bất kỳ ký tự ASCII viết hoa nào

7

[a-zA-Z0-9]

Phù hợp với bất kỳ điều nào ở trên

số 8

[^aeiou]

Khớp bất kỳ thứ gì khác ngoài một nguyên âm viết thường

9

[^0-9]

Khớp bất kỳ thứ gì khác ngoài một chữ số

Các lớp nhân vật đặc biệt

Sr.No. Ví dụ & Mô tả
1

.

Khớp bất kỳ ký tự nào ngoại trừ dòng mới

2

\d

Khớp một chữ số: [0-9]

3

\D

Khớp với một nondigit: [^ 0-9]

4

\s

Khớp một ký tự khoảng trắng: [\ t \ r \ n \ f]

5

\S

Khớp với khoảng trắng: [^ \ t \ r \ n \ f]

6

\w

Khớp một ký tự từ đơn: [A-Za-z0-9_]

7

\W

Khớp một ký tự không phải từ khóa: [^ A-Za-z0-9_]

Các trường hợp lặp lại

Sr.No. Ví dụ & Mô tả
1

ruby?

Đối sánh "rub" hoặc "ruby": y là tùy chọn

2

ruby*

Khớp "chà" cộng với 0 hoặc nhiều y

3

ruby+

Khớp "chà" cộng với 1 hoặc nhiều y

4

\d{3}

Khớp chính xác 3 chữ số

5

\d{3,}

Khớp 3 chữ số trở lên

6

\d{3,5}

Khớp 3, 4 hoặc 5 chữ số

Sự lặp lại nông cạn

Điều này phù hợp với số lần lặp lại nhỏ nhất -

Sr.No. Ví dụ & Mô tả
1

<.*>

Lặp lại tham lam: khớp với "<python> perl>"

2

<.*?>

Nongreedy: đối sánh "<python>" trong "<python> perl>"

Phân nhóm bằng dấu ngoặc đơn

Sr.No. Ví dụ & Mô tả
1

\D\d+

Không có nhóm: + lặp lại \ d

2

(\D\d)+

Đã nhóm: + lặp lại cặp \ D \ d

3

([Pp]ython(,)?)+

Khớp "Python", "Python, python, python", v.v.

Tài liệu tham khảo

Điều này khớp lại với một nhóm đã khớp trước đó -

Sr.No. Ví dụ & Mô tả
1

([Pp])ython&\1ails

Khớp với python & pails hoặc Python & Pails

2

(['"])[^\1]*\1

Chuỗi được trích dẫn đơn hoặc kép. \ 1 đối sánh với bất kỳ thứ gì mà nhóm đầu tiên phù hợp. \ 2 đối sánh với bất kỳ thứ gì mà nhóm thứ 2 phù hợp, v.v.

Giải pháp thay thế

Sr.No. Ví dụ & Mô tả
1

python|perl

Khớp "python" hoặc "perl"

2

rub(y|le)

Khớp "ruby" hoặc "rúp"

3

Python(!+|\?)

"Python" được theo sau bởi một hoặc nhiều! hay một cái?

Mỏ neo

Điều này cần phải chỉ định vị trí khớp.

Sr.No. Ví dụ & Mô tả
1

^Python

Khớp "Python" ở đầu chuỗi hoặc dòng nội bộ

2

Python$

Khớp "Python" ở cuối chuỗi hoặc dòng

3

\APython

Khớp "Python" ở đầu chuỗi

4

Python\Z

Khớp "Python" ở cuối chuỗi

5

\bPython\b

Khớp "Python" ở một ranh giới từ

6

\brub\B

\ B là ranh giới không có từ khóa: đối sánh "rub" trong "rube" và "ruby" nhưng không đối sánh một mình

7

Python(?=!)

Khớp "Python", nếu theo sau là dấu chấm than.

số 8

Python(?!!)

Khớp "Python", nếu không có dấu chấm than theo sau.

Cú pháp đặc biệt với dấu ngoặc đơn

Sr.No. Ví dụ & Mô tả
1

R(?#comment)

Đối sánh với "R". Tất cả phần còn lại là bình luận

2

R(?i)uby

Không phân biệt chữ hoa chữ thường khi đối sánh "uby"

3

R(?i:uby)

Giống như trên

4

rub(?:y|le))

Chỉ nhóm mà không tạo \ 1 backreference

Giao diện Cổng chung, hoặc CGI, là một tập hợp các tiêu chuẩn xác định cách thông tin được trao đổi giữa máy chủ web và tập lệnh tùy chỉnh. Các thông số kỹ thuật CGI hiện được duy trì bởi NCSA.

CGI là gì?

  • Giao diện cổng chung, hoặc CGI, là một tiêu chuẩn cho các chương trình cổng bên ngoài để giao tiếp với các máy chủ thông tin như máy chủ HTTP.

  • Phiên bản hiện tại là CGI / 1.1 và CGI / 1.2 đang được hoàn thiện.

Duyệt web

Để hiểu khái niệm về CGI, chúng ta hãy xem điều gì sẽ xảy ra khi chúng ta nhấp vào siêu liên kết để duyệt qua một trang web hoặc URL cụ thể.

  • Trình duyệt của bạn liên hệ với máy chủ web HTTP và yêu cầu URL, tức là tên tệp.

  • Máy chủ Web phân tích cú pháp URL và tìm kiếm tên tệp. Nếu nó tìm thấy tệp đó thì sẽ gửi nó trở lại trình duyệt, nếu không sẽ gửi thông báo lỗi cho biết rằng bạn đã yêu cầu một tệp sai.

  • Trình duyệt web nhận phản hồi từ máy chủ web và hiển thị tệp đã nhận hoặc thông báo lỗi.

Tuy nhiên, có thể thiết lập máy chủ HTTP để bất cứ khi nào tệp trong một thư mục nhất định được yêu cầu, tệp đó sẽ không được gửi lại; thay vào đó, nó được thực thi như một chương trình và bất cứ thứ gì mà chương trình đó xuất ra sẽ được gửi lại để trình duyệt của bạn hiển thị. Chức năng này được gọi là Giao diện cổng chung hoặc CGI và các chương trình được gọi là tập lệnh CGI. Các chương trình CGI này có thể là Python Script, PERL Script, Shell Script, chương trình C hoặc C ++, v.v.

Sơ đồ kiến ​​trúc CGI

Hỗ trợ và cấu hình máy chủ web

Trước khi bạn tiếp tục Lập trình CGI, hãy đảm bảo rằng Máy chủ Web của bạn hỗ trợ CGI và nó được cấu hình để xử lý các Chương trình CGI. Tất cả các Chương trình CGI được thực thi bởi máy chủ HTTP được lưu giữ trong một thư mục được cấu hình trước. Thư mục này được gọi là Thư mục CGI và theo quy ước, nó được đặt tên là / var / www / cgi-bin. Theo quy ước, các tệp CGI có phần mở rộng là.cgi, nhưng bạn có thể giữ các tệp của mình bằng tiện ích mở rộng python .py cũng.

Theo mặc định, máy chủ Linux được định cấu hình để chỉ chạy các tập lệnh trong thư mục cgi-bin trong / var / www. Nếu bạn muốn chỉ định bất kỳ thư mục nào khác để chạy các tập lệnh CGI của mình, hãy nhận xét các dòng sau trong tệp 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>

Ở đây, chúng tôi giả định rằng bạn đã thiết lập và chạy thành công Máy chủ Web và bạn có thể chạy bất kỳ chương trình CGI nào khác như Perl hoặc Shell, v.v.

Chương trình CGI đầu tiên

Đây là một liên kết đơn giản, được liên kết với tập lệnh CGI có tên hello.py . Tệp này được lưu trong thư mục / var / www / cgi-bin và có nội dung sau. Trước khi chạy chương trình CGI, hãy đảm bảo rằng bạn đã thay đổi chế độ tệp bằng cách sử dụngchmod 755 hello.py Lệnh UNIX để thực thi tệp.

#!/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- Dòng đầu tiên trong tập lệnh phải là đường dẫn đến tệp thực thi Python. Trong Linux, nó phải là #! / Usr / bin / python3

Nhập URL sau vào trình duyệt của bạn

http://localhost:8080/cgi-bin/hello.py

Từ xin chào! Đây là chương trình CGI đầu tiên của tôi

Tập lệnh hello.py này là một tập lệnh Python đơn giản, viết đầu ra của nó trên tệp STDOUT, tức là màn hình. Có một tính năng quan trọng và bổ sung có sẵn đó là dòng đầu tiên được inContent-type:text/html\r\n\r\n. Dòng này được gửi trở lại trình duyệt và nó chỉ định loại nội dung sẽ hiển thị trên màn hình trình duyệt.

Đến đây chắc hẳn bạn đã hiểu khái niệm cơ bản về CGI và bạn có thể viết nhiều chương trình CGI phức tạp bằng Python. Tập lệnh này có thể tương tác với bất kỳ hệ thống bên ngoài nào khác cũng để trao đổi thông tin như RDBMS.

Tiêu đề HTTP

Dòng Content-type:text/html\r\n\r\nlà một phần của tiêu đề HTTP được gửi đến trình duyệt để hiểu nội dung. Tất cả tiêu đề HTTP sẽ ở dạng sau:

HTTP Field Name: Field Content

For Example
Content-type: text/html\r\n\r\n

Có một số tiêu đề HTTP quan trọng khác mà bạn sẽ sử dụng thường xuyên trong Lập trình CGI của mình.

Sr.No. Tiêu đề & Mô tả
1

Content-type:

Một chuỗi MIME xác định định dạng của tệp được trả về. Ví dụ là Content-type: text / html

2

Expires: Date

Ngày thông tin trở nên không hợp lệ. Nó được trình duyệt sử dụng để quyết định khi nào một trang cần được làm mới. Chuỗi ngày hợp lệ có định dạng 01/01/1998 12:00:00 GMT.

3

Location: URL

URL được trả về thay vì URL được yêu cầu. Bạn có thể sử dụng trường này để chuyển hướng yêu cầu đến bất kỳ tệp nào.

4

Last-modified: Date

Ngày sửa đổi cuối cùng của tài nguyên.

5

Content-length: N

Độ dài, tính bằng byte, của dữ liệu được trả về. Trình duyệt sử dụng giá trị này để báo cáo thời gian tải xuống ước tính cho một tệp.

6

Set-Cookie: String

Đặt cookie được chuyển qua chuỗi

Biến môi trường CGI

Tất cả các chương trình CGI đều có quyền truy cập vào các biến môi trường sau đây. Các biến này đóng một vai trò quan trọng trong khi viết bất kỳ chương trình CGI nào.

Sr.No. Tên và mô tả biến
1

CONTENT_TYPE

Kiểu dữ liệu của nội dung. Được sử dụng khi máy khách đang gửi nội dung đính kèm đến máy chủ. Ví dụ: tải lên tệp.

2

CONTENT_LENGTH

Độ dài của thông tin truy vấn. Nó chỉ có sẵn cho các yêu cầu ĐĂNG.

3

HTTP_COOKIE

Trả về các cookie đã đặt ở dạng cặp khóa & giá trị.

4

HTTP_USER_AGENT

Trường tiêu đề yêu cầu Tác nhân người dùng chứa thông tin về tác nhân người dùng khởi tạo yêu cầu. Nó là tên của trình duyệt web.

5

PATH_INFO

Đường dẫn cho tập lệnh CGI.

6

QUERY_STRING

Thông tin mã hóa URL được gửi với yêu cầu phương thức GET.

7

REMOTE_ADDR

Địa chỉ IP của máy chủ từ xa thực hiện yêu cầu. Đây là cách ghi nhật ký hữu ích hoặc để xác thực.

số 8

REMOTE_HOST

Tên đầy đủ của máy chủ thực hiện yêu cầu. Nếu thông tin này không có sẵn, thì REMOTE_ADDR có thể được sử dụng để lấy địa chỉ IR.

9

REQUEST_METHOD

Phương pháp được sử dụng để thực hiện yêu cầu. Các phương pháp phổ biến nhất là GET và POST.

10

SCRIPT_FILENAME

Đường dẫn đầy đủ đến tập lệnh CGI.

11

SCRIPT_NAME

Tên của tập lệnh CGI.

12

SERVER_NAME

Tên máy chủ hoặc Địa chỉ IP của máy chủ

13

SERVER_SOFTWARE

Tên và phiên bản của phần mềm mà máy chủ đang chạy.

Đây là chương trình CGI nhỏ để liệt kê tất cả các biến CGI. Nhấp vào liên kết này để xem kết quả Nhận môi trường

#!/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]))

Phương thức GET và POST

Chắc hẳn bạn đã gặp nhiều tình huống khi bạn cần chuyển một số thông tin từ trình duyệt đến máy chủ web và cuối cùng là Chương trình CGI của mình. Thông thường nhất, trình duyệt sử dụng hai phương pháp truyền thông tin này đến máy chủ web. Các phương thức này là GET Method và POST Method.

Truyền thông tin bằng phương pháp GET

Phương thức GET gửi thông tin người dùng đã mã hóa được thêm vào yêu cầu trang. Trang và thông tin được mã hóa được phân tách bằng dấu? nhân vật như sau -

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2

Phương thức GET là phương thức mặc định để chuyển thông tin từ trình duyệt đến máy chủ web và nó tạo ra một chuỗi dài xuất hiện trong hộp Location: của trình duyệt của bạn. Không bao giờ sử dụng phương thức GET nếu bạn có mật khẩu hoặc thông tin nhạy cảm khác để chuyển đến máy chủ. Phương thức GET có giới hạn về kích thước: chỉ có thể gửi 1024 ký tự trong một chuỗi yêu cầu. Phương thức GET gửi thông tin bằng cách sử dụng tiêu đề QUERY_STRING và sẽ có thể truy cập được trong Chương trình CGI của bạn thông qua biến môi trường QUERY_STRING.

Bạn có thể chuyển thông tin bằng cách ghép các cặp khóa và giá trị với bất kỳ URL nào hoặc bạn có thể sử dụng thẻ HTML <FORM> để chuyển thông tin bằng phương thức GET.

Ví dụ về URL đơn giản: Phương thức lấy

Đây là một URL đơn giản, chuyển hai giá trị đến chương trình hello_get.py bằng phương thức GET.

/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI

Dưới là hello_get.pyscript để xử lý đầu vào do trình duyệt web cung cấp. Chúng tôi sẽ sử dụngcgi mô-đun, giúp dễ dàng truy cập thông tin đã chuyển -

#!/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>")

Điều này sẽ tạo ra kết quả sau:

Xin chào ZARA ALI

MẪU đơn giản Ví dụ: Phương pháp GET

Ví dụ này chuyển hai giá trị bằng HTML FORM và nút gửi. Chúng tôi sử dụng cùng một tập lệnh CGI hello_get.py để xử lý đầu vào này.

<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>

Đây là kết quả thực tế của biểu mẫu trên, bạn nhập Họ và Tên rồi nhấn nút gửi để xem kết quả.

Truyền thông tin bằng phương pháp POST

Phương pháp truyền thông tin đến chương trình CGI thường đáng tin cậy hơn là phương pháp POST. Điều này đóng gói thông tin theo cách giống hệt như các phương thức GET, nhưng thay vì gửi nó dưới dạng một chuỗi văn bản sau dấu? trong URL, nó sẽ gửi nó dưới dạng một tin nhắn riêng biệt. Thông báo này đi vào tập lệnh CGI ở dạng đầu vào chuẩn.

Dưới đây là cùng một tập lệnh hello_get.py xử lý GET cũng như phương thức 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>"

Hãy để chúng tôi lấy lại ví dụ tương tự như trên, chuyển hai giá trị bằng HTML FORM và nút gửi. Chúng tôi sử dụng cùng một tập lệnh CGI hello_get.py để xử lý đầu vào này.

<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>

Đây là kết quả thực tế của biểu mẫu trên. Bạn điền Họ và Tên rồi bấm nút gửi để xem kết quả.

Chuyển dữ liệu hộp kiểm sang chương trình CGI

Hộp kiểm được sử dụng khi bắt buộc phải chọn nhiều tùy chọn.

Đây là mã HTML mẫu cho biểu mẫu có hai hộp kiểm -

<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>

Kết quả của mã này là dạng sau:

Dưới đây là tập lệnh checkbox.cgi để xử lý đầu vào do trình duyệt web cung cấp cho nút hộp kiểm.

#!/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>"

Truyền dữ liệu nút radio sang chương trình CGI

Các nút Radio được sử dụng khi chỉ cần chọn một tùy chọn.

Đây là mã HTML mẫu cho biểu mẫu có hai nút radio -

<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>

Kết quả của mã này là dạng sau:

Dưới đây là tập lệnh radiobutton.py để xử lý đầu vào do trình duyệt web cung cấp cho nút radio -

#!/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>"

Chuyển dữ liệu vùng văn bản sang chương trình CGI

Phần tử TEXTAREA được sử dụng khi văn bản nhiều dòng phải được chuyển đến Chương trình CGI.

Đây là mã HTML mẫu cho biểu mẫu có hộp 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>

Kết quả của mã này là dạng sau:

Dưới đây là tập lệnh textarea.cgi để xử lý đầu vào do trình duyệt web cung cấp -

#!/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>"

Chuyển dữ liệu hộp thả xuống cho chương trình CGI

Hộp thả xuống được sử dụng khi chúng ta có nhiều tùy chọn nhưng chỉ một hoặc hai tùy chọn được chọn.

Đây là mã HTML mẫu cho biểu mẫu có một hộp thả xuống -

<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>

Kết quả của mã này là dạng sau:

Dưới đây là tập lệnh dropdown.py để xử lý đầu vào do trình duyệt web cung cấp.

#!/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>"

Sử dụng Cookie trong CGI

Giao thức HTTP là một giao thức không trạng thái. Đối với một trang web thương mại, bắt buộc phải duy trì thông tin phiên giữa các trang khác nhau. Ví dụ: một đăng ký người dùng kết thúc sau khi hoàn thành nhiều trang. Làm cách nào để duy trì thông tin phiên của người dùng trên tất cả các trang web?

Trong nhiều tình huống, sử dụng cookie là phương pháp hiệu quả nhất để ghi nhớ và theo dõi các sở thích, mua hàng, hoa hồng và các thông tin khác cần thiết để có trải nghiệm khách truy cập hoặc thống kê trang web tốt hơn.

Làm thế nào nó hoạt động?

Máy chủ của bạn gửi một số dữ liệu đến trình duyệt của khách truy cập dưới dạng cookie. Trình duyệt có thể chấp nhận cookie. Nếu có, nó được lưu trữ dưới dạng bản ghi văn bản thuần túy trên ổ cứng của khách truy cập. Bây giờ, khi khách truy cập đến một trang khác trên trang web của bạn, cookie sẽ có sẵn để truy xuất. Sau khi được truy xuất, máy chủ của bạn biết / ghi nhớ những gì đã được lưu trữ.

Cookie là một bản ghi dữ liệu văn bản thuần túy gồm 5 trường có độ dài thay đổi -

  • Expires- Ngày cookie sẽ hết hạn. Nếu ô này trống, cookie sẽ hết hạn khi khách truy cập thoát khỏi trình duyệt.

  • Domain - Tên miền của trang web của bạn.

  • Path- Đường dẫn đến thư mục hoặc trang web đặt cookie. Phần này có thể để trống nếu bạn muốn lấy cookie từ bất kỳ thư mục hoặc trang nào.

  • Secure- Nếu trường này chứa từ "an toàn", thì cookie chỉ có thể được truy xuất bằng máy chủ bảo mật. Nếu trường này trống, không có hạn chế như vậy tồn tại.

  • Name=Value - Cookie được thiết lập và truy xuất dưới dạng các cặp khóa và giá trị.

Thiết lập Cookie

Rất dễ dàng để gửi cookie đến trình duyệt. Các cookie này được gửi cùng với Tiêu đề HTTP trước khi đến trường Loại nội dung. Giả sử bạn muốn đặt UserID và Mật khẩu làm cookie. Việc đặt cookie được thực hiện như sau:

#!/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....

Từ ví dụ này, bạn chắc hẳn đã hiểu cách đặt cookie. Chúng tôi sử dụngSet-Cookie Tiêu đề HTTP để đặt cookie.

Bạn có thể tùy chọn đặt các thuộc tính cookie như Expires, Domain và Path. Đáng chú ý là cookie được đặt trước khi gửi dòng ma thuật"Content-type:text/html\r\n\r\n.

Truy xuất Cookie

Rất dễ dàng để truy xuất tất cả các cookie đã đặt. Cookie được lưu trữ trong biến môi trường CGI HTTP_COOKIE và chúng sẽ có dạng sau:

key1 = value1;key2 = value2;key3 = value3....

Đây là một ví dụ về cách lấy cookie.

#!/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

Điều này tạo ra kết quả sau cho các cookie được đặt bởi tập lệnh trên:

User ID = XYZ
Password = XYZ123

Ví dụ về Tải lên Tệp

Để tải tệp lên, biểu mẫu HTML phải có thuộc tính enctype được đặt thành multipart/form-data. Thẻ đầu vào với loại tệp sẽ tạo nút "Duyệt qua".

<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>

Kết quả của mã này là dạng sau:

Ví dụ trên đã bị vô hiệu hóa có chủ ý để lưu những người tải lên tệp trên máy chủ của chúng tôi, nhưng bạn có thể thử mã trên với máy chủ của mình.

Đây là kịch bản save_file.py để xử lý tải lên tệp -

#!/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,)

Nếu bạn chạy tập lệnh trên trên Unix / Linux, thì bạn cần chú ý thay thế dấu tách tệp như sau, nếu không trên máy windows của bạn ở trên câu lệnh open () sẽ hoạt động tốt.

fn = os.path.basename(fileitem.filename.replace("\\", "/" ))

Làm thế nào để Tăng Hộp thoại "Tải xuống Tệp"?

Đôi khi, bạn muốn cung cấp tùy chọn trong đó người dùng có thể nhấp vào liên kết và nó sẽ bật lên hộp thoại "Tải xuống tệp" cho người dùng thay vì hiển thị nội dung thực tế. Điều này rất dễ dàng và có thể đạt được thông qua tiêu đề HTTP. Tiêu đề HTTP này khác với tiêu đề được đề cập trong phần trước.

Ví dụ, nếu bạn muốn FileName tệp có thể tải xuống từ một liên kết nhất định, sau đó cú pháp của nó như sau:

#!/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()

Hy vọng bạn thích hướng dẫn này. Nếu có, vui lòng gửi cho tôi phản hồi của bạn tại: Liên hệ với chúng tôi

Tiêu chuẩn Python cho giao diện cơ sở dữ liệu là Python DB-API. Hầu hết các giao diện cơ sở dữ liệu Python đều tuân theo tiêu chuẩn này.

Bạn có thể chọn cơ sở dữ liệu phù hợp cho ứng dụng của mình. API cơ sở dữ liệu Python hỗ trợ nhiều loại máy chủ cơ sở dữ liệu như -

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

Đây là danh sách các giao diện cơ sở dữ liệu Python có sẵn - Python Database Interfaces and APIs . Bạn phải tải xuống mô-đun API DB riêng biệt cho mỗi cơ sở dữ liệu bạn cần truy cập. Ví dụ: nếu bạn cần truy cập cơ sở dữ liệu Oracle cũng như cơ sở dữ liệu MySQL, bạn phải tải xuống cả mô-đun cơ sở dữ liệu Oracle và MySQL.

API DB cung cấp một tiêu chuẩn tối thiểu để làm việc với cơ sở dữ liệu sử dụng cấu trúc và cú pháp Python nếu có thể. API này bao gồm những điều sau:

  • Nhập mô-đun API.
  • Có được kết nối với cơ sở dữ liệu.
  • Phát hành câu lệnh SQL và các thủ tục được lưu trữ.
  • Đóng kết nối

Python có hỗ trợ tích hợp cho SQLite. Trong phần này, chúng ta sẽ tìm hiểu tất cả các khái niệm sử dụng MySQL. Mô-đun MySQLdb, một giao diện phổ biến với MySQL không tương thích với Python 3. Thay vào đó, chúng tôi sẽ sử dụng mô-đun PyMySQL .

PyMySQL là gì?

PyMySQL là một giao diện để kết nối với máy chủ cơ sở dữ liệu MySQL từ Python. Nó triển khai API cơ sở dữ liệu Python v2.0 và chứa thư viện khách MySQL thuần Python. Mục tiêu của PyMySQL là để thay thế MySQLdb.

Làm cách nào để cài đặt PyMySQL?

Trước khi tiếp tục, bạn đảm bảo rằng bạn đã cài đặt PyMySQL trên máy của mình. Chỉ cần nhập đoạn mã sau vào tập lệnh Python của bạn và thực thi nó -

#!/usr/bin/python3

import pymysql

Nếu nó tạo ra kết quả sau thì có nghĩa là mô-đun MySQLdb chưa được cài đặt -

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      Import pymysql
ImportError: No module named pymysql

Bản phát hành ổn định cuối cùng có sẵn trên PyPI và có thể được cài đặt bằng pip -

pip install pymysql

Ngoài ra (ví dụ: nếu không có pip), có thể tải xuống tarball từ GitHub và cài đặt với Setuptools như sau:

$ # 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 - Đảm bảo rằng bạn có quyền root để cài đặt mô-đun trên.

Kết nối cơ sở dữ liệu

Trước khi kết nối với cơ sở dữ liệu MySQL, hãy đảm bảo các điểm sau:

  • Bạn đã tạo một cơ sở dữ liệu TESTDB.

  • Bạn đã tạo một bảng EMPLOYEE trong TESTDB.

  • Bảng này có các trường FIRST_NAME, LAST_NAME, AGE, SEX và THU NHẬP.

  • ID người dùng "testuser" và mật khẩu "test123" được đặt để truy cập TESTDB.

  • Mô-đun Python PyMySQL được cài đặt đúng cách trên máy của bạn.

  • Bạn đã xem qua hướng dẫn MySQL để hiểu Cơ bản về MySQL.

Thí dụ

Sau đây là một ví dụ về kết nối với cơ sở dữ liệu 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()

Trong khi chạy tập lệnh này, nó tạo ra kết quả sau.

Database version : 5.5.20-log

Nếu kết nối được thiết lập với nguồn dữ liệu, thì một Đối tượng kết nối sẽ được trả về và lưu vào db để sử dụng thêm, nếu không dbđược đặt thành Không. Kế tiếp,db đối tượng được sử dụng để tạo ra một cursor, đến lượt nó, được sử dụng để thực thi các truy vấn SQL. Cuối cùng, trước khi xuất hiện, nó đảm bảo rằng kết nối cơ sở dữ liệu được đóng và tài nguyên được giải phóng.

Tạo bảng cơ sở dữ liệu

Khi kết nối cơ sở dữ liệu được thiết lập, chúng tôi sẵn sàng tạo bảng hoặc bản ghi vào bảng cơ sở dữ liệu bằng cách sử dụng execute phương thức của con trỏ đã tạo.

Thí dụ

Hãy để chúng tôi tạo một bảng Cơ sở dữ liệu NHÂN VIÊN -

#!/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 hoạt động

Thao tác INSERT là bắt buộc khi bạn muốn tạo bản ghi của mình vào một bảng cơ sở dữ liệu.

Thí dụ

Ví dụ sau, thực hiện câu lệnh SQL INSERT để tạo bản ghi trong bảng 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()

Ví dụ trên có thể được viết như sau để tạo các truy vấn SQL động:

#!/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()

Thí dụ

Đoạn mã sau là một dạng thực thi khác mà bạn có thể truyền trực tiếp các tham số:

..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values("%s", "%s")' % \
             (user_id, password))
..................................

ĐỌC hoạt động

ĐỌC Hoạt động trên bất kỳ cơ sở dữ liệu nào có nghĩa là lấy một số thông tin hữu ích từ cơ sở dữ liệu.

Khi kết nối cơ sở dữ liệu được thiết lập, bạn đã sẵn sàng thực hiện truy vấn vào cơ sở dữ liệu này. Bạn có thể sử dụngfetchone() phương pháp để tìm nạp một bản ghi hoặc fetchall() để tìm nạp nhiều giá trị từ một bảng cơ sở dữ liệu.

  • fetchone()- Nó tìm nạp hàng tiếp theo của tập kết quả truy vấn. Tập kết quả là một đối tượng được trả về khi một đối tượng con trỏ được sử dụng để truy vấn bảng.

  • fetchall()- Nó tìm nạp tất cả các hàng trong một tập kết quả. Nếu một số hàng đã được trích xuất từ ​​tập kết quả, thì nó sẽ truy xuất các hàng còn lại từ tập kết quả.

  • rowcount - Đây là thuộc tính chỉ đọc và trả về số hàng đã bị ảnh hưởng bởi phương thức execute ().

Thí dụ

Quy trình sau đây truy vấn tất cả các bản ghi từ bảng EMPLOYEE có mức lương hơn 1000 -

#!/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()

Đầu ra

Điều này sẽ tạo ra kết quả sau:

fname = Mac, lname = Mohan, age = 20, sex = M, income = 2000

Cập nhật hoạt động

CẬP NHẬT Hoạt động trên bất kỳ cơ sở dữ liệu nào có nghĩa là cập nhật một hoặc nhiều bản ghi đã có sẵn trong cơ sở dữ liệu.

Quy trình sau cập nhật tất cả các bản ghi có SEX là 'M'. Ở đây, chúng tôi tăng TUỔI của tất cả nam giới thêm một năm.

Thí dụ

#!/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()

Thao tác DELETE

Thao tác DELETE là bắt buộc khi bạn muốn xóa một số bản ghi khỏi cơ sở dữ liệu của mình. Sau đây là quy trình để xóa tất cả các bản ghi khỏi NHÂN VIÊN có TUỔI trên 20 -

Thí dụ

#!/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()

Thực hiện giao dịch

Giao dịch là một cơ chế đảm bảo tính nhất quán của dữ liệu. Giao dịch có bốn thuộc tính sau:

  • Atomicity - Một giao dịch hoàn tất hoặc không có gì xảy ra cả.

  • Consistency - Một giao dịch phải bắt đầu ở trạng thái nhất quán và để hệ thống ở trạng thái nhất quán.

  • Isolation - Kết quả trung gian của một giao dịch không được hiển thị bên ngoài giao dịch hiện tại.

  • Durability - Một khi giao dịch đã được cam kết, các ảnh hưởng vẫn tồn tại, ngay cả sau khi hệ thống bị lỗi.

Python DB API 2.0 cung cấp hai phương thức để cam kết hoặc khôi phục một giao dịch.

Thí dụ

Bạn đã biết cách thực hiện các giao dịch. Đây là một ví dụ tương tự -

# 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()

Hoạt động CAM KẾT

Cam kết là một hoạt động đưa ra tín hiệu màu xanh lá cây cho cơ sở dữ liệu để hoàn tất các thay đổi và sau thao tác này, không thể hoàn nguyên thay đổi nào.

Đây là một ví dụ đơn giản để gọi commit phương pháp.

db.commit()

Hoạt động ROLLBACK

Nếu bạn không hài lòng với một hoặc nhiều thay đổi và bạn muốn hoàn nguyên hoàn toàn những thay đổi đó, hãy sử dụng rollback() phương pháp.

Đây là một ví dụ đơn giản để gọi rollback() phương pháp.

db.rollback()

Ngắt kết nối cơ sở dữ liệu

Để ngắt kết nối Cơ sở dữ liệu, hãy sử dụng phương thức close ().

db.close()

Nếu người dùng đóng kết nối với cơ sở dữ liệu bằng phương thức close (), thì bất kỳ giao dịch nào chưa hoàn thành sẽ được DB khôi phục. Tuy nhiên, thay vì phụ thuộc vào bất kỳ chi tiết triển khai cấp thấp hơn nào của DB, ứng dụng của bạn tốt hơn nên gọi cam kết hoặc khôi phục một cách rõ ràng.

Xử lý lỗi

Có nhiều nguồn sai sót. Một vài ví dụ là lỗi cú pháp trong câu lệnh SQL được thực thi, lỗi kết nối hoặc gọi phương thức tìm nạp cho một xử lý câu lệnh đã bị hủy hoặc hoàn thành.

API DB xác định một số lỗi phải tồn tại trong mỗi mô-đun cơ sở dữ liệu. Bảng sau liệt kê những ngoại lệ này.

Sr.No. Ngoại lệ & Mô tả
1

Warning

Được sử dụng cho các vấn đề không nghiêm trọng. Phải phân lớp StandardError.

2

Error

Lớp cơ sở cho các lỗi. Phải phân lớp StandardError.

3

InterfaceError

Được sử dụng cho các lỗi trong mô-đun cơ sở dữ liệu, không phải chính cơ sở dữ liệu. Phải phân lớp lỗi.

4

DatabaseError

Được sử dụng cho các lỗi trong cơ sở dữ liệu. Phải phân lớp lỗi.

5

DataError

Lớp con của DatabaseError đề cập đến lỗi trong dữ liệu.

6

OperationalError

Lớp con của DatabaseError đề cập đến các lỗi như mất kết nối với cơ sở dữ liệu. Những lỗi này nói chung nằm ngoài tầm kiểm soát của Python scripter.

7

IntegrityError

Lớp con của DatabaseError đối với các tình huống có thể làm hỏng tính toàn vẹn quan hệ, chẳng hạn như các ràng buộc về tính duy nhất hoặc khóa ngoại.

số 8

InternalError

Lớp con của DatabaseError đề cập đến các lỗi bên trong mô-đun cơ sở dữ liệu, chẳng hạn như con trỏ không còn hoạt động.

9

ProgrammingError

Lớp con của DatabaseError đề cập đến các lỗi như tên bảng không hợp lệ và những thứ khác có thể đổ lỗi cho bạn một cách an toàn.

10

NotSupportedError

Lớp con của DatabaseError đề cập đến việc cố gắng gọi chức năng không được hỗ trợ.

Các tập lệnh Python của bạn phải xử lý các lỗi này, nhưng trước khi sử dụng bất kỳ ngoại lệ nào ở trên, hãy đảm bảo MySQLdb của bạn có hỗ trợ cho ngoại lệ đó. Bạn có thể biết thêm thông tin về chúng bằng cách đọc thông số kỹ thuật của DB API 2.0.

Python cung cấp hai cấp độ truy cập vào các dịch vụ mạng. Ở cấp độ thấp, bạn có thể truy cập hỗ trợ socket cơ bản trong hệ điều hành cơ bản, cho phép bạn triển khai máy khách và máy chủ cho cả giao thức hướng kết nối và không kết nối.

Python cũng có các thư viện cung cấp quyền truy cập cấp cao hơn vào các giao thức mạng cấp ứng dụng cụ thể, chẳng hạn như FTP, HTTP, v.v.

Chương này cung cấp cho bạn sự hiểu biết về khái niệm nổi tiếng nhất trong Mạng - Lập trình Socket.

Sockets là gì?

Các ổ cắm là điểm cuối của một kênh truyền thông hai chiều. Sockets có thể giao tiếp trong một quy trình, giữa các quy trình trên cùng một máy hoặc giữa các quy trình trên các lục địa khác nhau.

Sockets có thể được triển khai trên một số loại kênh khác nhau: socket miền Unix, TCP, UDP, v.v. Các ổ cắm thư viện cung cấp các lớp cụ thể để xử lý các tàu vận tải thông thường cũng như một giao diện chung để xử lý phần còn lại.

Sockets có từ vựng riêng -

Sr.No. Thuật ngữ & Mô tả
1

domain

Họ các giao thức được sử dụng làm cơ chế vận chuyển. Các giá trị này là các hằng số như AF_INET, PF_INET, PF_UNIX, PF_X25, v.v.

2

type

Loại giao tiếp giữa hai điểm cuối, thường là SOCK_STREAM cho các giao thức hướng kết nối và SOCK_DGRAM cho các giao thức không kết nối.

3

protocol

Thông thường, giá trị này có thể được sử dụng để xác định một biến thể của giao thức trong một miền và loại.

4

hostname

Định danh của giao diện mạng -

  • Một chuỗi, có thể là tên máy chủ lưu trữ, địa chỉ tứ phân chấm hoặc địa chỉ IPV6 trong ký hiệu dấu hai chấm (và có thể là dấu chấm)

  • Chuỗi "<broadcast>", chỉ định địa chỉ INADDR_BROADCAST.

  • Một chuỗi có độ dài bằng 0, chỉ định INADDR_ANY hoặc

  • Số nguyên, được hiểu là địa chỉ nhị phân theo thứ tự byte máy chủ.

5

port

Mỗi máy chủ lắng nghe các máy khách gọi trên một hoặc nhiều cổng. Một cổng có thể là số cổng Fixnum, một chuỗi chứa số cổng hoặc tên của một dịch vụ.

Mô-đun ổ cắm

Để tạo một socket, bạn phải sử dụng hàm socket.socket () có sẵn trong mô-đun socket, có cú pháp chung:

s = socket.socket (socket_family, socket_type, protocol = 0)

Đây là mô tả của các tham số -

  • socket_family - Đây là AF_UNIX hoặc AF_INET, như đã giải thích trước đó.

  • socket_type - Đây là SOCK_STREAM hoặc SOCK_DGRAM.

  • protocol - Điều này thường được bỏ qua, mặc định là 0.

Khi bạn có đối tượng socket , bạn có thể sử dụng các chức năng cần thiết để tạo chương trình máy khách hoặc máy chủ của mình. Sau đây là danh sách các chức năng cần thiết:

Phương thức ổ cắm máy chủ

Sr.No. Phương pháp & Mô tả
1

s.bind()

Phương thức này liên kết địa chỉ (tên máy chủ, cặp số cổng) với socket.

2

s.listen()

Phương pháp này thiết lập và khởi động trình nghe TCP.

3

s.accept()

Điều này chấp nhận thụ động kết nối máy khách TCP, đợi cho đến khi kết nối đến (chặn).

Phương thức Socket Máy khách

Sr.No. Phương pháp & Mô tả
1

s.connect()

Phương pháp này chủ động khởi tạo kết nối máy chủ TCP.

Các phương pháp ổ cắm chung

Sr.No. Phương pháp & Mô tả
1

s.recv()

Phương thức này nhận thông báo TCP

2

s.send()

Phương thức này truyền thông điệp TCP

3

s.recvfrom()

Phương thức này nhận được tin nhắn UDP

4

s.sendto()

Phương thức này truyền thông điệp UDP

5

s.close()

Phương thức này đóng ổ cắm

6

socket.gethostname()

Trả về tên máy chủ.

Một máy chủ đơn giản

Để viết máy chủ Internet, chúng tôi sử dụng socketchức năng có sẵn trong mô-đun socket để tạo một đối tượng socket. Sau đó, một đối tượng socket được sử dụng để gọi các chức năng khác nhằm thiết lập một máy chủ socket.

Bây giờ hãy gọi cho bind(hostname, port)chức năng chỉ định một cổng cho dịch vụ của bạn trên máy chủ nhất định.

Tiếp theo, gọi phương thức chấp nhận của đối tượng trả về. Phương thức này đợi cho đến khi một máy khách kết nối với cổng bạn đã chỉ định, rồi trả về một đối tượng kết nối đại diện cho kết nối với máy khách đó.

#!/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()

Một khách hàng đơn giản

Hãy để chúng tôi viết một chương trình khách rất đơn giản, mở một kết nối đến một cổng 12345 nhất định và một máy chủ nhất định. Rất đơn giản để tạo một máy khách ổ cắm bằng cách sử dụng chức năng mô-đun ổ cắm của Python .

Các socket.connect(hosname, port )mở kết nối TCP tới tên máy chủ trên cổng . Khi bạn đã mở một ổ cắm, bạn có thể đọc từ đó giống như bất kỳ đối tượng IO nào. Khi hoàn tất, hãy nhớ đóng nó, vì bạn sẽ đóng một tệp.

Thí dụ

Đoạn mã sau là một ứng dụng khách rất đơn giản kết nối với một máy chủ và cổng nhất định, đọc bất kỳ dữ liệu có sẵn nào từ ổ cắm, sau đó thoát ra -

#!/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'))

Bây giờ, hãy chạy server.py này trong nền và sau đó chạy client.py ở trên để xem kết quả.

# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py

Đầu ra

Điều này sẽ tạo ra kết quả sau:

on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting

Mô-đun Internet Python

Dưới đây là danh sách một số mô-đun quan trọng trong lập trình Mạng / Internet Python:

Giao thức Chức năng chung Cổng số Mô-đun Python
HTTP trang web 80 httplib, urllib, xmlrpclib
NNTP Tin tức Usenet 119 nntplib
FTP Truyền tệp 20 ftplib, urllib
SMTP Gửi email 25 smtplib
POP3 Tìm nạp email 110 poplib
IMAP4 Tìm nạp email 143 imaplib
Telnet Dòng lệnh 23 telnetlib
Gopher Chuyển tài liệu 70 gopherlib, urllib

Vui lòng kiểm tra tất cả các thư viện được đề cập ở trên để hoạt động với các giao thức FTP, SMTP, POP và IMAP.

Đọc thêm

Đây là một khởi đầu nhanh chóng với Lập trình Socket. Nó là một chủ đề rộng lớn. Bạn nên đi qua liên kết sau để tìm thêm chi tiết -

  • Lập trình Unix Socket .

  • Thư viện Socket Python và Mô-đun .

Simple Mail Transfer Protocol (SMTP) là một giao thức, xử lý việc gửi e-mail và định tuyến e-mail giữa các máy chủ thư.

Python cung cấp smtplib mô-đun, định nghĩa một đối tượng phiên khách SMTP có thể được sử dụng để gửi thư đến bất kỳ máy Internet nào có trình nền trình nghe SMTP hoặc ESMTP.

Đây là một cú pháp đơn giản để tạo một đối tượng SMTP, sau này có thể được sử dụng để gửi e-mail -

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

Đây là chi tiết của các thông số -

  • host- Đây là máy chủ đang chạy máy chủ SMTP của bạn. Bạn có thể xác định địa chỉ IP của máy chủ hoặc tên miền như tutorialspoint.com. Đây là một đối số tùy chọn.

  • port- Nếu bạn đang cung cấp đối số máy chủ , thì bạn cần chỉ định một cổng, nơi máy chủ SMTP đang lắng nghe. Thông thường cổng này sẽ là 25.

  • local_hostname- Nếu máy chủ SMTP của bạn đang chạy trên máy cục bộ của bạn, thì bạn có thể chỉ định tùy chọn localhost .

Một đối tượng SMTP có một phương thức thể hiện được gọi là sendmail, thường được sử dụng để thực hiện công việc gửi thư. Nó có ba tham số -

  • Người gửi - Một chuỗi có địa chỉ của người gửi.

  • Người nhận - Một danh sách các chuỗi, mỗi chuỗi cho mỗi người nhận.

  • Các thông điệp - Một thông báo như là một chuỗi định dạng xác định trong RFC khác nhau.

Thí dụ

Đây là một cách đơn giản để gửi một e-mail bằng tập lệnh Python. Hãy thử một lần -

#!/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"

Ở đây, bạn đã đặt một e-mail cơ bản trong tin nhắn, sử dụng dấu ngoặc kép, hãy chú ý định dạng tiêu đề một cách chính xác. Một e-mail yêu cầu mộtFrom, To, và một Subject tiêu đề, được ngăn cách với nội dung của e-mail bằng một dòng trống.

Để gửi thư, bạn sử dụng smtpObj để kết nối với máy chủ SMTP trên máy cục bộ. Sau đó, sử dụng phương thức sendmail cùng với thư, địa chỉ từ và địa chỉ đích làm các tham số (mặc dù các địa chỉ từ và đến nằm trong chính e-mail, chúng không phải lúc nào cũng được sử dụng để định tuyến thư).

Nếu bạn không chạy máy chủ SMTP trên máy cục bộ của mình, bạn có thể sử dụng ứng dụng smtplib để giao tiếp với máy chủ SMTP từ xa. Trừ khi bạn đang sử dụng dịch vụ webmail (chẳng hạn như gmail hoặc Yahoo! Mail), nhà cung cấp email của bạn phải cung cấp cho bạn chi tiết máy chủ thư đi mà bạn có thể cung cấp cho họ, như sau:

mail = smtplib.SMTP('smtp.gmail.com', 587)

Gửi e-mail HTML bằng Python

Khi bạn gửi tin nhắn văn bản bằng Python, thì tất cả nội dung được coi là văn bản đơn giản. Ngay cả khi bạn bao gồm các thẻ HTML trong một tin nhắn văn bản, nó được hiển thị dưới dạng văn bản đơn giản và các thẻ HTML sẽ không được định dạng theo cú pháp HTML. Tuy nhiên, Python cung cấp một tùy chọn để gửi một tin nhắn HTML dưới dạng tin nhắn HTML thực tế.

Trong khi gửi e-mail, bạn có thể chỉ định phiên bản Mime, loại nội dung và bộ ký tự để gửi e-mail HTML.

Thí dụ

Sau đây là một ví dụ để gửi nội dung HTML dưới dạng e-mail. Hãy thử một lần -

#!/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"

Gửi tệp đính kèm dưới dạng e-mail

Để gửi một e-mail có nội dung hỗn hợp, yêu cầu cài đặt Content-type tiêu đề tới multipart/mixed. Sau đó, văn bản và các phần đính kèm có thể được chỉ định trongboundaries.

Ranh giới được bắt đầu bằng hai dấu gạch nối theo sau là một số duy nhất, không thể xuất hiện trong phần thư của e-mail. Ranh giới cuối cùng biểu thị phần cuối cùng của e-mail cũng phải kết thúc bằng hai dấu gạch nối.

Các tệp đính kèm phải được mã hóa bằng pack("m") có chức năng mã hóa cơ số 64 trước khi truyền.

Thí dụ

Sau đây là một ví dụ, gửi một tệp /tmp/test.txtdưới dạng tệp đính kèm. Hãy thử một lần -

#!/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")

Chạy một số luồng tương tự như chạy một số chương trình khác nhau đồng thời, nhưng với những lợi ích sau:

  • Nhiều luồng trong một quy trình chia sẻ cùng một không gian dữ liệu với luồng chính và do đó có thể chia sẻ thông tin hoặc giao tiếp với nhau dễ dàng hơn nếu chúng là các quy trình riêng biệt.

  • Các luồng đôi khi được gọi là các quy trình nhẹ và chúng không yêu cầu nhiều bộ nhớ; chúng rẻ hơn các quy trình.

Một chuỗi có phần mở đầu, chuỗi thực thi và phần kết luận. Nó có một con trỏ hướng dẫn theo dõi xem nó hiện đang chạy ở đâu trong ngữ cảnh của nó.

  • Nó có thể được làm trống trước (ngắt quãng).

  • Nó có thể tạm thời được đặt ở trạng thái chờ (còn được gọi là ngủ) trong khi các luồng khác đang chạy - điều này được gọi là năng suất.

Có hai loại chủ đề khác nhau -

  • chuỗi hạt nhân
  • chủ đề người dùng

Các luồng nhân là một phần của hệ điều hành, trong khi các luồng không gian người dùng không được triển khai trong nhân.

Có hai mô-đun hỗ trợ việc sử dụng các luồng trong Python3 -

  • _thread
  • threading

Mô-đun luồng đã "không được chấp nhận" trong một thời gian dài. Người dùng được khuyến khích sử dụng mô-đun phân luồng thay thế. Do đó, trong Python 3, "luồng" mô-đun không còn khả dụng nữa. Tuy nhiên, nó đã được đổi tên thành "_thread" để tương thích ngược trong Python3.

Bắt đầu một chuỗi mới

Để sinh ra một luồng khác, bạn cần gọi phương thức sau có sẵn trong mô-đun luồng :

_thread.start_new_thread ( function, args[, kwargs] )

Lệnh gọi phương thức này cho phép một cách nhanh chóng và hiệu quả để tạo các luồng mới trong cả Linux và Windows.

Lời gọi phương thức trả về ngay lập tức và luồng con bắt đầu và gọi hàm với danh sách các args được truyền vào . Khi hàm trả về, luồng kết thúc.

Ở đây, args là một loạt các đối số; sử dụng một bộ giá trị trống để gọi hàm mà không chuyển bất kỳ đối số nào. kwargs là một từ điển tùy chọn của các đối số từ khóa.

Thí dụ

#!/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

Đầu ra

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

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

Chương trình đi trong một vòng lặp vô hạn. Bạn sẽ phải nhấn ctrl-c để dừng

Mặc dù nó rất hiệu quả đối với phân luồng cấp thấp, nhưng mô-đun luồng rất hạn chế so với mô-đun luồng mới hơn.

Mô-đun phân luồng

Mô-đun luồng mới hơn được bao gồm trong Python 2.4 cung cấp hỗ trợ cấp cao, mạnh mẽ hơn nhiều cho các luồng so với mô-đun luồng được thảo luận trong phần trước.

Các luồng mô-đun cho thấy tất cả các phương pháp của chủ đề mô-đun và cung cấp một số phương pháp bổ sung -

  • threading.activeCount() - Trả về số đối tượng luồng đang hoạt động.

  • threading.currentThread() - Trả về số đối tượng luồng trong điều khiển luồng của người gọi.

  • threading.enumerate() - Trả về danh sách tất cả các đối tượng luồng hiện đang hoạt động.

Ngoài các phương pháp, mô-đun threading có Chủ đề lớp mà thực hiện luồng. Các phương thức được cung cấp bởi lớp Thread như sau:

  • run() - Phương thức run () là điểm vào của một luồng.

  • start() - Phương thức start () bắt đầu một luồng bằng cách gọi phương thức run.

  • join([time]) - Tham gia () đợi luồng kết thúc.

  • isAlive() - Phương thức isAlive () kiểm tra xem một luồng có còn đang thực thi hay không.

  • getName() - Phương thức getName () trả về tên của một luồng.

  • setName() - Phương thức setName () đặt tên của một luồng.

Tạo chủ đề bằng mô-đun phân luồng

Để triển khai một luồng mới bằng cách sử dụng mô-đun luồng, bạn phải làm như sau:

  • Định nghĩa một lớp con mới của lớp Thread .

  • Ghi đè phương thức __init __ (self [, args]) để thêm các đối số bổ sung.

  • Sau đó, ghi đè phương thức run (self [, args]) để triển khai những gì luồng sẽ làm khi bắt đầu.

Khi bạn đã tạo lớp con Thread mới , bạn có thể tạo một thể hiện của nó và sau đó bắt đầu một luồng mới bằng cách gọi start () , lần lượt gọi phương thức run () .

Thí dụ

#!/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")

Kết quả

Khi chúng tôi chạy chương trình trên, nó tạo ra kết quả sau:

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

Đồng bộ hóa chủ đề

Mô-đun phân luồng được cung cấp bằng Python bao gồm cơ chế khóa đơn giản để triển khai cho phép bạn đồng bộ hóa các luồng. Một khóa mới được tạo bằng cách gọi phương thức Lock () , phương thức này sẽ trả về khóa mới.

Phương thức thu được (chặn) của đối tượng khóa mới được sử dụng để buộc các luồng chạy đồng bộ. Tham số chặn tùy chọn cho phép bạn kiểm soát xem liệu chuỗi có chờ lấy khóa hay không.

Nếu chặn được đặt thành 0, chuỗi sẽ trả về ngay lập tức với giá trị 0 nếu không thể lấy được khóa và với giá trị 1 nếu đã có khóa. Nếu chặn được đặt thành 1, chuỗi sẽ chặn và đợi khóa được giải phóng.

Phương thức release () của đối tượng khóa mới được sử dụng để giải phóng khóa khi nó không còn được yêu cầu.

Thí dụ

#!/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")

Đầu ra

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

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

Hàng đợi ưu tiên đa luồng

Các Queue mô-đun cho phép bạn tạo một đối tượng hàng đợi mới có thể tổ chức một số cụ thể của các mặt hàng. Có các phương pháp sau để kiểm soát Hàng đợi:

  • get() - Hàm get () loại bỏ và trả về một mục từ hàng đợi.

  • put() - Đặt thêm mục vào hàng đợi.

  • qsize() - Hàm qsize () trả về số lượng mục hiện đang có trong hàng đợi.

  • empty()- Giá trị rỗng () trả về giá trị True nếu hàng đợi trống; ngược lại, Sai.

  • full()- full () trả về True nếu hàng đợi đầy; ngược lại, Sai.

Thí dụ

#!/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")

Đầu ra

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

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 là một ngôn ngữ mã nguồn mở, di động cho phép các lập trình viên phát triển các ứng dụng mà các ứng dụng khác có thể đọc được, bất kể hệ điều hành và / hoặc ngôn ngữ phát triển.

XML là gì?

Ngôn ngữ đánh dấu có thể mở rộng (XML) là một ngôn ngữ đánh dấu giống như HTML hoặc SGML. Điều này được khuyến nghị bởi World Wide Web Consortium và có sẵn như một tiêu chuẩn mở.

XML cực kỳ hữu ích để theo dõi lượng dữ liệu vừa và nhỏ mà không yêu cầu xương sống dựa trên SQL.

Kiến trúc phân tích cú pháp XML và API

Thư viện chuẩn Python cung cấp một bộ giao diện tối thiểu nhưng hữu ích để làm việc với XML.

Hai API cơ bản và được sử dụng rộng rãi nhất cho dữ liệu XML là giao diện SAX và DOM.

  • Simple API for XML (SAX)- Tại đây, bạn đăng ký các cuộc gọi lại cho các sự kiện quan tâm và sau đó để trình phân tích cú pháp tiến hành thông qua tài liệu. Điều này hữu ích khi tài liệu của bạn lớn hoặc bạn có giới hạn bộ nhớ, nó phân tích cú pháp tệp khi nó đọc từ đĩa và toàn bộ tệp không bao giờ được lưu trữ trong bộ nhớ.

  • Document Object Model (DOM) API - Đây là khuyến nghị của World Wide Web Consortium trong đó toàn bộ tệp được đọc vào bộ nhớ và được lưu trữ ở dạng phân cấp (dựa trên cây) để thể hiện tất cả các tính năng của tài liệu XML.

SAX rõ ràng không thể xử lý thông tin nhanh như DOM, khi làm việc với các tệp lớn. Mặt khác, việc sử dụng riêng DOM có thể thực sự giết chết tài nguyên của bạn, đặc biệt nếu được sử dụng trên nhiều tệp nhỏ.

SAX là chỉ đọc, trong khi DOM cho phép thay đổi tệp XML. Vì hai API khác nhau này bổ sung cho nhau theo nghĩa đen, không có lý do gì bạn không thể sử dụng cả hai cho các dự án lớn.

Đối với tất cả các ví dụ mã XML của chúng tôi, hãy sử dụng tệp XML đơn giản movies.xml làm đầu vào -

<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>

Phân tích cú pháp XML với các API SAX

SAX là một giao diện tiêu chuẩn để phân tích cú pháp XML theo hướng sự kiện. Phân tích cú pháp XML với SAX thường yêu cầu bạn tạo ContentHandler của riêng mình bằng cách phân lớp xml.sax.ContentHandler.

ContentHandler của bạn xử lý các thẻ và thuộc tính cụ thể của (các) hương vị XML của bạn. Đối tượng ContentHandler cung cấp các phương thức để xử lý các sự kiện phân tích cú pháp khác nhau. Bộ phân tích cú pháp riêng của nó gọi các phương thức ContentHandler vì nó phân tích cú pháp tệp XML.

Các phương thức startDocumentendDocument được gọi ở phần đầu và phần cuối của tệp XML. Các ký tự phương thức (văn bản) được truyền dữ liệu ký tự của tệp XML thông qua văn bản tham số.

ContentHandler được gọi ở đầu và cuối mỗi phần tử. Nếu trình phân tích cú pháp không ở chế độ không gian tên, các phương thức startElement (thẻ, thuộc tính)endElement (thẻ) được gọi; nếu không, các phương thức tương ứng startElementNSendElementNS được gọi. Ở đây, thẻ là thẻ phần tử và thuộc tính là một đối tượng Thuộc tính.

Dưới đây là các phương pháp quan trọng khác cần hiểu trước khi tiếp tục -

Phương pháp make_parser

Phương thức sau tạo một đối tượng phân tích cú pháp mới và trả về nó. Hệ thống tìm thấy đối tượng phân tích cú pháp được tạo ra sẽ thuộc loại trình phân tích cú pháp đầu tiên.

xml.sax.make_parser( [parser_list] )

Dưới đây là chi tiết của các thông số -

  • parser_list - Đối số tùy chọn bao gồm danh sách các trình phân tích cú pháp để sử dụng, tất cả các trình này đều phải triển khai phương thức make_parser.

Phương pháp phân tích cú pháp

Phương pháp sau đây tạo một trình phân tích cú pháp SAX và sử dụng nó để phân tích cú pháp một tài liệu.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

Dưới đây là chi tiết của các thông số -

  • xmlfile - Đây là tên của tệp XML cần đọc.

  • contenthandler - Đây phải là một đối tượng ContentHandler.

  • errorhandler - Nếu được chỉ định, trình xử lý lỗi phải là một đối tượng SAX ErrorHandler.

Phương thức phân tích cú pháp

Có một phương pháp nữa để tạo trình phân tích cú pháp SAX và phân tích cú pháp được chỉ định XML string.

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

Dưới đây là chi tiết của các thông số -

  • xmlstring - Đây là tên của chuỗi XML cần đọc.

  • contenthandler - Đây phải là một đối tượng ContentHandler.

  • errorhandler - Nếu được chỉ định, trình xử lý lỗi phải là một đối tượng SAX ErrorHandler.

Thí dụ

#!/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")

Đầu ra

Điều này sẽ tạo ra kết quả sau:

*****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

Để biết chi tiết đầy đủ về tài liệu SAX API, vui lòng tham khảo các API SAX Python tiêu chuẩn .

Phân tích cú pháp XML với các API DOM

Mô hình Đối tượng Tài liệu ("DOM") là một API đa ngôn ngữ từ World Wide Web Consortium (W3C) để truy cập và sửa đổi các tài liệu XML.

DOM cực kỳ hữu ích cho các ứng dụng truy cập ngẫu nhiên. SAX chỉ cho phép bạn xem từng bit của tài liệu tại một thời điểm. Nếu bạn đang xem một phần tử SAX, bạn không có quyền truy cập vào phần tử khác.

Đây là cách dễ nhất để tải một tài liệu XML một cách nhanh chóng và tạo một đối tượng minidom bằng cách sử dụng mô-đun xml.dom. Đối tượng minidom cung cấp một phương thức phân tích cú pháp đơn giản để nhanh chóng tạo một cây DOM từ tệp XML.

Cụm từ mẫu gọi hàm phân tích cú pháp (tệp [, trình phân tích cú pháp]) của đối tượng minidom để phân tích cú pháp tệp XML, được chỉ định bởi tệp thành đối tượng cây DOM.

Thí dụ

#!/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)

Đầu ra

Điều này sẽ tạo ra kết quả sau:

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

Để biết chi tiết đầy đủ về tài liệu DOM API, vui lòng tham khảo các API DOM Python tiêu chuẩn .

Python cung cấp các tùy chọn khác nhau để phát triển giao diện người dùng đồ họa (GUI). Các tính năng quan trọng nhất được liệt kê dưới đây.

  • Tkinter- Tkinter là giao diện Python cho bộ công cụ Tk GUI đi kèm với Python. Chúng tôi sẽ xem xét tùy chọn này trong chương này.

  • wxPython- Đây là một giao diện Python mã nguồn mở cho bộ công cụ GUI wxWidgets. Bạn có thể tìm thấy hướng dẫn đầy đủ về WxPython tại đây .

  • PyQt−Đây cũng là giao diện Python cho thư viện GUI Qt đa nền tảng phổ biến. TutorialsPoint có một hướng dẫn rất hay về PyQt tại đây .

  • JPython - JPython là một cổng Python dành cho Java, cho phép các tập lệnh Python truy cập liền mạch vào các thư viện lớp Java trên máy cục bộ http://www.jython.org.

Có rất nhiều giao diện khác có sẵn, bạn có thể tìm thấy chúng trên mạng.

Lập trình Tkinter

Tkinter là thư viện GUI tiêu chuẩn cho Python. Python khi kết hợp với Tkinter cung cấp một cách nhanh chóng và dễ dàng để tạo các ứng dụng GUI. Tkinter cung cấp giao diện hướng đối tượng mạnh mẽ cho bộ công cụ Tk GUI.

Tạo một ứng dụng GUI bằng Tkinter là một nhiệm vụ dễ dàng. Tất cả những gì bạn cần làm là thực hiện các bước sau:

  • Nhập mô-đun Tkinter .

  • Tạo cửa sổ chính của ứng dụng GUI.

  • Thêm một hoặc nhiều widget nói trên vào ứng dụng GUI.

  • Nhập vòng lặp sự kiện chính để thực hiện hành động đối với từng sự kiện do người dùng kích hoạt.

Thí dụ

#!/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()

Điều này sẽ tạo ra một cửa sổ sau:

Tkinter Widgets

Tkinter cung cấp các điều khiển khác nhau, chẳng hạn như các nút, nhãn và hộp văn bản được sử dụng trong ứng dụng GUI. Các điều khiển này thường được gọi là widget.

Hiện tại có 15 loại vật dụng trong Tkinter. Chúng tôi trình bày các tiện ích này cũng như mô tả ngắn gọn trong bảng sau:

Sr.No. Nhà điều hành & Mô tả
1 Cái nút

Tiện ích Nút được sử dụng để hiển thị các nút trong ứng dụng của bạn.

2 Tranh sơn dầu

Tiện ích Canvas được sử dụng để vẽ các hình dạng, chẳng hạn như đường thẳng, hình bầu dục, đa giác và hình chữ nhật, trong ứng dụng của bạn.

3 Nút kiểm tra

Tiện ích Nút kiểm tra được sử dụng để hiển thị một số tùy chọn dưới dạng hộp kiểm. Người dùng có thể chọn nhiều tùy chọn cùng một lúc.

4 Nhập cảnh

Tiện ích mục Nhập được sử dụng để hiển thị trường văn bản một dòng để chấp nhận các giá trị từ người dùng.

5 Khung

Widget Frame được sử dụng như một widget vùng chứa để sắp xếp các widget khác.

6 Nhãn

Tiện ích con Nhãn được sử dụng để cung cấp chú thích một dòng cho các tiện ích con khác. Nó cũng có thể chứa hình ảnh.

7 Hộp danh sách

Tiện ích Hộp danh sách được sử dụng để cung cấp danh sách các tùy chọn cho người dùng.

số 8 Menubutton

Tiện ích Menubutton được sử dụng để hiển thị các menu trong ứng dụng của bạn.

9 Thực đơn

Tiện ích Menu được sử dụng để cung cấp các lệnh khác nhau cho người dùng. Các lệnh này được chứa bên trong Menubutton.

10 Thông điệp

Tiện ích Tin nhắn được sử dụng để hiển thị các trường văn bản nhiều dòng để chấp nhận các giá trị từ người dùng.

11 Nút radio

Tiện ích Radiobutton được sử dụng để hiển thị một số tùy chọn dưới dạng các nút radio. Người dùng chỉ có thể chọn một tùy chọn tại một thời điểm.

12 Tỉ lệ

Tiện ích Quy mô được sử dụng để cung cấp tiện ích con trượt.

13 Thanh cuộn

Tiện ích Thanh cuộn được sử dụng để thêm khả năng cuộn cho các tiện ích con khác nhau, chẳng hạn như hộp danh sách.

14 Bản văn

Tiện ích Văn bản được sử dụng để hiển thị văn bản trong nhiều dòng.

15 Toplevel

Tiện ích Toplevel được sử dụng để cung cấp một vùng chứa cửa sổ riêng biệt.

16 Hộp xoay

Tiện ích Spinbox là một biến thể của tiện ích Tkinter Entry tiêu chuẩn, có thể được sử dụng để chọn từ một số giá trị cố định.

17 PanedWindow

PanedWindow là một tiện ích vùng chứa có thể chứa bất kỳ số lượng ngăn nào, được sắp xếp theo chiều ngang hoặc chiều dọc.

18 LabelFrame

Labelframe là một tiện ích chứa đơn giản. Mục đích chính của nó là hoạt động như một bộ đệm hoặc bộ chứa cho các bố cục cửa sổ phức tạp.

19 tkMessageBox

Mô-đun này được sử dụng để hiển thị các hộp thông báo trong các ứng dụng của bạn.

Thuộc tính tiêu chuẩn

Chúng ta hãy xem cách một số thuộc tính chung của chúng, chẳng hạn như kích thước, màu sắc và phông chữ được chỉ định.

  • Dimensions

  • Colors

  • Fonts

  • Anchors

  • Phong cách cứu trợ

  • Bitmaps

  • Cursors

Quản lý hình học

Tất cả các widget Tkinter đều có quyền truy cập vào các phương pháp quản lý hình học cụ thể, có mục đích tổ chức các widget trong toàn bộ khu vực widget chính. Tkinter đưa ra các lớp trình quản lý hình học sau: gói, lưới và địa điểm.

  • Phương thức pack () - Trình quản lý hình học này tổ chức các widget thành các khối trước khi đặt chúng vào widget chính.

  • Phương thức grid () - Trình quản lý hình học này tổ chức các widget theo cấu trúc giống như bảng trong widget cha.

  • Phương thức place () - Trình quản lý hình học này tổ chức các widget bằng cách đặt chúng vào một vị trí cụ thể trong widget chính.

Bất kỳ mã nào bạn viết bằng bất kỳ ngôn ngữ biên dịch nào như C, C ++ hoặc Java đều có thể được tích hợp hoặc nhập vào một tập lệnh Python khác. Mã này được coi là một "phần mở rộng".

Một mô-đun mở rộng Python không hơn gì một thư viện C bình thường. Trên máy Unix, các thư viện này thường kết thúc bằng.so(đối với đối tượng dùng chung). Trên máy Windows, bạn thường thấy.dll (đối với thư viện liên kết động).

Điều kiện tiên quyết để viết tiện ích mở rộng

Để bắt đầu viết tiện ích mở rộng của bạn, bạn sẽ cần các tệp tiêu đề Python.

  • Trên máy Unix, điều này thường yêu cầu cài đặt gói dành riêng cho nhà phát triển chẳng hạn như.

  • Người dùng Windows nhận được các tiêu đề này như một phần của gói khi họ sử dụng trình cài đặt Python nhị phân.

Ngoài ra, giả sử rằng bạn có kiến ​​thức tốt về C hoặc C ++ để viết bất kỳ Phần mở rộng Python nào bằng lập trình C.

Đầu tiên hãy xem một Tiện ích mở rộng Python

Để có cái nhìn đầu tiên về mô-đun mở rộng Python, bạn cần phải nhóm mã của mình thành bốn phần:

  • Tệp tiêu đề Python.h .

  • Các chức năng C bạn muốn hiển thị dưới dạng giao diện từ mô-đun của bạn.

  • Một bảng ánh xạ tên các hàm của bạn khi các nhà phát triển Python coi chúng là các hàm C bên trong mô-đun mở rộng.

  • Một chức năng khởi tạo.

Tệp tiêu đề Python.h

Bạn cần bao gồm tệp tiêu đề Python.h trong tệp nguồn C của mình, tệp này cung cấp cho bạn quyền truy cập vào API Python nội bộ được sử dụng để kết nối mô-đun của bạn với trình thông dịch.

Đảm bảo bao gồm Python.h trước bất kỳ tiêu đề nào khác mà bạn có thể cần. Bạn cần làm theo các bao gồm với các hàm bạn muốn gọi từ Python.

Các hàm C

Chữ ký của việc triển khai C các chức năng của bạn luôn có một trong ba dạng sau:

static PyObject *MyFunction( PyObject *self, PyObject *args );

static PyObject *MyFunctionWithKeywords(PyObject *self,
                                 PyObject *args,
                                 PyObject *kw);

static PyObject *MyFunctionWithNoArgs( PyObject *self );

Mỗi một trong các khai báo trước trả về một đối tượng Python. Không có cái gọi là hàm void trong Python như trong C. Nếu bạn không muốn các hàm của mình trả về giá trị, hãy trả về C tương đương của PythonNonegiá trị. Các tiêu đề Python xác định một macro, Py_RETURN_NONE, thực hiện điều này cho chúng ta.

Tên của các hàm C của bạn có thể là bất cứ thứ gì bạn thích vì chúng không bao giờ được nhìn thấy bên ngoài mô-đun mở rộng. Chúng được định nghĩa là hàm tĩnh .

Các hàm C của bạn thường được đặt tên bằng cách kết hợp mô-đun Python và tên hàm với nhau, như được hiển thị ở đây:

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Do your stuff here. */
   Py_RETURN_NONE;
}

Đây là một hàm Python được gọi là func bên trong mô -đun mô-đun . Bạn sẽ đưa con trỏ đến các hàm C của mình vào bảng phương pháp cho mô-đun thường xuất hiện tiếp theo trong mã nguồn của bạn.

Bảng ánh xạ phương pháp

Bảng phương thức này là một mảng cấu trúc PyMethodDef đơn giản. Cấu trúc đó trông giống như thế này -

struct PyMethodDef {
   char *ml_name;
   PyCFunction ml_meth;
   int ml_flags;
   char *ml_doc;
};

Đây là mô tả về các thành viên của cấu trúc này -

  • ml_name - Đây là tên của hàm như trình thông dịch Python trình bày khi nó được sử dụng trong các chương trình Python.

  • ml_meth - Đây là địa chỉ của một hàm có bất kỳ một trong các chữ ký được mô tả trong phần trước.

  • ml_flags - Điều này cho trình thông dịch biết mà ml_meth đang sử dụng chữ ký nào.

    • Cờ này thường có giá trị là METH_VARARGS.

    • Cờ này có thể được đặt theo bitwise HOẶC bằng METH_KEYWORDS nếu bạn muốn cho phép các đối số từ khóa vào hàm của mình.

    • Điều này cũng có thể có giá trị METH_NOARGS cho biết bạn không muốn chấp nhận bất kỳ đối số nào.

  • ml_doc - Đây là chuỗi tài liệu cho hàm, có thể là NULL nếu bạn không muốn viết hàm này.

Bảng này cần được kết thúc bằng một sentinel bao gồm các giá trị NULL và 0 cho các thành viên thích hợp.

Thí dụ

Đối với hàm được xác định ở trên, chúng ta có bảng ánh xạ phương thức sau:

static PyMethodDef module_methods[] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { NULL, NULL, 0, NULL }
};

Hàm khởi tạo

Phần cuối cùng của mô-đun mở rộng của bạn là chức năng khởi tạo. Hàm này được trình thông dịch Python gọi khi mô-đun được tải. Yêu cầu hàm phải được đặt têninitModule, trong đó Mô-đun là tên của mô-đun.

Hàm khởi tạo cần được xuất từ ​​thư viện mà bạn sẽ xây dựng. Các tiêu đề Python xác định PyMODINIT_FUNC để bao gồm các câu chú thích hợp để điều đó xảy ra cho môi trường cụ thể mà chúng ta đang biên dịch. Tất cả những gì bạn phải làm là sử dụng nó khi xác định hàm.

Hàm khởi tạo C của bạn thường có cấu trúc tổng thể sau:

PyMODINIT_FUNC initModule() {
   Py_InitModule3(func, module_methods, "docstring...");
}

Đây là mô tả của Py_InitModule3 chức năng -

  • func - Đây là chức năng được xuất.

  • module_methods - Đây là tên bảng ánh xạ đã xác định ở trên.

  • docstring - Đây là nhận xét bạn muốn đưa ra trong phần mở rộng của mình.

Kết hợp tất cả những điều này lại với nhau, nó trông giống như sau:

#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...");
}

Thí dụ

Một ví dụ đơn giản sử dụng tất cả các khái niệm trên -

#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!");
}

Ở đây, hàm Py_BuildValue được sử dụng để xây dựng một giá trị Python. Lưu mã trên trong tệp hello.c. Chúng ta sẽ xem cách biên dịch và cài đặt mô-đun này để được gọi từ tập lệnh Python.

Xây dựng và Cài đặt Tiện ích mở rộng

Các distutils gói làm cho nó rất dễ dàng để phân phối module Python, cả hai tinh khiết Python và mở rộng mô-đun, trong một cách tiêu chuẩn. Các mô-đun được phân phối ở dạng nguồn, được xây dựng và cài đặt thông qua tập lệnh thiết lập thường được gọi là setup.py as.

Đối với mô-đun trên, bạn cần chuẩn bị tập lệnh setup.py sau:

from distutils.core import setup, Extension
setup(name = 'helloworld', version = '1.0',  \
   ext_modules = [Extension('helloworld', ['hello.c'])])

Bây giờ, hãy sử dụng lệnh sau, lệnh này sẽ thực hiện tất cả các bước biên dịch và liên kết cần thiết, với các lệnh và cờ của trình biên dịch và trình liên kết phù hợp, và sao chép thư viện động kết quả vào một thư mục thích hợp -

$ python setup.py install

Trên các hệ thống dựa trên Unix, rất có thể bạn sẽ cần chạy lệnh này dưới dạng root để có quyền ghi vào thư mục gói trang. Đây thường không phải là vấn đề trên Windows.

Nhập tiện ích mở rộng

Sau khi cài đặt tiện ích mở rộng của mình, bạn có thể nhập và gọi tiện ích mở rộng đó trong tập lệnh Python của mình như sau:

Thí dụ

#!/usr/bin/python3
import helloworld

print helloworld.helloworld()

Đầu ra

Điều này sẽ tạo ra kết quả sau:

Hello, Python extensions!!

Thông số chức năng truyền

Vì rất có thể bạn sẽ muốn xác định các hàm chấp nhận đối số, bạn có thể sử dụng một trong các chữ ký khác cho các hàm C của mình. Ví dụ: hàm sau, chấp nhận một số tham số, sẽ được định nghĩa như thế này:

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Parse args and do something interesting here. */
   Py_RETURN_NONE;
}

Bảng phương thức chứa một mục nhập cho hàm mới sẽ trông như thế này:

static PyMethodDef module_methods[] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { "func", module_func, METH_VARARGS, NULL },
   { NULL, NULL, 0, NULL }
};

Bạn có thể sử dụng hàm API PyArg_ParseTuple để trích xuất các đối số từ một con trỏ PyObject được truyền vào hàm C của bạn.

Đối số đầu tiên của PyArg_ParseTuple là đối số args. Đây là đối tượng bạn sẽ phân tích cú pháp . Đối số thứ hai là một chuỗi định dạng mô tả các đối số như bạn mong đợi chúng xuất hiện. Mỗi đối số được biểu diễn bằng một hoặc nhiều ký tự trong chuỗi định dạng như sau.

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;
}

Đầu ra

Biên dịch phiên bản mới của mô-đun của bạn và nhập nó cho phép bạn gọi hàm mới với bất kỳ số lượng đối số nào thuộc bất kỳ loại nào -

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)

Bạn có thể nghĩ ra nhiều biến thể hơn nữa.

Hàm PyArg_ParseTuple

Đây là chữ ký tiêu chuẩn cho PyArg_ParseTuple chức năng -

int PyArg_ParseTuple(PyObject* tuple,char* format,...)

Hàm này trả về 0 cho các lỗi và giá trị không bằng 0 cho thành công. Tuple là PyObject * là đối số thứ hai của hàm C. Ở đây định dạng là một chuỗi C mô tả các đối số bắt buộc và tùy chọn.

Đây là danh sách các mã định dạng cho PyArg_ParseTuple chức năng -

Loại C Ý nghĩa
c char Một chuỗi Python có độ dài 1 trở thành C char.
d gấp đôi Một float Python trở thành một C double.
f Phao nổi Một float Python trở thành một float C.
Tôi int Một int Python trở thành một int C.
l Dài Một int Python trở thành một C dài.
L dài dài Một int Python trở thành một C dài
O PyObject * Nhận tham chiếu được mượn không phải NULL cho đối số Python.
S char * Chuỗi Python không có null được nhúng vào C char *.
S# char * + int Bất kỳ chuỗi Python nào đến địa chỉ và độ dài C.
t # char * + int Bộ đệm một đoạn chỉ đọc tới địa chỉ và độ dài C.
u Py_UNICODE * Python Unicode không có null được nhúng vào C.
u # Py_UNICODE * + int Bất kỳ địa chỉ và độ dài Python Unicode C nào.
w # char * + int Đọc / ghi bộ đệm một đoạn tới địa chỉ và độ dài C.
z char * Giống như s, cũng chấp nhận None (đặt C char * thành NULL).
z # char * + int Giống như s #, cũng chấp nhận None (đặt C char * thành NULL).
(...) theo ... Một chuỗi Python được coi là một đối số cho mỗi mục.
| Các đối số sau đây là tùy chọn.
: Kết thúc định dạng, theo sau là tên hàm cho các thông báo lỗi.
; Định dạng kết thúc, theo sau là toàn bộ văn bản thông báo lỗi.

Trả lại giá trị

Py_BuildValue nhận trong một chuỗi định dạng giống như PyArg_ParseTuple . Thay vì chuyển địa chỉ của các giá trị bạn đang xây dựng, bạn chuyển các giá trị thực tế vào. Đây là một ví dụ cho thấy cách triển khai một hàm thêm -

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);
}

Đây là giao diện của nó nếu được triển khai bằng Python -

def add(a, b):
   return (a + b)

Bạn có thể trả về hai giá trị từ hàm của mình như sau. Điều này sẽ được ghi lại bằng cách sử dụng một danh sách trong 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);
}

Đây là giao diện của nó nếu được triển khai bằng Python -

def add_subtract(a, b):
   return (a + b, a - b)

Các Py_BuildValue Chức năng

Đây là chữ ký tiêu chuẩn cho Py_BuildValue chức năng -

PyObject* Py_BuildValue(char* format,...)

Ở đây định dạng là một chuỗi C mô tả đối tượng Python để xây dựng. Các đối số sau đây của Py_BuildValue là giá trị C mà từ đó kết quả được tạo. Các PyObject * Kết quả là một tham chiếu mới.

Bảng sau liệt kê các chuỗi mã thường được sử dụng, trong đó không hoặc nhiều hơn được nối thành một định dạng chuỗi.

Loại C Ý nghĩa
c char AC char trở thành một chuỗi Python có độ dài 1.
d gấp đôi AC double trở thành một float trong Python.
f Phao nổi AC float trở thành một float trong Python.
Tôi int AC int trở thành một int Python.
l Dài AC long trở thành một int Python.
N PyObject * Truyền một đối tượng Python và đánh cắp một tham chiếu.
O PyObject * Truyền một đối tượng Python và INCREF nó như bình thường.
O & chuyển đổi + void * Chuyển đổi tùy ý
S char * C 0 kết thúc char * thành chuỗi Python hoặc NULL thành Không.
S# char * + int Ký tự C * và độ dài thành chuỗi Python hoặc NULL thành Không.
u Py_UNICODE * C-wide, chuỗi được kết thúc bằng null sang Python Unicode hoặc NULL thành Không.
u # Py_UNICODE * + int Chuỗi rộng C và độ dài thành Python Unicode hoặc NULL thành Không.
w # char * + int Đọc / ghi bộ đệm một đoạn tới địa chỉ và độ dài C.
z char * Giống như s, cũng chấp nhận None (đặt C char * thành NULL).
z # char * + int Giống như s #, cũng chấp nhận None (đặt C char * thành NULL).
(...) theo ... Tạo bộ tuple Python từ các giá trị C.
[...] theo ... Tạo danh sách Python từ các giá trị C.
{...} theo ... Xây dựng từ điển Python từ các giá trị C, các khóa và giá trị xen kẽ.

Mã {...} xây dựng từ điển từ một số giá trị C chẵn, xen kẽ các khóa và giá trị. Ví dụ: Py_BuildValue ("{Issi}", 23, "zig", "zag", 42) trả về một từ điển như {23: 'zig', 'zag': 42} của Python.