Hàm nào in đầu ra ra bàn điều khiển trong Python?
Hàm Python nào được sử dụng cho đầu ra của bàn điều khiển? Ngày 23 tháng 1 năm 2021 Cập nhật lần cuối. Ngày 5 tháng 5 năm 2022 Miễn bình luận Show
Chia sẻ Tweet Chia sẻ Ghim Ngân hàng câu hỏi CNTT › Danh mục. CCNP › Hàm Python nào được sử dụng cho đầu ra của bảng điều khiển? Hàm Python nào được sử dụng cho đầu ra của bàn điều khiển?
Giải thích. Lệnh in được sử dụng cho đầu ra của bàn điều khiển. Lệnh for được sử dụng cho logic lặp lại, from được sử dụng để nhập mô-đun và return là định nghĩa hàm. Câu hỏi khác. Câu trả lời cho kỳ thi thực hành chứng chỉ CCNP ENCOR v8 Vui lòng đăng nhập hoặc đăng ký để gửi câu trả lời của bạn 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ềuKeep reading to take full advantage of this seemingly boring and unappreciated little function. This tutorial will get you up to speed with using Python 94 effectively. However, prepare for a deep dive as you go through the sections. You may be surprised how much 94 has to offerBy the end of this tutorial, you’ll know how to
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 Note. 94 was a major addition to Python 3, in which it replaced the old 02 statement available in Python 2There were a number of good reasons for that, as you’ll see shortly. Although this tutorial focuses on Python 3, it does show the old way of printing in Python for reference 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. Đến cuối phần này, bạn sẽ biết mọi cách có thể để gọi 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àmLoại bỏ các quảng cáoĐang gọi >>> import os >>> os.linesep '\r\n' 94Ví dụ đơn giản nhất về việc sử dụng Python 94 chỉ cần một vài lần nhấn phím>>> 2Bạ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 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ự. 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 >>> 0Notice 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>>> 8Keep 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 0The first one is one character long, whereas the second one has no content Ghi chú. To remove the newline character from a string in Python, use its 19 method, like this>>> 2This 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>>> 4This 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 PEP 8 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 7Điều bạn muốn làm là đặt văn bản chứa dấu ngoặc kép trong dấu ngoặc đơn 8Thủ thuật tương tự sẽ hoạt động theo cách khác 0Ngoài ra, bạn có thể sử dụng các chuỗi ký tự thoát đã đề cập trước đó, để làm cho Python coi các dấu ngoặc kép bên trong đó theo nghĩa đen là một phần của chuỗi ký tự 1Chạy trốn là tốt và bảnh bao, nhưng đôi khi nó có thể cản trở. Cụ thể, khi bạn cần chuỗi của mình chứa tương đối nhiều ký tự gạch chéo ngược ở dạng chữ Một ví dụ kinh điển là đường dẫn tệp trên Windows 2Lưu ý cách mỗi ký tự dấu gạch chéo ngược cần được thoát bằng một dấu gạch chéo ngược khác Điều này thậm chí còn nổi bật hơn với các biểu thức thông thường, nhanh chóng trở nên phức tạp do sử dụng nhiều ký tự đặc biệt 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 một dòng mới ban đầu, 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>>> 8This will take care of unindenting paragraphs for you. 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 As with any function, it doesn’t matter whether you pass a literal, a variable, or an expression. Unlike many other functions, however, 94 will accept anything regardless of its typeCho đế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 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 7Đó là bởi vì hồi đó 02 không phải là một chức năng, như bạn sẽ thấy trong phần tiếp theo. 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 bộ >>> 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 >>> 00Điểm mấu chốt là bạn không nên gọi 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 41, bạn sẽ đọc thêm về điều này trong phần có liên quanLoại bỏ các quảng cáoTá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 một thông báo đượ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. 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 >>> 01Vì 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 đề. Trao đổi chúng ra vẫn sẽ cho kết quả tương tự >>> 02Ngượ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 >>> 03 94 cho phép số lượng đối số vị trí tùy ý nhờ tham số 44Hãy xem ví dụ này >>> 04 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ư 46Lư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 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>>> 05Ngoài việc chấp nhận một số lượng đối số vị trí khác nhau, 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 49 từ trình thông dịch tương tácBây giờ hãy tập trung vào 50. It stands for separator and is assigned a single space ( 51) by default. 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 cái sau có tác dụng tương tự như khoảng trắng mặc định>>> 06Nế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)>>> 07Bạn có thể muố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 đó>>> 08Mộ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>>> 09Hã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 >>> 80Cụ 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 một 57 nổi tiếng nếu ít nhất một trong các phần tử không phải là một chuỗi>>> 81Sẽ an toàn hơn nếu chỉ giải nén trình tự bằng toán tử sao ( 58) và để 94 xử lý việc truyền kiểu>>> 82Giả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) >>> 83Đ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ỳ>>> 84Trong 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 >>> 85Mặt khác, nếu bạn giữ chúng, bạn sẽ chuyển một phần tử bộ dữ liệu duy nhất cho câu lệnh 02>>> 86Hơ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 >>> 87Đó là cách định dạng chuỗi mặc định cho đến khi phương thức 65 được nhập từ Python 3Loại bỏ các quảng cáoNgă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 88Many programming languages expose functions similar to 94 through their standard libraries, but they let you decide whether to add a newline or not. 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 phải thêm 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 Ngôn ngữVí dụPerl 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ần 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ề 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 >>> 89Ví 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 >>> 00Mặt khác, khi bạn mở 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 01Mặc dù đây là hai cuộc 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 02Tuy 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ư 03Như 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 04Ba hướng dẫn này sẽ xuất ra một dòng văn bản 05Bạn có thể trộn hai đối số từ khóa 06Bạ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 07Khô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ó 08Nó sẽ in ra đoạn văn bản sau 09Như 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ú. Looping over lines in a text file preserves their own newline characters, which combined with the 94 function’s default behavior will result in a redundant newline character>>> 20Có 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 21Ngoà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 94. Bạn sẽ sử dụng đối số từ khóa 74 để làm điều đó>>> 22Bằ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 23Tuy 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 24Lưu ý rằng có một khoảng cách giữa các từ 000 và 001 25Để 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 trở lại mô-đun 004 26Điều này sẽ in đầu ra chính xác mà không cần thêm dung lượng 27Trong khi sử dụng mô-đun 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útLoại bỏ các quảng cáoIn ra một tập tinDù bạn có tin hay không thì tùy, 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 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 thác 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 Đầ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 28Trừ 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 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 29Đó gọi là chuyển hướng luồng Lỗi tiêu chuẩn tương tự như 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 010, bạn cần biết về bộ mô tả tệp, còn được gọi là trình xử lý tệpChú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. Bên dưới, bạn sẽ tìm thấy bản tóm tắt các bộ mô tả tệp cho một họ hệ điều hành tuân thủ POSIX StreamFile Descriptor 0080 0091 0102Biế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ả 018Chuyển hướng 009 020Chuyển hướng 010 022Chuyển hướng 009 và 010 sang các tệp riêng biệt 025Chuyển hướng 009 và 010 sang cùng một tệpLư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 009 và 010Chạy cửa sổ công cụ trong PyCharmWhile both 009 and 010 are write-only, 008 is read-only. 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 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 004 được tích hợp sẵn>>> 40Như 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 037 và 038 cũng như các phương thức 039 và 040 cùng nhiều phương thức khácTheo mặc định, 94 bị ràng buộc với 042 thông qua đối số 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 đó 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 94 để ghi dữ liệu nhị phân vì nó chỉ phù hợp với văn bảnChỉ cần gọi trực tiếp tệp nhị phân là 040 42Nế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ì 042 là một luồng ký tự>>> 43Thay vào đó, bạn phải đào sâu hơn để xử lý luồng byte bên dưới >>> 44Điều này in một chữ cái viết hoa 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 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ố 038 của 86 45Thay 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 94 trong các bài kiểm tra đơn vị>>> 46Nế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 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ếtCú pháp trong Python 2Hiển thị/Ẩn Có một cú pháp đặc biệt trong Python 2 để thay thế 042 mặc định bằng một tệp tùy chỉnh trong câu lệnh 02 47Bởi vì các chuỗi và byte được biểu diễn bằng cùng một loại 055 trong Python 2, nên câu lệnh 02 có thể xử lý tốt dữ liệu nhị phân 48Mặc dù, có một vấn đề với mã hóa ký tự. Hàm 86 trong Python 2 thiếu tham số 038, điều này thường dẫn đến sự cố đáng sợ 059>>> 49Lư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 70Alternatively, 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 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 72Tuy nhiên, một tùy chọn thuận tiện hơn là sử dụng mô-đun 060 tích hợp sẵn 73Nó 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' 94Trong tiểu mục trước, bạn đã biết rằng 94 ủy quyền in cho một đối tượng giống như tệp, chẳng hạn như 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 74Nỗ lực đầu tiên của bạn có thể trông giống như thế này 75Miễn là biế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 065 và kết thúc dòngThậ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
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 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ờ 067 của 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 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 saoCú 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 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 77Ngoà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ờ 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 071 78Lưu ý rằng 94 đã được nhập vào Python 2 và được cung cấp thông qua mô-đun 41. Thật không may, nó không đi kèm với tham số 067>>> 79What you’re seeing here is a docstring of the 94 function. 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 chức năng 076 tích hợpIn các loại dữ liệu tùy chỉnhCho đế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 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>>> 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 078, cuối cùng bạn sẽ cần xác định một lớp. Hãy xem ví dụ này 81Nếu bây giờ bạn tạo một thể hiện của lớp 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 077 tương đương>>> 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 trong đó 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 077 và một lớp tùy chỉnh thông qua kế thừa 83Lớ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 084 có thể được thay thế bằng dấu chấm lửng ( 085) để biểu thị một trình giữ chỗ 84Điều này ngăn trình thông dịch nâng cao 086 do thiếu khối mã thụt lềĐiều đó tốt hơn một 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 >>> 85Cú 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 94 gọi ngầm hàm 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 30 theo cách thủ công đối với một thể hiện của lớp 078 thông thường mang lại kết quả tương tự như in nó>>> 86Ngược lại, 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
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 095>>> 87Lưu ý việc sử dụng một hàm dựng sẵn khác, 096, luôn cố gắng gọi 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 94 sử dụng 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 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 88Nếu bạn in một đối tượng của lớp 801, thì bạn sẽ không thấy mật khẩu, bởi vì 802 sẽ gọi 803, mà cuối cùng sẽ gọi 804>>> 89Tuy nhiên, nếu bạn đặt cùng một biế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>>> 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 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 096Python 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 The semantics of 806 and 097 didn’t change since Python 2, but you must remember that strings were nothing more than glorified byte arrays back then. Để 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. 810Đây là một ví dụ về cùng một lớp 801 trong Python 2 01Như 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 812 tích hợp sẵnCả hai phương thức 806 và 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 815 là hằng số đặc biệt để biểu thị các ký tự vui nhộn, chẳng hạn như 816, dưới dạng các chuỗi thoát trong ASCII đơn giản, chẳng hạn như 817Câu lệnh 02 đang tìm kiếm phương thức 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 059 hoặc thậm chí bị cắt xén>>> 02Tuy 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 >>> 03Bạn nên chuyển đổi các 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 nó 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 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 822 thực hiện điều đó>>> 04Sử dụng hàm 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 824 của nó được xác định trong lớp tương ứngLoại bỏ các quảng cáoHiểu về Python >>> import os >>> os.linesep '\r\n' 94Bạn biết cách sử dụng 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 quaIn là một chức năng trong Python 3Bạn đã thấy rằng 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>>> 05Nó 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 >>> 06Bằ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 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ư 829>>> 07Bâ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 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 94 ngay từ đầu nếu đó không phải là một chức năngMặt khác, 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 32>>> 08Trê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 đó, mà cuối cùng là thay đổi trạng thái toàn cục. Trong trường hợp của 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ệpVì 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. You can quickly find its documentation using the editor of your choice, without having to remember some weird syntax for performing a certain taskBê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 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ố. This way, you can assign a function to a variable, pass it to another function, or even return one from another. 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 09Ở đây, tham số 838 cho phép bạn thêm chức năng gọi lại, mặc định là 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ế 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
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 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>>> 10Chứ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 842Khô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ế 94 bằng, bạn có thể tạo một biểu thức lambda ẩn danh để gọi nó>>> 11Tuy 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 >>> 12Python 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à 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 94 gây ra nhiều vấn đề đau đầu như thế nàoLoại bỏ các quảng cáo>>> import os >>> os.linesep '\n' 02 Là một Tuyên bố trong Python 2Mộ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 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
Ghi chú. Trăn 3. 8 mang đến một toán tử hải mã gây tranh cãi ( 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ácHã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 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 15Tranh cãi đằng sau đoạn cú pháp mới này đã gây ra nhiều tranh cãi. 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ư 848, 853 hoặc 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. Đó là lý do tại sao không thể xác định lại hoặc chế nhạo câu lệnh 02 trong Python 2. Bạn bị mắc kẹt với những gì bạn nhận đượcNgoà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 >>> 16Cú pháp của câu lệnh 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>>> 17Vào những thời điểm khác, họ thay đổi cách in tin nhắn >>> 18Nối chuỗi có thể tăng 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>>> 19So 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ự >>> 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. Thay vào đó, bạn cần nhớ cú pháp kỳ quặc. Ngay cả hàm 076 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 previous section 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 863 statementTo find out exactly what features are available to you, inspect the module >>> 22You could also call 864, 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 067 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 Loại bỏ các quảng cáoPrinting 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 870 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 >>> 25This is an example of Magic in IPython. There are a lot of built-in commands that start with a percent sign ( 872), 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 874 in your code using import renaming>>> 26Personally, I like to have both functions at my fingertips, so I’d rather use something like 875 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 874 calls 096 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, 874 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 881 module as well>>> 33This module supports most of the built-in types and is used by the Python debugger 874 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 883 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 870 module has an additional 885 function that returns a string, in case you had to do something other than printing itSurprisingly, the signature of 874 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 structuresLoại bỏ các quảng cáoAdding 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 888 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 889 or 890, 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 891 in hexadecimal or 892 in octal. You may use Python number literals to quickly verify it’s indeed the same number. >>> 36Ngoài ra, bạn có thể lấy nó bằng chuỗi thoát 893 trong trình bao 37Cá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 894 895mở dấu ngoặc vuông 895mã sốmột hoặc nhiều số được phân tách bằng 897 898mã ký tự chữ hoa hoặc chữ thường 899Mã 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 899 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ố 39Bạ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 In Python, you’d probably write a helper function to allow for wrapping arbitrary codes into a sequence >>> 40This would make the word 001 appear in red, bold, and underlined fontHowever, there are higher-level abstractions over ANSI escape codes, such as the mentioned 888 library, as well as tools for building user interfaces in the consoleLoại bỏ các quảng cáoBuilding Console User InterfacesWhile playing with ANSI escape codes is undeniably a ton of fun, in the real world you’d rather have more abstract building blocks to put together a user interface. There are a few libraries that provide such a high level of control over the terminal, but 003 seems to be the most popular choiceNote. To use the 003 library in Windows, you need to install a third-party package 41That’s because 003 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 003 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 007, 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 44Let’s define the snake as a list of points in screen coordinates 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 008 coordinates, so you can unpack them 46Again, if you run this code now, it won’t display anything, because you must explicitly refresh the screen afterward 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 48How 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 49To 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 009, 010, and 011 functionsThe direction will change on a keystroke, so you need to call 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 50By default, however, 012 is a blocking call that would prevent the snake from moving unless there was a keystroke. Therefore, you need to make the call non-blocking by adding yet another configuration 51You’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 52This is merely scratching the surface of the possibilities that the 003 module opens up. You may use it for game development like this or more business-oriented applicationsLiving It Up With Cool AnimationsNot only can animations make the user interface more appealing to the eye, but they also improve the overall user experience. 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 003 library. However, I’d like to show you an even simpler wayIf the animation can be constrained to a single line of text, then you might be interested in two special escape character sequences
The first one moves the cursor to the beginning of the line, whereas the second one moves it only one character to the left. 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 53The 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 54As before, each request for update repaints the entire line Note. Có một thư viện 018 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 độ theo cách toàn diện hơn nhiềuMaking Sounds With >>> import os >>> os.linesep '\r\n' 94If 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 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ế Go ahead and type this command to see if your terminal can play a sound 55This would normally print text, but the 020 flag enables the interpretation of backslash escapes. As you can see, there’s a dedicated escape sequence 021, which stands for “alert”, that outputs a special bell character. Some terminals make a sound whenever they see itSimilarly, 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
According to those rules, you could be “printing” an SOS signal indefinitely in the following way 56In Python, you can implement it in merely ten lines of code 57Maybe 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 TestsNowadays, 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 94? No. After all, it’s a built-in function that must have already gone through a comprehensive suite of tests. What you want to test, though, is whether your code is calling 94 at the right time with the expected parameters. That’s known as a behaviorYou can test behaviors by mocking real objects or functions. In this case, you want to mock 94 to record and verify its invocationsNote. 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 58This is the same example I used in an earlier section to talk about function composition. It basically allows for substituting 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>>> 59Calling this mock makes it save the last message in an attribute, which you can inspect later, for example in an 850 statementIn a slightly alternative solution, instead of replacing the entire 94 function with a custom wrapper, you could redirect the standard output to an in-memory file-like stream of characters>>> 60This time the function explicitly calls 94, but it exposes its 043 parameter to the outside worldHowever, a more Pythonic way of mocking objects takes advantage of the built-in 031 module, which uses a technique called monkey patching. 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 convenientNote. The 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 61Other than that, you referred to it as 031, whereas in Python 3 it’s part of the unit testing module, so you must import from 034What 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 94 in a test case, you’ll typically use the 036 decorator and specify a target for patching by referring to it with a fully qualified name, that is including the module name 62This 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 63The 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 94. It thinks it’s calling 94, but in reality, it’s calling a mock you’re in total control ofThere 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 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 sectionCú pháp trong Python 2Hiển thị/Ẩn You can’t monkey patch the 02 statement in Python 2, nor can you inject it as a dependency. However, you have a few other options
Let’s examine them one by one Stream redirection is almost identical to the example you saw earlier >>> 64There are only two differences. First, the syntax for stream redirection uses chevron ( 044) instead of the 043 argument. The other difference is where 046 is defined. Bạn có thể nhập nó từ mô-đun 046 có tên tương tự hoặc 048 để triển khai nhanh hơnVá đầu ra tiêu chuẩn từ mô-đun 004 đúng như tên gọi, nhưng bạn cần lưu ý một số vấn đề 65First of all, remember to install the 031 module as it wasn’t available in the standard library in Python 2Secondly, the 02 statement calls the underlying 040 method on the mocked object instead of calling the object itself. That’s why you’ll run assertions against 053Finally, a single 02 statement doesn’t always correspond to a single call to 055. In fact, you’ll see the newline character written separatelyThe last option you have is importing 94 from 057 and patching it 66Again, it’s nearly identical to Python 3, but the 94 function is defined in the 059 module rather than 060>>> import os >>> os.linesep '\r\n' 94 DebuggingIn this section, you’ll take a look at the available tools for debugging in Python, starting from a humble 94 function, through the 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 situationNote. 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 TracingAlso 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 >>> 67As you can see, the function doesn’t return the expected value of 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 isRounding 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 064 turns out to have an infinite binary representation, which gets roundedFor 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 94 calls you made without accidentally touching the genuine onesBesides, 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 LoggingLet’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. He claims to have tried purchasing a few items, but in the end, there was some cryptic error that prevented him from finishing that order. 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 68As 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. 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. 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 063 module is bundled with the standard library. You just import and configure it in as little as two lines of code 69You 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 70The advantage of using custom loggers is more fine-grain control. They’re usually named after the module they were defined in through the 068 variableNote. There’s a somewhat related 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 063 moduleThat said, you can make them work together by calling 071One last reason to switch from the 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 executionDebuggingThe 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
A crude debugger that runs in the terminal, unsurprisingly named 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 itHowever, it doesn’t come with a graphical interface, so using 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 71Otherwise, you can set up a breakpoint directly in the code, which will pause the execution of your script and drop you into the debugger. Cách cũ để làm điều này cần hai bước >>> 72This shows up an interactive prompt, which might look intimidating at first. 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ộ. Apart from that, there’s really only a handful of debugger-specific commands that you want to use for stepping through the code Note. 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. This requires the use of a semicolon, which is rarely found in Python programs 73While 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 075 function, which does the same thing, but in a more compact way and with some additional bells and whistles 74You’re probably going to use a visual debugger integrated with a code editor for the most part. PyCharm has an excellent debugger, which boasts high performance, but you’ll find plenty of alternative IDEs with debuggers, both paid and free of charge Debugging isn’t the proverbial silver bullet. Đôi khi ghi nhật ký hoặc theo dõi sẽ là một giải pháp tốt hơn. For example, defects that are hard to reproduce, such as race conditions, often result from temporal coupling. When you stop at a breakpoint, that little pause in program execution may mask the problem. It’s kind of like the Heisenberg principle. you can’t measure and observe a bug at the same time These methods aren’t mutually exclusive. They complement each other Thread-Safe PrintingI briefly touched upon the thread safety issue before, recommending 063 over the 94 function. If you’re still reading this, then you must be comfortable with the concept of threadsThread safety means that a piece of code can be safely shared between multiple threads of execution. The simplest strategy for ensuring thread-safety is by sharing immutable objects only. If threads can’t modify an object’s state, then there’s no risk of breaking its consistency Another method takes advantage of local memory, which makes each thread receive its own copy of the same object. That way, other threads can’t see the changes made to it in the current thread But that doesn’t solve the problem, does it? You often want your threads to cooperate by being able to mutate a shared resource. The most common way of synchronizing concurrent access to such a resource is by locking it. This gives exclusive write access to one or sometimes a few threads at a time However, locking is expensive and reduces concurrent throughput, so other means for controlling access have been invented, such as atomic variables or the compare-and-swap algorithm Printing isn’t thread-safe in Python. The 94 function holds a reference to the standard output, which is a shared global variable. In theory, because there’s no locking, a context switch could happen during a call to 055, intertwining bits of text from multiple 94 callsNote. A context switch means that one thread halts its execution, either voluntarily or not, so that another one can take over. This might happen at any moment, even in the middle of a function call In practice, however, that doesn’t happen. No matter how hard you try, writing to the standard output seems to be atomic. The only problem that you may sometimes observe is with messed up line breaks 75To simulate this, you can increase the likelihood of a context switch by making the underlying 040 method go to sleep for a random amount of time. How? By mocking it, which you already know about from an earlier section 76First, you need to store the original 040 method in a variable, which you’ll delegate to later. Then you provide your fake implementation, which will take up to one second to execute. Each thread will make a few 94 calls with its name and a letter. A, B, and CIf you read the mocking section before, then you may already have an idea of why printing misbehaves like that. Nonetheless, to make it crystal clear, you can capture values fed into your 084 function. You’ll notice that you get a slightly different sequence each time 77Even though 055 itself is an atomic operation, a single call to the 94 function can yield more than one write. For example, line breaks are written separately from the rest of the text, and context switching takes place between those writesNote. The atomic nature of the standard output in Python is a byproduct of the Global Interpreter Lock, which applies locking around bytecode instructions. Be aware, however, that many interpreter flavors don’t have the GIL, where multi-threaded printing requires explicit locking You can make the newline character become an integral part of the message by handling it manually 78This will fix the output 79Notice, however, that the 94 function still keeps making a separate call for the empty suffix, which translates to useless 088 instruction 80A truly thread-safe version of the 94 function could look like this 81You can put that function in a module and import it elsewhere 82Now, despite making two writes per each 94 request, only one thread is allowed to interact with the stream, while the rest must wait 83I added comments to indicate how the lock is limiting access to the shared resource Note. Even in single-threaded code, you might get caught up in a similar situation. Specifically, when you’re printing to the standard output and the standard error streams at the same time. Unless you redirect one or both of them to separate files, they’ll both share a single terminal window Conversely, the 063 module is thread-safe by design, which is reflected by its ability to display thread names in the formatted message>>> 84It’s another reason why you might not want to use the 94 function all the timePython Print CounterpartsBy now, you know a lot of what there is to know about 94. The subject, however, wouldn’t be complete without talking about its counterparts a little bit. While 94 is about the output, there are functions and libraries for the inputBuilt-InPython comes with a built-in function for accepting input from the user, predictably called 095. It accepts data from the standard input stream, which is usually the keyboard>>> 85The function always returns a string, so you might need to parse it accordingly 86The prompt parameter is completely optional, so nothing will show if you skip it, but the function will still work >>> 87Nevertheless, throwing in a descriptive call to action makes the user experience so much better Note. To read from the standard input in Python 2, you have to call 096 instead, which is yet another built-in. Unfortunately, there’s also a misleadingly named 095 function, which does a slightly different thingIn fact, it also takes the input from the standard stream, but then it tries to evaluate it as if it was Python code. Because that’s a potential security vulnerability, this function was completely removed from Python 3, while 096 got renamed to 095Here’s a quick comparison of the available functions and what they do Python 2Python 3 096 095 095 203As you can tell, it’s still possible to simulate the old behavior in Python 3 Asking the user for a password with 095 is a bad idea because it’ll show up in plaintext as they’re typing it. Trong trường hợp này, bạn nên sử dụng hàm 205 để che các ký tự đã nhập. This function is defined in a module under the same name, which is also available in the standard library>>> 88The 206 module has another function for getting the user’s name from an environment variable>>> 89Python’s built-in functions for handling the standard input are quite limited. Đồ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 Third-PartyThere are external Python packages out there that allow for building complex graphical interfaces specifically to collect data from the user. Some of their features include
Demonstrating such tools is outside of the scope of this article, but you may want to try them out. I personally got to know about some of those through the Python Bytes Podcast. Here they are
Nonetheless, it’s worth mentioning a command line tool called 211 that adds powerful line editing capabilities to your Python scripts for free. You don’t have to do anything for it to workLet’s assume you wrote a command-line interface that understands three instructions, including one for adding numbers 90At first glance, it seems like a typical prompt when you run it 91But as soon as you make a mistake and want to fix it, you’ll see that none of the function keys work as expected. Hitting the Left arrow, for example, results in this instead of moving the cursor back. 92Now, you can wrap the same script with the 211 command. Not only will you get the arrow keys working, but you’ll also be able to search through the persistent history of your custom commands, use autocompletion, and edit the line with shortcuts 93Isn’t that great? ConclusionYou’re now armed with a body of knowledge about the 94 function in Python, as well as many surrounding topics. You have a deep understanding of what it is and how it works, involving all of its key elements. Numerous examples gave you insight into its evolution from Python 2Apart from that, you learned how to
Now that you know all this, you can make interactive programs that communicate with users or produce data in popular file formats. You’re able to quickly diagnose problems in your code and protect yourself from them. 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 If you’re still thirsty for more information, have questions, or simply would like to share your thoughts, then feel free to reach out in the comments section below Mark as Completed Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding. The Python print() Function. Go Beyond the Basics 🐍 Python Tricks 💌 Get a short & sweet Python Trick delivered to your inbox every couple of days. No spam ever. Unsubscribe any time. Curated by the Real Python team Send Me Python Tricks » About Bartosz Zaczyński Bartosz is a bootcamp instructor, author, and polyglot programmer in love with Python. He helps his students get into software engineering by sharing over a decade of commercial experience in the IT industry » More about BartoszEach tutorial at Real Python is created by a team of developers so that it meets our high quality standards. The team members who worked on this tutorial are Aldren Joanna Mike Master Real-World Python Skills With Unlimited Access to Real Python Join us and get access to thousands of tutorials, hands-on video courses, and a community of expert Pythonistas Level Up Your Python Skills » Master Real-World Python Skills Join us and get access to thousands of tutorials, hands-on video courses, and a community of expert Pythonistas Level Up Your Python Skills » What Do You Think? Rate this article Tweet Share Share EmailWhat’s your #1 takeaway or favorite thing you learned? How are you going to put your newfound skills to use? Leave a comment below and let us know Commenting Tips. The most useful comments are those written with the goal of learning from or helping out other students. Get tips for asking good questions and get answers to common questions in our support portal Which function is used in Python to print output content to the console?Answer. In Python, the print() function is used to show the message on the screen/console. The message can be a string or anything but it will be converted into a string before printing to the screen.
Which function is used to print the output in Python?Python print() Function
The print() function prints the specified message to the screen, or other standard output device. The message can be a string, or any other object, the object will be converted into a string before written to the screen.
Một chức năng để xuất nội dung ra bàn điều khiển trong Python là gì?Chức năng in print function trong Python là một chức năng xuất ra cửa sổ bảng điều khiển của bạn bất cứ thứ gì bạn muốn in ra.
Which of the following functions print the output to the console?Câu trả lời được chuyên gia xác minh. Hàm print() sẽ in đầu ra ra bàn điều khiển. |