+3

Làm quen với Python (Part 1 - Thiết lập môi trường)

Trong bài viết lần này, chúng ta sẽ cùng nhau làm quen với một ngôn ngữ đang rất phổ biến hiện nay, Python. Chúng ta sẽ đi ngay vô phần setup môi trường thay vì giới thiệu các thông tin liên quan. Và chúng ta sẽ mượn framework Django để dẫn qua các khái niệm của Python, như vậy, khi hoàn thành chuỗi bài về làm quen Python này, chúng ta cũng đồng thời làm quen với framework Django. Một mũi tên trúng 2 con nhạn 😜

Hệ điều hành mà chúng ta sử dụng là Ubuntu 20.04

1. Cài đặt python

Ubuntu 20.04 đã kèm sẵn trong nó python. Chạy python3 --version để kiểm tra version hiện tại của python. Trên máy mình là Python 3.8.2

Tiếp theo, cài đặt python3-venv

sudo apt install python3-venv

Tạo một folder work trên desktop, sau đó cd work. Sau đó, chúng ta sẽ tạo một môi trường ảo, (virtual environment), tất cả các package sẽ được cài đặt vào đây. See

python3 -m venv venv

venv là gì? tại sao chúng ta cần sử dụng venv? venv cho phép các Python packages được cài đặt "local", thay vì cài đặt "global". Với các bạn từng lập trình NodeJS, thì sử dụng venv cũng tương tự việc chúng ta không thêm -g khi cài đặt npm install packageA. Sau đó, chúng ta sẽ kích hoạt môi trường ảo này bằng cách chạy câu lệnh:

source venv/bin/activate

Để kiểm tra, ta có thể chạy lệnh:

$ python --version
Python 3.8.2
$ pip --version
pip 20.0.2

Tiếp theo, chúng ta sẽ cài Django bằng câu lệnh

pip install Django==3.1

Lưu ý là không có --user

Sau khi cài đặt xong, trong thư mục bin sẽ có một file django-admin. Chúng ta sẽ tạo một django project mới sử dụng câu lệnh:

 $ django-admin startproject mysite

Câu lệnh này sẽ tạo cho chúng ta một thư mục có các files như sau:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

Tiếp theo chúng ta sẽ tạo app. Trong Django có sự khác biệt giữa project và app, Django tư duy theo hướng mỗi một project sẽ bao gồm nhiều app và mỗi app là một web application, thực hiện một tính năng chức năng nào đó, vị dụ như poll app. Một app thì có thể thuộc về nhiều project và một project có thể chứa nhiều app. Tạo app:

$ python manage.py startapp polls

Một thư mục polls sẽ được tạo ra có cấu trúc :

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

Về bản chất, thì một app thật chất là một python package, file __init__.py bắt buộc phải có để Python xác định một folder là một package. Nhưng trước khi tìm hiểu về python package, chúng ta sẽ còn nhau tìm hiểu xem python module là gì.

2. Python module là gì?

Thông thường một project được cấu thành bởi tập hợp của rất nhiều file code, hay nói cách khác là chúng ta viết code trong rất nhiều file. Việc chia nhỏ source code ra nhiều file và đặt cho từng file một tên gọi phản ánh công việc mà các dòng code trong file đó thực hiện sẽ giúp quá trình maintain đỡ vất vả.

Mỗi ngôn ngữ lập trình sẽ có các cơ chế khác nhau cho việc hỗ trợ chia nhỏ source code ra nhiều file. Trong Python, mỗi một file như vậy được gọi là một Module.

A module is a file containing Python definitions and statements. The file name is the module name with the suffix .py appended.

Như vậy một python module chỉ đơn giản là một file có phần extension là py. Và bên trong nó sẽ chứa code python.

Để sử dụng code từ một module ở một module khác. Ta dùng câu lệnh import. Trong Python, không bắt buộc các câu lệnh import phải đặt tất cả ở đầu file. Ví dụ:

>>> import fibo
>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

Each module has its own private symbol table, which is used as the global symbol table by all functions defined in the module.

Ở các ngôn ngữ lập trình khác, ta sử dụng khái niệm scope để chỉ phạm vi tồn tại của các hàm và biến. Trong Python, các tài liệu đề cập với nó với tên gọi symbol table. Như nội dung documentation mô tả, thì mỗi một module sẽ có một private symbol table. Nghĩa là các biến và hàm trong một module sẽ được "scoped" lại, đều này có nghĩa, ở hai module khác nhau, thì các biến và hàm sẽ vẫn có thể được đặt trùng tên.

There is a variant of the import statement that imports names from a module directly into the importing module’s symbol table.

Có nhiều cách để import một module vào một module khác, ví dụ, thay vì import module name rồi sau đó dùng modname.func hay modname.itemname để gọi tới các hàm và biến. Ta có thể mang trực tiếp các tên hàm và biến đó vào thẳng symbol table của module đang được sử dụng:

>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Import như này, chúng ta sẽ không có biến fibo để gọi các thành phần của module fibo. Mà thay vào đó, ta sẽ có hai hàm thuộc fibo, đó là fib và fib2. Từ đây chúng ta có thể sử dụng trực tiếp chúng.

Một dạng import khác là import toàn bộ names trong một module vào module hiện tại:

>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Tất cả các biến và hàm trong module fibo sẽ được import vào module hiện hành, trừ các biến và hàm bắt đầu bằng ký tự _ Tuy đây là một tính năng được hỗ trợ, phần đông dev không sử dụng nó vì nó rất khó quản lý, sẽ có nhiều thứ ẩn đi mà ta không biết nó có tồn tại. Tuy nhiên, nó lại hữu ích trong interactive mode, khi mà ta không muốn phải gõ quá nhiều.

Ta có thể đặt lên tên của module được import, như sau:

>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Tương tự cho câu lệnh from

>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

3. Python package

(to be continue...)


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí