In \b nghĩa là gì trong python?

If you’re like most Python users, including me, then you probably started your Python journey by learning about

>>> import os
>>> os.linesep
'\r\n'
94. It helped you write your very own
>>> import os
>>> os.linesep
'\r\n'
95 one-liner. Bạn có thể sử dụng nó để hiển thị các tin nhắn được định dạng trên màn hình và có thể tìm thấy một số lỗi. Nhưng nếu bạn nghĩ rằng đó là tất cả những gì cần biết về hàm
>>> import os
>>> os.linesep
'\r\n'
94 của Python, thì bạn đang bỏ lỡ rất nhiều

Hãy tiếp tục đọc để tận dụng tối đa chức năng nhỏ có vẻ nhàm chán và không được đánh giá cao này. Hướng dẫn này sẽ giúp bạn bắt kịp tốc độ sử dụng Python

>>> import os
>>> os.linesep
'\r\n'
94 một cách hiệu quả. Tuy nhiên, hãy chuẩn bị để tìm hiểu sâu khi bạn đi qua các phần. Bạn có thể ngạc nhiên về số lượng mà
>>> import os
>>> os.linesep
'\r\n'
94 cung cấp

Đến cuối hướng dẫn này, bạn sẽ biết cách

  • Tránh những lỗi thường gặp với
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94 của Python
  • Xử lý các dòng mới, mã hóa ký tự và bộ đệm
  • Viết văn bản vào tập tin
  • Mock
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94 in unit tests
  • Xây dựng giao diện người dùng nâng cao trong thiết bị đầu cuối

If you’re a complete beginner, then you’ll benefit most from reading the first part of this tutorial, which illustrates the essentials of printing in Python. Otherwise, feel free to skip that part and jump around as you see fit

Ghi chú.

>>> import os
>>> os.linesep
'\r\n'
94 là một bổ sung chính cho Python 3, trong đó nó thay thế câu lệnh
>>> import os
>>> os.linesep
'\n'
02 cũ có sẵn trong Python 2

Có một số lý do chính đáng cho điều đó, như bạn sẽ thấy ngay sau đây. Mặc dù hướng dẫn này tập trung vào Python 3, nhưng nó hiển thị cách in cũ trong Python để tham khảo

Tiền thưởng miễn phí. Nhấp vào đây để nhận Bảng cheat Python miễn phí của chúng tôi, trang này cho bạn biết kiến ​​thức cơ bản về Python 3, như làm việc với các kiểu dữ liệu, từ điển, danh sách và hàm Python

Printing in a Nutshell

Hãy bắt đầu bằng cách xem xét một số ví dụ thực tế về in bằng Python. Đến cuối phần này, bạn sẽ biết mọi cách có thể để gọi

>>> import os
>>> os.linesep
'\r\n'
94. Hoặc, theo biệt ngữ của lập trình viên, bạn sẽ nói rằng bạn sẽ quen với chữ ký hàm

Loại bỏ các quảng cáo

Đang gọi
>>> import os
>>> os.linesep
'\r\n'
94

Ví dụ đơn giản nhất về việc sử dụng Python

>>> import os
>>> os.linesep
'\r\n'
94 chỉ cần một vài lần nhấn phím

>>>

>>> import os
>>> os.linesep
'\r\n'
2

Bạn không chuyển bất kỳ đối số nào, nhưng bạn vẫn cần đặt dấu ngoặc đơn trống ở cuối, dấu ngoặc đơn này yêu cầu Python thực sự thực thi hàm thay vì chỉ gọi nó theo tên

Thao tác này sẽ tạo ra một ký tự xuống dòng ẩn, do đó sẽ khiến một dòng trống xuất hiện trên màn hình của bạn. Bạn có thể gọi

>>> import os
>>> os.linesep
'\r\n'
94 nhiều lần như thế này để thêm không gian theo chiều dọc. Giống như bạn đang nhấn Enter trên bàn phím của mình trong trình xử lý văn bản.

Ký tự xuống dòngHiển thị/Ẩn

Ký tự xuống dòng là một ký tự điều khiển đặc biệt được sử dụng để biểu thị kết thúc một dòng [EOL]. Nó thường không có biểu diễn hiển thị trên màn hình, nhưng một số trình soạn thảo văn bản có thể hiển thị các ký tự không in được như vậy với ít đồ họa

Từ “ký tự” có phần sai trong trường hợp này, bởi vì một dòng mới thường dài hơn một ký tự. Ví dụ: hệ điều hành Windows, cũng như giao thức HTTP, biểu thị các dòng mới bằng một cặp ký tự. Đôi khi bạn cần tính đến những khác biệt đó để thiết kế các chương trình di động thực sự

Để tìm hiểu điều gì tạo nên một dòng mới trong hệ điều hành của bạn, hãy sử dụng mô-đun

>>> import os
>>> os.linesep
'\n'
07 tích hợp sẵn của Python

Điều này sẽ ngay lập tức cho bạn biết rằng Windows và DOS đại diện cho dòng mới dưới dạng một chuỗi

>>> import os
>>> os.linesep
'\n'
08 theo sau là
>>> import os
>>> os.linesep
'\n'
09

>>>

>>> import os
>>> os.linesep
'\r\n'

Trên Unix, Linux và các phiên bản macOS gần đây, đó là một ký tự

>>> import os
>>> os.linesep
'\n'
09

>>>

>>> import os
>>> os.linesep
'\n'

Tuy nhiên, Mac OS X cổ điển vẫn bám sát triết lý “nghĩ khác” của riêng nó bằng cách chọn một đại diện khác

>>>

>>> import os
>>> os.linesep
'\r\n'
0

Lưu ý cách các ký tự này xuất hiện trong chuỗi ký tự. Họ sử dụng cú pháp đặc biệt với dấu gạch chéo ngược trước [

>>> import os
>>> os.linesep
'\n'
11] để biểu thị phần đầu của chuỗi ký tự thoát. Các trình tự như vậy cho phép biểu diễn các ký tự điều khiển, nếu không sẽ không nhìn thấy được trên màn hình

Hầu hết các ngôn ngữ lập trình đều đi kèm với một tập hợp các chuỗi thoát được xác định trước cho các ký tự đặc biệt, chẳng hạn như các ký tự này

  • >>> import os
    >>> os.linesep
    '\n'
    
    12. dấu gạch chéo ngược
  • >>> import os
    >>> os.linesep
    '\n'
    
    13. xóa lùi
  • >>> import os
    >>> os.linesep
    '\n'
    
    14. chuyển hướng
  • >>> import os
    >>> os.linesep
    '\n'
    
    08. vận chuyển trở lại [CR]
  • >>> import os
    >>> os.linesep
    '\n'
    
    09. dòng mới, còn được gọi là nguồn cấp dữ liệu dòng [LF]

Hai cái cuối cùng gợi nhớ đến máy đánh chữ cơ học, yêu cầu hai lệnh riêng biệt để chèn một dòng mới. Lệnh đầu tiên sẽ di chuyển cỗ xe trở lại đầu dòng hiện tại, trong khi lệnh thứ hai sẽ chuyển cuộn sang dòng tiếp theo

Bằng cách so sánh các mã ký tự ASCII tương ứng, bạn sẽ thấy rằng việc đặt dấu gạch chéo ngược trước một ký tự sẽ thay đổi hoàn toàn ý nghĩa của nó. Tuy nhiên, không phải tất cả các ký tự đều cho phép điều này–chỉ những ký tự đặc biệt

Để so sánh các mã ký tự ASCII, bạn có thể muốn sử dụng hàm

>>> import os
>>> os.linesep
'\n'
17 tích hợp

>>>

>>> import os
>>> os.linesep
'\r\n'
8

Hãy nhớ rằng, để tạo thành một chuỗi thoát chính xác, không được có khoảng cách giữa ký tự dấu gạch chéo ngược và một chữ cái

Như bạn vừa thấy, việc gọi

>>> import os
>>> os.linesep
'\r\n'
94 mà không có đối số sẽ dẫn đến một dòng trống, là một dòng chỉ bao gồm ký tự xuống dòng. Đừng nhầm lẫn điều này với một dòng trống, không chứa bất kỳ ký tự nào, thậm chí không có dòng mới

Bạn có thể sử dụng chuỗi ký tự của Python để hình dung hai

>>> import os
>>> os.linesep
'\r\n'
0

Cái đầu tiên dài một ký tự, trong khi cái thứ hai không có nội dung

Ghi chú. To remove the newline character from a string in Python, use its

>>> import os
>>> os.linesep
'\n'
19 method, like this

>>>

>>> import os
>>> os.linesep
'\r\n'
2

Điều này loại bỏ mọi khoảng trắng ở cuối từ cạnh phải của chuỗi ký tự

In a more common scenario, you’d want to communicate some message to the end user. There are a few ways to achieve this

Trước tiên, bạn có thể chuyển trực tiếp một chuỗi ký tự tới

>>> import os
>>> os.linesep
'\r\n'
94

>>>

>>> import os
>>> os.linesep
'\r\n'
4

This will print the message verbatim onto the screen

Chuỗi ký tựHiển thị/Ẩn

String literals in Python can be enclosed either in single quotes [

>>> import os
>>> os.linesep
'\n'
21] or double quotes [
>>> import os
>>> os.linesep
'\n'
22]. Theo hướng dẫn phong cách PEP 8 chính thức, bạn chỉ nên chọn một và tiếp tục sử dụng nó một cách nhất quán. There’s no difference, unless you need to nest one in another

For example, you can’t use double quotes for the literal and also include double quotes inside of it, because that’s ambiguous for the Python interpreter

>>> import os
>>> os.linesep
'\r\n'
7

What you want to do is enclose the text, which contains double quotes, within single quotes

>>> import os
>>> os.linesep
'\r\n'
8

Thủ thuật tương tự sẽ hoạt động theo cách khác

>>> import os
>>> os.linesep
'\r\n'
0

Alternatively, you could use escape character sequences mentioned earlier, to make Python treat those internal double quotes literally as part of the string literal

>>> import os
>>> os.linesep
'\r\n'
1

Escaping is fine and dandy, but it can sometimes get in the way. Specifically, when you need your string to contain relatively many backslash characters in literal form

One classic example is a file path on Windows

>>> import os
>>> os.linesep
'\r\n'
2

Notice how each backslash character needs to be escaped with yet another backslash

This is even more prominent with regular expressions, which quickly get convoluted due to the heavy use of special characters

>>> import os
>>> os.linesep
'\r\n'
3

Fortunately, you can turn off character escaping entirely with the help of raw-string literals. Simply prepend an

>>> import os
>>> os.linesep
'\n'
23 or
>>> import os
>>> os.linesep
'\n'
24 before the opening quote, and now you end up with this

>>> import os
>>> os.linesep
'\r\n'
4

That’s much better, isn’t it?

There are a few more prefixes that give special meaning to string literals in Python, but you won’t get into them here

Lastly, you can define multi-line string literals by enclosing them between

>>> import os
>>> os.linesep
'\n'
25 or
>>> import os
>>> os.linesep
'\n'
26, which are often used as docstrings

Here’s an example

>>> import os
>>> os.linesep
'\r\n'
5

To prevent an initial newline, simply put the text right after the opening

>>> import os
>>> os.linesep
'\n'
26

>>> import os
>>> os.linesep
'\r\n'
6

You can also use a backslash to get rid of the newline

>>> import os
>>> os.linesep
'\r\n'
7

To remove indentation from a multi-line string, you might take advantage of the built-in

>>> import os
>>> os.linesep
'\n'
28 module

>>>

>>> import os
>>> os.linesep
'\r\n'
8

This will take care of unindenting paragraphs for you. There are also a few other useful functions in

>>> import os
>>> os.linesep
'\n'
28 for text alignment you’d find in a word processor

Secondly, you could extract that message into its own variable with a meaningful name to enhance readability and promote code reuse

>>>

>>> import os
>>> os.linesep
'\r\n'
9

Lastly, you could pass an expression, like string concatenation, to be evaluated before printing the result

>>>

>>> import os
>>> os.linesep
'\n'
0

In fact, there are a dozen ways to format messages in Python. I highly encourage you to take a look at f-strings, introduced in Python 3. 6, because they offer the most concise syntax of them all

>>>

>>> import os
>>> os.linesep
'\n'
1

Moreover, f-strings will prevent you from making a common mistake, which is forgetting to type cast concatenated operands. Python is a strongly typed language, which means it won’t allow you to do this

>>>

>>> import os
>>> os.linesep
'\n'
2

Điều đó sai vì thêm số vào chuỗi không có nghĩa. Trước tiên, bạn cần chuyển đổi rõ ràng số thành chuỗi để nối chúng lại với nhau

>>>

>>> import os
>>> os.linesep
'\n'
3

Unless you handle such errors yourself, the Python interpreter will let you know about a problem by showing a traceback

Ghi chú.

>>> import os
>>> os.linesep
'\n'
30 là một hàm tích hợp toàn cầu giúp chuyển đổi một đối tượng thành biểu diễn chuỗi của nó

You can call it directly on any object, for example, a number

>>>

>>> import os
>>> os.linesep
'\n'
4

Các kiểu dữ liệu dựng sẵn có sẵn một biểu diễn chuỗi được xác định trước, nhưng ở phần sau của bài viết này, bạn sẽ tìm hiểu cách cung cấp một biểu diễn cho các lớp tùy chỉnh của mình

Như với bất kỳ chức năng nào, việc bạn truyền một ký tự, một biến hay một biểu thức không quan trọng. Tuy nhiên, không giống như nhiều chức năng khác,

>>> import os
>>> os.linesep
'\r\n'
94 sẽ chấp nhận mọi thứ bất kể loại của nó

Cho đến nay, bạn chỉ nhìn vào chuỗi, còn các kiểu dữ liệu khác thì sao?

>>>

>>> import os
>>> os.linesep
'\n'
5

Tuy nhiên, hãy coi chừng hằng số

>>> import os
>>> os.linesep
'\n'
32. Despite being used to indicate an absence of a value, it will show up as
>>> import os
>>> os.linesep
'\n'
33 rather than an empty string

>>>

>>> import os
>>> os.linesep
'\n'
6

Làm thế nào để

>>> import os
>>> os.linesep
'\r\n'
94 biết cách làm việc với tất cả các loại khác nhau này? . Nó ngầm gọi
>>> import os
>>> os.linesep
'\n'
30 đằng sau hậu trường để nhập cast bất kỳ đối tượng nào vào một chuỗi. Sau đó, nó xử lý các chuỗi theo cách thống nhất

Later in this tutorial, you’ll learn how to use this mechanism for printing custom data types such as your classes

Được rồi, bây giờ bạn có thể gọi

>>> import os
>>> os.linesep
'\r\n'
94 bằng một đối số hoặc không có bất kỳ đối số nào. Bạn biết cách in các tin nhắn đã sửa hoặc đã định dạng lên màn hình. Tiểu mục tiếp theo sẽ mở rộng một chút về định dạng thư

Cú pháp trong Python 2Hiển thị/Ẩn

Để đạt được kết quả tương tự trong thế hệ ngôn ngữ trước, bạn thường muốn bỏ dấu ngoặc đơn kèm theo văn bản

>>> import os
>>> os.linesep
'\n'
7

Đó là bởi vì hồi đó

>>> import os
>>> os.linesep
'\n'
02 không phải là một chức năng, như bạn sẽ thấy trong phần tiếp theo. Note, however, that in some cases parentheses in Python are redundant. Sẽ không hại gì nếu bao gồm chúng vì chúng sẽ bị bỏ qua. Điều đó có nghĩa là bạn nên sử dụng câu lệnh
>>> import os
>>> os.linesep
'\n'
02 như thể nó là một hàm?

Ví dụ: dấu ngoặc đơn bao quanh một biểu thức hoặc một chữ là tùy chọn. Cả hai hướng dẫn đều tạo ra cùng một kết quả trong Python 2

>>>

>>> import os
>>> os.linesep
'\n'
8

Dấu ngoặc tròn thực sự là một phần của biểu thức chứ không phải là câu lệnh

>>> import os
>>> os.linesep
'\n'
02. Nếu biểu thức của bạn tình cờ chỉ chứa một mục, thì có vẻ như bạn hoàn toàn không bao gồm dấu ngoặc

On the other hand, putting parentheses around multiple items forms a tuple

