Hướng dẫn string formatting python 3 - định dạng chuỗi python 3

Mục lục bài viết:

  • Định dạng chuỗi cũ bằng Python
    • Tùy chọn #1: %-format
    • Tùy chọn #2: str.format()
  • f-string: Một cách mới và cải tiến để định dạng chuỗi trong Python
    • Cú pháp đơn giản
    • Biểu thức tùy ý
    • Đa dòng trong f-string
    • Tốc độ
  • Một số chú ý
    • Dấu ngoặc kép
    • Từ điển
    • Ngoặc xoắn
    • Dấu gạch chéo ngược (xổ trái)
    • Chú thích (comment) bên trong
  • Đọc thêm


Kể từ Python 3.6, f-string là một cách mới tuyệt vời để định dạng chuỗi. Chúng không chỉ dễ đọc hơn, ngắn gọn hơn và ít bị lỗi hơn so với các cách định dạng khác mà còn nhanh hơn!f-string là một cách mới tuyệt vời để định dạng chuỗi. Chúng không chỉ dễ đọc hơn, ngắn gọn hơn và ít bị lỗi hơn so với các cách định dạng khác mà còn nhanh hơn!

Đến cuối bài viết này, bạn sẽ học cách làm thế nào và tại sao nên bắt đầu sử dụng f-strings ngay hôm nay.

Nhưng trước hết ta sẽ xem phải định dạng chuỗi thế nào khi chưa có f-strings.

Định dạng chuỗi cũ trong Python

Trước Python 3.6, bạn có hai cách chính để nhúng các biểu thức Python vào bên trong chuỗi ký tự để định dạng: %-formatting và 

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
6.

Lựa chọn #1: %-format

Đây là OG của định dạng Python và đã được sử dụng trong ngôn ngữ này ngay từ đầu.

Cách sử dụng %-formatting

Các đối tượng chuỗi có một hoạt động tích hợp bằng cách sử dụng toán tử 

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
7 mà bạn có thể sử dụng để định dạng chuỗi. Đây là những gì trông giống như trong thực tế:
>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> "Hello, %s." % name
'Hello, Eric.'

Để chèn nhiều biến bạn có thể làm như sau:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'

Tại sao %-format không phải là tuyệt vời

Các ví dụ mã mà bạn vừa thấy ở trên là đủ để đọc. Tuy nhiên, một khi bạn bắt đầu sử dụng một số tham số và chuỗi dài hơn, mã của bạn sẽ nhanh chóng trở nên khó đọc hơn nhiều. Mọi thứ bắt đầu có vẻ hơi lộn xộn rồi:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'

Thật không may, loại định dạng này không tuyệt vời vì nó dài dòng và dẫn đến lỗi, chẳng hạn như không hiển thị các bộ giá trị hoặc từ điển một cách chính xác. May mắn thay, có những ngày tươi sáng hơn ở phía trước. Ta xem tùy chọn #2 xem sao.

Tùy chọn #2: str.format()

f-string: Một cách mới và cải tiến để định dạng chuỗi trong Python

Cú pháp đơn giản

Biểu thức tùy ý

Đa dòng trong f-string

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'

Tốc độ

>>> "Hello, {1}. You are {0}.".format(age, name)
'Hello, Eric. You are 74.'

Một số chú ý

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
'Hello, Eric. You are 74.'

Dấu ngoặc kép

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'

Từ điển

Ngoặc xoắn

Dấu gạch chéo ngược (xổ trái)

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> print(("Hello, {first_name} {last_name}. You are {age}. " + 
>>>        "You are a {profession}. You were a member of {affiliation}.") \
>>>        .format(first_name=first_name, last_name=last_name, age=age, \
>>>                profession=profession, affiliation=affiliation))
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'

Chú thích (comment) bên trong

f-string: Một cách mới và cải tiến để định dạng chuỗi trong Python

Cú pháp đơn giản

Biểu thức tùy ý

Đa dòng trong f-string

Cú pháp đơn giản

Biểu thức tùy ý

>>> name = "Eric"
>>> age = 74
>>> f"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'

Đa dòng trong f-string

>>> F"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'

Tốc độ

Biểu thức tùy ý

Đa dòng trong f-string

Tốc độ

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
0

