Lớp Python in địa chỉ bộ nhớ cục bộ

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

>>> import os
>>> os.linesep
'\r\n'
94. It helped you write your very own
>>> import os
>>> os.linesep
'\r\n'
95 one-liner. You can use it to display formatted messages onto the screen and perhaps find some bugs. But if you think that’s all there is to know about Python’s
>>> import os
>>> os.linesep
'\r\n'
94 function, then you’re missing out on a lot

Keep reading to take full advantage of this seemingly boring and unappreciated little function. This tutorial will get you up to speed with using Python

>>> import os
>>> os.linesep
'\r\n'
94 effectively. However, prepare for a deep dive as you go through the sections. You may be surprised how much
>>> import os
>>> os.linesep
'\r\n'
94 has to offer

By the end of this tutorial, you’ll know how to

  • Avoid common mistakes with Python’s
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94
  • Deal with newlines, character encodings, and buffering
  • Write text to files
  • Mock
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94 in unit tests
  • Build advanced user interfaces in the terminal

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.

>>> import os
>>> os.linesep
'\r\n'
94 was a major addition to Python 3, in which it replaced the old
>>> import os
>>> os.linesep
'\n'
02 statement available in Python 2

There 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

Free Bonus. Click here to get our free Python Cheat Sheet that shows you the basics of Python 3, like working with data types, dictionaries, lists, and Python functions

Printing in a Nutshell

Let’s jump in by looking at a few real-life examples of printing in Python. By the end of this section, you’ll know every possible way of calling

>>> import os
>>> os.linesep
'\r\n'
94. Or, in programmer lingo, you’d say you’ll be familiar with the function signature

Remove ads

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

The simplest example of using Python

>>> import os
>>> os.linesep
'\r\n'
94 requires just a few keystrokes

>>>

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

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

>>> import os
>>> os.linesep
'\r\n'
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]. Nó thường không có biểu diễn hiển thị trên màn hình, nhưng một số trình soạn thảo văn bản có thể hiển thị các ký tự không in được như vậy với ít đồ họa

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

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

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

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

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

>>>

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

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

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

>>>

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

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

>>>

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

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

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

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

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

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

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

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

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

>>>

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

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

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

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

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

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

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

Ghi chú. Để xóa ký tự xuống dòng khỏi chuỗi trong Python, hãy sử dụng phương thức

>>> import os
>>> os.linesep
'\n'
19 của nó, như thế này

>>>

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

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

Trong một tình huống phổ biến hơn, bạn muốn truyền đạt một số thông điệp tới người dùng cuối. Có một số cách để đạt được điều này

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

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

>>>

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

Điều này sẽ in nguyên văn tin nhắn lên màn hình

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

Chuỗi ký tự trong Python có thể được đặt trong dấu ngoặc đơn [

>>> import os
>>> os.linesep
'\n'
21] hoặc dấu ngoặc kép [
>>> import os
>>> os.linesep
'\n'
22]. Theo hướng dẫn phong cách PEP 8 chính thức, bạn chỉ nên chọn một và tiếp tục sử dụng nó một cách nhất quán. Không có sự khác biệt, trừ khi bạn cần lồng cái này vào cái khác

Ví dụ: bạn không thể sử dụng dấu ngoặc kép cho nghĩa đen và cũng bao gồm dấu ngoặc kép bên trong nó, vì điều đó không rõ ràng đối với trình thông dịch Python

>>> import os
>>> os.linesep
'\r\n'
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

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

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

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

Ngoà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ự

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

Chạ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

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

Lư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

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

May 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

>>> import os
>>> os.linesep
'\n'
23 hoặc
>>> import os
>>> os.linesep
'\n'
24 trước câu trích dẫn mở đầu, và bây giờ bạn sẽ có được điều này

>>> import os
>>> os.linesep
'\r\n'
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ừ

>>> import os
>>> os.linesep
'\n'
25 hoặc
>>> import os
>>> os.linesep
'\n'
26, thường được sử dụng làm chuỗi tài liệu

Đây là một ví dụ

>>> import os
>>> os.linesep
'\r\n'
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

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

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

Bạn cũng có thể sử dụng dấu gạch chéo ngược để loại bỏ dòng mới

>>> import os
>>> os.linesep
'\r\n'
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

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

>>>

>>> import os
>>> os.linesep
'\r\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

>>> import os
>>> os.linesep
'\n'
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ản

Thứ 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ã

>>>

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

Cuố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ả

>>>

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

Trê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

>>>

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

Hơ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

>>>

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

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

>>>

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

Trừ 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ú.

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

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ố

>>>

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

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

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

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

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

>>>

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

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

>>> import os
>>> os.linesep
'\n'
32. 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
>>> import os
>>> os.linesep
'\n'
33 chứ không phải là một chuỗi trống