>>>

>>> import os
>>> os.linesep
'\n'
9

Đây là một nguồn nhầm lẫn đã biết. In fact, you’d also get a tuple by appending a trailing comma to the only item surrounded by parentheses

>>>

>>> import os
>>> os.linesep
'\r\n'
00

Điểm mấu chốt là bạn không nên gọi

>>> import os
>>> os.linesep
'\n'
02 bằng dấu ngoặc trong Python 2. Mặc dù, để hoàn toàn chính xác, bạn có thể giải quyết vấn đề này với sự trợ giúp của nhập khẩu
>>> import os
>>> os.linesep
'\n'
41, bạn sẽ đọc thêm về điều này trong phần có liên quan

Loại bỏ các quảng cáo

Tách nhiều đối số

Bạn đã thấy

>>> import os
>>> os.linesep
'\r\n'
94 được gọi mà không có bất kỳ đối số nào để tạo ra một dòng trống và sau đó được gọi với một đối số duy nhất để hiển thị một thông báo cố định hoặc được định dạng

Tuy nhiên, hóa ra hàm này có thể chấp nhận bất kỳ số lượng đối số vị trí nào, bao gồm không, một hoặc nhiều đối số. Điều đó rất hữu ích trong trường hợp phổ biến về định dạng thư, nơi bạn muốn kết hợp một số thành phần lại với nhau

Đối số vị tríHiển thị/Ẩn

Các đối số có thể được chuyển đến một chức năng theo một số cách. Một cách là đặt tên rõ ràng cho các đối số khi bạn gọi hàm, như thế này

>>>

>>> import os
>>> os.linesep
'\r\n'
01

Vì các đối số có thể được xác định duy nhất theo tên nên thứ tự của chúng không thành vấn đề. Swapping them out will still give the same result

>>>

>>> import os
>>> os.linesep
'\r\n'
02

Ngược lại, các đối số được truyền không có tên được xác định theo vị trí của chúng. Đó là lý do tại sao các đối số vị trí cần tuân thủ nghiêm ngặt thứ tự do chữ ký hàm đặt ra

>>>

>>> import os
>>> os.linesep
'\r\n'
03

>>> import os
>>> os.linesep
'\r\n'
94 cho phép số lượng đối số vị trí tùy ý nhờ tham số
>>> import os
>>> os.linesep
'\n'
44

Hãy xem ví dụ này

>>>

>>> import os
>>> os.linesep
'\r\n'
04

>>> import os
>>> os.linesep
'\r\n'
94 nối tất cả bốn đối số được truyền cho nó và nó chèn một khoảng trắng giữa chúng để bạn không nhận được một thông báo bị nén như
>>> import os
>>> os.linesep
'\n'
46

Lưu ý rằng nó cũng đảm nhiệm việc truyền kiểu thích hợp bằng cách gọi ngầm

>>> import os
>>> os.linesep
'\n'
30 trên mỗi đối số trước khi nối chúng lại với nhau. Nếu bạn nhớ lại từ tiểu mục trước, một phép nối ngây thơ có thể dễ dàng dẫn đến lỗi do các loại không tương thích

>>>

>>> import os
>>> os.linesep
'\r\n'
05

Ngoài việc chấp nhận một số lượng đối số vị trí khác nhau,

>>> import os
>>> os.linesep
'\r\n'
94 định nghĩa bốn đối số có tên hoặc từ khóa, là tùy chọn vì tất cả chúng đều có giá trị mặc định. Bạn có thể xem tài liệu ngắn gọn của họ bằng cách gọi
>>> import os
>>> os.linesep
'\n'
49 từ trình thông dịch tương tác

Let’s focus on

>>> import os
>>> os.linesep
'\n'
50 just for now. Nó là viết tắt của dấu phân cách và được gán một khoảng trắng [
>>> import os
>>> os.linesep
'\n'
51] theo mặc định. Nó xác định giá trị để nối các phần tử với

Nó phải là một chuỗi hoặc

>>> import os
>>> os.linesep
'\n'
32, nhưng cái sau có tác dụng tương tự như khoảng trắng mặc định

>>>

>>> import os
>>> os.linesep
'\r\n'
06

Nếu bạn muốn loại bỏ hoàn toàn dấu phân cách, thay vào đó, bạn phải chuyển một chuỗi trống [

>>> import os
>>> os.linesep
'\n'
53]

>>>

>>> import os
>>> os.linesep
'\r\n'
07

Bạn có thể muốn

>>> import os
>>> os.linesep
'\r\n'
94 tham gia các đối số của nó dưới dạng các dòng riêng biệt. Trong trường hợp đó, chỉ cần chuyển ký tự dòng mới đã thoát được mô tả trước đó

>>>

>>> import os
>>> os.linesep
'\r\n'
08

Một ví dụ hữu ích hơn về tham số

>>> import os
>>> os.linesep
'\n'
50 sẽ in một cái gì đó như đường dẫn tệp

>>>

>>> import os
>>> os.linesep
'\r\n'
09

Remember that the separator comes between the elements, not around them, so you need to account for that in one way or another

>>>

>>> import os
>>> os.linesep
'\r\n'
80

Cụ thể, bạn có thể chèn một ký tự gạch chéo [

>>> import os
>>> os.linesep
'\n'
56] vào đối số vị trí đầu tiên hoặc sử dụng một chuỗi trống làm đối số đầu tiên để thực thi dấu gạch chéo đầu

Note. Be careful about joining elements of a list or tuple

Doing it manually will result in a well-known

>>> import os
>>> os.linesep
'\n'
57 if at least one of the elements isn’t a string

>>>

>>> import os
>>> os.linesep
'\r\n'
81

It’s safer to just unpack the sequence with the star operator [

>>> import os
>>> os.linesep
'\n'
58] and let
>>> import os
>>> os.linesep
'\r\n'
94 handle type casting

>>>

>>> import os
>>> os.linesep
'\r\n'
82

Unpacking is effectively the same as calling

>>> import os
>>> os.linesep
'\r\n'
94 with individual elements of the list

One more interesting example could be exporting data to a comma-separated values [CSV] format

>>>

>>> import os
>>> os.linesep
'\r\n'
83

This wouldn’t handle edge cases such as escaping commas correctly, but for simple use cases, it should do. The line above would show up in your terminal window. In order to save it to a file, you’d have to redirect the output. Later in this section, you’ll see how to use

>>> import os
>>> os.linesep
'\r\n'
94 to write text to files straight from Python

Finally, the

>>> import os
>>> os.linesep
'\n'
50 parameter isn’t constrained to a single character only. You can join elements with strings of any length

>>>

>>> import os
>>> os.linesep
'\r\n'
84

In the upcoming subsections, you’ll explore the remaining keyword arguments of the

>>> import os
>>> os.linesep
'\r\n'
94 function

Cú pháp trong Python 2Hiển thị/Ẩn

To print multiple elements in Python 2, you must drop the parentheses around them, just like before

>>>

>>> import os
>>> os.linesep
'\r\n'
85

If you kept them, on the other hand, you’d be passing a single tuple element to the

>>> import os
>>> os.linesep
'\n'
02 statement

>>>

>>> import os
>>> os.linesep
'\r\n'
86

Moreover, there’s no way of altering the default separator of joined elements in Python 2, so one workaround is to use string interpolation like so

>>>

>>> import os
>>> os.linesep
'\r\n'
87

That was the default way of formatting strings until the

>>> import os
>>> os.linesep
'\n'
65 method got backported from Python 3

Loại bỏ các quảng cáo

Preventing Line Breaks

Sometimes you don’t want to end your message with a trailing newline so that subsequent calls to

>>> import os
>>> os.linesep
'\r\n'
94 will continue on the same line. Classic examples include updating the progress of a long-running operation or prompting the user for input. In the latter case, you want the user to type in the answer on the same line

>>> import os
>>> os.linesep
'\r\n'
88

Many programming languages expose functions similar to

>>> import os
>>> os.linesep
'\r\n'
94 through their standard libraries, but they let you decide whether to add a newline or not. For example, in Java and C#, you have two distinct functions, while other languages require you to explicitly append
>>> import os
>>> os.linesep
'\n'
09 at the end of a string literal

Here are a few examples of syntax in such languages

LanguageExamplePerl

>>> import os
>>> os.linesep
'\n'
69C
>>> import os
>>> os.linesep
'\n'
70C++
>>> import os
>>> os.linesep
'\n'
71

Ngược lại, hàm

>>> import os
>>> os.linesep
'\r\n'
94 của Python luôn thêm
>>> import os
>>> os.linesep
'\n'
09 mà không cần hỏi, vì đó là điều bạn muốn trong hầu hết các trường hợp. To disable it, you can take advantage of yet another keyword argument,
>>> import os
>>> os.linesep
'\n'
74, which dictates what to end the line with

In terms of semantics, the

>>> import os
>>> os.linesep
'\n'
74 parameter is almost identical to the
>>> import os
>>> os.linesep
'\n'
50 one that you saw earlier

  • It must be a string or
    >>> import os
    >>> os.linesep
    '\n'
    
    32
  • It can be arbitrarily long
  • It has a default value of
    >>> import os
    >>> os.linesep
    '\n'
    
    78
  • If equal to
    >>> import os
    >>> os.linesep
    '\n'
    
    32, it’ll have the same effect as the default value
  • If equal to an empty string [
    >>> import os
    >>> os.linesep
    '\n'
    
    53], it’ll suppress the newline

Now you understand what’s happening under the hood when you’re calling

>>> import os
>>> os.linesep
'\r\n'
94 without arguments. Since you don’t provide any positional arguments to the function, there’s nothing to be joined, and so the default separator isn’t used at all. However, the default value of
>>> import os
>>> os.linesep
'\n'
74 still applies, and a blank line shows up

Note. You may be wondering why the

>>> import os
>>> os.linesep
'\n'
74 parameter has a fixed default value rather than whatever makes sense on your operating system

Well, you don’t have to worry about newline representation across different operating systems when printing, because

>>> import os
>>> os.linesep
'\r\n'
94 will handle the conversion automatically. Just remember to always use the
>>> import os
>>> os.linesep
'\n'
09 escape sequence in string literals

This is currently the most portable way of printing a newline character in Python

>>>

>>> import os
>>> os.linesep
'\r\n'
89

If you were to try to forcefully print a Windows-specific newline character on a Linux machine, for example, you’d end up with broken output

>>>

>>> import os
>>> os.linesep
'\r\n'
00

On the flip side, when you open a file for reading with

>>> import os
>>> os.linesep
'\n'
86, you don’t need to care about newline representation either. Hàm này sẽ dịch bất kỳ dòng mới nào dành riêng cho hệ thống mà nó gặp thành một
>>> import os
>>> os.linesep
'\n'
78 chung. At the same time, you have control over how the newlines should be treated both on input and output if you really need that

Để tắt dòng mới, bạn phải chỉ định một chuỗi trống thông qua đối số từ khóa

>>> import os
>>> os.linesep
'\n'
74

>>> import os
>>> os.linesep
'\r\n'
01

Even though these are two separate

>>> import os
>>> os.linesep
'\r\n'
94 calls, which can execute a long time apart, you’ll eventually see only one line. First, it’ll look like this

>>> import os
>>> os.linesep
'\r\n'
02

Tuy nhiên, sau cuộc gọi thứ hai đến

>>> import os
>>> os.linesep
'\r\n'
94, dòng tương tự sẽ xuất hiện trên màn hình như

>>> import os
>>> os.linesep
'\r\n'
03

Như với

>>> import os
>>> os.linesep
'\n'
50, bạn có thể sử dụng
>>> import os
>>> os.linesep
'\n'
74 để nối các phần riêng lẻ thành một khối văn bản lớn bằng dấu tách tùy chỉnh. Tuy nhiên, thay vì nối nhiều đối số, nó sẽ nối văn bản từ mỗi lệnh gọi hàm vào cùng một dòng

>>> import os
>>> os.linesep
'\r\n'
04

Ba hướng dẫn này sẽ xuất ra một dòng văn bản

>>> import os
>>> os.linesep
'\r\n'
05

Bạn có thể trộn hai đối số từ khóa

>>> import os
>>> os.linesep
'\r\n'
06

Bạn không chỉ nhận được một dòng văn bản mà tất cả các mục được phân tách bằng dấu phẩy

>>> import os
>>> os.linesep
'\r\n'
07

Không có gì ngăn bạn sử dụng ký tự xuống dòng với một số phần đệm bổ sung xung quanh nó

>>> import os
>>> os.linesep
'\r\n'
08

Nó sẽ in ra đoạn văn bản sau

>>> import os
>>> os.linesep
'\r\n'
09

Như bạn có thể thấy, đối số từ khóa

>>> import os
>>> os.linesep
'\n'
74 sẽ chấp nhận các chuỗi tùy ý

Note. Vòng lặp qua các dòng trong tệp văn bản giữ nguyên các ký tự dòng mới của riêng chúng, kết hợp với hành vi mặc định của hàm

>>> import os
>>> os.linesep
'\r\n'
94 sẽ dẫn đến một ký tự dòng mới dư thừa

>>>

>>> import os
>>> os.linesep
'\r\n'
20

Có hai dòng mới sau mỗi dòng văn bản. Bạn muốn loại bỏ một trong số chúng, như được hiển thị trước đó trong bài viết này, trước khi in dòng

>>> import os
>>> os.linesep
'\r\n'
21

Ngoài ra, bạn có thể giữ dòng mới trong nội dung nhưng tự động chặn dòng được thêm vào bởi

>>> import os
>>> os.linesep
'\r\n'
94. Bạn sẽ sử dụng đối số từ khóa
>>> import os
>>> os.linesep
'\n'
74 để làm điều đó

>>>

>>> import os
>>> os.linesep
'\r\n'
22

Bằng cách kết thúc một dòng bằng một chuỗi trống, bạn vô hiệu hóa hiệu quả một trong các dòng mới

Bạn đang làm quen với việc in bằng Python, nhưng vẫn còn rất nhiều thông tin hữu ích phía trước. Trong phần phụ sắp tới, bạn sẽ học cách chặn và chuyển hướng đầu ra của hàm

>>> import os
>>> os.linesep
'\r\n'
94

Cú pháp trong Python 2Hiển thị/Ẩn

Ngăn ngắt dòng trong Python 2 yêu cầu bạn thêm dấu phẩy ở cuối vào biểu thức

>>> import os
>>> os.linesep
'\r\n'
23

Tuy nhiên, điều đó không lý tưởng vì nó cũng thêm một khoảng trống không mong muốn, điều này sẽ chuyển thành

>>> import os
>>> os.linesep
'\n'
98 thay vì
>>> import os
>>> os.linesep
'\n'
99 trong Python 3. Bạn có thể kiểm tra điều này với đoạn mã sau

>>> import os
>>> os.linesep
'\r\n'
24

Notice there’s a space between the words

>>> import os
>>> os.linesep
'\r\n'
000 and
>>> import os
>>> os.linesep
'\r\n'
001

>>> import os
>>> os.linesep
'\r\n'
25

In order to get the expected result, you’d need to use one of the tricks explained later, which is either importing the

>>> import os
>>> os.linesep
'\r\n'
94 function from
>>> import os
>>> os.linesep
'\n'
41 or falling back to the
>>> import os
>>> os.linesep
'\r\n'
004 module

>>> import os
>>> os.linesep
'\r\n'
26

This will print the correct output without extra space

>>> import os
>>> os.linesep
'\r\n'
27

Trong khi sử dụng mô-đun

>>> import os
>>> os.linesep
'\r\n'
004 cho phép bạn kiểm soát những gì được in ra đầu ra tiêu chuẩn, mã sẽ trở nên lộn xộn hơn một chút

Loại bỏ các quảng cáo

In ra một tập tin

Dù bạn có tin hay không thì tùy,

>>> import os
>>> os.linesep
'\r\n'
94 không biết cách chuyển tin nhắn thành văn bản trên màn hình của bạn và nói thẳng ra là không cần. Đó là công việc dành cho các lớp mã cấp thấp hơn, hiểu các byte và biết cách đẩy chúng xung quanh

>>> import os
>>> os.linesep
'\r\n'
94 is an abstraction over these layers, providing a convenient interface that merely delegates the actual printing to a stream or file-like object. Luồng có thể là bất kỳ tệp nào trên đĩa của bạn, ổ cắm mạng hoặc có thể là bộ đệm trong bộ nhớ

