Skip to content

Commit ddcb983

Browse files
khanhnnvngitbook-bot
authored andcommitted
GitBook: [master] 10 pages modified
1 parent e226ffc commit ddcb983

10 files changed

+400
-386
lines changed

11.-brief-tour-of-the-standard-library-part-ii.md

Lines changed: 21 additions & 23 deletions
Large diffs are not rendered by default.

12.-virtual-environments-and-packages.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
# 12. Môi trường phân lập (Virtual Environments) và các gói thư viện (Packages)
1+
# 12. Virtual Environments and Packages
22

3-
### 12.1. Giới thiệu
3+
## 12.1. Giới thiệu
44

55
Các chương trình viết bằng Python trên thực tế thường dùng các gói thư viện và module bên ngoài các thư viện - module có sẵn. Những chương trình này đôi khi cần phiên bản cụ thể của một thư viện nào đó.
66

77
Điều này có nghĩa là ít khi nào một bộ thư viện Python duy nhất phù hợp với tất cả các chương trình sử dụng nó. Nếu chương trình A cần phiên bản 1.0 của một module cụ thể nào đó nhưng chương trình B lại cần phiên bản 2.0 của module này, sự xung đột phiên bản sẽ xảy ra. Bạn chỉ có thể cài phiên bản 1.0 hoặc 2.0 của module trên một máy tính, do đó chương trình A hoặc B sẽ không chạy.
88

