Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

Hãy thảo luận ngắn gọn về các chuỗi trước khi đến đó. Nếu bạn là người mới bắt đầu, bạn nên tóm tắt lại các chuỗi

Chuỗi Python là gì

Một chuỗi Python (str) là một kiểu dữ liệu phổ biến được sử dụng để biểu diễn văn bản

Để tạo một chuỗi, hãy bọc các chữ cái hoặc số xung quanh một tập hợp các dấu ngoặc kép

Bạn có thể sử dụng một trong hai

  1. Dấu nháy đơn
  2. Dấu ngoặc kép

Dưới đây là một số ví dụ về chuỗi

s1 = "This is a test"
s2 = 'This is another test'

# To add quotes in a string, use double quotation marks with single-quote strings and vice versa.

q1 = "Then he said 'Bye'."
q2 = 'She told us "It is time to celebrate".'

Bạn có thể sử dụng cả dấu ngoặc kép và dấu nháy đơn khi tạo chuỗi trong Python.

Nếu bạn muốn trích dẫn một chuỗi, bạn cần sử dụng một chuỗi làm chuỗi bên ngoài và chuỗi còn lại làm chuỗi bên trong. ×

In không có dòng mới trong Python

Để hiển thị các chuỗi trong Python, bạn có thể in chúng vào bảng điều khiển bằng hàm print() tích hợp

Ví dụ

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)

đầu ra

This is a test
This is another test

In các chuỗi theo cách này giới thiệu một dòng mới

Trong khi đó, đây là trực quan, không phải lúc nào bạn cũng muốn

Để làm cho Python ngừng thêm dòng mới khi in, bạn có thể chỉ định một tham số khác bên trong hàm print()

Tham số này là một tham số tùy chọn được gọi là kết thúc. Nó chỉ định ký tự cuối cùng sau khi in chuỗi

Theo mặc định, tham số kết thúc là ký tự xuống dòng, nghĩa là “\n”

Đây là lý do tại sao luôn có một dòng mới sau lệnh gọi hàm print()

Nhưng bạn có thể thay đổi tham số kết thúc thành bất cứ điều gì bạn muốn

Để không muốn giới thiệu một dòng mới, hãy thay phần cuối bằng một khoảng trống ” “

Ví dụ

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)

Điều này dẫn đến cả hai chuỗi được in trên cùng một dòng

This is a test This is another test

Một ví dụ khác, hãy đặt tham số kết thúc sao cho lệnh gọi hàm print() kết thúc với 3 dấu ngắt dòng

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)

Điều này dẫn đến 3 dòng mới được in ở giữa hai bản in

This is a test


This is another test

Bây giờ bạn đã biết cách in các chuỗi trên cùng một dòng trong Python

Để trang trọng hơn, bây giờ bạn đã hiểu cách thay đổi ký tự kết thúc mặc định của lệnh gọi hàm print()

Các cách khác để in trên cùng một dòng trong Python

Cuối cùng chúng ta hãy đi qua một số cách tiếp cận khác để in các chuỗi trên cùng một dòng trong Python

Truyền nhiều chuỗi vào cùng lệnh gọi hàm print()

Hàm print() của Python chấp nhận bất kỳ số lượng đối số vị trí nào

Điều này có nghĩa là bạn có thể cung cấp cho nó bao nhiêu đối số tùy thích và nó sẽ in tất cả chúng vào bảng điều khiển

Nếu bạn in nhiều phần tử trong cùng một lệnh gọi hàm print() thì sẽ không có dòng mới nào được thêm vào

Ví dụ

s1 = "This is a test"
s2 = "This is another test"

print(s1, s2)

đầu ra

This is a test This is another test

Thay vì thêm một dòng mới, một khoảng trống được thêm vào. Điều này làm cho việc in nhiều mục trong một cuộc gọi hoạt động theo cách trực quan

Tham gia các chuỗi trước khi in

Một cách khác để in các chuỗi trên cùng một dòng trong Python là sử dụng phương thức string join()

Phương thức join() tuân theo cú pháp này

Hello world! It's me.
1

Trong đó dấu phân cách là một chuỗi hoạt động như một dấu phân cách giữa mỗi phần tử trong danh sách phần tử

Ví dụ: bạn có thể nối hai chuỗi bằng khoảng trống để tạo ra một chuỗi dài và in ra

Đây là giao diện của nó trong mã

Hello world! It's me.
2

đầu ra

This is a test This is another test

Tuy nhiên, về mặt kỹ thuật, điều này không được in trên cùng một dòng. Thay vào đó, chúng tôi kết hợp hai chuỗi thành một chuỗi và in dưới dạng một chuỗi

Bây giờ bạn đã biết rất nhiều cách để in các chuỗi trên cùng một dòng trong Python

Cuối cùng nhưng không kém phần quan trọng, hãy xem mọi thứ hoạt động như thế nào trong các phiên bản Python 2 cũ hơn

Cách in trên cùng một dòng trong Python 2. x

Trong Python 2 print không phải là một hàm mà là một câu lệnh

Để in trên cùng một dòng bằng Python 2. x, hãy thêm dấu phẩy sau câu lệnh in

Ví dụ

Hello world! It's me.
4

đầu ra

This is a test This is another test

Phần kết luận

Hôm nay bạn đã học cách in trên cùng một dòng trong Python

Tóm lại, hàm print() mặc định thêm một ký tự xuống dòng vào cuối. Điều này có nghĩa là mỗi lệnh gọi print() sẽ in ra một dòng mới

Nếu bạn giống như hầu hết người dùng Python, bao gồm cả tôi, thì có lẽ bạn đã bắt đầu hành trình Python của mình bằng cách tìm hiểu về

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494. Nó đã giúp bạn viết một lớp lót
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
495 của riêng bạn. Bạn có thể sử dụng nó để hiển thị các tin nhắn được định dạng trên màn hình và có thể tìm thấy một số lỗi. Nhưng nếu bạn nghĩ rằng đó là tất cả những gì cần biết về hàm
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 của Python, thì bạn đang bỏ lỡ rất nhiều thứ.

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 một cách hiệu quả. Tuy nhiên, hãy chuẩn bị để tìm hiểu sâu khi bạn đi qua các phần. Bạn có thể ngạc nhiên về số lượng mà
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 cung cấp

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

  • Tránh các lỗi phổ biến với Python's
    s1 = "This is a test"
    s2 = 'This is another test'
    
    print(s1)
    print(s2)
    494
  • Xử lý các dòng mới, mã hóa ký tự và bộ đệm
  • Viết văn bản vào tập tin
  • Mock
    s1 = "This is a test"
    s2 = 'This is another test'
    
    print(s1)
    print(s2)
    494 trong bài kiểm tra đơn vị
  • Xây dựng giao diện người dùng nâng cao trong thiết bị đầu cuối

Nếu bạn là người hoàn toàn mới bắt đầu, thì bạn sẽ thu được nhiều lợi ích nhất khi đọc phần đầu tiên của hướng dẫn này, phần này minh họa các yếu tố cần thiết của việc in bằng Python. Nếu không, vui lòng bỏ qua phần đó và nhảy xung quanh khi bạn thấy phù hợp

Ghi chú.

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 là một bổ sung chính cho Python 3, trong đó nó thay thế câu lệnh
This is a test
This is another test
202 cũ có sẵn trong Python 2

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

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

In một cách ngắn gọn

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494. Hoặc, theo biệt ngữ của lập trình viên, bạn sẽ nói rằng bạn sẽ quen với chữ ký hàm

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

Đang gọi s1 = "This is a test" s2 = 'This is another test' print(s1) print(s2)494

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 chỉ cần một vài lần nhấn phím

>>>

This is a test
This is another test
6

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

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 nhiều lần như thế này để thêm không gian theo chiều dọc. Giống như bạn đang nhấn Enter trên bàn phím của mình trong trình xử lý văn bản.

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

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

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

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

This is a test
This is another test
207 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

This is a test
This is another test
208 theo sau là
This is a test
This is another test
209

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
4

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

This is a test
This is another test
209

>>>

This is a test
This is another test
2

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

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
4

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 (

This is a test
This is another test
211) để 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

  • This is a test
    This is another test
    212. dấu gạch chéo ngược
  • This is a test
    This is another test
    213. xóa lùi
  • This is a test
    This is another test
    214. chuyển hướng
  • This is a test
    This is another test
    208. vận chuyển trở lại (CR)
  • This is a test
    This is another test
    209. 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

This is a test
This is another test
217 tích hợp

>>>

This is a test This is another test
2

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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

This is a test This is another test
4

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 một chuỗi trong Python, hãy sử dụng phương thức

This is a test
This is another test
219 của nó, như thế này