>>>

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

Làm thế nào để

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

Ở 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

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

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

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

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

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

>>> import os
>>> os.linesep
'\n'
02 không phải là một chức năng, như bạn sẽ thấy trong phần tiếp theo. 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
>>> import os
>>> os.linesep
'\n'
02 như thể nó là một hàm?

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

>>>

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

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

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

Mặt khác, đặt dấu ngoặc đơn xung quanh nhiều mục sẽ tạo thành một bộ

>>>

>>> import os
>>> os.linesep
'\n'
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

>>>

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

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

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

Remove ads

Tách nhiều đối số

Bạn đã thấy

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

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

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

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

>>>

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

Vì các đối số có thể được xác định duy nhất theo tên nên thứ tự của chúng không thành vấn đề. Trao đổi chúng ra vẫn sẽ cho kết quả tương tự

>>>

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

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

>>>

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

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

Hãy xem ví dụ này

>>>

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

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

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

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

>>>

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

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

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

Bây giờ hãy tập trung vào

>>> import os
>>> os.linesep
'\n'
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 [
>>> import os
>>> os.linesep
'\n'
51] theo mặc định. Nó xác định giá trị để nối các phần tử với

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

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

>>>

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

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

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

>>>

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

Bạn có thể muốn

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

>>>

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

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

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

>>>

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

Hã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

>>>

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

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

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

Ghi 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

>>> import os
>>> os.linesep
'\n'
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

>>>

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

Sẽ an toàn hơn nếu chỉ giải nén trình tự bằng toán tử sao [

>>> import os
>>> os.linesep
'\n'
58] và để
>>> import os
>>> os.linesep
'\r\n'
94 xử lý việc truyền kiểu

>>>

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

Giải nén thực sự giống như gọi

>>> import os
>>> os.linesep
'\r\n'
94 với các phần tử riêng lẻ của danh sách

Mộ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]

>>>

>>> import os
>>> os.linesep
'\r\n'
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

>>> import os
>>> os.linesep
'\r\n'
94 để viết văn bản vào tệp trực tiếp từ Python

Cuối cùng, tham số

>>> import os
>>> os.linesep
'\n'
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ỳ

>>>

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

Trong 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

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

Cú 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

>>>

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

Mặ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

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

>>>

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

Hơ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

>>>

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

Đó là cách định dạng chuỗi mặc định cho đến khi phương thức

>>> import os
>>> os.linesep
'\n'
65 được nhập từ Python 3

Remove ads

Ngă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

>>> import os
>>> os.linesep
'\r\n'
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

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

Nhiều ngôn ngữ lập trình hiển thị các hàm tương tự như

>>> import os
>>> os.linesep
'\r\n'
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 phải thêm rõ ràng
>>> import os
>>> os.linesep
'\n'
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

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

Ngược lại, hàm ________ 094 của Python luôn thêm ________ 809 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,

>>> import os
>>> os.linesep
'\n'
74, cho biết nội dung kết thúc dòng bằng

Về mặt ngữ nghĩa, tham số

>>> import os
>>> os.linesep
'\n'
74 gần giống với tham số
>>> import os
>>> os.linesep
'\n'
50 mà bạn đã thấy trước đó

  • Nó phải là một chuỗi hoặc
    >>> import os
    >>> os.linesep
    '\n'
    
    32
  • Nó có thể dài tùy ý
  • Nó có giá trị mặc định là
    >>> import os
    >>> os.linesep
    '\n'
    
    78
  • Nếu bằng
    >>> import os
    >>> os.linesep
    '\n'
    
    32, nó sẽ có tác dụng giống như giá trị mặc định
  • Nếu bằng một chuỗi rỗng [______853], nó sẽ chặn dòng mới

Bây giờ bạn đã hiểu điều gì đang xảy ra bí ẩn khi bạn gọi điện cho

>>> import os
>>> os.linesep
'\r\n'
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
>>> import os
>>> os.linesep
'\n'
74 vẫn được áp dụng và một dòng trống xuất hiện

Ghi chú. Bạn có thể thắc mắc tại sao tham số

>>> import os
>>> os.linesep
'\n'
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ạn

Chà, 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ì

>>> import os
>>> os.linesep
'\r\n'
94 sẽ tự động xử lý việc chuyển đổi. Chỉ cần nhớ luôn sử dụng chuỗi thoát
>>> import os
>>> os.linesep
'\n'
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

>>>

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

Ví 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

>>>

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

Mặt khác, khi bạn mở tệp để đọc bằng

>>> import os
>>> os.linesep
'\n'
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
>>> import os
>>> os.linesep
'\n'
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

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

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

Mặc dù đây là hai cuộc gọi

>>> import os
>>> os.linesep
'\r\n'
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

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

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

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

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

Như với

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>>

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

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

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

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

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

>>>

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

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

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

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

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

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

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

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

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

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

Lưu ý rằng có một khoảng cách giữa các từ

>>> import os
>>> os.linesep
'\r\n'
000 và
>>> import os
>>> os.linesep
'\r\n'
001

>>> import os
>>> os.linesep
'\r\n'
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

>>> import os
>>> os.linesep
'\r\n'
94 từ
>>> import os
>>> os.linesep
'\n'
41 hoặc quay trở lại mô-đun
>>> import os
>>> os.linesep
'\r\n'
004

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

Điều này sẽ in đầu ra chính xác mà không cần thêm dung lượng

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

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

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

Remove ads

In ra một tập tin

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

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

>>> import os
>>> os.linesep
'\r\n'
94 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

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

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

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

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

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

>>> import os
>>> os.linesep
'\r\n'
94 sẽ mặc định ghi vào đầu ra tiêu chuẩn. However, you can tell your operating system to temporarily swap out
>>> import os
>>> os.linesep
'\r\n'
009 for a file stream, so that any output ends up in that file rather than the screen

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

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

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

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

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

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

Chúng là các số tùy ý, mặc dù không đổi, được liên kết với các luồng tiêu chuẩn. 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

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

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

LệnhMô tả

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

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

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

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

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

Trong khi cả

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

In Python, you can access all standard streams through the built-in

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

>>>

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

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

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

Theo mặc định,

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

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

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

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

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

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

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

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

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

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

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

>>>

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

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

>>>

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

This prints an uppercase letter

>>> import os
>>> os.linesep
'\r\n'
047 and a newline character, which correspond to decimal values of 65 and 10 in ASCII. Tuy nhiên, chúng được mã hóa bằng cách sử dụng ký hiệu thập lục phân theo byte chữ

Lưu ý rằng

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

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

Instead of a real file existing somewhere in your file system, you can provide a fake one, which would reside in your computer’s memory. Bạn sẽ sử dụng kỹ thuật này sau để chế nhạo

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

>>>

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

If you got to this point, then you’re left with only one keyword argument in

>>> import os
>>> os.linesep
'\r\n'
94, which you’ll see in the next subsection. Nó có lẽ ít được sử dụng nhất trong số chúng. Tuy nhiên, có những lúc nó thực sự cần thiết

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

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

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

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

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

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

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

Although, there’s a problem with character encoding. Hàm

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

>>>

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

Notice how non-Latin characters must be escaped in both Unicode and string literals to avoid a syntax error. Hãy xem ví dụ này

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

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

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

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

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

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

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

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

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

Remove ads

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

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

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

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

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

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

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

Miễn là biến

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

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

That’s because the operating system buffers subsequent writes to the standard output in this case. Bạn cần biết rằng có ba loại luồng liên quan đến bộ đệm

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

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

Bộ đệm giúp giảm số lượng cuộc gọi I/O đắt tiền. Ví dụ, hãy nghĩ về việc gửi tin nhắn qua mạng có độ trễ cao. 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. Đó là nơi bộ đệm bước vào

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

>>> import os
>>> os.linesep
'\r\n'
94 to forcefully flush the stream without waiting for a newline character in the buffer using its
>>> import os
>>> os.linesep
'\r\n'
067 flag

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

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

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

>>> import os
>>> os.linesep
'\r\n'
94 bao gồm tất cả các tham số của nó. Bạn biết mục đích của chúng và khi nào nên sử dụng chúng. Understanding the signature is only the beginning, however. Trong các phần sắp tới, bạn sẽ thấy tại sao

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

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

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

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

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

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

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

Lưu ý rằng

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

>>>

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

What you’re seeing here is a docstring of the

>>> import os
>>> os.linesep
'\r\n'
94 function. You can display docstrings of various objects in Python using the built-in
>>> import os
>>> os.linesep
'\r\n'
076 function

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

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

For simple objects without any logic, whose purpose is to carry data, you’ll typically take advantage of

>>> import os
>>> os.linesep
'\r\n'
077, which is available in the standard library. Các bộ dữ liệu được đặt tên có một biểu diễn văn bản gọn gàng ngoài hộp

>>>

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

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

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

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

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

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

>>>

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

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

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

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

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

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

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

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

This prevents the interpreter from raising

>>> import os
>>> os.linesep
'\r\n'
086 due to missing indented block of code

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

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

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

Ghi chú. Following other languages and frameworks, 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. This way, you get the best of both worlds

>>>

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

The syntax for variable annotations, which is required to specify class fields with their corresponding types, was defined in Python 3. 6

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

>>> import os
>>> os.linesep
'\r\n'
94 gọi ngầm hàm
>>> import os
>>> os.linesep
'\n'
30 tích hợp để chuyển đổi các đối số vị trí của nó thành các chuỗi. Indeed, calling
>>> import os
>>> os.linesep
'\n'
30 manually against an instance of the regular
>>> import os
>>> os.linesep
'\r\n'
078 class yields the same result as printing it

>>>

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

Ngược lại,

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

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

The first one is recommended to return a short, human-readable text, which includes information from the most relevant attributes. 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

However, the other one should provide complete information about an object, to allow for restoring its state from a string. Lý tưởng nhất là nó sẽ trả về mã Python hợp lệ để bạn có thể chuyển trực tiếp mã đó tới

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

>>>

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

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

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

Note. Mặc dù bản thân

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

Consider this class with both magic methods, which return alternative string representations of the same object

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

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

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

>>>

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

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

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

>>>

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

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

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

Python 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. 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. 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

>>> import os
>>> os.linesep
'\r\n'
806 and
>>> import os
>>> os.linesep
'\r\n'
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.
>>> import os
>>> os.linesep
'\r\n'
810

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

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

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

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

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

Cả hai phương thức

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

Câu lệnh

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

>>>

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

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

>>>

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

Bạn nên chuyển đổi 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

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

>>>

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

Sử dụng hàm

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

Remove ads

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

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

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

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

Bạn đã thấy rằng

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

>>>

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

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

>>>

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

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

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

>>>

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

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

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

Mặt khác,

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

>>>

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

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

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

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

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

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

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

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

Ở đây, tham số

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

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

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

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

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

Khi bạn đi lấy đồ trong tủ lạnh cho mình, bạn có thể gây rắc rối. Bạn có thể để cửa mở, bạn có thể nhận được thứ gì đó mà bố hoặc mẹ không muốn bạn có. You might even be looking for something we don’t even have or which has expired

What you should be doing is stating a need, “I need something to drink with lunch,” and then we will make sure you have something when you sit down to eat

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

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

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

>>>

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

This custom function uses partial functions to achieve the desired effect. Đó là một khái niệm nâng cao mượn từ mô hình lập trình chức năng, vì vậy bạn không cần phải đi quá sâu vào chủ đề đó vào lúc này. Tuy nhiên, nếu bạn quan tâm đến chủ đề này, tôi khuyên bạn nên xem mô-đun

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

Không giống như câu lệnh, chức năng là giá trị. That means you can mix them with expressions, in particular, lambda expressions. Thay vì xác định một hàm toàn diện để thay thế

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

>>>

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

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

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

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

>>>

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

Python có cả câu lệnh điều kiện và biểu thức điều kiện. Cái sau được đánh giá thành một giá trị có thể được gán cho một biến hoặc được truyền cho một hàm. In the example above, you’re interested in the side-effect rather than the value, which evaluates to

>>> import os
>>> os.linesep
'\n'
32, so you simply ignore it

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

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

Remove ads

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

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

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

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

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

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

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

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

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

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

This is useful for simplifying the code without losing its efficiency. Thông thường, mã biểu diễn có xu hướng dài dòng hơn

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

The controversy behind this new piece of syntax caused a lot of argument. Vô số bình luận tiêu cực và những cuộc tranh luận sôi nổi cuối cùng đã khiến Guido van Rossum phải từ chức Nhà độc tài nhân từ vì sự sống hay BDFL

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

>>> import os
>>> os.linesep
'\r\n'
848,
>>> import os
>>> os.linesep
'\r\n'
853 hoặc
>>> import os
>>> os.linesep
'\n'
02 có nghĩa cố định trong ngôn ngữ. Bạn không thể sử dụng chúng để đặt tên cho các biến của mình hoặc các ký hiệu khác. Đó là lý do tại sao không thể xác định lại hoặc chế nhạo câu lệnh
>>> import os
>>> os.linesep
'\n'
02 trong Python 2. Bạn bị mắc kẹt với những gì bạn nhận được

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

>>>

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

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

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

>>>

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

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

>>>

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

String concatenation can raise a

>>> import os
>>> os.linesep
'\n'
57 due to incompatible types, which you have to handle manually, for example

>>>

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

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

>>>

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

There aren’t any keyword arguments for common tasks such as flushing the buffer or stream redirection. You need to remember the quirky syntax instead. Ngay cả hàm

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

>>>

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

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

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

The list of problems goes on and on. Nếu tò mò, bạn có thể quay lại phần trước và tìm kiếm các giải thích chi tiết hơn về cú pháp trong Python 2

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

>>> import os
>>> os.linesep
'\r\n'
94 đã được nhập vào để dễ dàng chuyển sang Python 3. Bạn có thể nhập nó từ một mô-đun
>>> import os
>>> os.linesep
'\n'
41 đặc biệt, hiển thị một loạt các tính năng ngôn ngữ được phát hành trong các phiên bản Python sau này

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

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

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

>>>

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

You could also call

>>> import os
>>> os.linesep
'\r\n'
864, but that would show a lot of uninteresting internal details of the module

Để kích hoạt hàm

>>> import os
>>> os.linesep
'\r\n'
94 trong Python 2, bạn cần thêm câu lệnh nhập này vào đầu mã nguồn của mình

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

Từ giờ câu lệnh

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

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

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

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

>>>

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

You now have an idea of how printing in Python evolved and, most importantly, understand why these backward-incompatible changes were necessary. Biết điều này chắc chắn sẽ giúp bạn trở thành một lập trình viên Python giỏi hơn

Remove ads

Printing With Style

Nếu bạn nghĩ rằng in ấn chỉ là làm sáng các điểm ảnh trên màn hình, thì về mặt kỹ thuật, bạn đã đúng. However, there are ways to make it look cool. 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 Structures

Ngôn ngữ máy tính cho phép bạn biểu diễn dữ liệu cũng như mã thực thi theo cách có cấu trúc. Unlike Python, however, most languages give you a lot of freedom in using whitespace and formatting. Điều này có thể hữu ích, chẳng hạn như trong quá trình nén, nhưng đôi khi nó dẫn đến mã khó đọc hơn

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

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

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

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

>>>

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

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

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

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

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

>>>

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

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

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

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

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

>>>

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

Đó là bởi vì

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

>>>

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

The function applies reasonable formatting to improve readability, but you can customize it even further with a couple of parameters. Ví dụ: bạn có thể giới hạn cấu trúc phân cấp được lồng sâu bằng cách hiển thị dấu chấm lửng bên dưới một mức nhất định

>>>

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

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

>>>

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

Tuy nhiên,

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

>>>

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

Phần tử cuối cùng trong danh sách là cùng một đối tượng với toàn bộ danh sách

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

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

>>>

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

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

>>> import os
>>> os.linesep
'\r\n'
874 automatically sorts dictionary keys for you before printing, which allows for consistent comparison. Khi bạn đang so sánh các chuỗi, bạn thường không quan tâm đến thứ tự cụ thể của các thuộc tính được tuần tự hóa. Dù sao đi nữa, tốt nhất bạn nên so sánh các từ điển thực tế trước khi đăng nhiều kỳ hơn

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

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

>>>

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

Notice, however, that you need to handle printing yourself, because it’s not something you’d typically want to do. Tương tự, mô-đun

>>> import os
>>> os.linesep
'\r\n'
870 có thêm một hàm
>>> import os
>>> os.linesep
'\r\n'
885 trả về một chuỗi, trong trường hợp bạn phải làm gì đó ngoài việc in nó

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

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

Remove ads

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

As 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. Điều đó đã thay đổi cách đây vài thập kỷ khi những người ở Viện Tiêu chuẩn Quốc gia Hoa Kỳ quyết định thống nhất nó bằng cách xác định mã thoát ANSI

Most of today’s terminal emulators support this standard to some degree. Cho đến gần đây, hệ điều hành Windows là một ngoại lệ đáng chú ý. Do đó, nếu bạn muốn tính di động tốt nhất, hãy sử dụng thư viện

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

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

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

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

ANSI escape sequences are like a markup language for the terminal. In HTML you work with tags, such as

>>> import os
>>> os.linesep
'\r\n'
889 or
>>> import os
>>> os.linesep
'\r\n'
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 website

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

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

>>>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>>

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

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

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

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

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

Remove ads

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

Mặc dù không thể phủ nhận việc chơi với các mã thoát ANSI rất thú vị, nhưng trong thế giới thực, bạn muốn có nhiều khối xây dựng trừu tượng hơn để kết hợp giao diện người dùng. There are a few libraries that provide such a high level of control over the terminal, but

>>> import os
>>> os.linesep
'\r\n'
003 seems to be the most popular choice

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

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

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

Đó là bởi vì

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

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

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

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

>>> import os
>>> os.linesep
'\r\n'
003. Vì nó sửa đổi trạng thái của thiết bị đầu cuối đang chạy, điều quan trọng là phải xử lý lỗi và khôi phục trạng thái trước đó một cách duyên dáng. You can do this manually, but the library comes with a convenient wrapper for your main function

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

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

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

Nếu bạn chạy chương trình này ngay bây giờ, bạn sẽ không thấy bất kỳ hiệu ứng nào, vì nó sẽ kết thúc ngay lập tức. Tuy nhiên, bạn có thể thêm một độ trễ nhỏ để xem trước

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

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

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

Hãy định nghĩa con rắn là một danh sách các điểm trong tọa độ màn hình

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

Đầu rắn luôn là phần tử đầu tiên trong danh sách, trong khi đuôi là phần tử cuối cùng. Hình dạng ban đầu của con rắn nằm ngang, bắt đầu từ góc trên cùng bên trái của màn hình và hướng sang bên phải. While its y-coordinate stays at zero, its x-coordinate decreases from head to tail

Để vẽ con rắn, bạn sẽ bắt đầu với phần đầu và sau đó làm theo các đoạn còn lại. Each segment carries

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

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

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

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

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

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

Là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

>>> import os
>>> os.linesep
'\r\n'
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

>>> import os
>>> os.linesep
'\r\n'
009,
>>> import os
>>> os.linesep
'\r\n'
010 và
>>> import os
>>> os.linesep
'\r\n'
011 tích hợp sẵn

Hướng sẽ thay đổi khi nhấn phím, vì vậy bạn cần gọi

>>> import os
>>> os.linesep
'\r\n'
012 để 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

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

Tuy nhiên, theo mặc định,

>>> import os
>>> os.linesep
'\r\n'
012 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

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

Bạ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

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

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

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

>>> import os
>>> os.linesep
'\r\n'
003 mở ra. 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ơn

Số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

>>> import os
>>> os.linesep
'\r\n'
003. Tuy nhiên, tôi muốn chỉ cho bạn một cách thậm chí còn đơn giản hơn

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

  • Vận chuyển trở lại.
    >>> import os
    >>> os.linesep
    '\n'
    
    08
  • xóa lùi.
    >>> import os
    >>> os.linesep
    '\n'
    
    13

Cái đầu tiên di chuyển con trỏ đến đầu dòng, trong khi cái thứ hai chỉ di chuyển con trỏ sang trái một ký tự. 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

Let’s take a look at a few examples

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. You can make a really simple stop motion animation from a sequence of characters that will cycle in a round-robin fashion

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

Vò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. You don’t want extra space between positional arguments, so separator argument must be blank. 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

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

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

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

Như 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ú. There’s a feature-rich

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

Tạo âm thanh với
>>> import os
>>> os.linesep
'\r\n'
94

Nế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

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

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

>>> import os
>>> os.linesep
'\r\n'
020 cho phép giải thích các dấu gạch chéo ngược thoát. Như bạn có thể thấy, có một chuỗi thoát chuyên dụng
>>> import os
>>> os.linesep
'\r\n'
021, 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

  • Letters are encoded with a sequence of dot [·] and dash [–] symbols
  • Dấu chấm là một đơn vị thời gian
  • Dấu gạch ngang là ba đơn vị thời gian
  • Các ký hiệu riêng lẻ trong một chữ cái được đặt cách nhau một đơn vị thời gian
  • Symbols of two adjacent letters are spaced three units of time apart
  • Ký hiệu của hai từ liền kề cách nhau bảy đơn vị thời gian

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

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

Trong Python, bạn có thể triển khai nó chỉ trong mười dòng mã

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

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

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

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ó linters, type checkers và các công cụ phân tích mã tĩnh khác để 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

So, should you be testing

>>> import os
>>> os.linesep
'\r\n'
94? No. Xét cho cùng, đó là một chức năng tích hợp sẵn phải trải qua một bộ kiểm tra toàn diện. Tuy nhiên, điều bạn muốn kiểm tra là liệu mã của bạn có đang gọi
>>> import os
>>> os.linesep
'\r\n'
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 vi

Bạ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 giả lập

>>> import os
>>> os.linesep
'\r\n'
94 để ghi lại và xác minh các yêu cầu của nó

Note. You might have heard the terms. dummy, fake, stub, spy, hoặc mock được sử dụng thay thế cho nhau. 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 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

>>> import os
>>> os.linesep
'\r\n'
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. It basically allows for substituting

>>> import os
>>> os.linesep
'\r\n'
94 with a custom function of the same interface. Để 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

>>>

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

Gọ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

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

Trong một giải pháp hơi thay thế, thay vì thay thế toàn bộ hàm

>>> import os
>>> os.linesep
'\r\n'
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ớ

>>>

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

Lần này, hàm gọi rõ ràng

>>> import os
>>> os.linesep
'\r\n'
94, nhưng nó để lộ tham số
>>> import os
>>> os.linesep
'\r\n'
043 của nó ra thế giới bên ngoài

However, a more Pythonic way of mocking objects takes advantage of the built-in

>>> import os
>>> os.linesep
'\r\n'
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. 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ợi

Note. The

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

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

Ngoài ra, bạn gọi nó là

>>> import os
>>> os.linesep
'\r\n'
031, 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ừ
>>> import os
>>> os.linesep
'\r\n'
034

Bả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. In practice, however, patching only affects the code for the duration of test execution

Để giả lập

>>> import os
>>> os.linesep
'\r\n'
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í
>>> import os
>>> os.linesep
'\r\n'
036 và chỉ định mục tiêu để vá bằng cách tham chiếu đến nó bằng một tên đủ điều kiện, bao gồm tên mô-đun

>>> import os
>>> os.linesep
'\r\n'
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. However, you need to declare that your test function accepts a mock now. Đố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ó

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

The code under test is a function that prints a greeting. 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ụ

To eliminate that side-effect, you need to mock the dependency out. Bản vá 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ề

>>> import os
>>> os.linesep
'\r\n'
94. Nó nghĩ rằng nó đang gọi
>>> import os
>>> os.linesep
'\r\n'
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át

There are many reasons for testing software. 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

>>> import os
>>> os.linesep
'\r\n'
94 bằng cách chế nhạo nó. Paradoxically, however, that same function can help you find bugs during a related process of debugging you’ll read about in the next section

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

You can’t monkey patch the

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

  • Use stream redirection
  • Patch the standard output defined in the
    >>> import os
    >>> os.linesep
    '\r\n'
    
    004 module
  • Import
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94 from the
    >>> import os
    >>> os.linesep
    '\n'
    
    41 module

Hãy kiểm tra từng cái một

Stream redirection is almost identical to the example you saw earlier

>>>

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

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

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

Patching the standard output from the

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

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

First of all, remember to install the

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

Secondly, the

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

Finally, a single

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

The last option you have is importing

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

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

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

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

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

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

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

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

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

Tracing

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

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

Hãy xem ví dụ này, biểu hiện lỗi làm tròn

>>>

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

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

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

Rounding ErrorShow/Hide

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

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

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

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

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

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

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

That’s precisely where logging shines

Logging

Let’s pretend for a minute that you’re running an e-commerce website. One day, an angry customer makes a phone call complaining about a failed transaction and saying he lost his money. 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. 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

Here’s a breakdown of a typical log record

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

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

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

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

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

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

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

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

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

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

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

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

Note. There’s a somewhat related

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

That said, you can make them work together by calling

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

One last reason to switch from the

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

Debugging

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

  • Step through the code interactively
  • Set breakpoints, including conditional breakpoints
  • Introspect variables in memory
  • Evaluate custom expressions at runtime

A crude debugger that runs in the terminal, unsurprisingly named

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

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

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

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

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

>>>

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

This shows up an interactive prompt, which might look intimidating at first. However, you can still type native Python at this point to examine or modify the state of local variables. Apart from that, there’s really only a handful of debugger-specific commands that you want to use for stepping through the code

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

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

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

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

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

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

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

Debugging isn’t the proverbial silver bullet. Sometimes logging or tracing will be a better solution. 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 Printing

I briefly touched upon the thread safety issue before, recommending

>>> import os
>>> os.linesep
'\r\n'
063 over the
>>> import os
>>> os.linesep
'\r\n'
94 function. If you’re still reading this, then you must be comfortable with the concept of threads

Thread 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

>>> import os
>>> os.linesep
'\r\n'
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
>>> import os
>>> os.linesep
'\r\n'
055, intertwining bits of text from multiple
>>> import os
>>> os.linesep
'\r\n'
94 calls

Note. 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

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

To simulate this, you can increase the likelihood of a context switch by making the underlying

>>> import os
>>> os.linesep
'\r\n'
040 method go to sleep for a random amount of time. How? By mocking it, which you already know about from an earlier section

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

First, you need to store the original

>>> import os
>>> os.linesep
'\r\n'
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
>>> import os
>>> os.linesep
'\r\n'
94 calls with its name and a letter. A, B, and C

If 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

>>> import os
>>> os.linesep
'\r\n'
084 function. You’ll notice that you get a slightly different sequence each time

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

Even though

>>> import os
>>> os.linesep
'\r\n'
055 itself is an atomic operation, a single call to the
>>> import os
>>> os.linesep
'\r\n'
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 writes

Note. 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

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

This will fix the output

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

Notice, however, that the

>>> import os
>>> os.linesep
'\r\n'
94 function still keeps making a separate call for the empty suffix, which translates to useless
>>> import os
>>> os.linesep
'\r\n'
088 instruction

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

A truly thread-safe version of the

>>> import os
>>> os.linesep
'\r\n'
94 function could look like this

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

You can put that function in a module and import it elsewhere

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

Now, despite making two writes per each

>>> import os
>>> os.linesep
'\r\n'
94 request, only one thread is allowed to interact with the stream, while the rest must wait

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

I 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

>>> import os
>>> os.linesep
'\r\n'
063 module is thread-safe by design, which is reflected by its ability to display thread names in the formatted message

>>>

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

It’s another reason why you might not want to use the

>>> import os
>>> os.linesep
'\r\n'
94 function all the time

Python Print Counterparts

By now, you know a lot of what there is to know about

>>> import os
>>> os.linesep
'\r\n'
94. The subject, however, wouldn’t be complete without talking about its counterparts a little bit. While
>>> import os
>>> os.linesep
'\r\n'
94 is about the output, there are functions and libraries for the input

Built-In

Python comes with a built-in function for accepting input from the user, predictably called

>>> import os
>>> os.linesep
'\r\n'
095. It accepts data from the standard input stream, which is usually the keyboard

>>>

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

The function always returns a string, so you might need to parse it accordingly

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

The prompt parameter is completely optional, so nothing will show if you skip it, but the function will still work

>>>

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

Nevertheless, 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

>>> import os
>>> os.linesep
'\r\n'
096 instead, which is yet another built-in. Unfortunately, there’s also a misleadingly named
>>> import os
>>> os.linesep
'\r\n'
095 function, which does a slightly different thing

In 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

>>> import os
>>> os.linesep
'\r\n'
096 got renamed to
>>> import os
>>> os.linesep
'\r\n'
095

Here’s a quick comparison of the available functions and what they do

Python 2Python 3

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

As you can tell, it’s still possible to simulate the old behavior in Python 3

Asking the user for a password with

>>> import os
>>> os.linesep
'\r\n'
095 is a bad idea because it’ll show up in plaintext as they’re typing it. In this case, you should be using the
>>> import os
>>> os.linesep
'\r\n'
205 function instead, which masks typed characters. This function is defined in a module under the same name, which is also available in the standard library

>>>

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

The

>>> import os
>>> os.linesep
'\r\n'
206 module has another function for getting the user’s name from an environment variable

>>>

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

Python’s built-in functions for handling the standard input are quite limited. At the same time, there are plenty of third-party packages, which offer much more sophisticated tools

Third-Party

There 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

  • Định dạng và kiểu dáng nâng cao
  • Automated parsing, validation, and sanitization of user data
  • A declarative style of defining layouts
  • Interactive autocompletion
  • Mouse support
  • Predefined widgets such as checklists or menus
  • Searchable history of typed commands
  • Syntax highlighting

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

  • >>> import os
    >>> os.linesep
    '\r\n'
    
    207
  • >>> import os
    >>> os.linesep
    '\r\n'
    
    208
  • >>> import os
    >>> os.linesep
    '\r\n'
    
    209
  • >>> import os
    >>> os.linesep
    '\r\n'
    
    210

Tuy nhiên, điều đáng nói là một công cụ dòng lệnh có tên là

>>> import os
>>> os.linesep
'\r\n'
211 bổ sung miễn phí khả năng chỉnh sửa dòng mạnh mẽ cho các tập lệnh Python của bạn. Bạn không phải làm bất cứ điều gì để nó hoạt động

Let’s assume you wrote a command-line interface that understands three instructions, including one for adding numbers

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

At first glance, it seems like a typical prompt when you run it

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

But 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.

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

Now, you can wrap the same script with the

>>> import os
>>> os.linesep
'\r\n'
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

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

Isn’t that great?

Conclusion

You’re now armed with a body of knowledge about the

>>> import os
>>> os.linesep
'\r\n'
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 2

Apart from that, you learned how to

  • Avoid common mistakes with
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94 in Python
  • Deal with newlines, character encodings and buffering
  • Write text to files
  • Mock the
    >>> import os
    >>> os.linesep
    '\r\n'
    
    94 function in unit tests
  • Build advanced user interfaces in the terminal

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. Last but not least, you know how to implement the classic snake game

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 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. He helps his students get into software engineering by sharing over a decade of commercial experience in the IT industry

» More about Bartosz

Each 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

Nâng cao kỹ năng Python của bạn »

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

Nâng cao kỹ năng Python của bạn »

What Do You Think?

Rate this article

Tweet Share Share Email

What’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

How to get value from memory address in Python?

Now that we have addresses, we can get value/python objects again from the memory address using ctypes module . where, memeory_address is the memory address of the variable. value is the method which is used to extract a value.

How are Python classes stored in memory?

Python stores object in heap memory and reference of object in stack. Variables, functions stored in stack and object is stored in heap.

What is __ str __ in Python?

Python __str__[] This method returns the string representation of the object . This method is called when print[] or str[] function is invoked on an object. This method must return the String object.

How will you print the address of a variable without using a pointer?

Program Explained .
Receive any number from user inside a variable say num
Print back its value on output screen
And to print address of that variable say num
We have to use format specifier as %u and add address [&] operator before the variable say num, that is &num will gives the address of num variable

Chủ Đề