Ngoài ra, có ba luồng tiêu chuẩn được cung cấp bởi hệ điều hành

  1. >>> import os
    >>> os.linesep
    '\r\n'
    
    008. đầu vào tiêu chuẩn
  2. >>> import os
    >>> os.linesep
    '\r\n'
    
    009. đầu ra tiêu chuẩn
  3. >>> import os
    >>> os.linesep
    '\r\n'
    
    010. standard error

Luồng chuẩnHiển thị/Ẩn

Đầu ra tiêu chuẩn là những gì bạn nhìn thấy trong thiết bị đầu cuối khi chạy các chương trình dòng lệnh khác nhau bao gồm các tập lệnh Python của riêng bạn

>>> import os
>>> os.linesep
'\r\n'
28

Trừ khi có hướng dẫn khác,

>>> import os
>>> os.linesep
'\r\n'
94 sẽ mặc định ghi vào đầu ra tiêu chuẩn. Tuy nhiên, bạn có thể yêu cầu hệ điều hành của mình tạm thời hoán đổi
>>> import os
>>> os.linesep
'\r\n'
009 cho một luồng tệp, để mọi đầu ra kết thúc trong tệp đó thay vì màn hình

>>> import os
>>> os.linesep
'\r\n'
29

Đó gọi là chuyển hướng luồng

Lỗi tiêu chuẩn tương tự như

>>> import os
>>> os.linesep
'\r\n'
009 ở chỗ nó cũng hiển thị trên màn hình. Tuy nhiên, đó là một luồng riêng biệt, với mục đích là ghi lại các thông báo lỗi để chẩn đoán. Bằng cách chuyển hướng một hoặc cả hai, bạn có thể giữ mọi thứ sạch sẽ

Ghi chú. Để chuyển hướng

>>> import os
>>> os.linesep
'\r\n'
010, bạn cần biết về bộ mô tả tệp, còn được gọi là trình xử lý tệp

Chúng là các số tùy ý, mặc dù không đổi, được liên kết với các luồng tiêu chuẩn. Below, you’ll find a summary of the file descriptors for a family of POSIX-compliant operating systems

StreamFile Descriptor

>>> import os
>>> os.linesep
'\r\n'
0080
>>> import os
>>> os.linesep
'\r\n'
0091
>>> import os
>>> os.linesep
'\r\n'
0102

Biết những bộ mô tả đó cho phép bạn chuyển hướng một hoặc nhiều luồng cùng một lúc

LệnhMô tả

>>> import os
>>> os.linesep
'\r\n'
018Chuyển hướng
>>> import os
>>> os.linesep
'\r\n'
009
>>> import os
>>> os.linesep
'\r\n'
020Chuyển hướng
>>> import os
>>> os.linesep
'\r\n'
010
>>> import os
>>> os.linesep
'\r\n'
022Chuyển hướng
>>> import os
>>> os.linesep
'\r\n'
009 và
>>> import os
>>> os.linesep
'\r\n'
010 sang các tệp riêng biệt
>>> import os
>>> os.linesep
'\r\n'
025Chuyển hướng
>>> import os
>>> os.linesep
'\r\n'
009 và
>>> import os
>>> os.linesep
'\r\n'
010 sang cùng một tệp

Lưu ý rằng ________ 2028 giống như ________ 2029

Một số chương trình sử dụng cách tô màu khác nhau để phân biệt giữa các thư được in cho

>>> import os
>>> os.linesep
'\r\n'
009 và
>>> import os
>>> os.linesep
'\r\n'
010

Chạy cửa sổ công cụ trong PyCharm

Trong khi cả

>>> import os
>>> os.linesep
'\r\n'
009 và
>>> import os
>>> os.linesep
'\r\n'
010 đều ở chế độ chỉ ghi, thì
>>> import os
>>> os.linesep
'\r\n'
008 là chế độ chỉ đọc. Bạn có thể coi đầu vào tiêu chuẩn là bàn phím của mình, nhưng cũng giống như hai bàn phím kia, bạn có thể hoán đổi
>>> import os
>>> os.linesep
'\r\n'
008 để lấy một tệp để đọc dữ liệu từ đó.

Trong Python, bạn có thể truy cập tất cả các luồng tiêu chuẩn thông qua mô-đun

>>> import os
>>> os.linesep
'\r\n'
004 được tích hợp sẵn

>>>

>>> import os
>>> os.linesep
'\r\n'
40

Như bạn có thể thấy, các giá trị được xác định trước này giống với các đối tượng giống như tệp với các thuộc tính

>>> import os
>>> os.linesep
'\r\n'
037 và
>>> import os
>>> os.linesep
'\r\n'
038 cũng như các phương thức
>>> import os
>>> os.linesep
'\r\n'
039 và
>>> import os
>>> os.linesep
'\r\n'
040 cùng nhiều phương thức khác

Theo mặc định,

>>> import os
>>> os.linesep
'\r\n'
94 bị ràng buộc với
>>> import os
>>> os.linesep
'\r\n'
042 thông qua đối số
>>> import os
>>> os.linesep
'\r\n'
043 của nó, nhưng bạn có thể thay đổi điều đó. Sử dụng đối số từ khóa đó để chỉ ra một tệp được mở ở chế độ ghi hoặc nối thêm, để thư đi thẳng đến tệp đó

>>> import os
>>> os.linesep
'\r\n'
41

Điều này sẽ làm cho mã của bạn không bị chuyển hướng luồng ở cấp hệ điều hành, điều này có thể hoặc không mong muốn

Để biết thêm thông tin về cách làm việc với tệp trong Python, bạn có thể xem Đọc và ghi tệp bằng Python [Hướng dẫn]

Ghi chú. Đừng thử sử dụng

>>> import os
>>> os.linesep
'\r\n'
94 để ghi dữ liệu nhị phân vì nó chỉ phù hợp với văn bản

Chỉ cần gọi trực tiếp tệp nhị phân là

>>> import os
>>> os.linesep
'\r\n'
040

>>> import os
>>> os.linesep
'\r\n'
42

Nếu bạn muốn ghi các byte thô trên đầu ra tiêu chuẩn, thì điều này cũng sẽ thất bại vì

>>> import os
>>> os.linesep
'\r\n'
042 là một luồng ký tự

>>>

>>> import os
>>> os.linesep
'\r\n'
43

Thay vào đó, bạn phải đào sâu hơn để xử lý luồng byte bên dưới

>>>

>>> import os
>>> os.linesep
'\r\n'
44

Điều này in một chữ cái viết hoa

>>> import os
>>> os.linesep
'\r\n'
047 và một ký tự xuống dòng, tương ứng với các giá trị thập phân là 65 và 10 trong ASCII. Tuy nhiên, chúng được mã hóa bằng cách sử dụng ký hiệu thập lục phân theo byte chữ

Lưu ý rằng

>>> import os
>>> os.linesep
'\r\n'
94 không có quyền kiểm soát mã hóa ký tự. Luồng có trách nhiệm mã hóa chính xác các chuỗi Unicode đã nhận thành byte. Trong hầu hết các trường hợp, bạn sẽ không tự đặt mã hóa vì UTF-8 mặc định là những gì bạn muốn. Nếu bạn thực sự cần, có lẽ đối với các hệ thống cũ, bạn có thể sử dụng đối số
>>> import os
>>> os.linesep
'\r\n'
038 của
>>> import os
>>> os.linesep
'\n'
86

>>> import os
>>> os.linesep
'\r\n'
45

Thay vì một tệp thực tồn tại ở đâu đó trong hệ thống tệp của bạn, bạn có thể cung cấp một tệp giả, tệp này sẽ nằm trong bộ nhớ máy tính của bạn. Bạn sẽ sử dụng kỹ thuật này sau để chế nhạo

>>> import os
>>> os.linesep
'\r\n'
94 trong các bài kiểm tra đơn vị

>>>

>>> import os
>>> os.linesep
'\r\n'
46

Nếu bạn đã đi đến điểm này, thì bạn chỉ còn lại một đối số từ khóa trong

>>> import os
>>> os.linesep
'\r\n'
94, mà bạn sẽ thấy trong tiểu mục tiếp theo. Nó có lẽ ít được sử dụng nhất trong số chúng. Tuy nhiên, có những lúc nó thực sự cần thiết

Cú pháp trong Python 2Hiển thị/Ẩn

Có một cú pháp đặc biệt trong Python 2 để thay thế

>>> import os
>>> os.linesep
'\r\n'
042 mặc định bằng một tệp tùy chỉnh trong câu lệnh
>>> import os
>>> os.linesep
'\n'
02

>>> import os
>>> os.linesep
'\r\n'
47

Bởi vì các chuỗi và byte được biểu diễn bằng cùng một loại

>>> import os
>>> os.linesep
'\r\n'
055 trong Python 2, nên câu lệnh
>>> import os
>>> os.linesep
'\n'
02 có thể xử lý tốt dữ liệu nhị phân

>>> import os
>>> os.linesep
'\r\n'
48

Mặc dù, có một vấn đề với mã hóa ký tự. Hàm

>>> import os
>>> os.linesep
'\n'
86 trong Python 2 thiếu tham số
>>> import os
>>> os.linesep
'\r\n'
038, điều này thường dẫn đến sự cố đáng sợ
>>> import os
>>> os.linesep
'\r\n'
059

>>>

>>> import os
>>> os.linesep
'\r\n'
49

Lưu ý cách các ký tự không phải là tiếng Latinh phải được thoát bằng cả Unicode và chuỗi ký tự để tránh lỗi cú pháp. Hãy xem ví dụ này

>>> import os
>>> os.linesep
'\r\n'
70

Ngoài ra, bạn có thể chỉ định mã hóa mã nguồn theo PEP 263 ở đầu tệp, nhưng đó không phải là cách tốt nhất do các vấn đề về tính di động

>>> import os
>>> os.linesep
'\r\n'
71

Đặt cược tốt nhất của bạn là mã hóa chuỗi Unicode ngay trước khi in nó. Bạn có thể làm điều này bằng tay

>>> import os
>>> os.linesep
'\r\n'
72

Tuy nhiên, một tùy chọn thuận tiện hơn là sử dụng mô-đun

>>> import os
>>> os.linesep
'\r\n'
060 tích hợp sẵn

>>> import os
>>> os.linesep
'\r\n'
73

Nó sẽ đảm nhiệm việc thực hiện các chuyển đổi phù hợp khi bạn cần đọc hoặc ghi tệp

Loại bỏ các quảng cáo

Đệm cuộc gọi
>>> import os
>>> os.linesep
'\r\n'
94

Trong tiểu mục trước, bạn đã biết rằng

>>> import os
>>> os.linesep
'\r\n'
94 ủy quyền in cho một đối tượng giống như tệp, chẳng hạn như
>>> import os
>>> os.linesep
'\r\n'
042. Tuy nhiên, một số luồng đệm một số hoạt động I/O nhất định để nâng cao hiệu suất, điều này có thể cản trở. Hãy xem xét một ví dụ

Hãy tưởng tượng bạn đang viết một đồng hồ đếm ngược, đồng hồ này sẽ thêm thời gian còn lại vào cùng một dòng mỗi giây

>>> import os
>>> os.linesep
'\r\n'
74

Nỗ lực đầu tiên của bạn có thể trông giống như thế này

>>> import os
>>> os.linesep
'\r\n'
75

Miễn là biến

>>> import os
>>> os.linesep
'\r\n'
064 lớn hơn 0, mã sẽ tiếp tục nối thêm văn bản mà không có dòng mới ở cuối và sau đó chuyển sang chế độ ngủ trong một giây. Cuối cùng, khi đếm ngược kết thúc, nó sẽ in
>>> import os
>>> os.linesep
'\r\n'
065 và kết thúc dòng

Thật bất ngờ, thay vì đếm ngược từng giây, chương trình lại nhàn rỗi một cách lãng phí trong ba giây, rồi đột ngột in toàn bộ dòng cùng một lúc

Đó là bởi vì bộ đệm hệ điều hành sau đó ghi vào đầu ra tiêu chuẩn trong trường hợp này. Bạn cần biết rằng có ba loại luồng liên quan đến bộ đệm

  1. Không có bộ đệm
  2. đệm dòng
  3. đệm khối

Không có bộ đệm thì rõ ràng, nghĩa là không có bộ đệm nào diễn ra và tất cả các thao tác ghi đều có hiệu lực ngay lập tức. Luồng có bộ đệm dòng chờ trước khi thực hiện bất kỳ lệnh gọi I/O nào cho đến khi ngắt dòng xuất hiện ở đâu đó trong bộ đệm, trong khi luồng có bộ đệm khối chỉ đơn giản cho phép bộ đệm lấp đầy đến một kích thước nhất định bất kể nội dung của nó là gì. Đầu ra tiêu chuẩn có cả bộ đệm dòng và bộ đệm khối, tùy thuộc vào sự kiện nào đến trước

Bộ đệm giúp giảm số lượng cuộc gọi I/O đắt tiền. Ví dụ, hãy nghĩ về việc gửi tin nhắn qua mạng có độ trễ cao. Khi bạn kết nối với một máy chủ từ xa để thực thi các lệnh qua giao thức SSH, mỗi lần nhấn phím của bạn thực sự có thể tạo ra một gói dữ liệu riêng lẻ, có kích thước lớn hơn tải trọng của nó. Thật là một chi phí. Sẽ hợp lý nếu đợi cho đến khi ít nhất một vài ký tự được nhập và sau đó gửi chúng cùng nhau. Đó là nơi bộ đệm bước vào

Mặt khác, bộ đệm đôi khi có thể có tác dụng không mong muốn như bạn vừa thấy với ví dụ đếm ngược. Để khắc phục, bạn chỉ cần yêu cầu

>>> import os
>>> os.linesep
'\r\n'
94 xóa mạnh luồng mà không cần chờ ký tự xuống dòng trong bộ đệm bằng cách sử dụng cờ
>>> import os
>>> os.linesep
'\r\n'
067 của nó

>>> import os
>>> os.linesep
'\r\n'
76

Đó là tất cả. Bộ đếm ngược của bạn sẽ hoạt động như mong đợi ngay bây giờ, nhưng đừng tin lời tôi. Hãy tiếp tục và kiểm tra nó để thấy sự khác biệt

Xin chúc mừng. Tại thời điểm này, bạn đã thấy các ví dụ về cách gọi

>>> import os
>>> os.linesep
'\r\n'
94 bao gồm tất cả các tham số của nó. Bạn biết mục đích của chúng và khi nào nên sử dụng chúng. Tuy nhiên, việc hiểu chữ ký chỉ là bước đầu. Trong các phần sắp tới, bạn sẽ thấy tại sao

Cú pháp trong Python 2Hiển thị/Ẩn

Không có cách nào dễ dàng để xóa luồng trong Python 2, vì bản thân câu lệnh

>>> import os
>>> os.linesep
'\n'
02 không cho phép thực hiện điều đó. Bạn cần xử lý lớp cấp thấp hơn của nó, đây là đầu ra tiêu chuẩn và gọi nó trực tiếp

>>> import os
>>> os.linesep
'\r\n'
77

Ngoài ra, bạn có thể vô hiệu hóa tính năng đệm của các luồng tiêu chuẩn bằng cách cung cấp cờ

>>> import os
>>> os.linesep
'\r\n'
070 cho trình thông dịch Python hoặc bằng cách thiết lập biến môi trường
>>> import os
>>> os.linesep
'\r\n'
071

>>> import os
>>> os.linesep
'\r\n'
78

Lưu ý rằng

>>> import os
>>> os.linesep
'\r\n'
94 đã được nhập vào Python 2 và được cung cấp thông qua mô-đun
>>> import os
>>> os.linesep
'\n'
41. Thật không may, nó không đi kèm với tham số
>>> import os
>>> os.linesep
'\r\n'
067

>>>

>>> import os
>>> os.linesep
'\r\n'
79

Những gì bạn đang thấy ở đây là một chuỗi tài liệu của hàm

>>> import os
>>> os.linesep
'\r\n'
94. Bạn có thể hiển thị các chuỗi tài liệu của các đối tượng khác nhau trong Python bằng cách sử dụng hàm
>>> import os
>>> os.linesep
'\r\n'
076 tích hợp

In các loại dữ liệu tùy chỉnh

Cho đến bây giờ, bạn chỉ xử lý các kiểu dữ liệu dựng sẵn như chuỗi và số, nhưng bạn sẽ thường muốn in các kiểu dữ liệu trừu tượng của riêng mình. Chúng ta hãy xem xét các cách khác nhau để định nghĩa chúng

Đối với các đối tượng đơn giản không có bất kỳ logic nào, mục đích là mang dữ liệu, thông thường bạn sẽ tận dụng lợi thế của

>>> import os
>>> os.linesep
'\r\n'
077, có sẵn trong thư viện tiêu chuẩn. Các bộ dữ liệu được đặt tên có một biểu diễn văn bản gọn gàng ngoài hộp

>>>

>>> import os
>>> os.linesep
'\r\n'
80

Điều đó thật tuyệt miễn là giữ dữ liệu là đủ, nhưng để thêm các hành vi vào loại

>>> import os
>>> os.linesep
'\r\n'
078, cuối cùng bạn sẽ cần xác định một lớp. Hãy xem ví dụ này

>>> import os
>>> os.linesep
'\r\n'
81

Nếu bây giờ bạn tạo một thể hiện của lớp

>>> import os
>>> os.linesep
'\r\n'
078 và thử in nó, bạn sẽ nhận được kết quả kỳ lạ này, khá khác so với lớp
>>> import os
>>> os.linesep
'\r\n'
077 tương đương

>>>

>>> import os
>>> os.linesep
'\r\n'
82

Đó là biểu diễn mặc định của các đối tượng, bao gồm địa chỉ của chúng trong bộ nhớ, tên lớp tương ứng và mô-đun mà chúng được định nghĩa. Bạn sẽ khắc phục điều đó trong giây lát, nhưng chỉ để ghi lại, như một giải pháp thay thế nhanh chóng, bạn có thể kết hợp

>>> import os
>>> os.linesep
'\r\n'
077 và một lớp tùy chỉnh thông qua kế thừa

>>> import os
>>> os.linesep
'\r\n'
83

Lớp ________ 2078 của bạn vừa trở thành một loại ________ 2077 chuyên biệt với hai thuộc tính mà bạn có thể tùy chỉnh

Ghi chú. Trong Python 3, câu lệnh

>>> import os
>>> os.linesep
'\r\n'
084 có thể được thay thế bằng dấu chấm lửng [
>>> import os
>>> os.linesep
'\r\n'
085] để biểu thị một trình giữ chỗ

>>> import os
>>> os.linesep
'\r\n'
84

Điều này ngăn trình thông dịch nâng cao

>>> import os
>>> os.linesep
'\r\n'
086 do thiếu khối mã thụt lề

Điều đó tốt hơn một

>>> import os
>>> os.linesep
'\r\n'
077 đơn giản, bởi vì bạn không chỉ được in miễn phí mà còn có thể thêm các phương thức và thuộc tính tùy chỉnh vào lớp. Tuy nhiên, nó giải quyết một vấn đề trong khi giới thiệu một vấn đề khác. Hãy nhớ rằng các bộ dữ liệu, bao gồm cả các bộ dữ liệu được đặt tên, là bất biến trong Python, vì vậy chúng không thể thay đổi giá trị của chúng sau khi được tạo

Đúng là mong muốn thiết kế các kiểu dữ liệu bất biến, nhưng trong nhiều trường hợp, bạn sẽ muốn chúng cho phép thay đổi, vì vậy bạn quay lại với các lớp thông thường

Ghi chú. Theo sau các ngôn ngữ và khuôn khổ khác, Python 3. 7 lớp dữ liệu được giới thiệu, mà bạn có thể coi là các bộ dữ liệu có thể thay đổi. Bằng cách này, bạn sẽ có được điều tốt nhất của cả hai thế giới

>>>

>>> import os
>>> os.linesep
'\r\n'
85

Cú pháp cho các chú thích biến, được yêu cầu để chỉ định các trường lớp với các loại tương ứng của chúng, đã được định nghĩa trong Python 3. 6

Từ các tiểu mục trước, bạn đã biết rằng

>>> import os
>>> os.linesep
'\r\n'
94 gọi ngầm hàm
>>> import os
>>> os.linesep
'\n'
30 tích hợp để chuyển đổi các đối số vị trí của nó thành các chuỗi. Thật vậy, gọi
>>> import os
>>> os.linesep
'\n'
30 theo cách thủ công đối với một thể hiện của lớp
>>> import os
>>> os.linesep
'\r\n'
078 thông thường mang lại kết quả tương tự như in nó

>>>

>>> import os
>>> os.linesep
'\r\n'
86

Ngược lại,

>>> import os
>>> os.linesep
'\n'
30 tìm kiếm một trong hai phương thức ma thuật trong nội dung lớp mà bạn thường triển khai. Nếu nó không tìm thấy, thì nó sẽ quay trở lại biểu diễn mặc định xấu xí. Những phương pháp kỳ diệu đó, theo thứ tự tìm kiếm

  1. >>> import os
    >>> os.linesep
    '\r\n'
    
    093
  2. >>> import os
    >>> os.linesep
    '\r\n'
    
    094

Cái đầu tiên được khuyến nghị trả về một văn bản ngắn, con người có thể đọc được, bao gồm thông tin từ các thuộc tính có liên quan nhất. Rốt cuộc, bạn không muốn để lộ dữ liệu nhạy cảm, chẳng hạn như mật khẩu người dùng, khi in các đối tượng

Tuy nhiên, cái còn lại phải cung cấp thông tin đầy đủ về một đối tượng, để cho phép khôi phục trạng thái của nó từ một chuỗi. Lý tưởng nhất là nó sẽ trả về mã Python hợp lệ để bạn có thể chuyển trực tiếp mã đó tới

>>> import os
>>> os.linesep
'\r\n'
095

>>>

>>> import os
>>> os.linesep
'\r\n'
87

Lưu ý việc sử dụng một hàm dựng sẵn khác,

>>> import os
>>> os.linesep
'\r\n'
096, luôn cố gắng gọi
>>> import os
>>> os.linesep
'\r\n'
097 trong một đối tượng, nhưng sẽ quay lại biểu diễn mặc định nếu nó không tìm thấy phương thức đó

Ghi chú. Mặc dù bản thân

>>> import os
>>> os.linesep
'\r\n'
94 sử dụng
>>> import os
>>> os.linesep
'\n'
30 để truyền kiểu, nhưng một số kiểu dữ liệu phức hợp ủy quyền lệnh gọi tới
>>> import os
>>> os.linesep
'\r\n'
096 cho các thành viên của chúng. Điều này xảy ra với danh sách và bộ dữ liệu, ví dụ

Xem xét lớp này với cả hai phương thức ma thuật, trả về các biểu diễn chuỗi thay thế của cùng một đối tượng

>>> import os
>>> os.linesep
'\r\n'
88

Nếu bạn in một đối tượng của lớp

>>> import os
>>> os.linesep
'\r\n'
801, thì bạn sẽ không thấy mật khẩu, bởi vì
>>> import os
>>> os.linesep
'\r\n'
802 sẽ gọi
>>> import os
>>> os.linesep
'\r\n'
803, mà cuối cùng sẽ gọi
>>> import os
>>> os.linesep
'\r\n'
804

>>>

>>> import os
>>> os.linesep
'\r\n'
89

Tuy nhiên, nếu bạn đặt cùng một biến

>>> import os
>>> os.linesep
'\r\n'
805 trong danh sách bằng cách đặt nó trong dấu ngoặc vuông, thì mật khẩu sẽ hiển thị rõ ràng

>>>

>>> import os
>>> os.linesep
'\r\n'
00

Đó là bởi vì các trình tự, chẳng hạn như danh sách và bộ dữ liệu, triển khai phương thức

>>> import os
>>> os.linesep
'\r\n'
806 của chúng để tất cả các phần tử của chúng được chuyển đổi lần đầu tiên bằng
>>> import os
>>> os.linesep
'\r\n'
096

Python mang đến cho bạn rất nhiều sự tự do khi xác định các kiểu dữ liệu của riêng bạn nếu không có kiểu tích hợp sẵn nào đáp ứng nhu cầu của bạn. Một số trong số chúng, chẳng hạn như các bộ dữ liệu được đặt tên và các lớp dữ liệu, cung cấp các biểu diễn chuỗi trông đẹp mắt mà không yêu cầu bất kỳ công việc nào từ phía bạn. Tuy nhiên, để linh hoạt nhất, bạn sẽ phải định nghĩa một lớp và ghi đè các phương thức ma thuật của nó được mô tả ở trên

Cú pháp trong Python 2Hiển thị/Ẩn

Ngữ nghĩa của

>>> import os
>>> os.linesep
'\r\n'
806 và
>>> import os
>>> os.linesep
'\r\n'
097 không thay đổi kể từ Python 2, nhưng bạn phải nhớ rằng các chuỗi không có gì khác hơn là các mảng byte được tôn vinh vào thời điểm đó. Để chuyển đổi các đối tượng của bạn thành Unicode thích hợp, là một loại dữ liệu riêng biệt, bạn phải cung cấp một phương pháp kỳ diệu khác.
>>> import os
>>> os.linesep
'\r\n'
810

Đây là một ví dụ về cùng một lớp

>>> import os
>>> os.linesep
'\r\n'
801 trong Python 2

>>> import os
>>> os.linesep
'\r\n'
01

Như bạn có thể thấy, việc triển khai này ủy thác một số công việc để tránh trùng lặp bằng cách tự gọi hàm

>>> import os
>>> os.linesep
'\r\n'
812 tích hợp sẵn

Cả hai phương thức

>>> import os
>>> os.linesep
'\r\n'
806 và
>>> import os
>>> os.linesep
'\r\n'
097 đều phải trả về chuỗi, vì vậy chúng mã hóa các ký tự Unicode thành các biểu diễn byte cụ thể được gọi là bộ ký tự. UTF-8 là mã hóa phổ biến nhất và an toàn nhất, trong khi
>>> import os
>>> os.linesep
'\r\n'
815 là hằng số đặc biệt để biểu thị các ký tự vui nhộn, chẳng hạn như
>>> import os
>>> os.linesep
'\r\n'
816, dưới dạng các chuỗi thoát trong ASCII đơn giản, chẳng hạn như
>>> import os
>>> os.linesep
'\r\n'
817

Câu lệnh

>>> import os
>>> os.linesep
'\n'
02 đang tìm kiếm phương thức
>>> import os
>>> os.linesep
'\r\n'
806 ma thuật trong lớp, vì vậy bộ ký tự được chọn phải tương ứng với bộ ký tự được sử dụng bởi thiết bị đầu cuối. Ví dụ: mã hóa mặc định trong DOS và Windows là CP 852 chứ không phải UTF-8, vì vậy việc chạy mã này có thể dẫn đến kết quả đầu ra
>>> import os
>>> os.linesep
'\r\n'
059 hoặc thậm chí bị cắt xén

>>>

>>> import os
>>> os.linesep
'\r\n'
02

Tuy nhiên, nếu bạn chạy cùng một mã trên hệ thống có mã hóa UTF-8, thì bạn sẽ nhận được cách viết đúng của một tên tiếng Nga phổ biến

>>>

>>> import os
>>> os.linesep
'\r\n'
03

Bạn nên chuyển đổi chuỗi thành Unicode càng sớm càng tốt, chẳng hạn như khi bạn đang đọc dữ liệu từ một tệp và sử dụng chuỗi đó một cách nhất quán ở mọi nơi trong mã của bạn. Đồng thời, bạn nên mã hóa Unicode trở lại bộ ký tự đã chọn ngay trước khi trình bày cho người dùng

Có vẻ như bạn có nhiều quyền kiểm soát hơn đối với biểu diễn chuỗi của các đối tượng trong Python 2 vì không còn phương thức

>>> import os
>>> os.linesep
'\r\n'
810 thần kỳ nào trong Python 3 nữa. Bạn có thể tự hỏi liệu có thể chuyển đổi một đối tượng thành biểu diễn chuỗi byte của nó thay vì chuỗi Unicode trong Python 3 không. Có thể, với một phương pháp đặc biệt
>>> import os
>>> os.linesep
'\r\n'
822 thực hiện điều đó

>>>

>>> import os
>>> os.linesep
'\r\n'
04

Sử dụng hàm

>>> import os
>>> os.linesep
'\r\n'
823 tích hợp trên một phiên bản ủy quyền cuộc gọi đến phương thức
>>> import os
>>> os.linesep
'\r\n'
824 của nó được xác định trong lớp tương ứng

Loại bỏ các quảng cáo

Hiểu về Python
>>> import os
>>> os.linesep
'\r\n'
94

Bạn biết cách sử dụng

>>> import os
>>> os.linesep
'\r\n'
94 khá tốt vào thời điểm này, nhưng biết nó là gì sẽ cho phép bạn sử dụng nó hiệu quả và có ý thức hơn. Sau khi đọc phần này, bạn sẽ hiểu cách in bằng Python đã được cải thiện như thế nào trong những năm qua

In là một chức năng trong Python 3

Bạn đã thấy rằng

>>> import os
>>> os.linesep
'\r\n'
94 là một hàm trong Python 3. Cụ thể hơn, đó là chức năng tích hợp sẵn, nghĩa là bạn không cần phải nhập nó từ bất cứ đâu

>>>

>>> import os
>>> os.linesep
'\r\n'
05

Nó luôn có sẵn trong không gian tên chung để bạn có thể gọi nó trực tiếp, nhưng bạn cũng có thể truy cập nó thông qua một mô-đun từ thư viện chuẩn

>>>

>>> import os
>>> os.linesep
'\r\n'
06

Bằng cách này, bạn có thể tránh xung đột tên với các chức năng tùy chỉnh. Giả sử bạn muốn xác định lại

>>> import os
>>> os.linesep
'\r\n'
94 để nó không thêm một dòng mới ở cuối. Đồng thời, bạn muốn đổi tên chức năng ban đầu thành một cái gì đó như
>>> import os
>>> os.linesep
'\r\n'
829

>>>

>>> import os
>>> os.linesep
'\r\n'
07

Bây giờ bạn có hai chức năng in riêng biệt giống như trong ngôn ngữ lập trình Java. Bạn cũng sẽ định nghĩa các hàm

>>> import os
>>> os.linesep
'\r\n'
94 tùy chỉnh trong phần mô phỏng sau này. Ngoài ra, lưu ý rằng bạn sẽ không thể ghi đè lên
>>> import os
>>> os.linesep
'\r\n'
94 ngay từ đầu nếu đó không phải là một chức năng

Mặt khác,

>>> import os
>>> os.linesep
'\r\n'
94 không phải là một hàm theo nghĩa toán học, bởi vì nó không trả về bất kỳ giá trị có ý nghĩa nào ngoài giá trị ẩn
>>> import os
>>> os.linesep
'\n'
32

>>>

>>> import os
>>> os.linesep
'\r\n'
08

Trên thực tế, các chức năng như vậy là các thủ tục hoặc chương trình con mà bạn gọi để đạt được một loại hiệu ứng phụ nào đó, cuối cùng là sự thay đổi trạng thái toàn cầu. Trong trường hợp của

>>> import os
>>> os.linesep
'\r\n'
94, tác dụng phụ đó là hiển thị một thông báo trên đầu ra tiêu chuẩn hoặc ghi vào một tệp

>>> import os
>>> os.linesep
'\r\n'
94 là một hàm nên nó có chữ ký được xác định rõ ràng với các thuộc tính đã biết. Bạn có thể nhanh chóng tìm thấy tài liệu của nó bằng cách sử dụng trình chỉnh sửa mà bạn chọn mà không cần phải nhớ một số cú pháp kỳ lạ để thực hiện một tác vụ nhất định

Bên cạnh đó, các chức năng dễ dàng mở rộng hơn. Việc thêm một tính năng mới vào một chức năng cũng dễ dàng như thêm một đối số từ khóa khác, trong khi việc thay đổi ngôn ngữ để hỗ trợ tính năng mới đó thì cồng kềnh hơn nhiều. Ví dụ, hãy nghĩ về chuyển hướng luồng hoặc xóa bộ đệm

Một lợi ích khác của việc

>>> import os
>>> os.linesep
'\r\n'
94 là một chức năng là khả năng kết hợp. Các hàm được gọi là đối tượng hạng nhất hoặc công dân hạng nhất trong Python, đây là một cách thú vị để nói rằng chúng là các giá trị giống như chuỗi hoặc số. Bằng cách này, bạn có thể gán một hàm cho một biến, chuyển nó sang một hàm khác hoặc thậm chí trả về một hàm từ một hàm khác.
>>> import os
>>> os.linesep
'\r\n'
94 không có gì khác biệt về vấn đề này. Chẳng hạn, bạn có thể tận dụng nó để tiêm phụ thuộc

>>> import os
>>> os.linesep
'\r\n'
09

Ở đây, tham số

>>> import os
>>> os.linesep
'\r\n'
838 cho phép bạn thêm chức năng gọi lại, mặc định là
>>> import os
>>> os.linesep
'\r\n'
94 nhưng có thể là bất kỳ chức năng nào có thể gọi được. Trong ví dụ này, việc in bị vô hiệu hóa hoàn toàn bằng cách thay thế
>>> import os
>>> os.linesep
'\r\n'
94 bằng một hàm giả không làm gì cả

Ghi chú. Phần phụ thuộc là bất kỳ đoạn mã nào được yêu cầu bởi một đoạn mã khác

Dependency injection là một kỹ thuật được sử dụng trong thiết kế mã để làm cho nó dễ kiểm tra hơn, có thể tái sử dụng và mở rộng hơn. Bạn có thể đạt được điều đó bằng cách đề cập gián tiếp đến các phụ thuộc thông qua các giao diện trừu tượng và bằng cách cung cấp chúng theo kiểu đẩy chứ không phải kiểu kéo

Có một lời giải thích hài hước về việc tiêm phụ thuộc lan truyền trên Internet

tiêm phụ thuộc cho trẻ năm tuổi

Khi bạn đi lấy đồ trong tủ lạnh cho mình, bạn có thể gây rắc rối. Bạn có thể để cửa mở, bạn có thể nhận được thứ gì đó mà bố hoặc mẹ không muốn bạn có. Bạn thậm chí có thể đang tìm kiếm thứ gì đó mà chúng tôi thậm chí không có hoặc đã hết hạn

Điều bạn nên làm là nêu rõ nhu cầu, “Tôi cần uống gì đó trong bữa trưa,” và sau đó chúng tôi sẽ đảm bảo bạn có thứ gì đó khi ngồi ăn

— John Munsch, ngày 28 tháng 10 năm 2009. [Nguồn]

Thành phần cho phép bạn kết hợp một số chức năng thành một chức năng mới cùng loại. Hãy xem điều này hoạt động bằng cách chỉ định một hàm

>>> import os
>>> os.linesep
'\r\n'
841 tùy chỉnh in ra luồng lỗi tiêu chuẩn và thêm tiền tố vào tất cả các thông báo với một mức nhật ký nhất định

>>>

>>> import os
>>> os.linesep
'\r\n'
10

Chức năng tùy chỉnh này sử dụng các chức năng từng phần để đạt được hiệu quả mong muốn. Đó là một khái niệm nâng cao mượn từ mô hình lập trình chức năng, vì vậy bạn không cần phải đi quá sâu vào chủ đề đó vào lúc này. Tuy nhiên, nếu bạn quan tâm đến chủ đề này, tôi khuyên bạn nên xem mô-đun

>>> import os
>>> os.linesep
'\r\n'
842

Không giống như câu lệnh, chức năng là giá trị. Điều đó có nghĩa là bạn có thể kết hợp chúng với các biểu thức, cụ thể là biểu thức lambda. Thay vì xác định một hàm toàn diện để thay thế

>>> import os
>>> os.linesep
'\r\n'
94 bằng, bạn có thể tạo một biểu thức lambda ẩn danh để gọi nó

>>>

>>> import os
>>> os.linesep
'\r\n'
11

Tuy nhiên, vì một biểu thức lambda được xác định tại chỗ nên không có cách nào đề cập đến nó ở nơi khác trong mã

Ghi chú. Trong Python, bạn không thể đặt các câu lệnh, chẳng hạn như phép gán, câu điều kiện, vòng lặp, v.v., trong một hàm lambda ẩn danh. Nó phải là một biểu thức duy nhất

Một loại biểu thức khác là biểu thức điều kiện bậc ba

>>>

>>> import os
>>> os.linesep
'\r\n'
12

Python có cả câu lệnh điều kiện và biểu thức điều kiện. Cái sau được đánh giá thành một giá trị có thể được gán cho một biến hoặc được truyền cho một hàm. Trong ví dụ trên, bạn quan tâm đến tác dụng phụ hơn là giá trị, đánh giá là

>>> import os
>>> os.linesep
'\n'
32, vì vậy bạn chỉ cần bỏ qua nó

Như bạn có thể thấy, các hàm cho phép một giải pháp tao nhã và có thể mở rộng, phù hợp với phần còn lại của ngôn ngữ. Trong tiểu mục tiếp theo, bạn sẽ khám phá ra việc không có hàm

>>> import os
>>> os.linesep
'\r\n'
94 gây ra nhiều vấn đề đau đầu như thế nào

Loại bỏ các quảng cáo

>>> import os
>>> os.linesep
'\n'
02 Là một Tuyên bố trong Python 2

Một câu lệnh là một hướng dẫn có thể gây ra tác dụng phụ khi được thực thi nhưng không bao giờ đánh giá thành một giá trị. Nói cách khác, bạn sẽ không thể in một câu lệnh hoặc gán nó cho một biến như thế này

>>> import os
>>> os.linesep
'\r\n'
13

Đó là lỗi cú pháp trong Python 2

Dưới đây là một vài ví dụ khác về câu lệnh trong Python

  • phân công.
    >>> import os
    >>> os.linesep
    '\r\n'
    
    847
  • có điều kiện.
    >>> import os
    >>> os.linesep
    '\r\n'
    
    848
  • vòng.
    >>> import os
    >>> os.linesep
    '\r\n'
    
    849
  • quả quyết.
    >>> import os
    >>> os.linesep
    '\r\n'
    
    850

Ghi chú. Trăn 3. 8 mang đến một toán tử hải mã gây tranh cãi [

>>> import os
>>> os.linesep
'\r\n'
851], là một biểu thức gán. Với nó, bạn có thể đánh giá một biểu thức và gán kết quả cho một biến cùng một lúc, ngay cả trong một biểu thức khác

Hãy xem ví dụ này, gọi một hàm đắt tiền một lần và sau đó sử dụng lại kết quả để tính toán thêm

>>> import os
>>> os.linesep
'\r\n'
14

Điều này rất hữu ích để đơn giản hóa mã mà không làm giảm hiệu quả của nó. Thông thường, mã biểu diễn có xu hướng dài dòng hơn

>>> import os
>>> os.linesep
'\r\n'
15

Tranh cãi đằng sau đoạn cú pháp mới này đã gây ra nhiều tranh luận. Vô số bình luận tiêu cực và những cuộc tranh luận sôi nổi cuối cùng đã khiến Guido van Rossum phải từ chức Nhà độc tài nhân từ vì sự sống hay BDFL

Các tuyên bố thường bao gồm các từ khóa dành riêng như

>>> import os
>>> os.linesep
'\r\n'
848,
>>> import os
>>> os.linesep
'\r\n'
853 hoặc
>>> import os
>>> os.linesep
'\n'
02 có nghĩa cố định trong ngôn ngữ. Bạn không thể sử dụng chúng để đặt tên cho các biến của mình hoặc các ký hiệu khác. That’s why redefining or mocking the
>>> import os
>>> os.linesep
'\n'
02 statement isn’t possible in Python 2. Bạn bị mắc kẹt với những gì bạn nhận được

Ngoài ra, bạn không thể in từ các hàm ẩn danh vì các câu lệnh không được chấp nhận trong các biểu thức lambda

>>>

>>> import os
>>> os.linesep
'\r\n'
16

Cú pháp của câu lệnh

>>> import os
>>> os.linesep
'\n'
02 không rõ ràng. Đôi khi bạn có thể thêm dấu ngoặc đơn xung quanh tin nhắn và chúng hoàn toàn không bắt buộc

>>>

>>> import os
>>> os.linesep
'\r\n'
17

Vào những thời điểm khác, họ thay đổi cách in tin nhắn

>>>

>>> import os
>>> os.linesep
'\r\n'
18

Nối chuỗi có thể tăng

>>> import os
>>> os.linesep
'\n'
57 do các loại không tương thích, chẳng hạn như bạn phải xử lý thủ công

>>>

>>> import os
>>> os.linesep
'\r\n'
19

So sánh mã này với mã tương tự trong Python 3, mã này thúc đẩy giải nén trình tự

>>>

>>> import os
>>> os.linesep
'\r\n'
20

Không có bất kỳ đối số từ khóa nào cho các tác vụ phổ biến như xóa bộ đệm hoặc chuyển hướng luồng. Thay vào đó, bạn cần nhớ cú pháp kỳ quặc. Ngay cả hàm

>>> import os
>>> os.linesep
'\r\n'
076 tích hợp cũng không hữu ích đối với câu lệnh
>>> import os
>>> os.linesep
'\n'
02

>>>

>>> import os
>>> os.linesep
'\r\n'
21

Loại bỏ dòng mới ở cuối không hoạt động hoàn toàn đúng vì nó thêm một khoảng trống không mong muốn. Bạn không thể soạn nhiều câu lệnh

>>> import os
>>> os.linesep
'\n'
02 cùng nhau và trên hết, bạn phải cực kỳ siêng năng về mã hóa ký tự

Danh sách các vấn đề cứ lặp đi lặp lại. Nếu tò mò, bạn có thể quay lại phần trước và tìm kiếm các giải thích chi tiết hơn về cú pháp trong Python 2

Tuy nhiên, bạn có thể giảm thiểu một số vấn đề đó bằng cách tiếp cận đơn giản hơn nhiều. Hóa ra hàm

>>> import os
>>> os.linesep
'\r\n'
94 đã được nhập vào để dễ dàng chuyển sang Python 3. You can import it from a special
>>> import os
>>> os.linesep
'\n'
41 module, which exposes a selection of language features released in later Python versions

Ghi chú. Bạn có thể nhập các hàm trong tương lai cũng như các cấu trúc ngôn ngữ có sẵn, chẳng hạn như câu lệnh

>>> import os
>>> os.linesep
'\r\n'
863

Để tìm hiểu chính xác những tính năng nào có sẵn cho bạn, hãy kiểm tra mô-đun

>>>

>>> import os
>>> os.linesep
'\r\n'
22

Bạn cũng có thể gọi

>>> import os
>>> os.linesep
'\r\n'
864, nhưng điều đó sẽ hiển thị nhiều chi tiết bên trong không thú vị của mô-đun

To enable the

>>> import os
>>> os.linesep
'\r\n'
94 function in Python 2, you need to add this import statement at the beginning of your source code

>>> import os
>>> os.linesep
'\r\n'
23

Từ giờ câu lệnh

>>> import os
>>> os.linesep
'\n'
02 không còn nữa, nhưng bạn đã có hàm
>>> import os
>>> os.linesep
'\r\n'
94 tùy ý sử dụng. Lưu ý rằng nó không giống chức năng như trong Python 3, vì nó thiếu đối số từ khóa
>>> import os
>>> os.linesep
'\r\n'
067, nhưng các đối số còn lại đều giống nhau

Ngoài ra, nó không giúp bạn quản lý mã hóa ký tự đúng cách

Đây là một ví dụ về cách gọi hàm

>>> import os
>>> os.linesep
'\r\n'
94 trong Python 2

>>>

>>> import os
>>> os.linesep
'\r\n'
24

Bây giờ bạn đã có ý tưởng về cách in bằng Python đã phát triển và quan trọng nhất là hiểu tại sao những thay đổi không tương thích ngược này lại cần thiết. Biết điều này chắc chắn sẽ giúp bạn trở thành một lập trình viên Python giỏi hơn

Loại bỏ các quảng cáo

In ấn theo phong cách

Nếu bạn nghĩ rằng in ấn chỉ là làm sáng các điểm ảnh trên màn hình, thì về mặt kỹ thuật, bạn đã đúng. However, there are ways to make it look cool. Trong phần này, bạn sẽ tìm hiểu cách định dạng cấu trúc dữ liệu phức tạp, thêm màu sắc và các trang trí khác, xây dựng giao diện, sử dụng hoạt ảnh và thậm chí phát âm thanh với văn bản

Cấu trúc dữ liệu lồng nhau in đẹp

Ngôn ngữ máy tính cho phép bạn biểu diễn dữ liệu cũng như mã thực thi theo cách có cấu trúc. Tuy nhiên, không giống như Python, hầu hết các ngôn ngữ đều cho phép bạn tự do sử dụng khoảng trắng và định dạng. Điều này có thể hữu ích, chẳng hạn như trong quá trình nén, nhưng đôi khi nó dẫn đến mã khó đọc hơn

Pretty-printing is about making a piece of data or code look more appealing to the human eye so that it can be understood more easily. Điều này được thực hiện bằng cách thụt lề một số dòng nhất định, chèn dòng mới, sắp xếp lại các phần tử, v.v.

Python đi kèm với mô-đun

>>> import os
>>> os.linesep
'\r\n'
870 trong thư viện tiêu chuẩn của nó, mô-đun này sẽ giúp bạn in các cấu trúc dữ liệu lớn đẹp mắt không vừa trên một dòng. Vì nó in theo cách thân thiện với con người hơn nên nhiều công cụ REPL phổ biến, bao gồm JupyterLab và IPython, sử dụng nó theo mặc định thay cho hàm
>>> import os
>>> os.linesep
'\r\n'
94 thông thường

Ghi chú. Để chuyển chế độ in đẹp trong IPython, hãy ra lệnh sau

>>>

>>> import os
>>> os.linesep
'\r\n'
25

Đây là một ví dụ về Phép thuật trong IPython. Có rất nhiều lệnh tích hợp bắt đầu bằng dấu phần trăm [

>>> import os
>>> os.linesep
'\r\n'
872], nhưng bạn có thể tìm thêm trên PyPI hoặc thậm chí tạo lệnh của riêng mình

Nếu bạn không quan tâm đến việc không có quyền truy cập vào hàm

>>> import os
>>> os.linesep
'\r\n'
94 ban đầu, thì bạn có thể thay thế nó bằng
>>> import os
>>> os.linesep
'\r\n'
874 trong mã của mình bằng cách nhập đổi tên

>>>

>>> import os
>>> os.linesep
'\r\n'
26

Cá nhân tôi muốn có cả hai chức năng trong tầm tay, vì vậy tôi muốn sử dụng một cái gì đó như

>>> import os
>>> os.linesep
'\r\n'
875 làm bí danh ngắn

>>> import os
>>> os.linesep
'\r\n'
27

Thoạt nhìn, hầu như không có bất kỳ sự khác biệt nào giữa hai chức năng và trong một số trường hợp hầu như không có

>>>

>>> import os
>>> os.linesep
'\r\n'
28

Đó là bởi vì

>>> import os
>>> os.linesep
'\r\n'
874 gọi
>>> import os
>>> os.linesep
'\r\n'
096 thay vì
>>> import os
>>> os.linesep
'\n'
30 thông thường để truyền kiểu, do đó bạn có thể đánh giá đầu ra của nó dưới dạng mã Python nếu bạn muốn. Sự khác biệt trở nên rõ ràng khi bạn bắt đầu cung cấp cho nó các cấu trúc dữ liệu phức tạp hơn

>>>

>>> import os
>>> os.linesep
'\r\n'
29

Hàm áp dụng định dạng hợp lý để cải thiện khả năng đọc, nhưng bạn có thể tùy chỉnh nó hơn nữa với một vài tham số. For example, you may limit a deeply nested hierarchy by showing an ellipsis below a given level

>>>

>>> import os
>>> os.linesep
'\r\n'
30

>>> import os
>>> os.linesep
'\r\n'
94 thông thường cũng sử dụng dấu chấm lửng nhưng để hiển thị cấu trúc dữ liệu đệ quy, tạo thành một chu trình, để tránh lỗi tràn ngăn xếp

>>>

>>> import os
>>> os.linesep
'\r\n'
31

Tuy nhiên,

>>> import os
>>> os.linesep
'\r\n'
874 rõ ràng hơn về nó bằng cách bao gồm danh tính duy nhất của một đối tượng tự tham chiếu

>>>

>>> import os
>>> os.linesep
'\r\n'
32

The last element in the list is the same object as the entire list

Ghi chú. Các tập dữ liệu đệ quy hoặc rất lớn cũng có thể được xử lý bằng cách sử dụng mô-đun

>>> import os
>>> os.linesep
'\r\n'
881

>>>

>>> import os
>>> os.linesep
'\r\n'
33

Mô-đun này hỗ trợ hầu hết các loại tích hợp sẵn và được trình gỡ lỗi Python sử dụng

>>> import os
>>> os.linesep
'\r\n'
874 tự động sắp xếp các khóa từ điển cho bạn trước khi in, cho phép so sánh nhất quán. Khi bạn đang so sánh các chuỗi, bạn thường không quan tâm đến thứ tự cụ thể của các thuộc tính được tuần tự hóa. Anyways, it’s always best to compare actual dictionaries before serialization

Từ điển thường biểu thị dữ liệu JSON, được sử dụng rộng rãi trên Internet. Để tuần tự hóa chính xác một từ điển thành một chuỗi có định dạng JSON hợp lệ, bạn có thể tận dụng mô-đun

>>> import os
>>> os.linesep
'\r\n'
883. Nó cũng có khả năng in đẹp

>>>

>>> import os
>>> os.linesep
'\r\n'
34

Tuy nhiên, xin lưu ý rằng bạn cần tự xử lý việc in, vì đó không phải là việc bạn thường muốn làm. Similarly, the

>>> import os
>>> os.linesep
'\r\n'
870 module has an additional
>>> import os
>>> os.linesep
'\r\n'
885 function that returns a string, in case you had to do something other than printing it

Ngạc nhiên thay, chữ ký của

>>> import os
>>> os.linesep
'\r\n'
874 không giống chữ ký của hàm
>>> import os
>>> os.linesep
'\r\n'
94. Bạn thậm chí không thể chuyển nhiều hơn một đối số vị trí, điều này cho thấy mức độ tập trung của nó vào việc in cấu trúc dữ liệu

Loại bỏ các quảng cáo

Thêm màu với chuỗi thoát ANSI

Khi máy tính cá nhân trở nên phức tạp hơn, chúng có đồ họa tốt hơn và có thể hiển thị nhiều màu sắc hơn. Tuy nhiên, các nhà cung cấp khác nhau có ý tưởng riêng về thiết kế API để kiểm soát nó. Điều đó đã thay đổi cách đây vài thập kỷ khi những người ở Viện Tiêu chuẩn Quốc gia Hoa Kỳ quyết định thống nhất nó bằng cách xác định mã thoát ANSI

Hầu hết các trình giả lập thiết bị đầu cuối ngày nay đều hỗ trợ tiêu chuẩn này ở một mức độ nào đó. Cho đến gần đây, hệ điều hành Windows là một ngoại lệ đáng chú ý. Do đó, nếu bạn muốn tính di động tốt nhất, hãy sử dụng thư viện

>>> import os
>>> os.linesep
'\r\n'
888 trong Python. Nó dịch mã ANSI sang các đối tác thích hợp của chúng trong Windows trong khi vẫn giữ chúng nguyên vẹn trong các hệ điều hành khác

Để kiểm tra xem thiết bị đầu cuối của bạn có hiểu một tập hợp con của các chuỗi thoát ANSI hay không, chẳng hạn như liên quan đến màu sắc, bạn có thể thử sử dụng lệnh sau

>>> import os
>>> os.linesep
'\r\n'
35

Thiết bị đầu cuối mặc định của tôi trên Linux cho biết nó có thể hiển thị 256 màu riêng biệt, trong khi xterm chỉ cho tôi 8. Lệnh sẽ trả về số âm nếu màu không được hỗ trợ

Chuỗi thoát ANSI giống như một ngôn ngữ đánh dấu cho thiết bị đầu cuối. Trong HTML, bạn làm việc với các thẻ, chẳng hạn như

>>> import os
>>> os.linesep
'\r\n'
889 hoặc
>>> import os
>>> os.linesep
'\r\n'
890, để thay đổi giao diện của các phần tử trong tài liệu. Các thẻ này được trộn lẫn với nội dung của bạn nhưng bản thân chúng không hiển thị. Tương tự, mã thoát sẽ không hiển thị trong thiết bị đầu cuối miễn là nó nhận ra chúng. Nếu không, chúng sẽ xuất hiện ở dạng chữ như thể bạn đang xem mã nguồn của một trang web

Như tên gọi của nó, một chuỗi phải bắt đầu bằng ký tự Esc không in được, có giá trị ASCII là 27, đôi khi được ký hiệu là

>>> import os
>>> os.linesep
'\r\n'
891 . Bạn có thể sử dụng chữ số Python để nhanh chóng xác minh đó thực sự là cùng một số.

>>>

>>> import os
>>> os.linesep
'\r\n'
36

Ngoài ra, bạn có thể lấy nó bằng chuỗi thoát

>>> import os
>>> os.linesep
'\r\n'
893 trong trình bao

>>> import os
>>> os.linesep
'\r\n'
37

Các chuỗi thoát ANSI phổ biến nhất có dạng sau

ElementDescriptionVí dụ Esc ký tự thoát không in được

>>> import os
>>> os.linesep
'\r\n'
894
>>> import os
>>> os.linesep
'\r\n'
895mở dấu ngoặc vuông
>>> import os
>>> os.linesep
'\r\n'
895mã sốmột hoặc nhiều số được phân tách bằng
>>> import os
>>> os.linesep
'\r\n'
897
>>> import os
>>> os.linesep
'\r\n'
898mã ký tự chữ hoa hoặc chữ thường
>>> import os
>>> os.linesep
'\r\n'
899

Mã số có thể là một hoặc nhiều số được phân tách bằng dấu chấm phẩy, trong khi mã ký tự chỉ là một chữ cái. Ý nghĩa cụ thể của chúng được xác định theo tiêu chuẩn ANSI. Ví dụ: để đặt lại tất cả định dạng, bạn sẽ nhập một trong các lệnh sau, sử dụng mã số 0 và chữ cái

>>> import os
>>> os.linesep
'\r\n'
899

>>> import os
>>> os.linesep
'\r\n'
38

Ở đầu kia của quang phổ, bạn có các giá trị mã phức hợp. Để đặt nền trước và nền sau với các kênh RGB, với điều kiện là thiết bị đầu cuối của bạn hỗ trợ độ sâu 24 bit, bạn có thể cung cấp nhiều số

>>> import os
>>> os.linesep
'\r\n'
39

Bạn không chỉ có thể đặt màu văn bản bằng mã thoát ANSI. Ví dụ: bạn có thể xóa và cuộn cửa sổ đầu cuối, thay đổi nền của nó, di chuyển con trỏ xung quanh, làm cho văn bản nhấp nháy hoặc trang trí bằng gạch dưới

Trong Python, bạn có thể viết một hàm trợ giúp để cho phép gói các mã tùy ý thành một chuỗi

>>>

>>> import os
>>> os.linesep
'\r\n'
40

Điều này sẽ làm cho từ

>>> import os
>>> os.linesep
'\r\n'
001 xuất hiện ở phông chữ màu đỏ, in đậm và gạch chân

Tuy nhiên, có những khái niệm trừu tượng cấp cao hơn đối với mã thoát ANSI, chẳng hạn như thư viện

>>> import os
>>> os.linesep
'\r\n'
888 đã đề cập, cũng như các công cụ để xây dựng giao diện người dùng trong bảng điều khiển

Loại bỏ các quảng cáo

Xây dựng giao diện người dùng bảng điều khiển

Mặc dù không thể phủ nhận việc chơi với các mã thoát ANSI rất thú vị, nhưng trong thế giới thực, bạn muốn có nhiều khối xây dựng trừu tượng hơn để kết hợp giao diện người dùng. Có một vài thư viện cung cấp mức độ kiểm soát cao như vậy đối với thiết bị đầu cuối, nhưng

>>> import os
>>> os.linesep
'\r\n'
003 dường như là lựa chọn phổ biến nhất

Ghi chú. Để sử dụng thư viện

>>> import os
>>> os.linesep
'\r\n'
003 trong Windows, bạn cần cài đặt gói của bên thứ ba

>>> import os
>>> os.linesep
'\r\n'
41

Đó là bởi vì

>>> import os
>>> os.linesep
'\r\n'
003 không có sẵn trong thư viện tiêu chuẩn của bản phân phối Python cho Windows

Về cơ bản, nó cho phép bạn suy nghĩ về các tiện ích đồ họa độc lập thay vì một khối văn bản. Bên cạnh đó, bạn có rất nhiều tự do trong việc thể hiện nghệ sĩ bên trong của mình, bởi vì nó thực sự giống như vẽ một bức tranh trống. Thư viện che giấu sự phức tạp của việc phải xử lý các thiết bị đầu cuối khác nhau. Ngoài ra, nó còn hỗ trợ tuyệt vời cho các sự kiện bàn phím, có thể hữu ích khi viết trò chơi điện tử

Làm thế nào về việc làm một trò chơi rắn cổ điển?

Trước tiên, bạn cần nhập mô-đun

>>> import os
>>> os.linesep
'\r\n'
003. Vì nó sửa đổi trạng thái của thiết bị đầu cuối đang chạy, điều quan trọng là phải xử lý lỗi và khôi phục trạng thái trước đó một cách duyên dáng. Bạn có thể thực hiện việc này theo cách thủ công, nhưng thư viện đi kèm với trình bao bọc thuận tiện cho chức năng chính của bạn

>>> import os
>>> os.linesep
'\r\n'
42

Note, the function must accept a reference to the screen object, also known as

>>> import os
>>> os.linesep
'\r\n'
007, that you’ll use later for additional setup

If you run this program now, you won’t see any effects, because it terminates immediately. However, you can add a small delay to have a sneak peek

>>> import os
>>> os.linesep
'\r\n'
43

Lần này, màn hình hoàn toàn trống trong một giây, nhưng con trỏ vẫn nhấp nháy. Để ẩn nó, chỉ cần gọi một trong các chức năng cấu hình được xác định trong mô-đun

>>> import os
>>> os.linesep
'\r\n'
44

Let’s define the snake as a list of points in screen coordinates

>>> import os
>>> os.linesep
'\r\n'
45

The head of the snake is always the first element in the list, whereas the tail is the last one. The initial shape of the snake is horizontal, starting from the top-left corner of the screen and facing to the right. While its y-coordinate stays at zero, its x-coordinate decreases from head to tail

To draw the snake, you’ll start with the head and then follow with the remaining segments. Each segment carries

>>> import os
>>> os.linesep
'\r\n'
008 coordinates, so you can unpack them

>>> import os
>>> os.linesep
'\r\n'
46

Again, if you run this code now, it won’t display anything, because you must explicitly refresh the screen afterward

>>> import os
>>> os.linesep
'\r\n'
47

Bạn muốn di chuyển con rắn theo một trong bốn hướng, có thể được định nghĩa là vectơ. Cuối cùng, hướng sẽ thay đổi để đáp ứng với một lần nhấn phím mũi tên, vì vậy bạn có thể kết nối nó với các mã khóa của thư viện

>>> import os
>>> os.linesep
'\r\n'
48

How does a snake move? It turns out that only its head really moves to a new location, while all other segments shift towards it. In each step, almost all segments remain the same, except for the head and the tail. Assuming the snake isn’t growing, you can remove the tail and insert a new head at the beginning of the list

>>> import os
>>> os.linesep
'\r\n'
49

To get the new coordinates of the head, you need to add the direction vector to it. However, adding tuples in Python results in a bigger tuple instead of the algebraic sum of the corresponding vector components. One way to fix this is by using the built-in

>>> import os
>>> os.linesep
'\r\n'
009,
>>> import os
>>> os.linesep
'\r\n'
010, and
>>> import os
>>> os.linesep
'\r\n'
011 functions

The direction will change on a keystroke, so you need to call

>>> import os
>>> os.linesep
'\r\n'
012 to obtain the pressed key code. However, if the pressed key doesn’t correspond to the arrow keys defined earlier as dictionary keys, the direction won’t change

>>> import os
>>> os.linesep
'\r\n'
50

By default, however,

>>> import os
>>> os.linesep
'\r\n'
012 is a blocking call that would prevent the snake from moving unless there was a keystroke. Do đó, bạn cần thực hiện cuộc gọi không bị chặn bằng cách thêm một cấu hình khác

>>> import os
>>> os.linesep
'\r\n'
51

You’re almost done, but there’s just one last thing left. If you now loop this code, the snake will appear to be growing instead of moving. That’s because you have to erase the screen explicitly before each iteration

Finally, this is all you need to play the snake game in Python

>>> import os
>>> os.linesep
'\r\n'
52

Đây chỉ là bề ngoài của các khả năng mà mô-đun

>>> import os
>>> os.linesep
'\r\n'
003 mở ra. You may use it for game development like this or more business-oriented applications

Living It Up With Cool Animations

Hoạt ảnh không chỉ có thể làm cho giao diện người dùng bắt mắt hơn mà còn cải thiện trải nghiệm người dùng tổng thể. When you provide early feedback to the user, for example, they’ll know if your program’s still working or if it’s time to kill it

To animate text in the terminal, you have to be able to freely move the cursor around. You can do this with one of the tools mentioned previously, that is ANSI escape codes or the

>>> import os
>>> os.linesep
'\r\n'
003 library. However, I’d like to show you an even simpler way

Nếu hoạt ảnh có thể bị giới hạn trong một dòng văn bản, thì bạn có thể quan tâm đến hai chuỗi ký tự thoát đặc biệt

  • Carriage return.
    >>> import os
    >>> os.linesep
    '\n'
    
    08
  • Backspace.
    >>> import os
    >>> os.linesep
    '\n'
    
    13

Cái đầu tiên di chuyển con trỏ đến đầu dòng, trong khi cái thứ hai chỉ di chuyển con trỏ sang trái một ký tự. They both work in a non-destructive way without overwriting text that’s already been written

Let’s take a look at a few examples

You’ll often want to display some kind of a spinning wheel to indicate a work in progress without knowing exactly how much time’s left to finish

Many command line tools use this trick while downloading data over the network. You can make a really simple stop motion animation from a sequence of characters that will cycle in a round-robin fashion

>>> import os
>>> os.linesep
'\r\n'
53

The loop gets the next character to print, then moves the cursor to the beginning of the line, and overwrites whatever there was before without adding a newline. You don’t want extra space between positional arguments, so separator argument must be blank. Also, notice the use of Python’s raw strings due to backslash characters present in the literal

When you know the remaining time or task completion percentage, then you’re able to show an animated progress bar

First, you need to calculate how many hashtags to display and how many blank spaces to insert. Next, you erase the line and build the bar from scratch

>>> import os
>>> os.linesep
'\r\n'
54

As before, each request for update repaints the entire line

Note. There’s a feature-rich

>>> import os
>>> os.linesep
'\r\n'
018 library, along with a few other similar tools, that can show progress in a much more comprehensive way

Making Sounds With
>>> import os
>>> os.linesep
'\r\n'
94

If you’re old enough to remember computers with a PC speaker, then you must also remember their distinctive beep sound, often used to indicate hardware problems. They could barely make any more noises than that, yet video games seemed so much better with it

Today you can still take advantage of this small loudspeaker, but chances are your laptop didn’t come with one. In such a case, you can enable terminal bell emulation in your shell, so that a system warning sound is played instead

Go ahead and type this command to see if your terminal can play a sound

>>> import os
>>> os.linesep
'\r\n'
55

Điều này thường sẽ in văn bản, nhưng cờ

>>> import os
>>> os.linesep
'\r\n'
020 cho phép giải thích các dấu gạch chéo ngược thoát. As you can see, there’s a dedicated escape sequence
>>> import os
>>> os.linesep
'\r\n'
021, which stands for “alert”, that outputs a special bell character. Some terminals make a sound whenever they see it

Similarly, you can print this character in Python. Perhaps in a loop to form some kind of melody. While it’s only a single note, you can still vary the length of pauses between consecutive instances. That seems like a perfect toy for Morse code playback

The rules are the following

  • Letters are encoded with a sequence of dot [·] and dash [–] symbols
  • A dot is one unit of time
  • A dash is three units of time
  • Individual symbols in a letter are spaced one unit of time apart
  • Symbols of two adjacent letters are spaced three units of time apart
  • Symbols of two adjacent words are spaced seven units of time apart

According to those rules, you could be “printing” an SOS signal indefinitely in the following way

>>> import os
>>> os.linesep
'\r\n'
56

In Python, you can implement it in merely ten lines of code

>>> import os
>>> os.linesep
'\r\n'
57

Maybe you could even take it one step further and make a command line tool for translating text into Morse code? Either way, I hope you’re having fun with this

Mocking Python
>>> import os
>>> os.linesep
'\r\n'
94 in Unit Tests

Nowadays, it’s expected that you ship code that meets high quality standards. If you aspire to become a professional, you must learn how to test your code

Software testing is especially important in dynamically typed languages, such as Python, which don’t have a compiler to warn you about obvious mistakes. Defects can make their way to the production environment and remain dormant for a long time, until that one day when a branch of code finally gets executed

Sure, you have linters, type checkers, and other tools for static code analysis to assist you. But they won’t tell you whether your program does what it’s supposed to do on the business level

So, should you be testing

>>> import os
>>> os.linesep
'\r\n'
94? No. Xét cho cùng, đó là một chức năng tích hợp sẵn phải trải qua một bộ kiểm tra toàn diện. What you want to test, though, is whether your code is calling
>>> import os
>>> os.linesep
'\r\n'
94 at the right time with the expected parameters. That’s known as a behavior

You can test behaviors by mocking real objects or functions. In this case, you want to mock

>>> import os
>>> os.linesep
'\r\n'
94 to record and verify its invocations

Note. You might have heard the terms. dummy, fake, stub, spy, or mock used interchangeably. Some people make a distinction between them, while others don’t

Martin Fowler explains their differences in a short glossary and collectively calls them test doubles

Mocking in Python can be done twofold. First, you can take the traditional path of statically-typed languages by employing dependency injection. This may sometimes require you to change the code under test, which isn’t always possible if the code is defined in an external library

>>> import os
>>> os.linesep
'\r\n'
58

This is the same example I used in an earlier section to talk about function composition. It basically allows for substituting

>>> import os
>>> os.linesep
'\r\n'
94 with a custom function of the same interface. To check if it prints the right message, you have to intercept it by injecting a mocked function

>>>

>>> import os
>>> os.linesep
'\r\n'
59

Calling this mock makes it save the last message in an attribute, which you can inspect later, for example in an

>>> import os
>>> os.linesep
'\r\n'
850 statement

In a slightly alternative solution, instead of replacing the entire

>>> import os
>>> os.linesep
'\r\n'
94 function with a custom wrapper, you could redirect the standard output to an in-memory file-like stream of characters

>>>

>>> import os
>>> os.linesep
'\r\n'
60

This time the function explicitly calls

>>> import os
>>> os.linesep
'\r\n'
94, but it exposes its
>>> import os
>>> os.linesep
'\r\n'
043 parameter to the outside world

Tuy nhiên, một cách mô phỏng các đối tượng Pythonic hơn tận dụng mô-đun

>>> import os
>>> os.linesep
'\r\n'
031 tích hợp, sử dụng một kỹ thuật gọi là vá khỉ. This derogatory name stems from it being a “dirty hack” that you can easily shoot yourself in the foot with. It’s less elegant than dependency injection but definitely quick and convenient

Note. The

>>> import os
>>> os.linesep
'\r\n'
031 module got absorbed by the standard library in Python 3, but before that, it was a third-party package. You had to install it separately

>>> import os
>>> os.linesep
'\r\n'
61

Other than that, you referred to it as

>>> import os
>>> os.linesep
'\r\n'
031, whereas in Python 3 it’s part of the unit testing module, so you must import from
>>> import os
>>> os.linesep
'\r\n'
034

What monkey patching does is alter implementation dynamically at runtime. Such a change is visible globally, so it may have unwanted consequences. In practice, however, patching only affects the code for the duration of test execution

To mock

>>> import os
>>> os.linesep
'\r\n'
94 in a test case, you’ll typically use the
>>> import os
>>> os.linesep
'\r\n'
036 decorator and specify a target for patching by referring to it with a fully qualified name, that is including the module name

>>> import os
>>> os.linesep
'\r\n'
62

This will automatically create the mock for you and inject it to the test function. However, you need to declare that your test function accepts a mock now. The underlying mock object has lots of useful methods and attributes for verifying behavior

Did you notice anything peculiar about that code snippet?

Despite injecting a mock to the function, you’re not calling it directly, although you could. That injected mock is only used to make assertions afterward and maybe to prepare the context before running the test

In real life, mocking helps to isolate the code under test by removing dependencies such as a database connection. You rarely call mocks in a test, because that doesn’t make much sense. Rather, it’s other pieces of code that call your mock indirectly without knowing it

Here’s what that means

>>> import os
>>> os.linesep
'\r\n'
63

The code under test is a function that prints a greeting. Even though it’s a fairly simple function, you can’t test it easily because it doesn’t return a value. It has a side-effect

To eliminate that side-effect, you need to mock the dependency out. Patching lets you avoid making changes to the original function, which can remain agnostic about

>>> import os
>>> os.linesep
'\r\n'
94. It thinks it’s calling
>>> import os
>>> os.linesep
'\r\n'
94, but in reality, it’s calling a mock you’re in total control of

There are many reasons for testing software. One of them is looking for bugs. When you write tests, you often want to get rid of the

>>> import os
>>> os.linesep
'\r\n'
94 function, for example, by mocking it away. Paradoxically, however, that same function can help you find bugs during a related process of debugging you’ll read about in the next section

Cú pháp trong Python 2Hiển thị/Ẩn

You can’t monkey patch the

>>> import os
>>> os.linesep
'\n'
02 statement in Python 2, nor can you inject it as a dependency. However, you have a few other options

  • Use stream redirection
  • Patch the standard output defined in the
    >>> import os
    >>> os.linesep
    '\r\n'
    
    004 module
  • Nhập
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94 từ mô-đun
    >>> import os
    >>> os.linesep
    '\n'
    
    41

Let’s examine them one by one

Stream redirection is almost identical to the example you saw earlier

>>>

>>> import os
>>> os.linesep
'\r\n'
64

There are only two differences. First, the syntax for stream redirection uses chevron [

>>> import os
>>> os.linesep
'\r\n'
044] instead of the
>>> import os
>>> os.linesep
'\r\n'
043 argument. The other difference is where
>>> import os
>>> os.linesep
'\r\n'
046 is defined. You can import it from a similarly named
>>> import os
>>> os.linesep
'\r\n'
046 module, or
>>> import os
>>> os.linesep
'\r\n'
048 for a faster implementation

Patching the standard output from the

>>> import os
>>> os.linesep
'\r\n'
004 module is exactly what it sounds like, but you need to be aware of a few gotchas

>>> import os
>>> os.linesep
'\r\n'
65

First of all, remember to install the

>>> import os
>>> os.linesep
'\r\n'
031 module as it wasn’t available in the standard library in Python 2

Secondly, the

>>> import os
>>> os.linesep
'\n'
02 statement calls the underlying
>>> import os
>>> os.linesep
'\r\n'
040 method on the mocked object instead of calling the object itself. That’s why you’ll run assertions against
>>> import os
>>> os.linesep
'\r\n'
053

Finally, a single

>>> import os
>>> os.linesep
'\n'
02 statement doesn’t always correspond to a single call to
>>> import os
>>> os.linesep
'\r\n'
055. In fact, you’ll see the newline character written separately

The last option you have is importing

>>> import os
>>> os.linesep
'\r\n'
94 from
>>> import os
>>> os.linesep
'\r\n'
057 and patching it

>>> import os
>>> os.linesep
'\r\n'
66

Again, it’s nearly identical to Python 3, but the

>>> import os
>>> os.linesep
'\r\n'
94 function is defined in the
>>> import os
>>> os.linesep
'\r\n'
059 module rather than
>>> import os
>>> os.linesep
'\r\n'
060

>>> import os
>>> os.linesep
'\r\n'
94 Debugging

In this section, you’ll take a look at the available tools for debugging in Python, starting from a humble

>>> import os
>>> os.linesep
'\r\n'
94 function, through the
>>> import os
>>> os.linesep
'\r\n'
063 module, to a fully fledged debugger. After reading it, you’ll be able to make an educated decision about which of them is the most suitable in a given situation

Note. Debugging is the process of looking for the root causes of bugs or defects in software after they’ve been discovered, as well as taking steps to fix them

The term bug has an amusing story about the origin of its name

Tracing

Also known as print debugging or caveman debugging, it’s the most basic form of debugging. While a little bit old-fashioned, it’s still powerful and has its uses

The idea is to follow the path of program execution until it stops abruptly, or gives incorrect results, to identify the exact instruction with a problem. You do that by inserting print statements with words that stand out in carefully chosen places

Take a look at this example, which manifests a rounding error

>>>

>>> import os
>>> os.linesep
'\r\n'
67

As you can see, the function doesn’t return the expected value of

>>> import os
>>> os.linesep
'\r\n'
064, but now you know it’s because the sum is a little off. Tracing the state of variables at different steps of the algorithm can give you a hint where the issue is

Rounding ErrorShow/Hide

In this case, the problem lies in how floating point numbers are represented in computer memory. Remember that numbers are stored in binary form. Decimal value of

>>> import os
>>> os.linesep
'\r\n'
064 turns out to have an infinite binary representation, which gets rounded

For more information on rounding numbers in Python, you can check out How to Round Numbers in Python

This method is simple and intuitive and will work in pretty much every programming language out there. Not to mention, it’s a great exercise in the learning process

On the other hand, once you master more advanced techniques, it’s hard to go back, because they allow you to find bugs much quicker. Tracing is a laborious manual process, which can let even more errors slip through. The build and deploy cycle takes time. Afterward, you need to remember to meticulously remove all the

>>> import os
>>> os.linesep
'\r\n'
94 calls you made without accidentally touching the genuine ones

Besides, it requires you to make changes in the code, which isn’t always possible. Maybe you’re debugging an application running in a remote web server or want to diagnose a problem in a post-mortem fashion. Sometimes you simply don’t have access to the standard output

That’s precisely where logging shines

Logging

Let’s pretend for a minute that you’re running an e-commerce website. One day, an angry customer makes a phone call complaining about a failed transaction and saying he lost his money. Anh ấy tuyên bố đã thử mua một số mặt hàng, nhưng cuối cùng, có một số lỗi khó hiểu khiến anh ấy không thể hoàn thành đơn hàng đó. Yet, when he checked his bank account, the money was gone

You apologize sincerely and make a refund, but also don’t want this to happen again in the future. How do you debug that? If only you had some trace of what happened, ideally in the form of a chronological list of events with their context

Whenever you find yourself doing print debugging, consider turning it into permanent log messages. This may help in situations like this, when you need to analyze a problem after it happened, in an environment that you don’t have access to

There are sophisticated tools for log aggregation and searching, but at the most basic level, you can think of logs as text files. Each line conveys detailed information about an event in your system. Usually, it won’t contain personally identifying information, though, in some cases, it may be mandated by law

Here’s a breakdown of a typical log record

>>> import os
>>> os.linesep
'\r\n'
68

As you can see, it has a structured form. Apart from a descriptive message, there are a few customizable fields, which provide the context of an event. Here, you have the exact date and time, the log level, the logger name, and the thread name

Log levels allow you to filter messages quickly to reduce noise. If you’re looking for an error, you don’t want to see all the warnings or debug messages, for example. It’s trivial to disable or enable messages at certain log levels through the configuration, without even touching the code

With logging, you can keep your debug messages separate from the standard output. All the log messages go to the standard error stream by default, which can conveniently show up in different colors. However, you can redirect log messages to separate files, even for individual modules

Quite commonly, misconfigured logging can lead to running out of space on the server’s disk. To prevent that, you may set up log rotation, which will keep the log files for a specified duration, such as one week, or once they hit a certain size. Nevertheless, it’s always a good practice to archive older logs. Some regulations enforce that customer data be kept for as long as five years

Compared to other programming languages, logging in Python is simpler, because the

>>> import os
>>> os.linesep
'\r\n'
063 module is bundled with the standard library. You just import and configure it in as little as two lines of code

>>> import os
>>> os.linesep
'\r\n'
69

You can call functions defined at the module level, which are hooked to the root logger, but more the common practice is to obtain a dedicated logger for each of your source files

>>> import os
>>> os.linesep
'\r\n'
70

The advantage of using custom loggers is more fine-grain control. They’re usually named after the module they were defined in through the

>>> import os
>>> os.linesep
'\r\n'
068 variable

Note. There’s a somewhat related

>>> import os
>>> os.linesep
'\r\n'
069 module in Python, which can also log messages to the standard error stream. However, it has a narrower spectrum of applications, mostly in library code, whereas client applications should use the
>>> import os
>>> os.linesep
'\r\n'
063 module

That said, you can make them work together by calling

>>> import os
>>> os.linesep
'\r\n'
071

One last reason to switch from the

>>> import os
>>> os.linesep
'\r\n'
94 function to logging is thread safety. In the upcoming section, you’ll see that the former doesn’t play well with multiple threads of execution

Debugging

The truth is that neither tracing nor logging can be considered real debugging. To do actual debugging, you need a debugger tool, which allows you to do the following

  • Step through the code interactively
  • Đặt điểm ngắt, bao gồm cả điểm dừng có điều kiện
  • Introspect variables in memory
  • Evaluate custom expressions at runtime

A crude debugger that runs in the terminal, unsurprisingly named

>>> import os
>>> os.linesep
'\r\n'
073 for “The Python Debugger,” is distributed as part of the standard library. This makes it always available, so it may be your only choice for performing remote debugging. Perhaps that’s a good reason to get familiar with it

However, it doesn’t come with a graphical interface, so using

>>> import os
>>> os.linesep
'\r\n'
073 may be a bit tricky. If you can’t edit the code, you have to run it as a module and pass your script’s location

>>> import os
>>> os.linesep
'\r\n'
71

Otherwise, you can set up a breakpoint directly in the code, which will pause the execution of your script and drop you into the debugger. The old way of doing this required two steps

>>>

>>> import os
>>> os.linesep
'\r\n'
72

This shows up an interactive prompt, which might look intimidating at first. However, you can still type native Python at this point to examine or modify the state of local variables. Ngoài ra, thực sự chỉ có một số lệnh dành riêng cho trình gỡ lỗi mà bạn muốn sử dụng để xem qua mã

Note. It’s customary to put the two instructions for spinning up a debugger on a single line. This requires the use of a semicolon, which is rarely found in Python programs

>>> import os
>>> os.linesep
'\r\n'
73

While certainly not Pythonic, it stands out as a reminder to remove it after you’re done with debugging

Since Python 3. 7, you can also call the built-in

>>> import os
>>> os.linesep
'\r\n'
075 function, which does the same thing, but in a more compact way and with some additional bells and whistles

>>> import os
>>> os.linesep
'\r\n'
74

Hầu hết các phần có thể bạn sẽ sử dụng trình gỡ lỗi trực quan được tích hợp với trình chỉnh sửa mã. PyCharm có một trình gỡ lỗi tuyệt vời, tự hào có hiệu suất cao, nhưng bạn sẽ tìm thấy nhiều IDE thay thế có trình gỡ lỗi, cả trả phí và miễn phí

Gỡ lỗi không phải là viên đạn bạc thành ngữ. Đôi khi ghi nhật ký hoặc theo dõi sẽ là một giải pháp tốt hơn. Ví dụ: các lỗi khó tái tạo, chẳng hạn như điều kiện chủng tộc, thường là do khớp nối thời gian. Khi bạn dừng tại một điểm dừng, việc tạm dừng nhỏ đó trong quá trình thực thi chương trình có thể che dấu sự cố. Nó giống như nguyên tắc Heisenberg. bạn không thể đo lường và quan sát lỗi cùng một lúc

Các phương pháp này không loại trừ lẫn nhau. Họ bổ sung cho nhau

In chỉ an toàn

Trước đây, tôi đã đề cập sơ qua về vấn đề an toàn luồng, khuyến nghị sử dụng

>>> import os
>>> os.linesep
'\r\n'
063 thay vì chức năng
>>> import os
>>> os.linesep
'\r\n'
94. Nếu bạn vẫn đang đọc điều này, thì bạn phải cảm thấy thoải mái với khái niệm chủ đề

An toàn luồng có nghĩa là một đoạn mã có thể được chia sẻ an toàn giữa nhiều luồng thực thi. Chiến lược đơn giản nhất để đảm bảo an toàn luồng là chỉ chia sẻ các đối tượng bất biến. Nếu các luồng không thể sửa đổi trạng thái của một đối tượng, thì sẽ không có nguy cơ phá vỡ tính nhất quán của nó

Một phương pháp khác tận dụng bộ nhớ cục bộ, làm cho mỗi luồng nhận bản sao của cùng một đối tượng. Bằng cách đó, các luồng khác không thể thấy các thay đổi được thực hiện đối với luồng đó trong luồng hiện tại

Nhưng điều đó không giải quyết được vấn đề, phải không? . Cách phổ biến nhất để đồng bộ hóa quyền truy cập đồng thời vào một tài nguyên như vậy là khóa nó. Điều này cho phép truy cập ghi độc quyền vào một hoặc đôi khi một vài luồng tại một thời điểm

Tuy nhiên, khóa đắt tiền và làm giảm thông lượng đồng thời, vì vậy các phương tiện khác để kiểm soát quyền truy cập đã được phát minh, chẳng hạn như các biến nguyên tử hoặc thuật toán so sánh và hoán đổi

In không an toàn theo luồng trong Python. Hàm

>>> import os
>>> os.linesep
'\r\n'
94 giữ tham chiếu đến đầu ra tiêu chuẩn, là biến toàn cục được chia sẻ. Về lý thuyết, do không có khóa nên việc chuyển đổi ngữ cảnh có thể xảy ra trong khi gọi tới
>>> import os
>>> os.linesep
'\r\n'
055, đan xen các đoạn văn bản từ nhiều lệnh gọi
>>> import os
>>> os.linesep
'\r\n'
94

Ghi chú. Chuyển đổi ngữ cảnh có nghĩa là một luồng tạm dừng thực thi của nó, một cách tự nguyện hoặc không, để một luồng khác có thể tiếp quản. Điều này có thể xảy ra bất cứ lúc nào, ngay cả khi đang gọi hàm

Tuy nhiên, trong thực tế, điều đó không xảy ra. Cho dù bạn có cố gắng thế nào, việc ghi vào đầu ra tiêu chuẩn dường như là nguyên tử. Vấn đề duy nhất mà đôi khi bạn có thể quan sát thấy là việc ngắt dòng bị lộn xộn

>>> import os
>>> os.linesep
'\r\n'
75

Để mô phỏng điều này, bạn có thể tăng khả năng chuyển đổi ngữ cảnh bằng cách đặt phương thức

>>> import os
>>> os.linesep
'\r\n'
040 cơ bản ở chế độ ngủ trong một khoảng thời gian ngẫu nhiên. Làm sao?

>>> import os
>>> os.linesep
'\r\n'
76

Trước tiên, bạn cần lưu trữ phương thức gốc

>>> import os
>>> os.linesep
'\r\n'
040 trong một biến mà bạn sẽ ủy thác sau này. Sau đó, bạn cung cấp triển khai giả của mình, sẽ mất tối đa một giây để thực thi. Mỗi chuỗi sẽ thực hiện một vài cuộc gọi
>>> import os
>>> os.linesep
'\r\n'
94 với tên và một chữ cái. A, B và C

Nếu bạn đã đọc phần mô phỏng trước đó, thì bạn có thể đã biết tại sao việc in lại hoạt động sai như vậy. Tuy nhiên, để làm cho nó rõ ràng, bạn có thể nắm bắt các giá trị được đưa vào hàm

>>> import os
>>> os.linesep
'\r\n'
084 của mình. Bạn sẽ nhận thấy rằng bạn nhận được một trình tự hơi khác mỗi lần

>>> import os
>>> os.linesep
'\r\n'
77

Mặc dù bản thân

>>> import os
>>> os.linesep
'\r\n'
055 là một phép toán nguyên tử, nhưng một lần gọi hàm
>>> import os
>>> os.linesep
'\r\n'
94 có thể mang lại nhiều hơn một lần ghi. Ví dụ: ngắt dòng được viết riêng biệt với phần còn lại của văn bản và chuyển đổi ngữ cảnh diễn ra giữa các lần viết đó

Ghi chú. Bản chất nguyên tử của đầu ra tiêu chuẩn trong Python là sản phẩm phụ của Khóa phiên dịch toàn cầu, áp dụng khóa xung quanh các hướng dẫn mã byte. Tuy nhiên, hãy lưu ý rằng nhiều hương vị trình thông dịch không có GIL, nơi in đa luồng yêu cầu khóa rõ ràng

Bạn có thể làm cho ký tự xuống dòng trở thành một phần không thể thiếu của tin nhắn bằng cách xử lý thủ công

>>> import os
>>> os.linesep
'\r\n'
78

Điều này sẽ khắc phục đầu ra

>>> import os
>>> os.linesep
'\r\n'
79

Tuy nhiên, lưu ý rằng hàm

>>> import os
>>> os.linesep
'\r\n'
94 vẫn tiếp tục thực hiện lệnh gọi riêng cho hậu tố trống, điều này chuyển thành lệnh
>>> import os
>>> os.linesep
'\r\n'
088 vô dụng

>>> import os
>>> os.linesep
'\r\n'
80

Phiên bản thực sự an toàn cho luồng của hàm

>>> import os
>>> os.linesep
'\r\n'
94 có thể trông như thế này

>>> import os
>>> os.linesep
'\r\n'
81

Bạn có thể đặt chức năng đó trong một mô-đun và nhập nó vào nơi khác

>>> import os
>>> os.linesep
'\r\n'
82

Bây giờ, mặc dù thực hiện hai lần ghi cho mỗi yêu cầu

>>> import os
>>> os.linesep
'\r\n'
94, nhưng chỉ một luồng được phép tương tác với luồng, trong khi phần còn lại phải đợi

>>> import os
>>> os.linesep
'\r\n'
83

Tôi đã thêm nhận xét để cho biết khóa đang giới hạn quyền truy cập vào tài nguyên được chia sẻ như thế nào

Ghi chú. Ngay cả trong mã đơn luồng, bạn có thể gặp phải tình huống tương tự. Cụ thể, khi bạn đang in ra đầu ra tiêu chuẩn và các luồng lỗi tiêu chuẩn cùng một lúc. Trừ khi bạn chuyển hướng một hoặc cả hai thành các tệp riêng biệt, cả hai sẽ chia sẻ một cửa sổ đầu cuối duy nhất

Ngược lại, mô-đun

>>> import os
>>> os.linesep
'\r\n'
063 được thiết kế an toàn cho luồng, điều này được thể hiện qua khả năng hiển thị tên luồng trong thông báo được định dạng

>>>

>>> import os
>>> os.linesep
'\r\n'
84

Đó là một lý do khác khiến bạn có thể không muốn sử dụng hàm

>>> import os
>>> os.linesep
'\r\n'
94 mọi lúc

Đối tác in Python

Đến bây giờ, bạn đã biết rất nhiều điều cần biết về

>>> import os
>>> os.linesep
'\r\n'
94. Tuy nhiên, chủ đề sẽ không hoàn chỉnh nếu không nói một chút về các đối tác của nó. Trong khi
>>> import os
>>> os.linesep
'\r\n'
94 là về đầu ra, có các chức năng và thư viện cho đầu vào

Được xây dựng trong

Python đi kèm với một chức năng tích hợp để chấp nhận đầu vào từ người dùng, được gọi là

>>> import os
>>> os.linesep
'\r\n'
095. Nó chấp nhận dữ liệu từ luồng đầu vào tiêu chuẩn, thường là bàn phím

>>>

>>> import os
>>> os.linesep
'\r\n'
85

Hàm luôn trả về một chuỗi, vì vậy bạn có thể cần phân tích cú pháp cho phù hợp

>>> import os
>>> os.linesep
'\r\n'
86

Tham số dấu nhắc là hoàn toàn tùy chọn, vì vậy sẽ không có gì hiển thị nếu bạn bỏ qua nó, nhưng chức năng vẫn hoạt động

>>>

>>> import os
>>> os.linesep
'\r\n'
87

Tuy nhiên, việc đưa ra lời kêu gọi hành động mang tính mô tả giúp trải nghiệm người dùng tốt hơn rất nhiều

Ghi chú. Để đọc từ đầu vào tiêu chuẩn trong Python 2, thay vào đó, bạn phải gọi

>>> import os
>>> os.linesep
'\r\n'
096, đây là một tích hợp khác. Thật không may, cũng có một hàm
>>> import os
>>> os.linesep
'\r\n'
095 được đặt tên gây hiểu nhầm, thực hiện một việc hơi khác

Trên thực tế, nó cũng lấy đầu vào từ luồng tiêu chuẩn, nhưng sau đó nó cố gắng đánh giá nó như thể đó là mã Python. Bởi vì đó là một lỗ hổng bảo mật tiềm ẩn, chức năng này đã bị xóa hoàn toàn khỏi Python 3, trong khi

>>> import os
>>> os.linesep
'\r\n'
096 được đổi tên thành
>>> import os
>>> os.linesep
'\r\n'
095

Dưới đây là so sánh nhanh các chức năng có sẵn và chức năng của chúng

Trăn 2 Trăn 3

>>> import os
>>> os.linesep
'\r\n'
096____3095
>>> import os
>>> os.linesep
'\r\n'
095
>>> import os
>>> os.linesep
'\r\n'
203

Như bạn có thể thấy, vẫn có thể mô phỏng hành vi cũ trong Python 3

Yêu cầu người dùng nhập mật khẩu bằng

>>> import os
>>> os.linesep
'\r\n'
095 là một ý tưởng tồi vì nó sẽ hiển thị ở dạng văn bản gốc khi họ nhập mật khẩu. Trong trường hợp này, bạn nên sử dụng hàm
>>> import os
>>> os.linesep
'\r\n'
205 để che các ký tự đã nhập. Chức năng này được định nghĩa trong một mô-đun có cùng tên, cũng có sẵn trong thư viện tiêu chuẩn

>>>

>>> import os
>>> os.linesep
'\r\n'
88

Mô-đun

>>> import os
>>> os.linesep
'\r\n'
206 có một chức năng khác để lấy tên người dùng từ một biến môi trường

>>>

>>> import os
>>> os.linesep
'\r\n'
89

Các hàm tích hợp của Python để xử lý đầu vào tiêu chuẩn khá hạn chế. Đồng thời, có rất nhiều gói của bên thứ ba cung cấp các công cụ tinh vi hơn nhiều

bên thứ ba

Có các gói Python bên ngoài cho phép xây dựng các giao diện đồ họa phức tạp đặc biệt để thu thập dữ liệu từ người dùng. Một số tính năng của họ bao gồm

  • Định dạng và kiểu dáng nâng cao
  • Tự động phân tích cú pháp, xác thực và vệ sinh dữ liệu người dùng
  • Một phong cách khai báo xác định bố cục
  • Tự động hoàn thành tương tác
  • hỗ trợ chuột
  • Các vật dụng được xác định trước như danh sách kiểm tra hoặc menu
  • Lịch sử có thể tìm kiếm của các lệnh đã gõ
  • Đánh dấu cú pháp

Trình diễn các công cụ như vậy nằm ngoài phạm vi của bài viết này, nhưng bạn có thể muốn dùng thử chúng. Cá nhân tôi đã biết về một số trong số đó thông qua Python Bytes Podcast. Họ đây rồi

  • >>> import os
    >>> os.linesep
    '\r\n'
    
    207
  • >>> import os
    >>> os.linesep
    '\r\n'
    
    208
  • >>> import os
    >>> os.linesep
    '\r\n'
    
    209
  • >>> import os
    >>> os.linesep
    '\r\n'
    
    210

Tuy nhiên, điều đáng nói là một công cụ dòng lệnh có tên là

>>> import os
>>> os.linesep
'\r\n'
211 bổ sung miễn phí khả năng chỉnh sửa dòng mạnh mẽ cho các tập lệnh Python của bạn. Bạn không phải làm bất cứ điều gì để nó hoạt động

Giả sử bạn đã viết một giao diện dòng lệnh hiểu ba hướng dẫn, bao gồm một hướng dẫn để thêm số

>>> import os
>>> os.linesep
'\r\n'
90

Thoạt nhìn, nó giống như một lời nhắc điển hình khi bạn chạy nó

>>> import os
>>> os.linesep
'\r\n'
91

Nhưng ngay khi bạn mắc lỗi và muốn sửa nó, bạn sẽ thấy không có phím chức năng nào hoạt động như mong muốn. Ví dụ: nhấn vào mũi tên Trái sẽ dẫn đến điều này thay vì di chuyển con trỏ trở lại.

>>> import os
>>> os.linesep
'\r\n'
92

Bây giờ, bạn có thể gói cùng một tập lệnh bằng lệnh

>>> import os
>>> os.linesep
'\r\n'
211. Bạn không chỉ làm cho các phím mũi tên hoạt động mà còn có thể tìm kiếm trong lịch sử liên tục của các lệnh tùy chỉnh của mình, sử dụng tính năng tự động hoàn thành và chỉnh sửa dòng bằng phím tắt

>>> import os
>>> os.linesep
'\r\n'
93

Điều đó không tuyệt sao?

Sự kết luận

Bây giờ bạn đã được trang bị một lượng kiến ​​thức về hàm

>>> import os
>>> os.linesep
'\r\n'
94 trong Python, cũng như nhiều chủ đề xung quanh. Bạn hiểu sâu về nó là gì và nó hoạt động như thế nào, liên quan đến tất cả các yếu tố chính của nó. Nhiều ví dụ đã cho bạn cái nhìn sâu sắc về sự phát triển của nó từ Python 2

Ngoài ra, bạn đã học cách

  • Tránh những lỗi phổ biến với
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94 trong Python
  • Xử lý các dòng mới, mã hóa ký tự và bộ đệm
  • Viết văn bản vào tập tin
  • Giả lập chức năng
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94 trong các bài kiểm tra đơn vị
  • Xây dựng giao diện người dùng nâng cao trong thiết bị đầu cuối

Bây giờ bạn đã biết tất cả những điều này, bạn có thể tạo các chương trình tương tác giao tiếp với người dùng hoặc tạo dữ liệu ở các định dạng tệp phổ biến. Bạn có thể nhanh chóng chẩn đoán các sự cố trong mã của mình và tự bảo vệ mình khỏi chúng. Cuối cùng nhưng không kém phần quan trọng, bạn biết cách thực hiện trò chơi rắn cổ điển

Nếu bạn vẫn khao khát biết thêm thông tin, có câu hỏi hoặc chỉ đơn giản là muốn chia sẻ suy nghĩ của mình, thì hãy liên hệ trong phần bình luận bên dưới

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Hàm print[] của Python. Đi xa hơn những điều cơ bản

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Bartosz Zaczyński

Bartosz là người hướng dẫn bootcamp, tác giả và lập trình viên đa ngôn ngữ yêu thích Python. Anh ấy giúp sinh viên của mình tiếp cận công nghệ phần mềm bằng cách chia sẻ kinh nghiệm thương mại hơn một thập kỷ trong ngành CNTT

» Thông tin thêm về Bartosz

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

Joanna

Mike

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

\\ b trong Python là gì?

Trong python, ký tự 'b' trước một chuỗi được sử dụng để chỉ định chuỗi đó là “chuỗi byte“ .

Dấu gạch chéo ngược b trong Python là gì?

\b là ký tự khoảng lùi \b ASCII Backspace [BS] Nếu bạn muốn in chuỗi \foo\bar hãy làm . >>> in r"\foo\bar" \foo\bar. Điều này sử dụng các chuỗi thô có sẵn trong python.

Chức năng của \t trong Python là gì?

Nó được sử dụng trong đại diện cho các ký tự khoảng trắng nhất định . "\t" là một tab, "\n" là một dòng mới và "\r" là một xuống dòng. Ngược lại, đặt trước một ký tự đặc biệt với "\" sẽ biến ký tự đó thành một ký tự thông thường. Cái này gọi là "thoát".

Chủ Đề