99
Giải pháp xử lý vấn đề này là tạo ra [virtual environment](https://docs.python.org/3/glossary.html#term-virtual-environment), một thư mục chứa phiên bản cụ thể của một thư viện cụ thể, hoặc thậm chí chứa bộ thư viện chuẩn của Python theo phiên bản nào đó.
1010

11-
Các chương trình khác nhau có thể sử dụng các môi trường phân lập (virtual ennviroment) khác nhau để thực thi. Để giải quyết vấn đề xung đột phiên bản thư viện, chương trình A có thể có môi trường phân lập riêng chứa phiên bản 1.0 của thư viện, còn chương trình B lại sử dụng môi trường phân lập khác chứa phiên bản thư viện 2.0. Nếu chương trình B cần nâng cấp phiên bản thư viện lên 3.0 trong virtual enviroment của nó, điều này sẽ không ảnh hưởng gì tới virtual enviroment của A.
11+
Các chương trình khác nhau có thể sử dụng các môi trường phân lập \(virtual ennviroment\) khác nhau để thực thi. Để giải quyết vấn đề xung đột phiên bản thư viện, chương trình A có thể có môi trường phân lập riêng chứa phiên bản 1.0 của thư viện, còn chương trình B lại sử dụng môi trường phân lập khác chứa phiên bản thư viện 2.0. Nếu chương trình B cần nâng cấp phiên bản thư viện lên 3.0 trong virtual enviroment của nó, điều này sẽ không ảnh hưởng gì tới virtual enviroment của A.
1212

13-
### 12.2. Tạo môi trường phân lập (Virtual Environment)
13+
## 12.2. Tạo môi trường phân lập \(Virtual Environment\)
1414

1515
Module được sử dụng để tạo và quản lý virtual enviroment có tên là [`venv`](https://docs.python.org/3/library/venv.html#module-venv). [`venv`](https://docs.python.org/3/library/venv.html#module-venv) thường sẽ cài đặt các thư viện Python mới nhất trên máy tính của bạn vào virtual enviroment. Nếu bạn có nhiều phiên bản Python trên máy tính, bạn có thể chọn lựa phiên bản Python bằng lệnh `python3` hoặc bất cứ phiên bản Python nào bạn muốn.
1616

@@ -22,7 +22,7 @@ python3 -m venv tutorial-env
2222

2323
Lệnh này sẽ tạo thư mục `tutorial-env` nếu nó chưa tồn tại, cùng với đó là các thư mục con chứa trình thông dịch Python, các thư viện Python chuẩn và các file cần thiết khác.
2424

25-
Sau khi tạo virtual environment, bạn cần kích hoạt (activate) nó để sử dụng.
25+
Sau khi tạo virtual environment, bạn cần kích hoạt \(activate\) nó để sử dụng.
2626

2727
Trên Windows, gõ lệnh:
2828

@@ -52,7 +52,7 @@ Python 3.5.1 (default, May 6 2016, 10:59:36)
5252
>>>
5353
```
5454

55-
### 12.3. Quản lý các gói thư viện bằng pip
55+
## 12.3. Quản lý các gói thư viện bằng pip
5656

5757
Bạn có thể cài đặt, nâng cấp, xóa bỏ các gói thư viện bằng một chương trình tên là **pip**. Mặc định, `pip` sẽ cài đặt các gói thư viện nằm trên Python Package Index, <[https://pypi.python.org/pypi](https://pypi.python.org/pypi)>. Bạn có thể tìm hiểu các gói thư viện này bằng cách vào trang web của Python Package Index hoặc tìm kiếm thông qua lệnh `pip` trên shell:
5858

@@ -157,3 +157,4 @@ Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0
157157
```
158158

159159
`pip` còn nhiều tham số khác nữa cho bạn sử dụng. Tham khảo thêm [Installing Python Modules](https://docs.python.org/3/installing/index.html#installing-index) để biết rõ hơn về `pip`. Nếu bạn có một gói thư viện của riêng mình và muốn nó xuất hiện trên Python Package Index, tham khảo cách làm tại [Distributing Python Modules](https://docs.python.org/3/distributing/index.html#distributing-index).
160+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# 14. Interactive Input Editing and History Substitution
2+
3+
Some versions of the Python interpreter support editing of the current input line and history substitution, similar to facilities found in the Korn shell and the GNU Bash shell. This is implemented using the [GNU Readline](https://tiswww.case.edu/php/chet/readline/rltop.html) library, which supports various styles of editing. This library has its own documentation which we won’t duplicate here.
4+
5+
### 14.1. Tab Completion and History Editing
6+
7+
Completion of variable and module names is [automatically enabled](https://docs.python.org/3/library/site.html#rlcompleter-config) at interpreter startup so that the Tab key invokes the completion function; it looks at Python statement names, the current local variables, and the available module names. For dotted expressions such as `string.a`, it will evaluate the expression up to the final `'.'` and then suggest completions from the attributes of the resulting object. Note that this may execute application-defined code if an object with a [`__getattr__()`](https://docs.python.org/3/reference/datamodel.html#object.__getattr__) method is part of the expression. The default configuration also saves your history into a file named `.python_history` in your user directory. The history will be available again during the next interactive interpreter session.
8+
9+
### 14.2. Alternatives to the Interactive Interpreter
10+
11+
This facility is an enormous step forward compared to earlier versions of the interpreter; however, some wishes are left: It would be nice if the proper indentation were suggested on continuation lines \(the parser knows if an indent token is required next\). The completion mechanism might use the interpreter’s symbol table. A command to check \(or even suggest\) matching parentheses, quotes, etc., would also be useful.
12+
13+
One alternative enhanced interactive interpreter that has been around for quite some time is [IPython](https://ipython.org/), which features tab completion, object exploration and advanced history management. It can also be thoroughly customized and embedded into other applications. Another similar enhanced interactive environment is [bpython](http://www.bpython-interpreter.org/).
14+

15.-floating-point-arithmetic-issues-and-limitations.md

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
# 15. Số hữu tỉ: Vấn đề và hạn chế
2-
3-
1+
# 15. Floating Point Arithmetic: Issues and Limitations
42

53
Số hữu tỉ được máy tính hiểu dưới dạng phân số hệ nhị phân. Ví dụ như với phân số thập phân:
64

@@ -40,14 +38,13 @@ Bất kể ta cần mẫn viết thêm bao nhiêu số, kết quả không bao g
4038

4139
Tương tự như thế, không cần biết bạn muốn thêm bao nhiêu số với phân số nhị phân, số hữu tỉ thập phân 0.1 mãi mãi không thể có giá trị chính xác là 0.1 ở dạng nhị phân, 1/10 mãi mãi là sự lặp lại vô tận trong trường hợp này.
4240

43-
4441
```text
4542
0.0001100110011001100110011001100110011001100110011...
4643
```
4744

48-
Việc biểu diễn gần đúng này sẽ được dừng lại ở một số hữu hạn bit. Trong hầu hết các máy tính hiện tại, số hữu tỉ được biểu diễn gần đúng sử dụng 53 bit đầu tiên biểu diễn phần tỉ số và phần mẫu số là lũy thừa của 2. Trong trường hợp của 1/10, phân số nhị phân sẽ là (3602879701896397 / (2 ** 55)), nghĩa là gần đúng chứ không phải là 1/10.
45+
Việc biểu diễn gần đúng này sẽ được dừng lại ở một số hữu hạn bit. Trong hầu hết các máy tính hiện tại, số hữu tỉ được biểu diễn gần đúng sử dụng 53 bit đầu tiên biểu diễn phần tỉ số và phần mẫu số là lũy thừa của 2. Trong trường hợp của 1/10, phân số nhị phân sẽ là \(3602879701896397 / \(2 \*\* 55\)\), nghĩa là gần đúng chứ không phải là 1/10.
4946

50-
Hầu hết người dùng đều không để ý đến giá trị gần đúng. Python chỉ in ra giá trị số hữu tỉ thập phân gần đúng của một số hữu tỉ nhị phân thật sự đang được lưu lại trong bộ nhớ máy tính (RAM). Với hầu hết các máy tính, nếu như Python thật sự in ra con số phân số nhị phân đang được lưu trữ trong bộ nhớ, giá trị 0.1 sẽ phải là:
47+
Hầu hết người dùng đều không để ý đến giá trị gần đúng. Python chỉ in ra giá trị số hữu tỉ thập phân gần đúng của một số hữu tỉ nhị phân thật sự đang được lưu lại trong bộ nhớ máy tính \(RAM\). Với hầu hết các máy tính, nếu như Python thật sự in ra con số phân số nhị phân đang được lưu trữ trong bộ nhớ, giá trị 0.1 sẽ phải là:
5148

5249
```text
5350
>>> 0.1
@@ -63,9 +60,9 @@ Hầu hết người dùng đều không để ý đến giá trị gần đúng
6360

6461
Luôn nhớ rằng, dù cho kết quả được in ra có vẻ giống với giá trị thực của 1/10, giá trị được lưu trữ chỉ là giá trị phân số nhị phân gần đúng mà thôi.
6562

66-
Thú vị hơn, ta sẽ thấy có rất nhiều số hữu tỉ thập phân có cùng một giá trị tương đương nhị phân. Ví dụ như 0.1 và 0.10000000000000001 hay 0.1000000000000000055511151231257827021181583404541015625 đều được biểu diễn chung bằng (3602879701896397 / (2 ** 55)). Chính vì nguyên nhân này, tất cả các giá trị hữu tỉ thập phân bên trên đều được logic eval(repr(x)) == 1/10 trả về giá trị True.
63+
Thú vị hơn, ta sẽ thấy có rất nhiều số hữu tỉ thập phân có cùng một giá trị tương đương nhị phân. Ví dụ như 0.1 và 0.10000000000000001 hay 0.1000000000000000055511151231257827021181583404541015625 đều được biểu diễn chung bằng \(3602879701896397 / \(2 \*\* 55\)\). Chính vì nguyên nhân này, tất cả các giá trị hữu tỉ thập phân bên trên đều được logic eval\(repr\(x\)\) == 1/10 trả về giá trị True.
6764

68-
Trong quá khứ, hàm [`repr()`](https://docs.python.org/3/library/functions.html#repr) sẽ hiển thị đến ký tự thứ 17 (0.10000000000000001). Bắt đầu từ Python 3.1, Python đã có thể lựa chọn giá trị tương đương gần nhất và hiển thị 0.1 (với hầu hết phần cứng).
65+
Trong quá khứ, hàm [`repr()`](https://docs.python.org/3/library/functions.html#repr) sẽ hiển thị đến ký tự thứ 17 \(0.10000000000000001\). Bắt đầu từ Python 3.1, Python đã có thể lựa chọn giá trị tương đương gần nhất và hiển thị 0.1 \(với hầu hết phần cứng\).
6966

7067
Lưu ý đây là tính tự nhiên của số hữu tỉ nhị phân, đây không phải là lỗi của Python, cũng càng không phải là lỗi của chương trình bạn viết. Vấn đề này cũng được xử lý tương tự ở rất nhiều ngôn ngữ lập trình khác.
7168

@@ -107,17 +104,17 @@ True
107104

108105
Thuật toán hữu tỉ nhị phân tạo ra rất nhiều bất ngờ tương tự thế này. Vấn đề với "0.1" sẽ được trình bày cụ thể phía bên dưới, ở phần "Lỗi sai số". Xem [`The Perils of Floating Point`](http://www.lahey.com/float.htm) để hiểu rõ hơn về vấn đề này.
109106

110-
Như được nói ở gần cuối, "vấn đề này không hề có câu trả lời dễ dàng". Tuy nhiên, ta đừng quá lo lắng về số hữu tỉ! Sai số của Python trong tính toán số hữu tỉ là sản phẩm kế thừa từ sai số hệ thống của số hữu tỉ, và hầu hết hệ thống có sai số không quá (1/(2 ** 53)). Việc này là quá chính xác với hầu hết các chương trình, chỉ cần lưu ý là nó không phải là thuật toán thập phân, và tất cả các phép tính hữu tỉ đều có sai số làm tròn.
107+
Như được nói ở gần cuối, "vấn đề này không hề có câu trả lời dễ dàng". Tuy nhiên, ta đừng quá lo lắng về số hữu tỉ! Sai số của Python trong tính toán số hữu tỉ là sản phẩm kế thừa từ sai số hệ thống của số hữu tỉ, và hầu hết hệ thống có sai số không quá \(1/\(2 \*\* 53\)\). Việc này là quá chính xác với hầu hết các chương trình, chỉ cần lưu ý là nó không phải là thuật toán thập phân, và tất cả các phép tính hữu tỉ đều có sai số làm tròn.
111108

112109
Do các sai số hệ thống này, hầu hết các trường hợp thông thường có sử dụng thuật toán hữu tỉ ta có thể có các kết quả như mong muốn bằng việc làm tròn kết quả cuối cùng sau khi tính toán. [`str()`](https://docs.python.org/3/library/stdtypes.html#str) thường được sử dụng, tìm hiểu thêm [`str.format()`](https://docs.python.org/3/library/stdtypes.html#str.format) & [`cú pháp string format`](https://docs.python.org/3/library/string.html#formatstrings) để sử dụng tốt hơn hàm này.
113110

114111
Với các trường hợp đòi hỏi giá trị thập phân chính xác, ta có thể sử dụng module [`decimal`](https://docs.python.org/3/library/decimal.html#module-decimal) để tăng độ chính xác cho các thuật toán thập phân đòi hỏi trong các phần mềm kế toán hoặc các phần mềm kỹ thuật khác.
115112

116-
Một lựa chọn khác cho thuật toán chính xác là module [`fractions`](https://docs.python.org/3/library/fractions.html#module-fractions) fractions với các thuật toán tăng cường độ chính xác dựa trên các số tỉ lệ (1/3 thể được biểu diễn chính xác nhờ số tỉ lệ).
113+
Một lựa chọn khác cho thuật toán chính xác là module [`fractions`](https://docs.python.org/3/library/fractions.html#module-fractions) fractions với các thuật toán tăng cường độ chính xác dựa trên các số tỉ lệ \(1/3 thể được biểu diễn chính xác nhờ số tỉ lệ\).
117114

118115
Nếu bạn cần phải sử dụng số hữu tỉ thường xuyên, bạn nên tìm hiểu về các gói dữ liệu số của Python mà điển hình là [`SciPy`](https://scipy.org/).
119116

120-
Python có cung cấp một số công cụ có thể giúp bạn tìm hiểu giá trị thật sự của một số hữu tỉ. [`float.as_integer_ratio()`](https://docs.python.org/3/library/stdtypes.html#float.as_integer_ratio) là một giải pháp để thể hiện giá trị một số hữu tỉ ở dạng phân số.
117+
Python có cung cấp một số công cụ có thể giúp bạn tìm hiểu giá trị thật sự của một số hữu tỉ. [`float.as_integer_ratio()`](https://docs.python.org/3/library/stdtypes.html#float.as_integer_ratio) là một giải pháp để thể hiện giá trị một số hữu tỉ ở dạng phân số.
121118

122119
```text
123120
>>> x = 3.14159
@@ -132,7 +129,7 @@ Vì số tỉ lệ là chính xác, số này có thể được dùng để bi
132129
True
133130
```
134131

135-
[`float.hex()`](https://docs.python.org/3/library/stdtypes.html#float.hex) là giải pháp thể hiện một số hữu tỉ ở dạng hexadecimal (phần 16), đây là giá trị thực thế được lưu trữ trong máy tính:
132+
[`float.hex()`](https://docs.python.org/3/library/stdtypes.html#float.hex) là giải pháp thể hiện một số hữu tỉ ở dạng hexadecimal \(phần 16\), đây là giá trị thực thế được lưu trữ trong máy tính:
136133

137134
```text
138135
>>> x.hex()
@@ -146,7 +143,7 @@ Một giá trị dưới dạng phần 16 được dùng để xây dựng lại
146143
True
147144
```
148145

149-
Vì giá trị này là giá trị chính xác, nó có thể sử dụng để truyền các giá trị qua lại giữa các phiên bản khác nhau của Python (từ những hệ điều hành độc lập) cũng như trao đổi dữ liệu với các ngôn ngữ lập trình khác có sử dụng định dạng tương tự (Java hay C++).
146+
Vì giá trị này là giá trị chính xác, nó có thể sử dụng để truyền các giá trị qua lại giữa các phiên bản khác nhau của Python \(từ những hệ điều hành độc lập\) cũng như trao đổi dữ liệu với các ngôn ngữ lập trình khác có sử dụng định dạng tương tự \(Java hay C++\).
150147

151148
Còn một công cụ khác nữa là hàm [`math.fsum()`](https://docs.python.org/3/library/math.html#math.fsum) giúp giảm thiểu sai số trong phép tính tổng. Hàm này lưu lại các phần bị mất trong giá trị thực và thêm nó vào tổng thực tế. Việc này tạo ra một kết quả chính xác hơn khi ta cần sử dụng để so sánh:
152149

@@ -157,7 +154,7 @@ False
157154
True
158155
```
159156

160-
### 15.1. Lỗi sai số
157+
## 15.1. Lỗi sai số
161158

162159
This section explains the “0.1” example in detail, and shows how you can perform an exact analysis of cases like this yourself. Basic familiarity with binary floating-point representation is assumed.
163160

@@ -251,5 +248,3 @@ Decimal('0.1000000000000000055511151231257827021181583404541015625')
251248
'0.10000000000000001'
252249
```
253250

254-
####
255-

0 commit comments

Comments
 (0)