Nhưng bạn cũng có thể gọi các hàm. Đây là một ví dụ:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
1

Bạn cũng có tùy chọn gọi một phương thức trực tiếp:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
2

Bạn thậm chí có thể sử dụng các đối tượng được tạo từ các lớp với f-string. Hãy tưởng tượng bạn có lớp sau:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
3

Bạn có thể làm điều này:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
4

Các phương thức __str__() và __repr__() xử lý cách các đối tượng được trình bày dưới dạng chuỗi, vì vậy bạn sẽ cần đảm bảo rằng bạn đưa vào ít nhất một trong những phương thức đó trong định nghĩa lớp của mình. Nếu bạn phải chọn một phương thức, hãy chọn 

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'
7 vì nó có thể được sử dụng thay thế 
>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'
8.

Chuỗi được trả về 

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'
8 là chuỗi biểu diễn không chính thức của một đối tượng và phải có thể đọc được. Chuỗi được trả về 
>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'
7 là đại diện chính thức và phải rõ ràng. Lời gọi đến 
>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> print(("Hello, {first_name} {last_name}. You are {age}. " + 
>>>        "You are a {profession}. You were a member of {affiliation}.") \
>>>        .format(first_name=first_name, last_name=last_name, age=age, \
>>>                profession=profession, affiliation=affiliation))
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
1 và 
>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> print(("Hello, {first_name} {last_name}. You are {age}. " + 
>>>        "You are a {profession}. You were a member of {affiliation}.") \
>>>        .format(first_name=first_name, last_name=last_name, age=age, \
>>>                profession=profession, affiliation=affiliation))
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
2 lại thích sử dụng 
>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'
8 và 
>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'
7 một cách trực tiếp.

Theo mặc định, f-string sẽ sử dụng 

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'
8, nhưng bạn có thể đảm bảo rằng chúng sử dụng 
>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'
7 nếu bạn đưa vào cờ chuyển đổi 
>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> print(("Hello, {first_name} {last_name}. You are {age}. " + 
>>>        "You are a {profession}. You were a member of {affiliation}.") \
>>>        .format(first_name=first_name, last_name=last_name, age=age, \
>>>                profession=profession, affiliation=affiliation))
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
7:
>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
5

Đa dòng trong f-string

Bạn có thể có các chuỗi nhiều dòng như sau:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
6

Nhưng hãy nhớ rằng bạn cần phải đặt một 

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
'Hello, Eric. You are 74.'
5 phía trước mỗi dòng của một chuỗi nhiều dòng. Đoạn mã sau sẽ không hoạt động:
>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
7

Nếu bạn không đặt 

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
'Hello, Eric. You are 74.'
5 trước từng dòng riêng lẻ, thì bạn sẽ chỉ có những dòng hiển thị thông thường.

Nếu bạn muốn trải rộng các chuỗi trên nhiều dòng, bạn cũng có tùy chọn là thêm 

>>> name = "Eric"
>>> age = 74
>>> f"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'
3 như sau:
>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
8

Nhưng đây là những gì sẽ xảy ra nếu bạn sử dụng 

>>> name = "Eric"
>>> age = 74
>>> f"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'
5:
>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
9

Đọc kỹ hướng dẫn thụt lề trong PEP 8.

Tốc độ

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
'Hello, Eric. You are 74.'
5 trong f-string cũng có thể là viết tắt của "fast".

f-string nhanh hơn cả %-format và 

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
6. Như bạn đã thấy, chuỗi f là các biểu thức được đánh giá trong thời gian chạy chứ không phải là các giá trị không đổi. Đây là một đoạn trích từ tài liệu:

“F-string cung cấp một cách để nhúng các biểu thức vào bên trong các ký tự chuỗi, sử dụng một cú pháp tối thiểu. Cần lưu ý rằng một chuỗi f thực sự là một biểu thức được đánh giá tại thời gian chạy, không phải là một giá trị hằng số. Trong mã nguồn Python, chuỗi f là một chuỗi chữ, có tiền tố là 

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
'Hello, Eric. You are 74.'
5, chứa các biểu thức bên trong dấu ngoặc nhọn. Các biểu thức được thay thế bằng các giá trị của chúng. ” (Nguồn)

Trong thời gian chạy, biểu thức bên trong dấu ngoặc nhọn được đánh giá trong phạm vi riêng của nó và sau đó được đặt cùng với phần ký tự của chuỗi f-string. Chuỗi kết quả sau đó được trả về. Đó là tất cả những gì nó cần.

Đây là một so sánh tốc độ:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
0
>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
1
>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
2

Như bạn có thể thấy, chuỗi f có thời gian thực thi nhỏ nhất.

Tuy nhiên, không phải lúc nào cũng vậy. Khi chúng được triển khai lần đầu tiên, chúng có một số vấn đề về tốc độ và cần phải được thực hiện nhanh hơn 

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
6. Một BUILD_STRING opcode đặc biệt đã được giới thiệu đến bạn.

Một số chú ý

Bây giờ bạn đã tìm hiểu tất cả về lý do tại sao f-string lại tuyệt vời, tôi chắc chắn rằng bạn đang rất muốn bắt đầu sử dụng chúng. Dưới đây là một số chi tiết cần ghi nhớ.

Dấu ngoặc kép

Bạn có thể sử dụng nhiều loại dấu ngoặc kép khác nhau bên trong các biểu thức. Chỉ cần đảm bảo rằng bạn không sử dụng cùng một loại dấu ngoặc kép ở bên ngoài chuỗi f như bạn đang sử dụng trong biểu thức.

Mã sau sẽ hoạt động:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
3

Mã sau cũng sẽ hoạt động:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
4

Bạn cũng có thể sử dụng dấu ngoặc kép:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
5
>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
6

Nếu bạn thấy mình cần sử dụng cùng một loại dấu ngoặc kép ở cả bên trong và bên ngoài chuỗi, thì bạn có thể thoát bằng 

>>> name = "Eric"
>>> age = 74
>>> f"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'
3:
>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
7

Từ điển

Nói về dấu ngoặc kép, hãy để ý khi bạn đang làm việc với từ điển. Nếu bạn định sử dụng dấu ngoặc kép đơn cho các khóa của từ điển, thì hãy nhớ đảm bảo rằng bạn đang sử dụng dấu ngoặc kép cho các chuỗi f chứa khóa.

Điều sau sẽ hoạt động:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
8

Nhưng đây sẽ là một mớ hỗn độn nóng với một lỗi cú pháp:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
9

Nếu bạn sử dụng cùng một loại dấu ngoặc kép xung quanh các khóa từ điển như khi bạn làm ở bên ngoài chuỗi f, thì dấu ngoặc kép ở đầu khóa từ điển đầu tiên sẽ được hiểu là cuối chuỗi.

Ngoặc xoắn ({})

Để tạo một dấu ngoặc xoắn trong chuỗi của bạn, bạn phải sử dụng dấu ngoặc kép:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
0

Lưu ý rằng nếu bạn sử dụng ba dấu ngoặc xoắn sẽ dẫn đến việc chỉ có một dấu ngoặc nhọn trong chuỗi của bạn:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
1

Tuy nhiên, bạn có thể nhận được nhiều ngặc xoắn hơn để hiển thị nếu bạn sử dụng nhiều hơn ba ngoặc xoắn:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
2

Dấu gạch chéo ngược (xổ trái)

Như bạn đã thấy trước đó, bạn có thể sử dụng các thoát dấu gạch chéo ngược trong phần chuỗi của một chuỗi f. Tuy nhiên, bạn không thể sử dụng dấu gạch chéo ngược để thoát trong phần biểu thức của chuỗi f:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
3

Bạn có thể giải quyết vấn đề này bằng cách đánh giá trước biểu thức và sử dụng kết quả trong chuỗi f:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
4

Chú thích (comment) bên trong

Biểu thức không được bao gồm các chú thích sử dụng biểu tượng 

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
04. Bạn sẽ gặp lỗi cú pháp:
>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
8

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'
5

Đọc thêm

Nếu bạn muốn xem thảo luận mở rộng về nội suy chuỗi, hãy xem PEP 502. Ngoài ra, dự thảo PEP 536 có thêm một số suy nghĩ về tương lai của chuỗi f.

Để có thêm niềm vui với chuỗi, hãy xem các bài viết sau:

  • Giới thiệu thực tế về Web Scraping bằng Python