>>>

This is a test This is another test
6

Đ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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494

>>>

This is a test This is another test
8

Đ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 (

This is a test
This is another test
221) hoặc dấu ngoặc kép (
This is a test
This is another test
222). 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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
1

Đ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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
2

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
40

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ự

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
41

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
42

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
43

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

This is a test
This is another test
223 hoặc
This is a test
This is another test
224 trước câu trích dẫn mở đầu, và bây giờ bạn sẽ có được điều này

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
44

Đ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ừ

This is a test
This is another test
225 hoặc
This is a test
This is another test
226, thường được sử dụng làm chuỗi tài liệu

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
45

Để ngăn một dòng mới ban đầu, chỉ cần đặt văn bản ngay sau phần mở đầu

This is a test
This is another test
226

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
46

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
47

Để 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

This is a test
This is another test
228 tích hợp

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
48

Đ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

This is a test
This is another test
228 để 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ã

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
49

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ả

>>>

This is a test
This is another test
20

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

>>>

This is a test
This is another test
21

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

>>>

This is a test
This is another test
22

Đ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

>>>

This is a test
This is another test
23

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

This is a test
This is another test
230 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ố

>>>

This is a test
This is another test
24

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,

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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?

>>>

This is a test
This is another test
25

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

This is a test
This is another test
232. 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
This is a test
This is another test
233 chứ không phải là một chuỗi trống

>>>

This is a test
This is another test
26

Làm thế nào để

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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
This is a test
This is another test
230 đằ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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 với một đối số hoặc không có bất kỳ đối số nào. Bạn biết cách in các tin nhắn đã sửa hoặc đã định dạng lên màn hình. 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

This is a test
This is another test
27

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

This is a test
This is another test
202 không phải là một hàm, 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
This is a test
This is another test
202 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

>>>

This is a test
This is another test
28

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

This is a test
This is another test
202. 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ộ

>>>

This is a test
This is another test
29

Đâ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

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
40

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

This is a test
This is another test
202 với dấu ngoặc trong Python 2. Mặc dù, để hoàn toàn chính xác, bạn có thể giải quyết vấn đề này với sự trợ giúp của nhập khẩu
This is a test
This is another test
241, bạn sẽ đọc thêm về điều này trong phần có liên quan

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

Tách nhiều đối số

Bạn đã thấy

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 đượ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ị thông báo cố định hoặc thông báo đượ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

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
41

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ự

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
42

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

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
43

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 cho phép số lượng đối số vị trí tùy ý nhờ tham số
This is a test
This is another test
244

Hãy xem ví dụ này

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
44

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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ư
This is a test
This is another test
246

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

This is a test
This is another test
230 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

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
45

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 đị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
This is a test
This is another test
249 từ trình thông dịch tương tác

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

This is a test
This is another test
250. Nó là viết tắt của dấu phân cách và được gán một khoảng trắng (
This is a test
This is another test
251) 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

This is a test
This is another test
232, nhưng cái sau có tác dụng tương tự như khoảng trắng mặc định

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
46

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 (

This is a test
This is another test
253)

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
47

Bạn có thể muốn

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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 đó

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
48

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

This is a test
This is another test
250 sẽ in một cái gì đó như đường dẫn tệp

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
49

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

>>>

This is a test This is another test
20

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

This is a test
This is another test
256) 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

Doing it manually will result in a well-known

This is a test
This is another test
257 if at least one of the elements isn’t a string

>>>

This is a test This is another test
21

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

This is a test
This is another test
258) and let
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 handle type casting

>>>

This is a test This is another test
22

Unpacking is effectively the same as calling

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 with individual elements of the list

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

>>>

This is a test This is another test
23

This wouldn’t handle edge cases such as escaping commas correctly, but for simple use cases, it should do. The line above would show up in your terminal window. In order to save it to a file, you’d have to redirect the output. Ở phần sau của phần này, bạn sẽ thấy cách sử dụng

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 để viết văn bản vào tệp trực tiếp từ Python

Cuối cùng, tham số

This is a test
This is another test
250 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ỳ

>>>

This is a test This is another test
24

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494

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

>>>

This is a test This is another test
25

Mặt khác, nếu bạn giữ chúng, bạn sẽ chuyển một phần tử tuple duy nhất cho câu lệnh

This is a test
This is another test
202

>>>

This is a test This is another test
26

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

>>>

This is a test This is another test
27

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

This is a test
This is another test
265 được nhập từ Python 3

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

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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

This is a test This is another test
28

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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
This is a test
This is another test
209 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

This is a test
This is another test
269C
This is a test
This is another test
270C++
This is a test
This is another test
271

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

This is a test
This is another test
274, cho biết nội dung kết thúc dòng bằng

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

This is a test
This is another test
274 gần giống với tham số
This is a test
This is another test
250 mà bạn đã thấy trước đó

  • Nó phải là một chuỗi hoặc
    This is a test
    This is another test
    232
  • Nó có thể dài tùy ý
  • Nó có giá trị mặc định là
    This is a test
    This is another test
    278
  • Nếu bằng
    This is a test
    This is another test
    232, 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 (______2253), nó sẽ chặn dòng mới

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 mà không có đối số. 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
This is a test
This is another test
274 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ố

This is a test
This is another test
274 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ề biểu diễn dòng mới trên các hệ điều hành khác nhau khi in, vì

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 sẽ tự động xử lý chuyển đổi. Chỉ cần nhớ luôn sử dụng chuỗi thoát
This is a test
This is another test
209 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

>>>

This is a test This is another test
29

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

>>>

This is a test This is another test
40

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

This is a test
This is another test
286, 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
This is a test
This is another test
278 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

This is a test
This is another test
274

This is a test This is another test
41

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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

This is a test This is another test
42

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494, dòng tương tự sẽ xuất hiện trên màn hình như

This is a test This is another test
43

Như với

This is a test
This is another test
250, bạn có thể sử dụng
This is a test
This is another test
274 để 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

This is a test This is another test
44

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

This is a test This is another test
45

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

This is a test This is another test
46

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

This is a test This is another test
47

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ó

This is a test This is another test
48

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

This is a test This is another test
49

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

This is a test
This is another test
274 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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 sẽ dẫn đến một ký tự dòng mới dư thừa

>>>

This is a test This is another test
60

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

This is a test This is another test
61

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494. Bạn sẽ sử dụng đối số từ khóa
This is a test
This is another test
274 để làm điều đó

>>>

This is a test This is another test
62

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494

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

This is a test This is another test
63

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

This is a test
This is another test
298 thay vì
This is a test
This is another test
299 trong Python 3. Bạn có thể kiểm tra điều này với đoạn mã sau

This is a test This is another test
64

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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
400 và
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
401

This is a test This is another test
65

Để 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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 từ
This is a test
This is another test
241 hoặc quay lại mô-đun
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
404

This is a test This is another test
66

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

This is a test This is another test
67

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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
404 cho phép bạn kiểm soát những gì được in ra đầu ra tiêu chuẩn, mã sẽ trở nên lộn xộn hơn một chút

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

In ra một tập tin

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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. s1 = "This is a test"
    s2 = "This is another test"
    
    print(s1, end=" ")
    print(s2)
    408. standard input
  2. s1 = "This is a test"
    s2 = "This is another test"
    
    print(s1, end=" ")
    print(s2)
    409. standard output
  3. s1 = "This is a test"
    s2 = "This is another test"
    
    print(s1, end=" ")
    print(s2)
    410. standard error

Standard StreamsShow/Hide

Standard output is what you see in the terminal when you run various command-line programs including your own Python scripts

This is a test This is another test
68

Unless otherwise instructed,

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 will default to writing to standard output. However, you can tell your operating system to temporarily swap out
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
409 for a file stream, so that any output ends up in that file rather than the screen

This is a test This is another test
69

That’s called stream redirection

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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
409 ở chỗ nó cũng hiển thị trên màn hình. Nonetheless, it’s a separate stream, whose purpose is to log error messages for diagnostics. By redirecting one or both of them, you can keep things clean

Note. To redirect

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
410, you need to know about file descriptors, also known as file handles

They’re arbitrary, albeit constant, numbers associated with standard streams. Below, you’ll find a summary of the file descriptors for a family of POSIX-compliant operating systems

StreamFile Descriptor

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
4080
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
4091
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
4102

Knowing those descriptors allows you to redirect one or more streams at a time

CommandDescription

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
418Redirect
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
409
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
420Redirect
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
410
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
422Redirect
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
409 and
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
410 to separate files
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
425Redirect
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
409 and
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
410 to the same file

Note that

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
428 is the same as
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
429

Some programs use different coloring to distinguish between messages printed to

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
409 and
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
410

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?
Run Tool Window in PyCharm

While both

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
409 and
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
410 are write-only,
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
408 is read-only. You can think of standard input as your keyboard, but just like with the other two, you can swap out
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
408 for a file to read data from

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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
404 module

>>>

This is a test This is another test
80

As you can see, these predefined values resemble file-like objects with

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
437 and
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
438 attributes as well as
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
439 and
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
440 methods among many others

By default,

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 is bound to
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
442 through its
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
443 argument, but you can change that. Use that keyword argument to indicate a file that was open in write or append mode, so that messages go straight to it

This is a test This is another test
81

This will make your code immune to stream redirection at the operating system level, which might or might not be desired

For more information on working with files in Python, you can check out Reading and Writing Files in Python (Guide)

Note. Don’t try using

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 for writing binary data as it’s only well suited for text

Just call the binary file’s

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
440 directly

This is a test This is another test
82

If you wanted to write raw bytes on the standard output, then this will fail too because

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
442 is a character stream

>>>

This is a test This is another test
83

You must dig deeper to get a handle of the underlying byte stream instead

>>>

This is a test This is another test
84

This prints an uppercase letter

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
447 and a newline character, which correspond to decimal values of 65 and 10 in ASCII. However, they’re encoded using hexadecimal notation in the bytes literal

Note that

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 has no control over character encoding. It’s the stream’s responsibility to encode received Unicode strings into bytes correctly. In most cases, you won’t set the encoding yourself, because the default UTF-8 is what you want. If you really need to, perhaps for legacy systems, you can use the
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
438 argument of
This is a test
This is another test
286

This is a test This is another test
85

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. You’ll use this technique later for mocking

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 in unit tests

>>>

This is a test This is another test
86

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494, which you’ll see in the next subsection. It’s probably the least used of them all. Nevertheless, there are times when it’s absolutely necessary

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

There’s a special syntax in Python 2 for replacing the default

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
442 with a custom file in the
This is a test
This is another test
202 statement

This is a test This is another test
87

Because strings and bytes are represented with the same

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
455 type in Python 2, the
This is a test
This is another test
202 statement can handle binary data just fine

This is a test This is another test
88

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

This is a test
This is another test
286 function in Python 2 lacks the
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
438 parameter, which would often result in the dreadful
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
459

>>>

This is a test This is another test
89

Notice how non-Latin characters must be escaped in both Unicode and string literals to avoid a syntax error. Take a look at this example

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
10

Alternatively, you could specify source code encoding according to PEP 263 at the top of the file, but that wasn’t the best practice due to portability issues

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
11

Your best bet is to encode the Unicode string just before printing it. You can do this manually

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
12

However, a more convenient option is to use the built-in

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
460 module

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
13

It’ll take care of making appropriate conversions when you need to read or write files

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

Buffering s1 = "This is a test" s2 = 'This is another test' print(s1) print(s2)494 Calls

In the previous subsection, you learned that

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 delegates printing to a file-like object such as
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
442. Some streams, however, buffer certain I/O operations to enhance performance, which can get in the way. Let’s take a look at an example

Imagine you were writing a countdown timer, which should append the remaining time to the same line every second

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
14

Your first attempt may look something like this

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
15

As long as the

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
464 variable is greater than zero, the code keeps appending text without a trailing newline and then goes to sleep for one second. Finally, when the countdown is finished, it prints
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
465 and terminates the line

Unexpectedly, instead of counting down every second, the program idles wastefully for three seconds, and then suddenly prints the entire line at once

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

Đó là bởi vì bộ đệm hệ điều hành sau đó ghi vào đầu ra tiêu chuẩn trong trường hợp này. You need to know that there are three kinds of streams with respect to buffering

  1. Unbuffered
  2. Line-buffered
  3. Block-buffered

Unbuffered is self-explanatory, that is, no buffering is taking place, and all writes have immediate effect. A line-buffered stream waits before firing any I/O calls until a line break appears somewhere in the buffer, whereas a block-buffered one simply allows the buffer to fill up to a certain size regardless of its content. Đầ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. Think about sending messages over a high-latency network, for example. When you connect to a remote server to execute commands over the SSH protocol, each of your keystrokes may actually produce an individual data packet, which is orders of magnitude bigger than its payload. What an overhead. It would make sense to wait until at least a few characters are typed and then send them together. That’s where buffering steps in

On the other hand, buffering can sometimes have undesired effects as you just saw with the countdown example. To fix it, you can simply tell

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 to forcefully flush the stream without waiting for a newline character in the buffer using its
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
467 flag

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
16

That’s all. Your countdown should work as expected now, but don’t take my word for it. Go ahead and test it to see the difference

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 bao gồm tất cả các tham số của nó. You know their purpose and when to use them. Understanding the signature is only the beginning, however. In the upcoming sections, you’ll see why

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

There isn’t an easy way to flush the stream in Python 2, because the

This is a test
This is another test
202 statement doesn’t allow for it by itself. You need to get a handle of its lower-level layer, which is the standard output, and call it directly

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
17

Alternatively, you could disable buffering of the standard streams either by providing the

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
470 flag to the Python interpreter or by setting up the
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
471 environment variable

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
18

Note that

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 was backported to Python 2 and made available through the
This is a test
This is another test
241 module. Unfortunately, it doesn’t come with the
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
467 parameter

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
19

What you’re seeing here is a docstring of the

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function. You can display docstrings of various objects in Python using the built-in
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
476 function

Printing Custom Data Types

Up until now, you only dealt with built-in data types such as strings and numbers, but you’ll often want to print your own abstract data types. Let’s have a look at different ways of defining them

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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
477, which is available in the standard library. Named tuples have a neat textual representation out of the box

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
20

That’s great as long as holding data is enough, but in order to add behaviors to the

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
478 type, you’ll eventually need to define a class. Take a look at this example

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
21

If you now create an instance of the

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
478 class and try to print it, you’ll get this bizarre output, which is quite different from the equivalent
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
477

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
22

It’s the default representation of objects, which comprises their address in memory, the corresponding class name and a module in which they were defined. You’ll fix that in a bit, but just for the record, as a quick workaround you could combine

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
477 and a custom class through inheritance

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
23

Your

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
478 class has just become a specialized kind of
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
477 with two attributes, which you can customize

Note. In Python 3, the

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
484 statement can be replaced with the ellipsis (
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
485) literal to indicate a placeholder

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
24

This prevents the interpreter from raising

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
486 due to missing indented block of code

That’s better than a plain

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
477, because not only do you get printing right for free, but you can also add custom methods and properties to the class. However, it solves one problem while introducing another. Remember that tuples, including named tuples, are immutable in Python, so they can’t change their values once created

It’s true that designing immutable data types is desirable, but in many cases, you’ll want them to allow for change, so you’re back with regular classes again

Note. Following other languages and frameworks, Python 3. 7 introduced data classes, which you can think of as mutable tuples. This way, you get the best of both worlds

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
25

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

From earlier subsections, you already know that

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 implicitly calls the built-in
This is a test
This is another test
230 function to convert its positional arguments into strings. Indeed, calling
This is a test
This is another test
230 manually against an instance of the regular
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
478 class yields the same result as printing it

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
26

This is a test
This is another test
230, in turn, looks for one of two magic methods within the class body, which you typically implement. If it doesn’t find one, then it falls back to the ugly default representation. Those magic methods are, in order of search

  1. s1 = "This is a test"
    s2 = "This is another test"
    
    print(s1, end=" ")
    print(s2)
    493
  2. s1 = "This is a test"
    s2 = "This is another test"
    
    print(s1, end=" ")
    print(s2)
    494

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. Ideally, it should return valid Python code, so that you can pass it directly to

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
495

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
27

Notice the use of another built-in function,

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
496, which always tries to call
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
497 in an object, but falls back to the default representation if it doesn’t find that method

Note. Even though

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 itself uses
This is a test
This is another test
230 for type casting, some compound data types delegate that call to
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
496 on their members. This happens to lists and tuples, for example

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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
28

If you print a single object of the

This is a test This is another test
201 class, then you won’t see the password, because
This is a test This is another test
202 will call
This is a test This is another test
203, which eventually will invoke
This is a test This is another test
204

>>>

s1 = "This is a test"
s2 = "This is another test"

print(s1, end="\n\n\n")
print(s2)
29

However, if you put the same

This is a test This is another test
205 variable inside a list by wrapping it in square brackets, then the password will become clearly visible

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
400

That’s because sequences, such as lists and tuples, implement their

This is a test This is another test
206 method so that all of their elements are first converted with
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
496

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. Some of them, such as named tuples and data classes, offer string representations that look good without requiring any work on your part. Still, for the most flexibility, you’ll have to define a class and override its magic methods described above

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

