[Functions – part 2] – Modules trong Python

1. Module là gì ?

Bạn còn nhớ câu lệnh import datetime ở bài Ngày tháng và thời gian trong Python? đó là một ví dụ về import (mình giữ nguyên tiếng Anh chứ ra tiếng Việt là nhập vào hay nhập khẩu nó chuối quá :D) một module.

Vậy trong Python, một module là một file mà nó cung cấp  các định nghĩa về biếnhàm được xây dựng sẵn mà bạn có thể sử dụng  khi đã  được import.

Trước khi ta thử import bất cứ thứ gì, chúng ta hãy xem Python sẽ làm gì với lệnh lấy căn bậc hai sqrt().

print

sqrt

(

25

)

Bạn sẽ nhận được một lỗi như vầy:

Traceback (most recent call last):   File "python", line 1, in <module> NameError: name 'sqrt' is not defined >>>

Báo lỗi này thông báo cho ta rằng: cái lệnh sqrt chưa được định nghĩa, ờ thì nhìn lại xem, có dòng nào ta định nghĩa hàm này hồi nào đâu mà xài. Ta sẽ sửa lỗi này ở phần sau đây:

2. Generic Imports (Import dạng tổng quát)

Ở đoạn trước bạn đã thấy Python thông báo “NameError: name ‘sqrt’ is not defined.”. Python nó không biết cái hàm sqrt() là cái gì hết ấy.

Nhưng thật ra Python có cung cấp cho ta hàm này, hàm này được cung cấp trong một module có tên là math, module này bao gồm một số các biến và các chức năng, và sqrt() là một trong số các chức năng này.

Để sử dụng module math này, ta cần sử dụng từ khóa import, khi chỉ cần nhập một module theo cách này, nó được gọi là Generic import (import dạng tổng quát).

Vậy để sửa bài trên, ta cần làm 2 việc sau:

– Gõ import math ở đầu đoạn code trên

– Chèn từ khóa “math.” ở trước hàm sqrt(), tức là thế này math.sqrt().

Điều này có nghĩa là Python sẽ lấy chức năng sqrt() từ module math.

# Ask Python to print sqrt(25) on line 3.

import math

print math.sqrt(25)

3. import function (import hàm)

Ok, vậy là giờ Python đã biết làm sao lấy được căn bậc 2 của một số.

Tuy nhiên cái module math nó nhiều lắm, không lẽ lấy có cái hàm căn bậc 2 mà phải import cả module math, giờ ta chỉ cần lấy cái hàm sqrt() và khi gọi ta không cần phải gọi math.sqrt() mà chỉ cần gõ sqrt().

Ta có thể import chắc chắn một biến hay một hàm nào đó mà ta cần sử dụng từ module mà ta import.

Lấy duy nhất một hàm từ một module gọi là  function import (import hàm). Ta thực hiện điều đó bằng từ khóa from:

from

module

import

function

Để import thêm vài hàm nữa ta chỉ cần thêm các  hàm ở phía sau và ngăn cách bởi dấu phẩy

from

module

import

function, function1, function2

Ta tiếp tục bài tập trước: hãy import chỉ duy nhất hàm sqrt() từ module math, (Ta không cần dấu () sau mỗi hàm ở câu lệnh import)

# Import *just* the sqrt function from math!

from math import

sqrt

print

sqrt(

25

)

Bây giờ, ta thấy, ta không cần phải gõ math.sqrt() để lấy căn bậc 2 một số nữa, ta chỉ cần gõ sqrt() để lấy căn bậc 2 cho một số là được.

4. Universal Imports (import toàn bộ)

Vậy làm thế nào nếu bạn vẫn muốn sử dụng tất cả các biến và hàm trong một module mà không muốn gõ thêm .math”. Universal import có thể làm điều đó cho ta.

Ta có thể thực hiện việc đó thông qua câu lệnh sau:

from

module

import

*

Ví dụ: sử dụng cú pháp from module import * để nhập mọi thứ từ module math và sử dụng các tài nguyên đó để tính căn bậc 2 của một số.

# Import *everything* from the math module!

from math

import *

print sqrt(25)

5. Nhận xét chung

Universal Import có thể rất tiện lợi. Nhưng nó thật sự không phải là một ý tưởng tốt để sử dụng các tài nguyên trong một module, có một số các lý do như một module có thể có hàng tấn biến và hàm khác nhau trong đó và sẽ không thật sự an toàn khi ta lấy hết tất cả các hàm trong đó.

Một vấn đề nữa, ví dụ nếu bạn khai báo một hàm có tên là sqrt() (hàm này do ta tự định nghĩa) và mặc dù ta import math thì chương trình của ta vẫn an toàn (Vì hàm sqrt() của bạn khác với hàm math.sqrt() của module math). Tuy nhiên khi bạn dùng from math import * ta có một rắc rối, hai hàm khác nhau với tên giống nhau, sau đó sẽ xảy ra xung đột.

Thậm chí nếu định nghĩa hàm riêng của riêng bạn không trùng với hàm nào trong các module được import mà bạn import nhiều module theo kiểu from module import * thì ta không thể quản lý được hàm của ta đến từ module nào.

* Với những lý do trên, cách tốt nhất để thực hiện import một module là sử dụng lệnh import module hoặc nếu chỉ sử dụng một vài hàm trong module đó ta chỉ cần import một biến hoặc một hàm cụ thể mà ta cần.

Đôi khi bạn muốn biết trong module đó có chứa những gì, Python hỗ trợ bạn việc đó, để xem các hàm và biến nói chung là tất cả mọi thứ trong một module ta cần import module đó và sau đó dùng lệnh dir(module).

Ví dụ: ta muốn xem các hàm và biến có trong module  math.

import math

everything =

dir(math)

# Sets everything to a list of things

from math

print everything

# Prints 'everything from math!

P/s: Vậy qua phần này ta thấy rằng, éo biết sao Codecademy lại đặt phần module vào chung phần với function =)), vì module nó thực chất chỉ là một thư viện gồm nhiều thứ để ta có thể truy cập vào mà sử dụng thông qua lệnh import chứ đâu chỉ riêng hàm, thôi kệ nó đặt sau thì làm theo nó 😀

Advertisement

Chia sẻ:

Thích bài này:

Thích

Đang tải…