Kết thúc trăn trở
Nếu bạn giống như hầu hết người dùng Python, bao gồm cả tôi, thì có lẽ bạn đã bắt đầu hành trình Python của mình bằng cách tìm hiểu về 94. Nó đã giúp bạn viết một lớp lót 95 của riêng bạn. 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 94 của Python, thì bạn đang bỏ lỡ rất nhiều thứ. Show
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 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à 94 cung cấpĐến cuối hướng dẫn này, bạn sẽ biết cách
Nếu bạn là người hoàn toàn mới bắt đầu, thì bạn sẽ thu được nhiều lợi ích nhất khi đọc phần đầu tiên của hướng dẫn này, phần này minh họa các yếu tố cần thiết của việc in bằng Python. Nếu không, vui lòng bỏ qua phần đó và nhảy xung quanh khi bạn thấy phù hợp Ghi chú. 94 là một bổ sung chính cho Python 3, trong đó nó thay thế câu lệnh 02 cũ có sẵn trong Python 2Có 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 In một cách ngắn gọnHãy bắt đầu bằng cách xem xét một số ví dụ thực tế về in bằng Python. By the end of this section, you’ll know every possible way of calling 94. Or, in programmer lingo, you’d say you’ll be familiar with the function signatureRemove adsCalling >>> import os >>> os.linesep '\r\n' 94The simplest example of using Python 94 requires just a few keystrokes>>>
You don’t pass any arguments, but you still need to put empty parentheses at the end, which tell Python to actually execute the function rather than just refer to it by name This will produce an invisible newline character, which in turn will cause a blank line to appear on your screen. You can call 94 multiple times like this to add vertical space. It’s just as if you were hitting Enter on your keyboard in a word processor. Newline CharacterShow/Hide A newline character is a special control character used to indicate the end of a line (EOL). It usually doesn’t have a visible representation on the screen, but some text editors can display such non-printable characters with little graphics The word “character” is somewhat of a misnomer in this case, because a newline is often more than one character long. For example, the Windows operating system, as well as the HTTP protocol, represent newlines with a pair of characters. Sometimes you need to take those differences into account to design truly portable programs To find out what constitutes a newline in your operating system, use Python’s built-in 07 moduleThis will immediately tell you that Windows and DOS represent the newline as a sequence of 08 followed by 09>>>
On Unix, Linux, and recent versions of macOS, it’s a single 09 character>>>
The classic Mac OS X, however, sticks to its own “think different” philosophy by choosing yet another representation >>>
Notice how these characters appear in string literals. They use special syntax with a preceding backslash ( 11) to denote the start of an escape character sequence. Such sequences allow for representing control characters, which would be otherwise invisible on screenMost programming languages come with a predefined set of escape sequences for special characters such as these
The last two are reminiscent of mechanical typewriters, which required two separate commands to insert a newline. The first command would move the carriage back to the beginning of the current line, while the second one would advance the roll to the next line By comparing the corresponding ASCII character codes, you’ll see that putting a backslash in front of a character changes its meaning completely. However, not all characters allow for this–only the special ones To compare ASCII character codes, you may want to use the built-in 17 function>>>
Keep in mind that, in order to form a correct escape sequence, there must be no space between the backslash character and a letter As you just saw, calling 94 without arguments results in a blank line, which is a line comprised solely of the newline character. Don’t confuse this with an empty line, which doesn’t contain any characters at all, not even the newlineYou can use Python’s string literals to visualize these two
The first one is one character long, whereas the second one has no content Note. To remove the newline character from a string in Python, use its 19 method, like this>>>
This strips any trailing whitespace from the right edge of the string of characters In a more common scenario, you’d want to communicate some message to the end user. There are a few ways to achieve this First, you may pass a string literal directly to 94>>>
This will print the message verbatim onto the screen String LiteralsShow/Hide String literals in Python can be enclosed either in single quotes ( 21) or double quotes ( 22). According to the official style guide, you should just pick one and keep using it consistently. There’s no difference, unless you need to nest one in anotherFor 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
What you want to do is enclose the text, which contains double quotes, within single quotes
The same trick would work the other way around 0Alternatively, you could use escape character sequences mentioned earlier, to make Python treat those internal double quotes literally as part of the string literal 1Escaping 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 2Notice 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 3May mắn thay, bạn có thể tắt hoàn toàn thoát ký tự với sự trợ giúp của chuỗi ký tự thô. Đơn giản chỉ cần thêm một 23 hoặc 24 trước câu trích dẫn mở đầu, và bây giờ bạn sẽ có được điều này 4Điều đó tốt hơn nhiều, phải không? Có một vài tiền tố nữa mang ý nghĩa đặc biệt cho chuỗi ký tự trong Python, nhưng bạn sẽ không tìm hiểu về chúng ở đây Cuối cùng, bạn có thể xác định các chuỗi ký tự nhiều dòng bằng cách đặt chúng trong khoảng từ 25 hoặc 26, thường được sử dụng làm chuỗi tài liệuĐây là một ví dụ 5Để ngăn dòng mới đầu tiên, chỉ cần đặt văn bản ngay sau phần mở đầu 26 6Bạn cũng có thể sử dụng dấu gạch chéo ngược để loại bỏ dòng mới 7Để xóa thụt đầu dòng khỏi chuỗi nhiều dòng, bạn có thể tận dụng mô-đun 28 tích hợp sẵn>>> 8Điều này sẽ xử lý các đoạn không liên kết cho bạn. Ngoài ra còn có một số chức năng hữu ích khác trong 28 để căn chỉnh văn bản mà bạn có thể tìm thấy trong trình xử lý văn bảnThứ hai, bạn có thể trích xuất thông báo đó thành biến riêng của nó với một tên có ý nghĩa để nâng cao khả năng đọc và thúc đẩy tái sử dụng mã >>> 9Cuối cùng, bạn có thể chuyển một biểu thức, chẳng hạn như nối chuỗi, để được đánh giá trước khi in kết quả >>> 0Trên thực tế, có hàng chục cách để định dạng thư trong Python. Tôi thực sự khuyến khích bạn xem f-strings, được giới thiệu trong Python 3. 6, bởi vì chúng cung cấp cú pháp ngắn gọn nhất trong số chúng >>> 1Hơn nữa, f-strings sẽ giúp bạn tránh mắc một lỗi phổ biến, đó là quên gõ các toán hạng nối kiểu ép kiểu. Python là một ngôn ngữ được gõ mạnh, có nghĩa là nó sẽ không cho phép bạn làm điều này >>> 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 >>> 3Trừ khi bạn tự xử lý các lỗi như vậy, trình thông dịch Python sẽ cho bạn biết về sự cố bằng cách hiển thị truy nguyên Ghi chú. 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óBạn có thể gọi nó trực tiếp trên bất kỳ đối tượng nào, ví dụ: một số >>> 4Cá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, 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? >>> 5Tuy nhiên, hãy coi chừng hằng số 32. Mặc dù được sử dụng để biểu thị sự vắng mặt của một giá trị, nhưng nó sẽ hiển thị dưới dạng 33 chứ không phải là một chuỗi trống>>> 6Làm thế nào để 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 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Ở phần sau của hướng dẫn này, bạn sẽ học cách sử dụng cơ chế này để in các loại dữ liệu tùy chỉnh, chẳng hạn như các lớp của bạn Được rồi, bây giờ bạn có thể gọi 94 với 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. The next subsection will expand on message formatting a little bitCú 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 7Đó là bởi vì hồi đó 02 không phải là một hàm, như bạn sẽ thấy trong. Tuy nhiên, lưu ý rằng trong một số trường hợp, dấu ngoặc đơn trong Python là thừa. 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 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 >>> 8Dấ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 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ặcMặt khác, đặt dấu ngoặc đơn xung quanh nhiều mục sẽ tạo thành một >>> 9Đây là một nguồn nhầm lẫn đã biết. Trên thực tế, bạn cũng sẽ nhận được một bộ bằng cách thêm dấu phẩy ở cuối vào mục duy nhất được bao quanh bởi dấu ngoặc đơn >>> 0Điểm mấu chốt là bạn không nên gọi 02 với 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 41, bạn sẽ đọc thêm về điều này trong phần có liên quanRemove adsTách nhiều đối sốBạn thấy 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ạngTuy 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. One way is by explicitly naming the arguments when you’re calling the function, like this >>> 1Since arguments can be uniquely identified by name, their order doesn’t matter. Swapping them out will still give the same result >>> 2Conversely, arguments passed without names are identified by their position. That’s why positional arguments need to follow strictly the order imposed by the function signature >>> 3 94 allows an thanks to the 44 parameterHãy xem ví dụ này >>> 4 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 duy nhất giữa chúng để bạn không nhận được một thông báo bị nén như 46Lưu ý rằng nó cũng quan tâm đến việc truyền kiểu thích hợp bằng cách gọi ngầm 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>>> 5Ngoài việc chấp nhận một số lượng đối số vị trí khác nhau, 94 xác định bốn đối số được đặt 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 tóm tắt của họ bằng cách gọi số 49 từ trình thông dịch viên tương tácBây giờ hãy tập trung vào 50. Nó là viết tắt của dấu phân cách và được gán một khoảng trắng (_______8_______51) theo mặc định. Nó xác định giá trị để nối các phần tử vớiNó phải là một chuỗi hoặc 32, nhưng chuỗi sau có tác dụng tương tự như khoảng trắng mặc định>>> 6Nế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 ( 53)>>> 7Bạn có thể muốn 94 nối các đối số của nó thành 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 đó>>> 8Một ví dụ hữu ích hơn về tham số 50 sẽ in một cái gì đó như đường dẫn tệp>>> 9Hãy nhớ rằng dấu phân cách nằm giữa các phần tử chứ không phải xung quanh chúng, vì vậy bạn cần tính đến điều đó theo cách này hay cách khác >>> 0Cụ thể, bạn có thể chèn một ký tự gạch chéo ( 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 đầuGhi chú. Hãy cẩn thận về việc tham gia các phần tử của danh sách hoặc bộ dữ liệu Thực hiện thủ công sẽ dẫn đến kết quả nổi tiếng 57 nếu ít nhất một trong các phần tử không phải là chuỗi>>> 1Sẽ an toàn hơn nếu chỉ giải nén trình tự bằng toán tử dấu sao ( 58) và để 94 xử lý việc truyền kiểu>>> 2Việc giải nén thực sự giống như gọi 94 với các phần tử riêng lẻ của danh sáchMột ví dụ thú vị khác có thể là xuất dữ liệu sang định dạng giá trị được phân tách bằng dấu phẩy (CSV) >>> 3Điều này sẽ không xử lý các trường hợp cạnh như thoát dấu phẩy một cách chính xác, nhưng đối với các trường hợp sử dụng đơn giản, nó nên làm. Dòng trên sẽ hiển thị trong cửa sổ đầu cuối của bạn. Để lưu nó vào một tệp, bạn phải chuyển hướng đầu ra. Ở phần sau của phần này, bạn sẽ thấy cách sử dụng 94 để viết văn bản vào tệp trực tiếp từ PythonCuối cùng, tham số 50 không chỉ giới hạn ở một ký tự. Bạn có thể nối các phần tử với các chuỗi có độ dài bất kỳ>>> 4Trong các phần phụ sắp tới, bạn sẽ khám phá các đối số từ khóa còn lại của hàm 94Cú pháp trong Python 2Hiển thị/Ẩn Để in nhiều phần tử trong Python 2, bạn phải bỏ dấu ngoặc đơn xung quanh chúng, giống như trước đây >>> 5Mặt khác, nếu bạn giữ chúng, bạn sẽ chuyển một phần tử tuple duy nhất cho câu lệnh 02>>> 6Hơn nữa, không có cách nào thay đổi dấu tách mặc định của các phần tử đã nối trong Python 2, vì vậy một cách giải quyết khác là sử dụng phép nội suy chuỗi như vậy >>> 7Đó là cách định dạng chuỗi mặc định cho đến khi phương thức 65 được nhập từ Python 3Remove adsNgăn Ngắt DòngĐôi khi bạn không muốn kết thúc tin nhắn của mình bằng một dòng mới ở cuối để các cuộc gọi tiếp theo tới 94 sẽ tiếp tục trên cùng một dòng. Các ví dụ cổ điển bao gồm cập nhật tiến trình của một hoạt động dài hạn hoặc nhắc người dùng nhập liệu. Trong trường hợp sau, bạn muốn người dùng nhập câu trả lời trên cùng một dòng 8Nhiều ngôn ngữ lập trình hiển thị các hàm tương tự như 94 thông qua các thư viện tiêu chuẩn của chúng, nhưng chúng cho phép bạn quyết định có thêm một dòng mới hay không. Ví dụ: trong Java và C#, bạn có hai hàm riêng biệt, trong khi các ngôn ngữ khác yêu cầu bạn nối thêm một cách rõ ràng 09 vào cuối chuỗi ký tựDưới đây là một vài ví dụ về cú pháp trong các ngôn ngữ như vậy LanguageExamplePerl 69C 70C++ 71Ngược lại, hàm 94 của Python luôn thêm 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. Để vô hiệu hóa nó, bạn có thể tận dụng một đối số từ khóa khác, 74, cho biết nội dung kết thúc dòng bằngVề mặt ngữ nghĩa, tham số 74 gần giống với tham số 50 mà bạn đã thấy trước đó
Bây giờ bạn đã hiểu điều gì đang xảy ra bí ẩn khi bạn gọi điện cho 94 mà không có tranh luận. Vì bạn không cung cấp bất kỳ đối số vị trí nào cho hàm nên không có gì được nối và do đó, dấu phân cách mặc định hoàn toàn không được sử dụng. Tuy nhiên, giá trị mặc định của 74 vẫn được áp dụng và một dòng trống xuất hiệnGhi chú. Bạn có thể thắc mắc tại sao tham số 74 có giá trị mặc định cố định thay vì bất kỳ giá trị nào có ý nghĩa trên hệ điều hành của bạnChà, bạn không phải lo lắng về việc biểu diễn dòng mới trên các hệ điều hành khác nhau khi in, vì 94 sẽ tự động xử lý việc chuyển đổi. Chỉ cần nhớ luôn sử dụng chuỗi thoát 09 trong chuỗi ký tựĐây hiện là cách di động nhất để in một ký tự dòng mới trong Python >>> 9Ví dụ: nếu bạn cố gắng in mạnh một ký tự dòng mới dành riêng cho Windows trên máy Linux, thì kết quả đầu ra của bạn sẽ bị hỏng >>> 0Mặt khác, khi bạn mở một tệp để đọc bằng 86, bạn cũng không cần quan tâm đến biểu diễn dòng mới. 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 78 chung. Đồng thời, bạn có quyền kiểm soát cách xử lý các dòng mới ở cả đầu vào và đầu ra nếu bạn thực sự cần điều đóĐể 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 74 1Mặc dù đây là hai lệnh gọi 94 riêng biệt, có thể thực hiện cách nhau một thời gian dài, cuối cùng bạn sẽ chỉ thấy một dòng. Đầu tiên, nó sẽ trông như thế này 2Tuy nhiên, sau cuộc gọi thứ hai đến 94, dòng tương tự sẽ xuất hiện trên màn hình như 3Như với 50, bạn có thể sử dụng 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 4Ba hướng dẫn này sẽ xuất ra một dòng văn bản 5Bạn có thể trộn hai đối số từ khóa 6Bạ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 7Khô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ó 8Nó sẽ in ra đoạn văn bản sau 9Như bạn có thể thấy, đối số từ khóa 74 sẽ chấp nhận các chuỗi tùy ýGhi chú. 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 94 sẽ dẫn đến một ký tự dòng mới dư thừa>>> 0Có 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 1Ngoài ra, bạn có thể giữ dòng mới trong nội dung nhưng tự động loại bỏ dòng được thêm vào bởi 94. Bạn sẽ sử dụng đối số từ khóa 74 để làm điều đó>>> 2Bằ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 94Cú 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 3Tuy 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 98 thay vì 99 trong Python 3. Bạn có thể kiểm tra điều này với đoạn mã sau 4Lưu ý rằng có một khoảng trống giữa các từ 00 và 01 5Để có được kết quả như mong đợi, bạn cần sử dụng một trong những thủ thuật được giải thích sau, đó là nhập hàm 94 từ 41 hoặc quay lại mô-đun 04 6Điều này sẽ in đầu ra chính xác mà không cần thêm dung lượng 7Trong khi sử dụng mô-đun 04 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útRemove adsIn ra một tập tinTin hay không tùy bạ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. That’s a job for lower-level layers of code, which understand bytes and know how to push them around 94 là một sự trừu tượng hóa trên các lớp này, cung cấp một giao diện thuận tiện chỉ ủy quyền việc in thực tế cho một đối tượng giống như luồng hoặc tệp. 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
Luồng chuẩnHiển thị/Ẩn Standard output is what you see in the terminal when you run various command-line programs including your own Python scripts 8Trừ khi có hướng dẫn khác, 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 09 cho một luồng tệp, để mọi đầu ra kết thúc trong tệp đó thay vì màn hình 9Đó gọi là chuyển hướng luồng Lỗi tiêu chuẩn tương tự như 09 ở 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. By redirecting one or both of them, you can keep things cleanNote. To redirect 10, you need to know about file descriptors, also known as file handlesThey’re arbitrary, albeit constant, numbers associated with standard streams. Below, you’ll find a summary of the file descriptors for a family of POSIX-compliant operating systems StreamFile Descriptor 080 091 102Knowing those descriptors allows you to redirect one or more streams at a time CommandDescription 18Redirect 09 20Redirect 10 22Redirect 09 and 10 to separate files 25Redirect 09 and 10 to the same fileNote that 28 is the same as 29Some programs use different coloring to distinguish between messages printed to 09 and 10Run Tool Window in PyCharmWhile both 09 and 10 are write-only, 08 is read-only. You can think of standard input as your keyboard, but just like with the other two, you can swap out 08 for a file to read data fromIn Python, you can access all standard streams through the built-in 04 module>>> 0As you can see, these predefined values resemble file-like objects with 37 and 38 attributes as well as 39 and 40 methods among many othersBy default, 94 is bound to 42 through its 43 argument, but you can change that. Use that keyword argument to indicate a file that was open in write or append mode, so that messages go straight to it 1This will make your code immune to stream redirection at the operating system level, which might or might not be desired For more information on working with files in Python, you can check out Reading and Writing Files in Python (Guide) Note. Don’t try using 94 for writing binary data as it’s only well suited for textJust call the binary file’s 40 directly 2If you wanted to write raw bytes on the standard output, then this will fail too because 42 is a character stream>>> 3You must dig deeper to get a handle of the underlying byte stream instead >>> 4This prints an uppercase letter 47 and a newline character, which correspond to decimal values of 65 and 10 in ASCII. However, they’re encoded using hexadecimal notation in the bytes literalNote that 94 has no control over character encoding. It’s the stream’s responsibility to encode received Unicode strings into bytes correctly. In most cases, you won’t set the encoding yourself, because the default UTF-8 is what you want. If you really need to, perhaps for legacy systems, you can use the 38 argument of 86 5Instead of a real file existing somewhere in your file system, you can provide a fake one, which would reside in your computer’s memory. You’ll use this technique later for mocking 94 in unit tests>>> 6If you got to this point, then you’re left with only one keyword argument in 94, which you’ll see in the next subsection. It’s probably the least used of them all. Nevertheless, there are times when it’s absolutely necessaryCú pháp trong Python 2Hiển thị/Ẩn There’s a special syntax in Python 2 for replacing the default 42 with a custom file in the 02 statement 7Because strings and bytes are represented with the same 55 type in Python 2, the 02 statement can handle binary data just fine 8Although, there’s a problem with character encoding. Hàm 86 trong Python 2 thiếu tham số 38, điều này thường dẫn đến kết quả đáng sợ là 59>>> 9Notice how non-Latin characters must be escaped in both Unicode and string literals to avoid a syntax error. Take a look at this example 0Alternatively, you could specify source code encoding according to PEP 263 at the top of the file, but that wasn’t the best practice due to portability issues 1Your best bet is to encode the Unicode string just before printing it. You can do this manually 2However, a more convenient option is to use the built-in 60 module 3It’ll take care of making appropriate conversions when you need to read or write files Remove adsBuffering >>> import os >>> os.linesep '\r\n' 94 CallsIn the previous subsection, you learned that 94 delegates printing to a file-like object such as 42. Some streams, however, buffer certain I/O operations to enhance performance, which can get in the way. Let’s take a look at an exampleImagine you were writing a countdown timer, which should append the remaining time to the same line every second 4Your first attempt may look something like this 5As long as the 64 variable is greater than zero, the code keeps appending text without a trailing newline and then goes to sleep for one second. Finally, when the countdown is finished, it prints 65 and terminates the lineUnexpectedly, instead of counting down every second, the program idles wastefully for three seconds, and then suddenly prints the entire line at once That’s because the operating system buffers subsequent writes to the standard output in this case. You need to know that there are three kinds of streams with respect to buffering
Unbuffered is self-explanatory, that is, no buffering is taking place, and all writes have immediate effect. A line-buffered stream waits before firing any I/O calls until a line break appears somewhere in the buffer, whereas a block-buffered one simply allows the buffer to fill up to a certain size regardless of its content. Standard output is both line-buffered and block-buffered, depending on which event comes first Buffering helps to reduce the number of expensive I/O calls. Think about sending messages over a high-latency network, for example. When you connect to a remote server to execute commands over the SSH protocol, each of your keystrokes may actually produce an individual data packet, which is orders of magnitude bigger than its payload. What an overhead. It would make sense to wait until at least a few characters are typed and then send them together. That’s where buffering steps in On the other hand, buffering can sometimes have undesired effects as you just saw with the countdown example. To fix it, you can simply tell 94 to forcefully flush the stream without waiting for a newline character in the buffer using its 67 flag 6That’s all. Your countdown should work as expected now, but don’t take my word for it. Go ahead and test it to see the difference Congratulations. At this point, you’ve seen examples of calling 94 that cover all of its parameters. You know their purpose and when to use them. Understanding the signature is only the beginning, however. In the upcoming sections, you’ll see whyCú pháp trong Python 2Hiển thị/Ẩn There isn’t an easy way to flush the stream in Python 2, because the 02 statement doesn’t allow for it by itself. You need to get a handle of its lower-level layer, which is the standard output, and call it directly 7Alternatively, you could disable buffering of the standard streams either by providing the 70 flag to the Python interpreter or by setting up the 71 environment variable 8Note that 94 was backported to Python 2 and made available through the 41 module. Unfortunately, it doesn’t come with the 67 parameter>>> 9What you’re seeing here is a docstring of the 94 function. You can display docstrings of various objects in Python using the built-in 76 functionPrinting Custom Data TypesUp until now, you only dealt with built-in data types such as strings and numbers, but you’ll often want to print your own abstract data types. Let’s have a look at different ways of defining them For simple objects without any logic, whose purpose is to carry data, you’ll typically take advantage of 77, which is available in the standard library. Named tuples have a neat textual representation out of the box>>> 0Đ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 78, cuối cùng bạn sẽ cần xác định một lớp. Take a look at this example 1If you now create an instance of the 78 class and try to print it, you’ll get this bizarre output, which is quite different from the equivalent 77>>> 2It’s the default representation of objects, which comprises their address in memory, the corresponding class name and a module in which they were defined. You’ll fix that in a bit, but just for the record, as a quick workaround you could combine 77 and a custom class through inheritance 3Your 78 class has just become a specialized kind of 77 with two attributes, which you can customizeNote. In Python 3, the 84 statement can be replaced with the ellipsis ( 85) literal to indicate a placeholder 4This prevents the interpreter from raising 86 due to missing indented block of codeThat’s better than a plain 77, because not only do you get printing right for free, but you can also add custom methods and properties to the class. However, it solves one problem while introducing another. Remember that tuples, including named tuples, are immutable in Python, so they can’t change their values once createdIt’s true that designing immutable data types is desirable, but in many cases, you’ll want them to allow for change, so you’re back with regular classes again Note. Following other languages and frameworks, Python 3. 7 introduced data classes, which you can think of as mutable tuples. This way, you get the best of both worlds >>> 5Cú 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 From earlier subsections, you already know that 94 implicitly calls the built-in 30 function to convert its positional arguments into strings. Indeed, calling 30 manually against an instance of the regular 78 class yields the same result as printing it>>> 6 30, in turn, looks for one of two magic methods within the class body, which you typically implement. If it doesn’t find one, then it falls back to the ugly default representation. Những phương pháp kỳ diệu đó, theo thứ tự tìm kiếm
The first one is recommended to return a short, human-readable text, which includes information from the most relevant attributes. After all, you don’t want to expose sensitive data, such as user passwords, when printing objects However, the other one should provide complete information about an object, to allow for restoring its state from a string. Ideally, it should return valid Python code, so that you can pass it directly to 95>>> 7Notice the use of another built-in function, 96, which always tries to call 97 in an object, but falls back to the default representation if it doesn’t find that methodNote. Even though 94 itself uses 30 for type casting, some compound data types delegate that call to 96 on their members. This happens to lists and tuples, for exampleConsider this class with both magic methods, which return alternative string representations of the same object 8If you print a single object of the 01 class, then you won’t see the password, because 02 will call 03, which eventually will invoke 04>>> 9However, if you put the same 05 variable inside a list by wrapping it in square brackets, then the password will become clearly visible>>> 00That’s because sequences, such as lists and tuples, implement their 06 method so that all of their elements are first converted with 96Python gives you a lot of freedom when it comes to defining your own data types if none of the built-in ones meet your needs. Some of them, such as named tuples and data classes, offer string representations that look good without requiring any work on your part. Still, for the most flexibility, you’ll have to define a class and override its magic methods described above Cú pháp trong Python 2Hiển thị/Ẩn The semantics of 06 and 97 didn’t change since Python 2, but you must remember that strings were nothing more than glorified byte arrays back then. To convert your objects into proper Unicode, which was a separate data type, you’d have to provide yet another magic method. 10Here’s an example of the same 01 class in Python 2 01As you can see, this implementation delegates some work to avoid duplication by calling the built-in 12 function on itselfBoth 06 and 97 methods must return strings, so they encode Unicode characters into specific byte representations called character sets. UTF-8 is the most widespread and safest encoding, while 15 is a special constant to express funky characters, such as 16, as escape sequences in plain ASCII, such as 17The 02 statement is looking for the magic 06 method in the class, so the chosen charset must correspond to the one used by the terminal. For example, default encoding in DOS and Windows is CP 852 rather than UTF-8, so running this can result in a 59 or even garbled output>>> 02However, if you ran the same code on a system with UTF-8 encoding, then you’d get the proper spelling of a popular Russian name >>> 03It’s recommended to convert strings to Unicode as early as possible, for example, when you’re reading data from a file, and use it consistently everywhere in your code. At the same time, you should encode Unicode back to the chosen character set right before presenting it to the user It seems as if you have more control over string representation of objects in Python 2 because there’s no magic 10 method in Python 3 anymore. You may be asking yourself if it’s possible to convert an object to its byte string representation rather than a Unicode string in Python 3. It’s possible, with a special 22 method that does just that>>> 04Using the built-in 23 function on an instance delegates the call to its 24 method defined in the corresponding classRemove adsUnderstanding Python >>> import os >>> os.linesep '\r\n' 94You know how to use 94 quite well at this point, but knowing what it is will allow you to use it even more effectively and consciously. After reading this section, you’ll understand how printing in Python has improved over the yearsIn là một chức năng trong Python 3You’ve seen that 94 is a function in Python 3. More specifically, it’s a built-in function, which means that you don’t need to import it from anywhere>>> 05It’s always available in the global namespace so that you can call it directly, but you can also access it through a module from the standard library >>> 06This way, you can avoid name collisions with custom functions. Let’s say you wanted to redefine 94 so that it doesn’t append a trailing newline. At the same time, you wanted to rename the original function to something like 29>>> 07Now you have two separate printing functions just like in the Java programming language. You’ll define custom 94 functions in the later as well. Also, note that you wouldn’t be able to overwrite 94 in the first place if it wasn’t a functionOn the other hand, 94 isn’t a function in the mathematical sense, because it doesn’t return any meaningful value other than the implicit 32>>> 08Such functions are, in fact, procedures or subroutines that you call to achieve some kind of side-effect, which ultimately is a change of a global state. In the case of 94, that side-effect is showing a message on the standard output or writing to a fileBecause 94 is a function, it has a well-defined signature with known attributes. You can quickly find its documentation using the editor of your choice, without having to remember some weird syntax for performing a certain taskBesides, functions are easier to extend. Adding a new feature to a function is as easy as adding another keyword argument, whereas changing the language to support that new feature is much more cumbersome. Think of stream redirection or buffer flushing, for example Another benefit of 94 being a function is composability. Functions are so-called first-class objects or first-class citizens in Python, which is a fancy way of saying they’re values just like strings or numbers. This way, you can assign a function to a variable, pass it to another function, or even return one from another. 94 isn’t different in this regard. For instance, you can take advantage of it for dependency injection 09Here, the 38 parameter lets you inject a callback function, which defaults to 94 but can be any callable. In this example, printing is completely disabled by substituting 94 with a dummy function that does nothingNote. A dependency is any piece of code required by another bit of code Dependency injection is a technique used in code design to make it more testable, reusable, and open for extension. You can achieve it by referring to dependencies indirectly through abstract interfaces and by providing them in a push rather than pull fashion There’s a funny explanation of dependency injection circulating on the Internet
Composition allows you to combine a few functions into a new one of the same kind. Let’s see this in action by specifying a custom 41 function that prints to the standard error stream and prefixes all messages with a given log level>>> 10This custom function uses partial functions to achieve the desired effect. It’s an advanced concept borrowed from the functional programming paradigm, so you don’t need to go too deep into that topic for now. However, if you’re interested in this topic, I recommend taking a look at the 42 moduleUnlike statements, functions are values. That means you can mix them with expressions, in particular, lambda expressions. Instead of defining a full-blown function to replace 94 with, you can make an anonymous lambda expression that calls it>>> 11However, because a lambda expression is defined in place, there’s no way of referring to it elsewhere in the code Note. In Python, you can’t put statements, such as assignments, conditional statements, loops, and so on, in an anonymous lambda function. It has to be a single expression Another kind of expression is a ternary conditional expression >>> 12Python has both conditional statements and . The latter is evaluated to a single value that can be assigned to a variable or passed to a function. In the example above, you’re interested in the side-effect rather than the value, which evaluates to 32, so you simply ignore itAs you can see, functions allow for an elegant and extensible solution, which is consistent with the rest of the language. In the next subsection, you’ll discover how not having 94 as a function caused a lot of headachesRemove ads>>> import os >>> os.linesep '\n' 02 Was a Statement in Python 2A statement is an instruction that may evoke a side-effect when executed but never evaluates to a value. In other words, you wouldn’t be able to print a statement or assign it to a variable like this 13That’s a syntax error in Python 2 Here are a few more examples of statements in Python
Note. Python 3. 8 brings a controversial walrus operator ( 51), which is an assignment expression. With it, you can evaluate an expression and assign the result to a variable at the same time, even within another expressionTake a look at this example, which calls an expensive function once and then reuses the result for further computation 14This is useful for simplifying the code without losing its efficiency. Typically, performant code tends to be more verbose 15The controversy behind this new piece of syntax caused a lot of argument. An abundance of negative comments and heated debates eventually led Guido van Rossum to step down from the Benevolent Dictator For Life or BDFL position Statements are usually comprised of reserved keywords such as 48, 53, or 02 that have fixed meaning in the language. You can’t use them to name your variables or other symbols. That’s why redefining or mocking the 02 statement isn’t possible in Python 2. You’re stuck with what you getNgoà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 >>> 16The syntax of the 02 statement is ambiguous. Sometimes you can add parentheses around the message, and they’re completely optional>>> 17At other times they change how the message is printed >>> 18String concatenation can raise a 57 due to incompatible types, which you have to handle manually, for example>>> 19Compare this with similar code in Python 3, which leverages sequence unpacking >>> 20Khô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. You need to remember the quirky syntax instead. Ngay cả hàm 76 tích hợp cũng không hữu ích đối với câu lệnh 02>>> 21Loạ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. You can’t compose multiple 02 statements together, and, on top of that, you have to be extra diligent about character encodingThe list of problems goes on and on. If you’re curious, you can jump back to the and look for more detailed explanations of the syntax in Python 2 However, you can mitigate some of those problems with a much simpler approach. It turns out the 94 function was backported to ease the migration to Python 3. You can import it from a special 41 module, which exposes a selection of language features released in later Python versionsNote. You may import future functions as well as baked-in language constructs such as the 63 statementTo find out exactly what features are available to you, inspect the module >>> 22You could also call 64, but that would show a lot of uninteresting internal details of the moduleTo enable the 94 function in Python 2, you need to add this import statement at the beginning of your source code 23From now on the 02 statement is no longer available, but you have the 94 function at your disposal. Note that it isn’t the same function like the one in Python 3, because it’s missing the 67 keyword argument, but the rest of the arguments are the sameOther than that, it doesn’t spare you from managing character encodings properly Here’s an example of calling the 94 function in Python 2>>> 24You now have an idea of how printing in Python evolved and, most importantly, understand why these backward-incompatible changes were necessary. Knowing this will surely help you become a better Python programmer Remove adsPrinting With StyleIf you thought that printing was only about lighting pixels up on the screen, then technically you’d be right. However, there are ways to make it look cool. In this section, you’ll find out how to format complex data structures, add colors and other decorations, build interfaces, use animation, and even play sounds with text Pretty-Printing Nested Data StructuresComputer languages allow you to represent data as well as executable code in a structured way. Unlike Python, however, most languages give you a lot of freedom in using whitespace and formatting. This can be useful, for example in compression, but it sometimes leads to less readable code 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. This is done by indenting certain lines, inserting newlines, reordering elements, and so forth Python comes with the 70 module in its standard library, which will help you in pretty-printing large data structures that don’t fit on a single line. Because it prints in a more human-friendly way, many popular REPL tools, including JupyterLab and IPython, use it by default in place of the regular 94 functionNote. To toggle pretty printing in IPython, issue the following command >>> 25Đây là một ví dụ về Phép thuật trong IPython. There are a lot of built-in commands that start with a percent sign ( 72), but you can find more on PyPI, or even create your ownIf you don’t care about not having access to the original 94 function, then you can replace it with 74 in your code using import renaming>>> 26Personally, I like to have both functions at my fingertips, so I’d rather use something like 75 as a short alias 27At first glance, there’s hardly any difference between the two functions, and in some cases there’s virtually none >>> 28That’s because 74 calls 96 instead of the usual 30 for type casting, so that you may evaluate its output as Python code if you want to. The differences become apparent as you start feeding it more complex data structures>>> 29The function applies reasonable formatting to improve readability, but you can customize it even further with a couple of parameters. For example, you may limit a deeply nested hierarchy by showing an ellipsis below a given level >>> 30The ordinary 94 also uses ellipses but for displaying recursive data structures, which form a cycle, to avoid stack overflow error>>> 31However, 74 is more explicit about it by including the unique identity of a self-referencing object>>> 32The last element in the list is the same object as the entire list Note. Recursive or very large data sets can be dealt with using the 81 module as well>>> 33This module supports most of the built-in types and is used by the Python debugger 74 automatically sorts dictionary keys for you before printing, which allows for consistent comparison. When you’re comparing strings, you often don’t care about a particular order of serialized attributes. Anyways, it’s always best to compare actual dictionaries before serializationDictionaries often represent JSON data, which is widely used on the Internet. To correctly serialize a dictionary into a valid JSON-formatted string, you can take advantage of the 83 module. It too has pretty-printing capabilities>>> 34Notice, however, that you need to handle printing yourself, because it’s not something you’d typically want to do. Similarly, the 70 module has an additional 85 function that returns a string, in case you had to do something other than printing itSurprisingly, the signature of 74 is nothing like the 94 function’s one. You can’t even pass more than one positional argument, which shows how much it focuses on printing data structuresRemove adsAdding Colors With ANSI Escape SequencesAs personal computers got more sophisticated, they had better graphics and could display more colors. However, different vendors had their own idea about the API design for controlling it. That changed a few decades ago when people at the American National Standards Institute decided to unify it by defining ANSI escape codes Most of today’s terminal emulators support this standard to some degree. Until recently, the Windows operating system was a notable exception. Therefore, if you want the best portability, use the 88 library in Python. It translates ANSI codes to their appropriate counterparts in Windows while keeping them intact in other operating systemsTo check if your terminal understands a subset of the ANSI escape sequences, for example, related to colors, you can try using the following command 35My default terminal on Linux says it can display 256 distinct colors, while xterm gives me only 8. The command would return a negative number if colors were unsupported ANSI escape sequences are like a markup language for the terminal. In HTML you work with tags, such as 89 or 90, to change how elements look in the document. These tags are mixed with your content, but they’re not visible themselves. Similarly, escape codes won’t show up in the terminal as long as it recognizes them. Otherwise, they’ll appear in the literal form as if you were viewing the source of a websiteAs its name implies, a sequence must begin with the non-printable Esc character, whose ASCII value is 27, sometimes denoted as 91 in hexadecimal or 92 in octal. You may use Python number literals to quickly verify it’s indeed the same number. >>> 36Additionally, you can obtain it with the 93 escape sequence in the shell 37The most common ANSI escape sequences take the following form ElementDescriptionExample Esc non-printable escape character 94 95opening square bracket 95numeric codeone or more numbers separated with 97 98character codeuppercase or lowercase letter 99The numeric code can be one or more numbers separated with a semicolon, while the character code is just one letter. Their specific meaning is defined by the ANSI standard. For example, to reset all formatting, you would type one of the following commands, which use the code zero and the letter 99 38At the other end of the spectrum, you have compound code values. To set foreground and background with RGB channels, given that your terminal supports 24-bit depth, you could provide multiple numbers 39It’s not just text color that you can set with the ANSI escape codes. You can, for example, clear and scroll the terminal window, change its background, move the cursor around, make the text blink or decorate it with an underline In Python, you’d probably write a helper function to allow for wrapping arbitrary codes into a sequence >>> 40This would make the word 01 appear in red, bold, and underlined fontHowever, there are higher-level abstractions over ANSI escape codes, such as the mentioned 88 library, as well as tools for building user interfaces in the consoleRemove adsBuilding Console User InterfacesMặ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. There are a few libraries that provide such a high level of control over the terminal, but 03 seems to be the most popular choiceNote. To use the 03 library in Windows, you need to install a third-party package 41That’s because 03 isn’t available in the standard library of the Python distribution for WindowsPrimarily, it allows you to think in terms of independent graphical widgets instead of a blob of text. Besides, you get a lot of freedom in expressing your inner artist, because it’s really like painting a blank canvas. The library hides the complexities of having to deal with different terminals. Other than that, it has great support for keyboard events, which might be useful for writing video games How about making a retro snake game? Let’s create a Python snake simulator First, you need to import the 03 module. Since it modifies the state of a running terminal, it’s important to handle errors and gracefully restore the previous state. You can do this manually, but the library comes with a convenient wrapper for your main function 42Note, the function must accept a reference to the screen object, also known as 07, that you’ll use later for additional setupIf 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 43This time the screen went completely blank for a second, but the cursor was still blinking. To hide it, just call one of the configuration functions defined in the module 44Hãy định nghĩa con rắn là một danh sách các điểm trong tọa độ màn hình 45The 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 08 coordinates, so you can unpack them 46Một lần nữa, nếu bạn chạy mã này ngay bây giờ, nó sẽ không hiển thị bất cứ thứ gì vì bạn phải làm mới màn hình một cách rõ ràng sau đó 47You want to move the snake in one of four directions, which can be defined as vectors. Eventually, the direction will change in response to an arrow keystroke, so you may hook it up to the library’s key codes 48Làm thế nào để một con rắn di chuyển? . Ở mỗi bậc hầu như các phân khúc đều được giữ nguyên ngoại trừ phần đầu và phần đuôi. Giả sử con rắn không phát triển, bạn có thể bỏ đuôi và chèn một cái đầu mới vào đầu danh sách 49Để có tọa độ mới của đầu, bạn cần thêm vectơ chỉ phương vào đó. Tuy nhiên, việc thêm các bộ trong Python dẫn đến một bộ lớn hơn thay vì tổng đại số của các thành phần vectơ tương ứng. Một cách để khắc phục điều này là sử dụng các hàm tích hợp sẵn 09, 10 và 11Hướng sẽ thay đổi khi nhấn phím, vì vậy bạn cần gọi số 12 để lấy mã phím đã nhấn. Tuy nhiên, nếu phím được nhấn không tương ứng với các phím mũi tên được xác định trước đó là phím từ điển, hướng sẽ không thay đổi 50Tuy nhiên, theo mặc định, 12 là một cuộc gọi chặn sẽ ngăn con rắn di chuyển trừ khi có một lần nhấn phím. 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 51Bạn sắp hoàn thành, nhưng chỉ còn một việc cuối cùng. Nếu bây giờ bạn lặp đoạn mã này, con rắn sẽ có vẻ như đang lớn lên thay vì di chuyển. Đó là bởi vì bạn phải xóa màn hình một cách rõ ràng trước mỗi lần lặp lại Cuối cùng, đây là tất cả những gì bạn cần để chơi trò rắn săn mồi bằng Python 52Đây chỉ là bề nổi của các khả năng mà mô-đun 03 mở ra. Bạn có thể sử dụng nó để phát triển trò chơi như thế này hoặc nhiều ứng dụng định hướng kinh doanh hơnSống hết mình với những hình ảnh động thú vị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ể. Ví dụ: khi bạn cung cấp phản hồi sớm cho người dùng, họ sẽ biết liệu chương trình của bạn có còn hoạt động hay không hay đã đến lúc kết thúc chương trình đó Để tạo hiệu ứng động cho văn bản trong thiết bị đầu cuối, bạn phải có thể tự do di chuyển con trỏ xung quanh. Bạn có thể thực hiện việc này bằng một trong những công cụ đã đề cập trước đây, đó là mã thoát ANSI hoặc thư viện 03. Tuy nhiên, tôi muốn chỉ cho bạn một cách thậm chí còn đơn giản hơnNế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
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ự. Cả hai đều hoạt động theo cách không phá hủy mà không ghi đè lên văn bản đã được viết Hãy xem xét một vài ví dụ Bạn sẽ thường muốn hiển thị một số loại bánh xe quay để chỉ ra một công việc đang tiến hành mà không biết chính xác còn bao nhiêu thời gian để hoàn thành Nhiều công cụ dòng lệnh sử dụng thủ thuật này khi tải dữ liệu qua mạng. Bạn có thể tạo hoạt hình chuyển động dừng thực sự đơn giản từ một chuỗi các ký tự sẽ quay vòng theo kiểu vòng tròn 53Vòng lặp lấy ký tự tiếp theo để in, sau đó di chuyển con trỏ đến đầu dòng và ghi đè lên bất kỳ ký tự nào trước đó mà không cần thêm dòng mới. Bạn không muốn có thêm khoảng trống giữa các đối số vị trí, vì vậy đối số dấu phân cách phải để trống. Ngoài ra, hãy lưu ý việc sử dụng các chuỗi thô của Python do các ký tự dấu gạch chéo ngược có trong nghĩa đen Khi bạn biết thời gian còn lại hoặc phần trăm hoàn thành nhiệm vụ, thì bạn có thể hiển thị thanh tiến trình động Trước tiên, bạn cần tính toán xem có bao nhiêu hashtag sẽ hiển thị và bao nhiêu khoảng trắng để chèn vào. Tiếp theo, bạn xóa dòng và xây dựng thanh từ đầu 54Như trước đây, mỗi yêu cầu cập nhật sẽ sơn lại toàn bộ dòng Ghi chú. Có một thư viện 18 giàu tính năng, cùng với một số công cụ tương tự khác, có thể hiển thị tiến trình theo cách toàn diện hơn nhiềuTạo âm thanh với >>> import os >>> os.linesep '\r\n' 94Nếu bạn đủ lớn để nhớ máy tính có loa PC, thì bạn cũng phải nhớ âm thanh bíp đặc biệt của chúng, thường được sử dụng để chỉ ra các sự cố phần cứng. Họ hầu như không thể tạo ra nhiều tiếng ồn hơn thế, nhưng các trò chơi điện tử dường như tốt hơn rất nhiều với nó Ngày nay, bạn vẫn có thể tận dụng chiếc loa nhỏ này, nhưng rất có thể máy tính xách tay của bạn không đi kèm với chiếc loa này. Trong trường hợp như vậy, bạn có thể bật mô phỏng chuông đầu cuối trong trình bao của mình để âm thanh cảnh báo hệ thống được phát thay thế Hãy tiếp tục và gõ lệnh này để xem thiết bị đầu cuối của bạn có thể phát âm thanh không 55Điều này thường sẽ in văn bản, nhưng cờ 20 cho phép giải thích các dấu gạch chéo ngược thoát. Như bạn có thể thấy, có một chuỗi thoát chuyên dụng 21, viết tắt của “alert”, tạo ra một ký tự chuông đặc biệt. Một số thiết bị đầu cuối phát ra âm thanh bất cứ khi nào họ nhìn thấy nóTương tự, bạn có thể in ký tự này bằng Python. Có lẽ trong một vòng lặp để tạo thành một loại giai điệu nào đó. Mặc dù đó chỉ là một ghi chú, nhưng bạn vẫn có thể thay đổi thời lượng tạm dừng giữa các lần liên tiếp. Đó có vẻ như là một món đồ chơi hoàn hảo để phát lại mã Morse Các quy tắc như sau
Theo các quy tắc đó, bạn có thể “in” tín hiệu SOS vô thời hạn theo cách sau 56Trong Python, bạn có thể triển khai nó chỉ trong mười dòng mã 57Có lẽ bạn thậm chí có thể tiến thêm một bước và tạo một công cụ dòng lệnh để dịch văn bản sang mã Morse? Mocking Python >>> import os >>> os.linesep '\r\n' 94 trong bài kiểm tra đơn vịNgày nay, bạn mong đợi rằng bạn gửi mã đáp ứng các tiêu chuẩn chất lượng cao. Nếu bạn khao khát trở thành một chuyên gia, bạn phải học cách kiểm tra mã của mình Kiểm thử phần mềm đặc biệt quan trọng trong các ngôn ngữ được nhập động, chẳng hạn như Python, không có trình biên dịch để cảnh báo bạn về những lỗi rõ ràng. Các lỗi có thể tìm đường đến môi trường sản xuất và không hoạt động trong một thời gian dài, cho đến một ngày khi một nhánh mã cuối cùng được thực thi Chắc chắn rồi, bạn có , trình kiểm tra loại và các công cụ khác để phân tích mã tĩnh để hỗ trợ bạn. Nhưng họ sẽ không cho bạn biết liệu chương trình của bạn có làm những gì nó phải làm ở cấp độ doanh nghiệp hay không Vì vậy, bạn có nên kiểm tra 94 không? . 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. Tuy nhiên, điều bạn muốn kiểm tra là liệu mã của bạn có đang gọi 94 vào đúng thời điểm với các tham số dự kiến hay không. Đó được gọi là một hành viBạn có thể kiểm tra các hành vi bằng cách mô phỏng các đối tượng hoặc chức năng thực. Trong trường hợp này, bạn muốn chế nhạo 94 để ghi lại và xác minh các yêu cầu của nóGhi chú. Bạn có thể đã nghe các điều khoản. dummy, fake, stub, spy, hoặc mock được sử dụng thay thế cho nhau. Một số người phân biệt giữa chúng, trong khi những người khác thì không Martin Fowler giải thích sự khác biệt của chúng trong một bảng thuật ngữ ngắn và gọi chung chúng là kiểm tra nhân đôi Mocking trong Python có thể được thực hiện gấp đôi. Đầu tiên, bạn có thể đi theo con đường truyền thống của các ngôn ngữ được gõ tĩnh bằng cách sử dụng phép nội xạ phụ thuộc. Điều này đôi khi có thể yêu cầu bạn thay đổi mã đang được kiểm tra, điều này không phải lúc nào cũng thực hiện được nếu mã được xác định trong thư viện bên ngoài 58Đây là ví dụ giống như tôi đã sử dụng trong phần trước để nói về thành phần chức năng. Về cơ bản, nó cho phép thay thế 94 bằng một chức năng tùy chỉnh của cùng một giao diện. Để kiểm tra xem nó có in đúng thông báo hay không, bạn phải chặn nó bằng cách đưa vào một hàm giả lập>>> 59Gọi mô hình này làm cho nó lưu thông báo cuối cùng trong một thuộc tính mà bạn có thể kiểm tra sau này, chẳng hạn như trong câu lệnh 50Trong một giải pháp hơi thay thế, thay vì thay thế toàn bộ hàm 94 bằng một trình bao bọc tùy chỉnh, bạn có thể chuyển hướng đầu ra tiêu chuẩn sang luồng ký tự giống như tệp trong bộ nhớ>>> 60Lần này, hàm gọi rõ ràng 94, nhưng nó để lộ tham số 43 của nó ra thế giới bên ngoàiTuy nhiên, một cách chế nhạo các đối tượng Pythonic hơn tận dụng mô-đun 31 tích hợp, sử dụng một kỹ thuật gọi là vá khỉ. Cái tên xúc phạm này bắt nguồn từ việc nó là một "mánh khóe bẩn thỉu" mà bạn có thể dễ dàng tự bắn vào chân mình. Nó kém thanh lịch hơn so với tiêm phụ thuộc nhưng chắc chắn nhanh chóng và tiện lợiGhi chú. Mô-đun 31 đã được thư viện chuẩn trong Python 3 hấp thụ, nhưng trước đó, nó là gói của bên thứ ba. Bạn đã phải cài đặt nó một cách riêng biệt 61Ngoài ra, bạn gọi nó là 31, trong khi trong Python 3, nó là một phần của mô-đun thử nghiệm đơn vị, vì vậy bạn phải nhập từ 34Bản vá khỉ làm gì là thay đổi triển khai một cách linh hoạt trong thời gian chạy. Một thay đổi như vậy có thể nhìn thấy trên toàn cầu, vì vậy nó có thể gây ra những hậu quả không mong muốn. Tuy nhiên, trên thực tế, việc vá lỗi chỉ ảnh hưởng đến mã trong thời gian thực hiện kiểm tra Để giả định 94 trong một trường hợp thử nghiệm, thông thường bạn sẽ sử dụng trình trang trí 36 và chỉ định mục tiêu để vá bằng cách tham chiếu đến mục tiêu đó bằng một tên đủ điều kiện, bao gồm tên mô-đun 62Điều này sẽ tự động tạo mô hình cho bạn và đưa nó vào chức năng kiểm tra. Tuy nhiên, bạn cần khai báo rằng chức năng kiểm tra của bạn chấp nhận mô hình ngay bây giờ. Đối tượng mô phỏng bên dưới có rất nhiều phương thức và thuộc tính hữu ích để xác minh hành vi Bạn có nhận thấy điều gì đặc biệt về đoạn mã đó không? Mặc dù đã thêm một hàm giả vào hàm, nhưng bạn không gọi nó trực tiếp, mặc dù bạn có thể. Mô hình được đưa vào đó chỉ được sử dụng để đưa ra các xác nhận sau đó và có thể để chuẩn bị bối cảnh trước khi chạy thử nghiệm Trong cuộc sống thực, chế nhạo giúp cô lập mã đang kiểm tra bằng cách loại bỏ các phụ thuộc như kết nối cơ sở dữ liệu. Bạn hiếm khi gọi các bản giả trong một bài kiểm tra, vì điều đó không có nhiều ý nghĩa. Thay vào đó, đó là những đoạn mã khác gián tiếp gọi mô hình của bạn mà bạn không biết Đây là ý nghĩa của nó 63Mã đang kiểm tra là một chức năng in lời chào. Mặc dù đây là một chức năng khá đơn giản, nhưng bạn không thể dễ dàng kiểm tra nó vì nó không trả về giá trị. Nó có tác dụng phụ Để loại bỏ tác dụng phụ đó, bạn cần loại bỏ sự phụ thuộc. Việc vá lỗi cho phép bạn tránh thực hiện các thay đổi đối với chức năng ban đầu, điều này có thể vẫn là bất khả tri về 94. Nó nghĩ rằng nó đang gọi 94, nhưng trên thực tế, nó đang gọi một kẻ giả mạo mà bạn có toàn quyền kiểm soátCó nhiều lý do để kiểm thử phần mềm. Một trong số họ đang tìm kiếm lỗi. Ví dụ, khi bạn viết bài kiểm tra, bạn thường muốn loại bỏ hàm 94 bằng cách chế nhạo nó. Tuy nhiên, nghịch lý thay, chính chức năng đó có thể giúp bạn tìm lỗi trong quá trình gỡ lỗi có liên quan mà bạn sẽ đọc trong phần tiếp theoCú pháp trong Python 2Hiển thị/Ẩn Bạn không thể vá câu lệnh 02 trong Python 2, bạn cũng không thể đưa nó vào làm phụ thuộc. Tuy nhiên, bạn có một vài lựa chọn khác
Hãy kiểm tra từng cái một Chuyển hướng luồng gần giống với ví dụ bạn đã thấy trước đó >>> 64Chỉ có hai sự khác biệt. Đầu tiên, cú pháp chuyển hướng luồng sử dụng chữ cái chevron ( 44) thay vì đối số 43. Sự khác biệt khác là nơi 46 được xác định. Bạn có thể nhập nó từ mô-đun 46 có tên tương tự hoặc 48 để triển khai nhanh hơnVá đầu ra tiêu chuẩn từ mô-đun 04 đúng như tên gọi của nó, nhưng bạn cần lưu ý một số vấn đề 65Trước hết, hãy nhớ cài đặt mô-đun 31 vì nó không có sẵn trong thư viện chuẩn của Python 2Thứ hai, câu lệnh 02 gọi phương thức 40 cơ bản trên đối tượng giả định thay vì gọi chính đối tượng đó. Đó là lý do tại sao bạn sẽ chạy xác nhận đối với 53Cuối cùng, một câu lệnh 02 không phải lúc nào cũng tương ứng với một lần gọi tới 55. Trên thực tế, bạn sẽ thấy ký tự xuống dòng được viết riêngTùy chọn cuối cùng bạn có là nhập 94 từ 57 và vá nó 66Một lần nữa, nó gần giống với Python 3, nhưng hàm 94 được định nghĩa trong mô-đun 59 thay vì 60>>> import os >>> os.linesep '\r\n' 94 Gỡ lỗiTrong phần này, bạn sẽ xem xét các công cụ có sẵn để gỡ lỗi trong Python, bắt đầu từ một hàm khiêm tốn 94, thông qua mô-đun 63, cho đến một trình gỡ lỗi chính thức. Sau khi đọc nó, bạn sẽ có thể đưa ra quyết định sáng suốt về cách nào phù hợp nhất trong một tình huống nhất địnhGhi chú. Gỡ lỗi là quá trình tìm kiếm nguyên nhân gốc rễ của lỗi hoặc khiếm khuyết trong phần mềm sau khi chúng được phát hiện, cũng như thực hiện các bước để khắc phục chúng Thuật ngữ lỗi có nguồn gốc tên của nó truy tìmCòn được gọi là gỡ lỗi in hoặc gỡ lỗi thượng cổ, đây là hình thức gỡ lỗi cơ bản nhất. Mặc dù hơi lỗi thời nhưng nó vẫn mạnh mẽ và có công dụng của nó Ý tưởng là đi theo đường dẫn thực thi chương trình cho đến khi chương trình dừng đột ngột hoặc đưa ra kết quả không chính xác để xác định chính xác lệnh có vấn đề. Bạn làm điều đó bằng cách chèn các câu lệnh in với các từ nổi bật ở những nơi được lựa chọn cẩn thận Hãy xem ví dụ này, biểu hiện lỗi làm tròn >>> 67Như bạn có thể thấy, hàm không trả về giá trị mong muốn là 64, nhưng bây giờ bạn biết đó là do tổng hơi sai. Theo dõi trạng thái của các biến ở các bước khác nhau của thuật toán có thể cho bạn gợi ý về vấn đềLỗi làm trònHiển thị/Ẩn Trong trường hợp này, vấn đề nằm ở chỗ số dấu phẩy động được biểu diễn như thế nào trong bộ nhớ máy tính. Hãy nhớ rằng các số được lưu trữ ở dạng nhị phân. Giá trị thập phân của 64 hóa ra có biểu diễn nhị phân vô hạn, được làm trònĐể biết thêm thông tin về cách làm tròn số trong Python, bạn có thể xem Cách làm tròn số trong Python Phương pháp này đơn giản, trực quan và sẽ hoạt động với hầu hết mọi ngôn ngữ lập trình hiện có. Chưa kể, đó là một bài tập tuyệt vời trong quá trình học tập Mặt khác, một khi bạn nắm vững các kỹ thuật nâng cao hơn, thì rất khó để quay lại, vì chúng cho phép bạn tìm lỗi nhanh hơn nhiều. Truy tìm là một quy trình thủ công tốn nhiều công sức, có thể để lọt nhiều lỗi hơn nữa. Chu kỳ xây dựng và triển khai cần có thời gian. Sau đó, bạn cần nhớ loại bỏ tỉ mỉ tất cả các cuộc gọi 94 mà bạn đã thực hiện mà không vô tình chạm vào cuộc gọi chính hãngBên cạnh đó, nó yêu cầu bạn thực hiện các thay đổi trong mã, điều này không phải lúc nào cũng có thể thực hiện được. Có thể bạn đang gỡ lỗi một ứng dụng đang chạy trong máy chủ web từ xa hoặc muốn chẩn đoán sự cố theo kiểu khám nghiệm tử thi. Đôi khi bạn chỉ đơn giản là không có quyền truy cập vào đầu ra tiêu chuẩn Đó chính xác là nơi khai thác gỗ tỏa sáng ghi nhật kýGiả sử bạn đang điều hành một trang web thương mại điện tử trong một phút. Một ngày nọ, một khách hàng tức giận gọi điện thoại phàn nàn về một giao dịch không thành công và nói rằng anh ta đã mất tiền. 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 đó. Tuy nhiên, khi anh ta kiểm tra tài khoản ngân hàng của mình, tiền đã biến mất Bạn chân thành xin lỗi và hoàn tiền, nhưng cũng không muốn điều này lặp lại trong tương lai. Làm thế nào để bạn gỡ lỗi đó? Bất cứ khi nào bạn thấy mình đang gỡ lỗi bản in, hãy cân nhắc biến nó thành thông báo tường trình vĩnh viễn. Điều này có thể hữu ích trong những tình huống như thế này, khi bạn cần phân tích một vấn đề sau khi nó xảy ra, trong một môi trường mà bạn không có quyền truy cập Có những công cụ tinh vi để tổng hợp và tìm kiếm nhật ký, nhưng ở cấp độ cơ bản nhất, bạn có thể coi nhật ký là tệp văn bản. Mỗi dòng truyền tải thông tin chi tiết về một sự kiện trong hệ thống của bạn. Thông thường, nó sẽ không chứa thông tin nhận dạng cá nhân, tuy nhiên, trong một số trường hợp, nó có thể được pháp luật quy định Đây là bảng phân tích của một bản ghi nhật ký điển hình 68Như bạn có thể thấy, nó có dạng cấu trúc. Ngoài một thông báo mô tả, có một số trường có thể tùy chỉnh, cung cấp ngữ cảnh của một sự kiện. Tại đây, bạn có ngày giờ chính xác, cấp nhật ký, tên nhật ký và tên luồng Các cấp nhật ký cho phép bạn lọc tin nhắn nhanh chóng để giảm tiếng ồn. Ví dụ: nếu bạn đang tìm lỗi, bạn không muốn xem tất cả các cảnh báo hoặc thông báo gỡ lỗi. Việc tắt hoặc bật thông báo ở các cấp nhật ký nhất định thông qua cấu hình là chuyện nhỏ mà không cần chạm vào mã Với tính năng ghi nhật ký, bạn có thể giữ các thông báo gỡ lỗi của mình tách biệt với đầu ra tiêu chuẩn. Theo mặc định, tất cả các thông báo nhật ký đều chuyển đến luồng lỗi tiêu chuẩn, có thể hiển thị thuận tiện bằng các màu khác nhau. Tuy nhiên, bạn có thể chuyển hướng thông điệp tường trình sang các tệp riêng biệt, ngay cả đối với các mô-đun riêng lẻ Khá phổ biến, ghi nhật ký bị định cấu hình sai có thể dẫn đến hết dung lượng trên đĩa của máy chủ. Để ngăn chặn điều đó, bạn có thể thiết lập xoay vòng nhật ký, thao tác này sẽ giữ các tệp nhật ký trong một khoảng thời gian nhất định, chẳng hạn như một tuần hoặc khi chúng đạt đến một kích thước nhất định. Tuy nhiên, lưu trữ các nhật ký cũ hơn luôn là một cách thực hành tốt. Một số quy định buộc dữ liệu khách hàng phải được lưu giữ trong vòng 5 năm So với các ngôn ngữ lập trình khác, đăng nhập Python đơn giản hơn, vì mô-đun 63 đi kèm với thư viện chuẩn. Bạn chỉ cần nhập và định cấu hình nó chỉ trong hai dòng mã 69Bạn có thể gọi các hàm được xác định ở cấp độ mô-đun, được nối với trình ghi nhật ký gốc, nhưng thực tế phổ biến hơn là lấy một trình ghi nhật ký chuyên dụng cho từng tệp nguồn của bạn 70Ưu điểm của việc sử dụng trình ghi nhật ký tùy chỉnh là kiểm soát chi tiết hơn. Chúng thường được đặt tên theo mô-đun mà chúng được xác định thông qua biến 68Ghi chú. Có một mô-đun 69 hơi liên quan trong Python, mô-đun này cũng có thể ghi thông báo vào luồng lỗi tiêu chuẩn. Tuy nhiên, nó có phổ ứng dụng hẹp hơn, chủ yếu là mã thư viện, trong khi các ứng dụng khách nên sử dụng mô-đun 63Điều đó nói rằng, bạn có thể làm cho họ làm việc cùng nhau bằng cách gọi 71Một lý do cuối cùng để chuyển từ chức năng 94 sang ghi nhật ký là sự an toàn của luồng. Trong phần sắp tới, bạn sẽ thấy rằng phần trước không hoạt động tốt với nhiều luồng thực thigỡ lỗiSự thật là cả truy tìm và ghi nhật ký đều không thể được coi là gỡ lỗi thực sự. Để thực hiện gỡ lỗi thực tế, bạn cần một công cụ gỡ lỗi, cho phép bạn thực hiện các thao tác sau
Trình gỡ lỗi thô chạy trong thiết bị đầu cuối, không có gì ngạc nhiên khi được đặt tên là 73 cho “Trình gỡ lỗi Python,” được phân phối như một phần của thư viện chuẩn. Điều này làm cho nó luôn khả dụng, vì vậy nó có thể là lựa chọn duy nhất của bạn để thực hiện gỡ lỗi từ xa. Có lẽ đó là một lý do tốt để làm quen với nóTuy nhiên, nó không đi kèm với giao diện đồ họa nên việc sử dụng 73 có thể hơi phức tạp. Nếu bạn không thể chỉnh sửa mã, bạn phải chạy mã đó dưới dạng mô-đun và chuyển vị trí tập lệnh của bạn 71Nếu không, bạn có thể thiết lập một điểm ngắt trực tiếp trong mã, điểm dừng này sẽ tạm dừng việc thực thi tập lệnh của bạn và đưa bạn vào trình gỡ lỗi. Cách cũ để làm điều này cần hai bước >>> 72Thao tác này sẽ hiển thị lời nhắc tương tác, thoạt nhìn có vẻ đáng sợ. Tuy nhiên, bạn vẫn có thể nhập Python nguyên gốc vào thời điểm này để kiểm tra hoặc sửa đổi trạng thái của các biến cục bộ. 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ã Ghi chú. Theo thông lệ, bạn sẽ đặt hai hướng dẫn để khởi động trình gỡ lỗi trên một dòng. Điều này yêu cầu sử dụng dấu chấm phẩy, hiếm khi được tìm thấy trong các chương trình Python 73Mặc dù chắc chắn không phải Pythonic, nhưng nó nổi bật như một lời nhắc xóa nó sau khi bạn hoàn tất việc gỡ lỗi Kể từ Python 3. 7, bạn cũng có thể gọi hàm 75 tích hợp sẵn, hàm này thực hiện điều tương tự, nhưng theo cách nhỏ gọn hơn và có thêm một số 74Hầ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ànTrước đây, tôi đã đề cập sơ qua về vấn đề an toàn của luồng, khuyến nghị sử dụng 63 thay vì chức năng 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 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 có thể xảy ra chuyển đổi ngữ cảnh trong khi gọi tới 55, đan xen các đoạn văn bản từ nhiều lệnh gọi 94Ghi 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 75Để mô phỏng điều này, bạn có thể tăng khả năng chuyển ngữ cảnh bằng cách đặt phương thức 40 cơ bản ở chế độ ngủ trong một khoảng thời gian ngẫu nhiên. Làm sao? 76Trước tiên, bạn cần lưu trữ phương thức 40 ban đầu 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 chủ đề sẽ thực hiện một vài cuộc gọi 94 với tên của nó và một chữ cái. A, B và CNế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 84 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 77Mặc dù bản thân 55 là một phép toán nguyên tử, nhưng một lần gọi hàm 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 78Điều này sẽ khắc phục đầu ra 79Tuy nhiên, lưu ý rằng hàm 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 88 vô dụng 80Phiên bản thực sự an toàn cho luồng của hàm 94 có thể trông như thế này 81Bạn có thể đặt chức năng đó trong một mô-đun và nhập nó vào nơi khác 82Bây giờ, mặc dù thực hiện hai lần ghi cho mỗi yêu cầu 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 83Tô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 63 đượ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>>> 84Đó là một lý do khác khiến bạn có thể không muốn sử dụng hàm 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ề 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 94 là về đầu ra, có các hàm và thư viện cho đầu vàoĐược xây dựng trongPython đi kèm với một chức năng tích hợp sẵn để chấp nhận đầu vào từ người dùng, có thể đoán trước được gọi là 95. 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>>> 85Hà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 86Tham 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 >>> 87Tuy 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 96, đây là một tích hợp khác. Thật không may, cũng có một hàm 95 được đặt tên gây hiểu nhầm, thực hiện một việc hơi khácTrê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 96 được đổi tên thành 95Dướ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 Python 2Python 3 96 95 95 03Như 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 95 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 05 để 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>>> 88Mô-đun 06 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>>> 89Cá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ứ baCó 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
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
Tuy nhiên, điều đáng nói là một công cụ dòng lệnh có tên là 11 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 độngGiả 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ố 90Thoạt nhìn, nó giống như một lời nhắc điển hình khi bạn chạy nó 91Như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. 92Bây giờ, bạn có thể gói cùng một tập lệnh bằng lệnh 11. 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 93Điều đó không tuyệt sao? Phần kết luậnBây giờ bạn đã được trang bị một lượng kiến thức về hàm 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 2Ngoài ra, bạn đã học cách
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ề BartoszMỗ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 » Chuyên gia Kỹ năng Python trong thế giới 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ẻ EmailBà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. 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 Kết thúc ='\ T nghĩa là gì trong Python?Tham số kết thúc trong hàm in là dùng để thêm bất kỳ chuỗi nào . Ở cuối đầu ra của câu lệnh in trong python.
end =' trong Python là gì?Tham số “kết thúc” lần đầu tiên được xác định trong Python 3. 0. Trong các phiên bản trước của python, không có “end”. Mục đích của end là nối thêm một chuỗi vào cuối print(). Việc nối thêm một chuỗi vào một chuỗi khác cũng có thể được thực hiện bằng toán tử “+” còn được gọi là toán tử nối
Chúng ta có thể sử dụng Endl trong Python không?Trong C++, std. endl được sử dụng để thêm trả về và xóa chuỗi. Trong Python, không cần sử dụng chức năng đặc biệt này, ngoại trừ các mục đích sử dụng cụ thể .
Thay thế cho kết thúc bằng Python là gì?Trong Python 2, nó có thể bị chặn bằng cách đặt ',' ở cuối. Trong Python 3, "end =' '" nối thêm khoảng trắng thay vì xuống dòng . |