The semantics of

This is a test This is another test
206 and
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
497 didn’t change since Python 2, but you must remember that strings were nothing more than glorified byte arrays back then. To convert your objects into proper Unicode, which was a separate data type, you’d have to provide yet another magic method.
This is a test This is another test
210

Here’s an example of the same

This is a test This is another test
201 class in Python 2

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
401

As you can see, this implementation delegates some work to avoid duplication by calling the built-in

This is a test This is another test
212 function on itself

Both

This is a test This is another test
206 and
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
497 methods must return strings, so they encode Unicode characters into specific byte representations called character sets. UTF-8 is the most widespread and safest encoding, while
This is a test This is another test
215 is a special constant to express funky characters, such as
This is a test This is another test
216, as escape sequences in plain ASCII, such as
This is a test This is another test
217

The

This is a test
This is another test
202 statement is looking for the magic
This is a test This is another test
206 method in the class, so the chosen charset must correspond to the one used by the terminal. For example, default encoding in DOS and Windows is CP 852 rather than UTF-8, so running this can result in a
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
459 or even garbled output

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
402

However, if you ran the same code on a system with UTF-8 encoding, then you’d get the proper spelling of a popular Russian name

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
403

It’s recommended to convert strings to Unicode as early as possible, for example, when you’re reading data from a file, and use it consistently everywhere in your code. At the same time, you should encode Unicode back to the chosen character set right before presenting it to the user

It seems as if you have more control over string representation of objects in Python 2 because there’s no magic

This is a test This is another test
210 method in Python 3 anymore. You may be asking yourself if it’s possible to convert an object to its byte string representation rather than a Unicode string in Python 3. It’s possible, with a special
This is a test This is another test
222 method that does just that

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
404

Using the built-in

This is a test This is another test
223 function on an instance delegates the call to its
This is a test This is another test
224 method defined in the corresponding class

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

Understanding Python s1 = "This is a test" s2 = 'This is another test' print(s1) print(s2)494

You know how to use

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 quite well at this point, but knowing what it is will allow you to use it even more effectively and consciously. 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

You’ve seen that

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 is a function in Python 3. More specifically, it’s a built-in function, which means that you don’t need to import it from anywhere

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
405

It’s always available in the global namespace so that you can call it directly, but you can also access it through a module from the standard library

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
406

This way, you can avoid name collisions with custom functions. Let’s say you wanted to redefine

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 so that it doesn’t append a trailing newline. Đồng thời, bạn muốn đổi tên chức năng ban đầu thành một cái gì đó như
This is a test This is another test
229

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
407

Now you have two separate printing functions just like in the Java programming language. You’ll define custom

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 functions in the mocking section later as well. Also, note that you wouldn’t be able to overwrite
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 in the first place if it wasn’t a function

On the other hand,

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 isn’t a function in the mathematical sense, because it doesn’t return any meaningful value other than the implicit
This is a test
This is another test
232

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
408

Such functions are, in fact, procedures or subroutines that you call to achieve some kind of side-effect, which ultimately is a change of a global state. In the case of

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494, that side-effect is showing a message on the standard output or writing to a file

Because

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 is a function, it has a well-defined signature with known attributes. You can quickly find its documentation using the editor of your choice, without having to remember some weird syntax for performing a certain task

Besides, functions are easier to extend. Adding a new feature to a function is as easy as adding another keyword argument, whereas changing the language to support that new feature is much more cumbersome. Think of stream redirection or buffer flushing, for example

Another benefit of

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 being a function is composability. Functions are so-called first-class objects or first-class citizens in Python, which is a fancy way of saying they’re values just like strings or numbers. This way, you can assign a function to a variable, pass it to another function, or even return one from another.
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 không khác biệt về vấn đề này. For instance, you can take advantage of it for dependency injection

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
409

Here, the

This is a test This is another test
238 parameter lets you inject a callback function, which defaults to
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 but can be any callable. In this example, printing is completely disabled by substituting
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 with a dummy function that does nothing

Note. A dependency is any piece of code required by another bit of code

Dependency injection is a technique used in code design to make it more testable, reusable, and open for extension. You can achieve it by referring to dependencies indirectly through abstract interfaces and by providing them in a push rather than pull fashion

There’s a funny explanation of dependency injection circulating on the Internet

Dependency injection for five-year-olds

When you go and get things out of the refrigerator for yourself, you can cause problems. You might leave the door open, you might get something Mommy or Daddy doesn’t want you to have. 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, 28 October 2009. (Source)

Composition allows you to combine a few functions into a new one of the same kind. Let’s see this in action by specifying a custom

This is a test This is another test
241 function that prints to the standard error stream and prefixes all messages with a given log level

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
410

This custom function uses partial functions to achieve the desired effect. It’s an advanced concept borrowed from the functional programming paradigm, so you don’t need to go too deep into that topic for now. However, if you’re interested in this topic, I recommend taking a look at the

This is a test This is another test
242 module

Unlike statements, functions are values. That means you can mix them with expressions, in particular, lambda expressions. Instead of defining a full-blown function to replace

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 with, you can make an anonymous lambda expression that calls it

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
411

However, because a lambda expression is defined in place, there’s no way of referring to it elsewhere in the code

Note. In Python, you can’t put statements, such as assignments, conditional statements, loops, and so on, in an anonymous lambda function. It has to be a single expression

Another kind of expression is a ternary conditional expression

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
412

Python has both conditional statements and conditional expressions. The latter is evaluated to a single value that can be assigned to a variable or passed to a function. In the example above, you’re interested in the side-effect rather than the value, which evaluates to

This is a test
This is another test
232, so you simply ignore it

As you can see, functions allow for an elegant and extensible solution, which is consistent with the rest of the language. Trong tiểu mục tiếp theo, bạn sẽ khám phá ra việc không có hàm

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 gây ra nhiều vấn đề đau đầu như thế nào

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

This is a test This is another test202 Was a Statement in Python 2

A statement is an instruction that may evoke a side-effect when executed but never evaluates to a value. In other words, you wouldn’t be able to print a statement or assign it to a variable like this

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
413

That’s a syntax error in Python 2

Here are a few more examples of statements in Python

  • assignment.
    This is a test This is another test
    247
  • conditional.
    This is a test This is another test
    248
  • loop.
    This is a test This is another test
    249
  • assertion.
    This is a test This is another test
    250

Note. Python 3. 8 brings a controversial walrus operator (

This is a test This is another test
251), which is an assignment expression. With it, you can evaluate an expression and assign the result to a variable at the same time, even within another expression

Take a look at this example, which calls an expensive function once and then reuses the result for further computation

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
414

This is useful for simplifying the code without losing its efficiency. Typically, performant code tends to be more verbose

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
415

The controversy behind this new piece of syntax caused a lot of argument. An abundance of negative comments and heated debates eventually led Guido van Rossum to step down from the Benevolent Dictator For Life or BDFL position

Statements are usually comprised of reserved keywords such as

This is a test This is another test
248,
This is a test This is another test
253, or
This is a test
This is another test
202 that have fixed meaning in the language. You can’t use them to name your variables or other symbols. That’s why redefining or mocking the
This is a test
This is another test
202 statement isn’t possible in Python 2. You’re stuck with what you get

Furthermore, you can’t print from anonymous functions, because statements aren’t accepted in lambda expressions

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
416

The syntax of the

This is a test
This is another test
202 statement is ambiguous. Sometimes you can add parentheses around the message, and they’re completely optional

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
417

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

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
418

String concatenation can raise a

This is a test
This is another test
257 due to incompatible types, which you have to handle manually, for example

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
419

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ự

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
420

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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
476 tích hợp cũng không hữu ích đối với câu lệnh
This is a test
This is another test
202

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
421

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

This is a test
This is another test
202 cùng nhau và trên hết, bạn phải cực kỳ siêng năng về mã hóa ký tự

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

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 đã đượ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
This is a test
This is another test
241 đặ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

Ghi chú. You may import future functions as well as baked-in language constructs such as the

This is a test This is another test
263 statement

To find out exactly what features are available to you, inspect the module

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
422

You could also call

This is a test This is another test
264, but that would show a lot of uninteresting internal details of the module

To enable the

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function in Python 2, you need to add this import statement at the beginning of your source code

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
423

From now on the

This is a test
This is another test
202 statement is no longer available, but you have the
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function at your disposal. Note that it isn’t the same function like the one in Python 3, because it’s missing the
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
467 keyword argument, but the rest of the arguments are the same

Other than that, it doesn’t spare you from managing character encodings properly

Here’s an example of calling the

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function in Python 2

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
424

You now have an idea of how printing in Python evolved and, most importantly, understand why these backward-incompatible changes were necessary. Knowing this will surely help you become a better Python programmer

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

Printing With Style

If you thought that printing was only about lighting pixels up on the screen, then technically you’d be right. However, there are ways to make it look cool. In this section, you’ll find out how to format complex data structures, add colors and other decorations, build interfaces, use animation, and even play sounds with text

Pretty-Printing Nested Data Structures

Computer languages allow you to represent data as well as executable code in a structured way. Unlike Python, however, most languages give you a lot of freedom in using whitespace and formatting. Đ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. This is done by indenting certain lines, inserting newlines, reordering elements, and so forth

Python comes with the

This is a test This is another test
270 module in its standard library, which will help you in pretty-printing large data structures that don’t fit on a single line. Because it prints in a more human-friendly way, many popular REPL tools, including JupyterLab and IPython, use it by default in place of the regular
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function

Note. To toggle pretty printing in IPython, issue the following command

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
425

This is an example of Magic in IPython. There are a lot of built-in commands that start with a percent sign (

This is a test This is another test
272), but you can find more on PyPI, or even create your own

If you don’t care about not having access to the original

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function, then you can replace it with
This is a test This is another test
274 in your code using import renaming

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
426

Personally, I like to have both functions at my fingertips, so I’d rather use something like

This is a test This is another test
275 as a short alias

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
427

At first glance, there’s hardly any difference between the two functions, and in some cases there’s virtually none

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
428

That’s because

This is a test This is another test
274 calls
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
496 instead of the usual
This is a test
This is another test
230 for type casting, so that you may evaluate its output as Python code if you want to. The differences become apparent as you start feeding it more complex data structures

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
429

The function applies reasonable formatting to improve readability, but you can customize it even further with a couple of parameters. For example, you may limit a deeply nested hierarchy by showing an ellipsis below a given level

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
430

The ordinary

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 also uses ellipses but for displaying recursive data structures, which form a cycle, to avoid stack overflow error

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
431

However,

This is a test This is another test
274 is more explicit about it by including the unique identity of a self-referencing object

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
432

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

Note. Recursive or very large data sets can be dealt with using the

This is a test This is another test
281 module as well

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
433

This module supports most of the built-in types and is used by the Python debugger

This is a test This is another test
274 automatically sorts dictionary keys for you before printing, which allows for consistent comparison. When you’re comparing strings, you often don’t care about a particular order of serialized attributes. Anyways, it’s always best to compare actual dictionaries before serialization

Dictionaries often represent JSON data, which is widely used on the Internet. To correctly serialize a dictionary into a valid JSON-formatted string, you can take advantage of the

This is a test This is another test
283 module. It too has pretty-printing capabilities

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
434

Notice, however, that you need to handle printing yourself, because it’s not something you’d typically want to do. Similarly, the

This is a test This is another test
270 module has an additional
This is a test This is another test
285 function that returns a string, in case you had to do something other than printing it

Surprisingly, the signature of

This is a test This is another test
274 is nothing like the
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function’s one. You can’t even pass more than one positional argument, which shows how much it focuses on printing data structures

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

Adding Colors With ANSI Escape Sequences

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. That changed a few decades ago when people at the American National Standards Institute decided to unify it by defining ANSI escape codes

Most of today’s terminal emulators support this standard to some degree. Until recently, the Windows operating system was a notable exception. Therefore, if you want the best portability, use the

This is a test This is another test
288 library in Python. It translates ANSI codes to their appropriate counterparts in Windows while keeping them intact in other operating systems

To check if your terminal understands a subset of the ANSI escape sequences, for example, related to colors, you can try using the following command

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
435

My default terminal on Linux says it can display 256 distinct colors, while xterm gives me only 8. The command would return a negative number if colors were unsupported

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

This is a test This is another test
289 or
This is a test This is another test
290, 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

As its name implies, a sequence must begin with the non-printable Esc character, whose ASCII value is 27, sometimes denoted as

This is a test This is another test
291 in hexadecimal or
This is a test This is another test
292 in octal. You may use Python number literals to quickly verify it’s indeed the same number.

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
436

Additionally, you can obtain it with the

This is a test This is another test
293 escape sequence in the shell

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
437

The most common ANSI escape sequences take the following form

ElementDescriptionExample Esc non-printable escape character

This is a test This is another test
294
This is a test This is another test
295opening square bracket
This is a test This is another test
295numeric codeone or more numbers separated with
This is a test This is another test
297
This is a test This is another test
298character codeuppercase or lowercase letter
This is a test This is another test
299

The numeric code can be one or more numbers separated with a semicolon, while the character code is just one letter. Their specific meaning is defined by the ANSI standard. 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

This is a test This is another test
299

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
438

Ở đầu kia của quang phổ, bạn có các giá trị mã phức hợp. To set foreground and background with RGB channels, given that your terminal supports 24-bit depth, you could provide multiple numbers

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
439

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í nó 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

>>> ____1440

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

This is a test This is another test
401 xuất hiện với phông chữ màu đỏ, in đậm và gạch chân

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

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

This is a test This is another test
288 đã đề cập, cũng như các công cụ để xây dựng giao diện người dùng trong bảng điều khiển

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

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

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

This is a test This is another test
403 dường như là lựa chọn phổ biến nhất

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

This is a test This is another test
403 trong Windows, bạn cần cài đặt gói của bên thứ ba

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
441

Đó là bởi vì

This is a test This is another test
403 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?

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

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

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
442

Lưu ý, hàm phải chấp nhận tham chiếu đến đối tượng màn hình, còn được gọi là

This is a test This is another test
407, mà bạn sẽ sử dụng sau này để thiết lập bổ sung

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
443

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
444

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
445

Đầ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. Trong khi tọa độ y của nó vẫn ở mức 0, thì tọa độ x của nó giảm dần từ đầu đến đuôi

Để 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. Mỗi phân đoạn mang tọa độ

This is a test This is another test
408, vì vậy bạn có thể giải nén chúng

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
446

Một lần nữa, nếu bạn chạy mã này ngay bây giờ, nó sẽ không hiển thị bất cứ thứ gì vì bạn phải làm mới màn hình một cách rõ ràng sau đó

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
447

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
448

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
449

Để 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

This is a test This is another test
409,
This is a test This is another test
410 và
This is a test This is another test
411 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 điện cho

This is a test This is another test
412 để 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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
450

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

This is a test This is another test
412 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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
451

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

Cuối cùng, đây là tất cả những gì bạn cần để chơi trò rắn săn mồi bằng Python

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
452

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

This is a test This is another test
403 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

This is a test This is another test
403. 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.
    This is a test
    This is another test
    208
  • xóa lùi.
    This is a test
    This is another test
    213

Cái đầu tiên di chuyển con trỏ đến đầu dòng, trong khi cái thứ hai chỉ di chuyển con trỏ sang trái một ký tự. Cả hai đều hoạt động theo cách không phá hủy mà không ghi đè lên văn bản đã được viết

Hãy xem xét một vài ví dụ

Bạn sẽ thường muốn hiển thị một số loại bánh xe quay để chỉ ra một công việc đang tiến hành mà không biết chính xác còn bao nhiêu thời gian để hoàn thành

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

Nhiều công cụ dòng lệnh sử dụng thủ thuật này khi tải dữ liệu qua mạng. Bạn có thể tạo hoạt hình chuyển động dừng thực sự đơn giản từ một chuỗi các ký tự sẽ quay vòng theo kiểu vòng tròn

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
453

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. Bạn không muốn có thêm khoảng trống giữa các đối số vị trí, vì vậy đối số dấu phân cách phải để trống. Ngoài ra, hãy lưu ý việc sử dụng các chuỗi thô của Python do các ký tự dấu gạch chéo ngược có trong nghĩa đen

Khi bạn biết thời gian còn lại hoặc phần trăm hoàn thành nhiệm vụ, thì bạn có thể hiển thị thanh tiến trình động

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
454

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ú. Có một thư viện

This is a test This is another test
418 giàu tính năng, cùng với một số công cụ tương tự khác, có thể hiển thị tiến độ theo cách toàn diện hơn nhiều

Tạo âm thanh với s1 = "This is a test" s2 = 'This is another test' print(s1) print(s2)494

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
455

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

This is a test This is another test
420 cho phép giải thích 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
This is a test This is another test
421, 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

  • Các chữ cái được mã hóa bằng một chuỗi các ký hiệu dấu chấm (·) và dấu gạch ngang (–)
  • 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
  • Ký hiệu của hai chữ cái liền kề cách nhau ba đơn vị thời gian
  • 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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
456

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
457

Có lẽ bạn thậm chí có thể tiến thêm một bước và tạo một công cụ dòng lệnh để dịch văn bản sang mã Morse?

Mocking Python s1 = "This is a test" s2 = 'This is another test' print(s1) print(s2)494 trong các bài kiểm tra đơn vị

Ngày nay, bạn mong đợi rằng bạn gửi mã đáp ứng các tiêu chuẩn chất lượng cao. Nếu bạn khao khát trở thành một chuyên gia, bạn phải học cách kiểm tra mã của mình

Kiểm thử phần mềm đặc biệt quan trọng trong các ngôn ngữ được nhập động, chẳng hạn như Python, không có trình biên dịch để cảnh báo bạn về những lỗi rõ ràng. Các lỗi có thể tìm đường đến môi trường sản xuất và không hoạt động trong một thời gian dài, cho đến một ngày khi một nhánh mã cuối cùng được thực thi

Chắc chắn rồi, bạn có 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

Vì vậy, bạn có nên thử nghiệm

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 không? . Xét cho cùng, đó là một chức năng tích hợp sẵn phải trải qua một bộ kiểm tra toàn diện. Tuy nhiên, điều bạn muốn kiểm tra là liệu mã của bạn có đang gọi
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 để ghi lại và xác minh các yêu cầu của nó

Note. Bạn có thể đã nghe các điều khoản. dummy, fake, stub, spy, hoặc mock được sử dụng thay thế cho nhau. Một số người phân biệt giữa chúng, trong khi những người khác thì không

Martin Fowler giải thích sự khác biệt của chúng trong một bảng thuật ngữ ngắn và gọi chung chúng là kiểm tra nhân đôi

Mocking trong Python có thể được thực hiện gấp đôi. Đầu tiên, bạn có thể đi theo con đường truyền thống của các ngôn ngữ được gõ tĩnh bằng cách sử dụng phép nội xạ phụ thuộc. Điều này đôi khi có thể yêu cầu bạn thay đổi mã đang được kiểm tra, điều này không phải lúc nào cũng thực hiện được nếu mã được xác định trong thư viện bên ngoài

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
458

Đây là ví dụ giống như tôi đã sử dụng trong phần trước để nói về thành phần chức năng. Về cơ bản, nó cho phép thay thế

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 bằng chức năng tùy chỉnh của cùng một giao diện. Để kiểm tra xem nó có in đúng thông báo hay không, bạn phải chặn nó bằng cách đưa vào một hàm giả lập

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
459

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

This is a test This is another test
250 statement

In a slightly alternative solution, instead of replacing the entire

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function with a custom wrapper, you could redirect the standard output to an in-memory file-like stream of characters

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
460

This time the function explicitly calls

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494, but it exposes its
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
443 parameter to the outside world

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

This is a test This is another test
431 module, which uses a technique called monkey patching. This derogatory name stems from it being a “dirty hack” that you can easily shoot yourself in the foot with. It’s less elegant than dependency injection but definitely quick and convenient

Note. The

This is a test This is another test
431 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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
461

Other than that, you referred to it as

This is a test This is another test
431, whereas in Python 3 it’s part of the unit testing module, so you must import from
This is a test This is another test
434

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

To mock

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 in a test case, you’ll typically use the
This is a test This is another test
436 decorator and specify a target for patching by referring to it with a fully qualified name, that is including the module name

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
462

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

Did you notice anything peculiar about that code snippet?

Despite injecting a mock to the function, you’re not calling it directly, although you could. 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

In real life, mocking helps to isolate the code under test by removing dependencies such as a database connection. You rarely call mocks in a test, because that doesn’t make much sense. 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

Here’s what that means

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
463

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

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494. It thinks it’s calling
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494, but in reality, it’s calling a mock you’re in total control of

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function, for example, by mocking it away. Paradoxically, however, that same function can help you find bugs during a related process of debugging you’ll read about in the next section

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

You can’t monkey patch the

This is a test
This is another test
202 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
    s1 = "This is a test"
    s2 = "This is another test"
    
    print(s1, end=" ")
    print(s2)
    404 module
  • Import
    s1 = "This is a test"
    s2 = 'This is another test'
    
    print(s1)
    print(s2)
    494 from the
    This is a test
    This is another test
    241 module

Let’s examine them one by one

Stream redirection is almost identical to the example you saw earlier

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
464

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

This is a test This is another test
444) instead of the
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
443 argument. The other difference is where
This is a test This is another test
446 is defined. You can import it from a similarly named
This is a test This is another test
446 module, or
This is a test This is another test
448 for a faster implementation

Patching the standard output from the

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
404 module is exactly what it sounds like, but you need to be aware of a few gotchas

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
465

First of all, remember to install the

This is a test This is another test
431 module as it wasn’t available in the standard library in Python 2

Secondly, the

This is a test
This is another test
202 statement calls the underlying
s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
440 method on the mocked object instead of calling the object itself. That’s why you’ll run assertions against
This is a test This is another test
453

Finally, a single

This is a test
This is another test
202 statement doesn’t always correspond to a single call to
This is a test This is another test
455. In fact, you’ll see the newline character written separately

The last option you have is importing

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 from
This is a test This is another test
457 and patching it

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
466

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function is defined in the
This is a test This is another test
459 module rather than
This is a test This is another test
460

s1 = "This is a test" s2 = 'This is another test' print(s1) print(s2)494 Debugging

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function, through the
This is a test This is another test
463 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

Ý tưởng là đi theo đường dẫn thực hiện chương trình cho đến khi chương trình dừng đột ngột hoặc đưa ra kết quả không chính xác để xác định chính xác lệnh có vấn đề. You do that by inserting print statements with words that stand out in carefully chosen places

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

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
467

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

This is a test This is another test
464, 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

Lỗi làm trònHiển thị/Ẩn

Trong trường hợp này, vấn đề nằm ở chỗ số dấu phẩy động được biểu diễn như thế nào trong bộ nhớ máy tính. Hãy nhớ rằng các số được lưu trữ ở dạng nhị phân. Giá trị thập phân của

This is a test This is another test
464 hóa ra có dạng biểu diễn nhị phân vô hạn, được làm tròn

Để biết thêm thông tin về cách làm tròn số trong Python, bạn có thể xem Cách làm tròn số trong Python

Phương pháp này đơn giản, trực quan và sẽ hoạt động với hầu hết mọi ngôn ngữ lập trình hiện có. Chưa kể, đó là một bài tập tuyệt vời trong quá trình học tập

Mặt khác, một khi bạn nắm vững các kỹ thuật nâng cao hơn, thì rất khó để quay lại, vì chúng cho phép bạn tìm lỗi nhanh hơn nhiều. Truy tìm là một quy trình thủ công tốn nhiều công sức, có thể để lọt nhiều lỗi hơn nữa. The build and deploy cycle takes time. Sau đó, bạn cần nhớ loại bỏ tỉ mỉ tất cả các cuộc gọi

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 mà bạn đã thực hiện mà không vô tình chạm vào cuộc gọi chính hãng

Bên cạnh đó, nó yêu cầu bạn thực hiện các thay đổi trong mã, điều này không phải lúc nào cũng có thể thực hiện được. Maybe you’re debugging an application running in a remote web server or want to diagnose a problem in a post-mortem fashion. Đôi khi bạn chỉ đơn giản là không có quyền truy cập vào đầu ra tiêu chuẩn

Đó chính xác là nơi khai thác gỗ tỏa sáng

ghi nhật ký

Giả sử bạn đang điều hành một trang web thương mại điện tử trong một phút. Một ngày nọ, một khách hàng tức giận gọi điện thoại phàn nàn về một giao dịch không thành công và nói rằng anh ta đã mất tiền. Anh ấy tuyên bố đã thử mua một số mặt hàng, nhưng cuối cùng, có một số lỗi khó hiểu khiến anh ấy không thể hoàn thành đơn hàng đó. Tuy nhiên, khi anh ta kiểm tra tài khoản ngân hàng của mình, tiền đã biến mất

Bạn chân thành xin lỗi và hoàn tiền, nhưng cũng không muốn điều này lặp lại trong tương lai. Làm thế nào để bạn gỡ lỗi đó?

Bất cứ khi nào bạn thấy mình đang gỡ lỗi bản in, hãy cân nhắc biến nó thành thông báo tường trình vĩnh viễn. Điều này có thể hữu ích trong những tình huống như thế này, khi bạn cần phân tích một vấn đề sau khi nó xảy ra, trong một môi trường mà bạn không có quyền truy cập

Có những công cụ tinh vi để tổng hợp và tìm kiếm nhật ký, nhưng ở cấp độ cơ bản nhất, bạn có thể coi nhật ký là tệp văn bản. Mỗi dòng truyền tải thông tin chi tiết về một sự kiện trong hệ thống của bạn. Thông thường, nó sẽ không chứa thông tin nhận dạng cá nhân, tuy nhiên, trong một số trường hợp, nó có thể được pháp luật quy định

Đây là bảng phân tích của một bản ghi nhật ký điển hình

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
468

Như bạn có thể thấy, nó có dạng cấu trúc. Ngoài một thông báo mô tả, có một số trường có thể tùy chỉnh, cung cấp ngữ cảnh của một sự kiện. Tại đây, bạn có ngày giờ chính xác, cấp nhật ký, tên nhật ký và tên luồng

Các cấp nhật ký cho phép bạn lọc tin nhắn nhanh chóng để giảm tiếng ồn. Ví dụ: nếu bạn đang tìm lỗi, bạn không muốn xem tất cả các cảnh báo hoặc thông báo gỡ lỗi. Việc tắt hoặc bật thông báo ở các cấp nhật ký nhất định thông qua cấu hình là chuyện nhỏ mà không cần chạm vào mã

Với tính năng ghi nhật ký, bạn có thể giữ các thông báo gỡ lỗi của mình tách biệt với đầu ra tiêu chuẩn. Theo mặc định, tất cả các thông báo nhật ký đều chuyển đến luồng lỗi tiêu chuẩn, có thể hiển thị thuận tiện bằng các màu khác nhau. Tuy nhiên, bạn có thể chuyển hướng thông điệp tường trình sang các tệp riêng biệt, ngay cả đối với các mô-đun riêng lẻ

Khá phổ biến, ghi nhật ký bị định cấu hình sai có thể dẫn đến hết dung lượng trên đĩa của máy chủ. Để ngăn chặn điều đó, bạn có thể thiết lập xoay vòng nhật ký, thao tác này sẽ giữ các tệp nhật ký trong một khoảng thời gian nhất định, chẳng hạn như một tuần hoặc khi chúng đạt đến một kích thước nhất định. Tuy nhiên, lưu trữ các nhật ký cũ hơn luôn là một cách thực hành tốt. Một số quy định buộc dữ liệu khách hàng phải được lưu giữ trong vòng 5 năm

So với các ngôn ngữ lập trình khác, đăng nhập Python đơn giản hơn vì module

This is a test This is another test
463 được đóng gói sẵn với thư viện chuẩn. Bạn chỉ cần nhập và định cấu hình nó chỉ trong hai dòng mã

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
469

Bạn có thể gọi các chức năng được xác định ở cấp độ mô-đun, được nối với trình ghi nhật ký gốc, nhưng thực tế phổ biến hơn là lấy một trình ghi nhật ký chuyên dụng cho từng tệp nguồn của bạn

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
470

Ưu điểm của việc sử dụng trình ghi nhật ký tùy chỉnh là kiểm soát chi tiết hơn. Chúng thường được đặt tên theo mô-đun mà chúng được xác định thông qua biến

This is a test This is another test
468

Ghi chú. Có một mô-đun

This is a test This is another test
469 hơi liên quan trong Python, mô-đun này cũng có thể ghi thông báo vào luồng lỗi tiêu chuẩn. Tuy nhiên, nó có phổ ứng dụng hẹp hơn, chủ yếu là mã thư viện, trong khi các ứng dụng khách nên sử dụng mô-đun
This is a test This is another test
463

Điều đó nói rằng, bạn có thể làm cho chúng hoạt động cùng nhau bằng cách gọi

This is a test This is another test
471

Một lý do cuối cùng để chuyển từ chức năng

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 sang ghi nhật ký là sự an toàn của luồng. Trong phần sắp tới, bạn sẽ thấy rằng phần trước không hoạt động tốt với nhiều luồng thực thi

gỡ lỗi

Sự thật là cả truy tìm và ghi nhật ký đều không thể được coi là gỡ lỗi thực sự. Để thực hiện gỡ lỗi thực tế, bạn cần một công cụ gỡ lỗi, cho phép bạn thực hiện các thao tác sau

  • Bước qua mã một cách tương tác
  • Đặt điểm ngắt, bao gồm cả điểm dừng có điều kiện
  • Các biến nội quan trong bộ nhớ
  • Đánh giá các biểu thức tùy chỉnh trong thời gian chạy

Trình gỡ lỗi thô chạy trong thiết bị đầu cuối, có tên không ngạc nhiên là

This is a test This is another test
473 cho “Trình gỡ lỗi Python,” được phân phối như một phần của thư viện chuẩn. Điều này làm cho nó luôn khả dụng, vì vậy nó có thể là lựa chọn duy nhất của bạn để thực hiện gỡ lỗi từ xa. Có lẽ đó là một lý do tốt để làm quen với nó

Tuy nhiên, nó không đi kèm với giao diện đồ họa nên việc sử dụng

This is a test This is another test
473 có thể hơi phức tạp một chút. Nếu bạn không thể chỉnh sửa mã, bạn phải chạy mã đó dưới dạng mô-đun và chuyển vị trí tập lệnh của bạn

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
471

Nếu không, bạn có thể thiết lập một điểm ngắt trực tiếp trong mã, điểm dừng này sẽ tạm dừng việc thực thi tập lệnh của bạn và đưa bạn vào trình gỡ lỗi. Cách cũ để làm điều này cần hai bước

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
472

Thao tác này sẽ hiển thị lời nhắc tương tác, thoạt nhìn có vẻ đáng sợ. Tuy nhiên, bạn vẫn có thể nhập Python nguyên gốc vào thời điểm này để kiểm tra hoặc sửa đổi trạng thái của các biến cục bộ. Ngoài ra, thực sự chỉ có một số lệnh dành riêng cho trình gỡ lỗi mà bạn muốn sử dụng để xem qua mã

Ghi chú. Theo thông lệ, bạn sẽ đặt hai hướng dẫn để khởi động trình gỡ lỗi trên một dòng. Điều này yêu cầu sử dụng dấu chấm phẩy, hiếm khi được tìm thấy trong các chương trình Python

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
473

Mặc dù chắc chắn không phải Pythonic, nhưng nó nổi bật như một lời nhắc xóa nó sau khi bạn hoàn tất việc gỡ lỗi

Kể từ Python 3. 7, bạn cũng có thể gọi hàm

This is a test This is another test
475 tích hợp, thực hiện tương tự nhưng theo cách nhỏ gọn hơn và có thêm một số chuông và còi

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
474

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

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

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

In chỉ an toàn

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

This is a test This is another test
463 thay vì chức năng
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494. Nếu bạn vẫn đang đọc điều này, thì bạn phải cảm thấy thoải mái với khái niệm chủ đề

An toàn luồng có nghĩa là một đoạn mã có thể được chia sẻ an toàn giữa nhiều luồng thực thi. The simplest strategy for ensuring thread-safety is by sharing immutable objects only. Nếu các luồng không thể sửa đổi trạng thái của một đối tượng, thì sẽ không có nguy cơ phá vỡ tính nhất quán của nó

Một phương pháp khác tận dụng bộ nhớ cục bộ, làm cho mỗi luồng nhận bản sao của cùng một đối tượng. That way, other threads can’t see the changes made to it in the current thread

Nhưng điều đó không giải quyết được vấn đề, phải không? . The most common way of synchronizing concurrent access to such a resource is by locking it. Điều này cho phép truy cập ghi độc quyền vào một hoặc đôi khi một vài luồng tại một thời điểm

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

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function holds a reference to the standard output, which is a shared global variable. Về lý thuyết, do không có khóa nên việc chuyển đổi ngữ cảnh có thể xảy ra trong khi gọi tới
This is a test This is another test
455, đan xen các đoạn văn bản từ nhiều lệnh gọi
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494

Ghi chú. Chuyển đổi ngữ cảnh có nghĩa là một luồng tạm dừng thực thi của nó, một cách tự nguyện hoặc không, để một luồng khác có thể tiếp quản. This might happen at any moment, even in the middle of a function call

Tuy nhiên, trong thực tế, điều đó không xảy ra. Cho dù bạn có cố gắng thế nào, việc ghi vào đầu ra tiêu chuẩn dường như là nguyên tử. The only problem that you may sometimes observe is with messed up line breaks

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
475

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

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
440 method go to sleep for a random amount of time. How? By mocking it, which you already know about from an earlier section

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
476

First, you need to store the original

s1 = "This is a test"
s2 = "This is another test"

print(s1, end=" ")
print(s2)
440 method in a variable, which you’ll delegate to later. Sau đó, bạn cung cấp triển khai giả của mình, sẽ mất tối đa một giây để thực thi. Mỗi chủ đề sẽ thực hiện một vài cuộc gọi
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 với tên của nó và một chữ cái. A, B, and C

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

This is a test This is another test
484 của mình. You’ll notice that you get a slightly different sequence each time

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
477

Mặc dù bản thân

This is a test This is another test
455 là một phép toán nguyên tử, nhưng một lần gọi hàm
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 có thể mang lại nhiều hơn một lần ghi. For example, line breaks are written separately from the rest of the text, and context switching takes place between those writes

Ghi chú. Bản chất nguyên tử của đầu ra tiêu chuẩn trong Python là sản phẩm phụ của Khóa phiên dịch toàn cầu, áp dụng khóa xung quanh các hướng dẫn mã byte. Be aware, however, that many interpreter flavors don’t have the GIL, where multi-threaded printing requires explicit locking

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
478

This will fix the output

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
479

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 vẫn tiếp tục thực hiện lệnh gọi riêng cho hậu tố trống, điều này chuyển thành lệnh
This is a test This is another test
488 vô dụng

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
480

A truly thread-safe version of the

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function could look like this

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
481

Bạn có thể đặt chức năng đó trong một mô-đun và nhập nó vào nơi khác

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
482

Now, despite making two writes per each

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 request, only one thread is allowed to interact with the stream, while the rest must wait

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
483

Tôi đã thêm nhận xét để cho biết khóa đang giới hạn quyền truy cập vào tài nguyên được chia sẻ như thế nào

Ghi chú. Ngay cả trong mã đơn luồng, bạn có thể gặp phải tình huống tương tự. Cụ thể, khi bạn đang in ra đầu ra tiêu chuẩn và các luồng lỗi tiêu chuẩn cùng một lúc. Unless you redirect one or both of them to separate files, they’ll both share a single terminal window

Ngược lại, mô-đun

This is a test This is another test
463 được thiết kế an toàn cho luồng, điều này được thể hiện qua khả năng hiển thị tên luồng trong thông báo được định dạng

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
484

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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 function all the time

Đối tác in Python

Đến bây giờ, bạn đã biết rất nhiều điều cần biết về

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494. The subject, however, wouldn’t be complete without talking about its counterparts a little bit. Trong khi
s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 là về đầu ra, có các chức năng và thư viện cho đầu vào

Được xây dựng trong

Python đi kèm với một chức năng tích hợp để chấp nhận đầu vào từ người dùng, được gọi là

This is a test This is another test
495. Nó chấp nhận dữ liệu từ luồng đầu vào tiêu chuẩn, thường là bàn phím

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
485

Hàm luôn trả về một chuỗi, vì vậy bạn có thể cần phân tích cú pháp cho phù hợp

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
486

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

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
487

Tuy nhiên, việc đưa ra lời kêu gọi hành động mang tính mô tả giúp trải nghiệm người dùng tốt hơn rất nhiều

Ghi chú. Để đọc từ đầu vào tiêu chuẩn trong Python 2, thay vào đó, bạn phải gọi

This is a test This is another test
496, đây là một tích hợp khác. Thật không may, cũng có một hàm
This is a test This is another test
495 được đặt tên gây hiểu nhầm, thực hiện một việc hơi khác

Trên thực tế, nó cũng lấy đầu vào từ luồng tiêu chuẩn, nhưng sau đó nó cố gắng đánh giá nó như thể đó là mã Python. Because that’s a potential security vulnerability, this function was completely removed from Python 3, while

This is a test This is another test
496 got renamed to
This is a test This is another test
495

Dưới đây là so sánh nhanh các chức năng có sẵn và chức năng của chúng

Trăn 2 Trăn 3

This is a test This is another test
496____4495
This is a test This is another test
495 _______4603

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

Yêu cầu người dùng nhập mật khẩu bằng

This is a test This is another test
495 là một ý tưởng tồi vì nó sẽ hiển thị ở dạng văn bản gốc khi họ nhập mật khẩu. Trong trường hợp này, bạn nên sử dụng hàm
This is a test This is another test
605 để che các ký tự đã nhập. This function is defined in a module under the same name, which is also available in the standard library

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
488

Mô-đun

This is a test This is another test
606 có một chức năng khác để lấy tên người dùng từ một biến môi trường

>>>

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
489

Các hàm tích hợp của Python để xử lý đầu vào tiêu chuẩn khá hạn chế. Đồng thời, có rất nhiều gói của bên thứ ba cung cấp các công cụ tinh vi hơn nhiều

bên thứ ba

Có các gói Python bên ngoài cho phép xây dựng các giao diện đồ họa phức tạp đặc biệt để thu thập dữ liệu từ người dùng. Một số tính năng của họ bao gồm

  • Định dạng và kiểu dáng nâng cao
  • Tự động phân tích cú pháp, xác thực và vệ sinh dữ liệu người dùng
  • A declarative style of defining layouts
  • Tự động hoàn thành tương tác
  • hỗ trợ chuột
  • Các vật dụng được xác định trước như danh sách kiểm tra hoặc menu
  • Lịch sử có thể tìm kiếm của các lệnh đã nhập
  • Đánh dấu cú pháp

Trình diễn các công cụ như vậy nằm ngoài phạm vi của bài viết này, nhưng bạn có thể muốn dùng thử chúng. Cá nhân tôi đã biết về một số trong số đó thông qua Python Bytes Podcast. Họ đây rồi

  • This is a test This is another test
    607
  • This is a test This is another test
    608
  • This is a test This is another test
    609
  • This is a test This is another test
    610

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

This is a test This is another test
611 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

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
490

Thoạt nhìn, nó giống như một lời nhắc điển hình khi bạn chạy nó

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
491

Nhưng ngay khi bạn mắc lỗi và muốn sửa nó, bạn sẽ thấy không có phím chức năng nào hoạt động như mong muốn. Ví dụ: nhấn vào mũi tên Trái sẽ dẫn đến điều này thay vì di chuyển con trỏ trở lại.

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
492

Bây giờ, bạn có thể gói cùng một tập lệnh bằng lệnh

This is a test This is another test
611. Bạn không chỉ làm cho các phím mũi tên hoạt động mà còn có thể tìm kiếm trong lịch sử liên tục của các lệnh tùy chỉnh của mình, sử dụng tính năng tự động hoàn thành và chỉnh sửa dòng bằng phím tắt

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
493

Điều đó không tuyệt sao?

Phần kết luận

Bây giờ bạn đã được trang bị một lượng kiến ​​thức về hàm

s1 = "This is a test"
s2 = 'This is another test'

print(s1)
print(s2)
494 trong Python, cũng như nhiều chủ đề xung quanh. 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

Ngoài ra, bạn đã học cách

  • Tránh những lỗi phổ biến với
    s1 = "This is a test"
    s2 = 'This is another test'
    
    print(s1)
    print(s2)
    494 trong Python
  • Xử lý các dòng mới, mã hóa ký tự và bộ đệm
  • Viết văn bản vào tập tin
  • Giả lập chức năng
    s1 = "This is a test"
    s2 = 'This is another test'
    
    print(s1)
    print(s2)
    494 trong các bài kiểm tra đơn vị
  • Xây dựng giao diện người dùng nâng cao trong thiết bị đầu cuối

Bây giờ bạn đã biết tất cả những điều này, bạn có thể tạo các chương trình tương tác giao tiếp với người dùng hoặc tạo dữ liệu ở các định dạng tệp phổ biến. Bạn có thể nhanh chóng chẩn đoán các sự cố trong mã của mình và tự bảo vệ mình khỏi chúng. Cuối cùng nhưng không kém phần quan trọng, bạn biết cách thực hiện trò chơi rắn cổ điển

Nếu bạn vẫn khao khát biết thêm thông tin, có câu hỏi hoặc chỉ đơn giản là muốn chia sẻ suy nghĩ của mình, thì hãy liên hệ trong phần bình luận bên dưới

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Hàm print() của Python. Đi xa hơn những điều cơ bản

🐍 Python Tricks 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Unsubscribe any time. Được quản lý bởi nhóm Real Python

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

Gửi cho tôi thủ thuật Python »

Giới thiệu về Bartosz Zaczyński

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?
Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

Bartosz là người hướng dẫn bootcamp, tác giả và lập trình viên đa ngôn ngữ yêu thích Python. Anh ấy giúp sinh viên của mình tiếp cận công nghệ phần mềm bằng cách chia sẻ kinh nghiệm thương mại hơn một thập kỷ trong ngành CNTT

» Thông tin thêm về Bartosz


Each tutorial at Real Python is created by a team of developers so that it meets our high quality standards. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

Aldren

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

Joanna

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

Mike

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Làm cách nào để bạn cập nhật cùng một câu lệnh in trong python?

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

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

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

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

What Do You Think?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi