Hướng dẫn what is r and f in python? - r và f trong python là gì?

Tôi đã bắt đầu học Python lần đầu tiên trong một khóa học tăng tốc về khoa học dữ liệu vài tuần trước và chúng tôi đã được giới thiệu sớm với F-String.

Mã đơn giản:

name = 'Tim'
print(f'There are some who call me {name}...')

đầu ra chuỗi "Có một số người gọi tôi là Tim ..."

Thông qua việc duyệt các gói khác nhau vì tò mò, tôi đã tìm thấy các trang như thế này chi tiết một hàm mà bạn có thể gọi trong matplotlib để hiển thị các biểu thức giống như $ \ latex $ trong các hình ảnh được tạo. Trong mã ví dụ, họ sử dụng một cái gì đó tương tự như F-String nhưng với R thay vì F.

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()

Biểu đồ kết quả (trống rỗng) có một tiêu đề sử dụng văn bản đã được định dạng tương tự như cách người ta mong đợi bằng cách sử dụng Mathjax hoặc $ \ latex $ với ký tự Hy Lạp Alpha và Beta nhân vật Hy Lạp.


Câu hỏi của tôi là như sau:

Điều gì chính xác là một chuỗi R và làm thế nào nó so sánh với một chuỗi F? Các chuỗi R có được sử dụng đặc biệt cho MathText và Usetex của Matplotlib không?

Ngoài các chuỗi F và dây R, có bất kỳ biến thể chuỗi tương tự đáng chú ý nào khác mà tôi nên làm quen với hoặc được biết đến không?

Tác giả: Eric V. Smith Trạng thái: FinalType: Tiêu chuẩn theo dõi: 01-Aug-2015Python-Version: 3.6Post-History: 07-Aug-2015, 30-Aug-2015, 04-Sep-2015, 19-Sep-2015, 06-Nov-2016Resolution: Thông điệp Python-Dev:Eric V. Smith Status:FinalType:Standards TrackCreated:01-Aug-2015Python-Version:3.6Post-History:07-Aug-2015, 30-Aug-2015, 04-Sep-2015, 19-Sep-2015, 06-Nov-2016Resolution:Python-Dev message
Mục lục
  • trừu tượng
  • Cơ sở lý luận
    • Không sử dụng Globals () hoặc người dân địa phương ()
  • Sự chỉ rõ
    • Trình tự thoát
    • Mã tương đương
    • Đánh giá biểu hiện
    • Định dạng xác định
    • Dây nối
    • Xử lý lỗi
    • Dẫn đầu và dấu vết trắng trong biểu cảm bị bỏ qua
    • Thứ tự đánh giá biểu thức
  • Thảo luận
    • Thảo luận Python-Ideas
      • Cách biểu thị các chuỗi F
      • Cách chỉ định vị trí của các biểu thức trong chuỗi F
      • Hỗ trợ các biểu thức Python đầy đủ
    • Hỗ trợ tương tự trong các ngôn ngữ khác
    • Sự khác biệt giữa các biểu thức F-String và Str.Format
    • Triple-Roted-String
    • Law F-String
    • Không có dây F nhị phân
    • >>> msg = ('disk failure', 32)
      >>> 'error: %s' % msg
      Traceback (most recent call last):
        File "", line 1, in 
      TypeError: not all arguments converted during string formatting
      
      5,
      >>> msg = ('disk failure', 32)
      >>> 'error: %s' % msg
      Traceback (most recent call last):
        File "", line 1, in 
      TypeError: not all arguments converted during string formatting
      
      6 và
      >>> msg = ('disk failure', 32)
      >>> 'error: %s' % msg
      Traceback (most recent call last):
        File "", line 1, in 
      TypeError: not all arguments converted during string formatting
      
      7 là dự phòng
    • Lambdas bên trong biểu thức
    • Có thể kết hợp với ‘u
  • Ví dụ từ mã nguồn Python
  • Người giới thiệu
  • Bản quyền

trừu tượng

Cơ sở lý luận

Không sử dụng Globals () hoặc người dân địa phương ()

Sự chỉ rõ

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."

Trình tự thoát

Cơ sở lý luận

Không sử dụng Globals () hoặc người dân địa phương ()

Sự chỉ rõ

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'

Trình tự thoát

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting

Mã tương đương

>>> 'error: %s' % (msg,)
"error: ('disk failure', 32)"

Đánh giá biểu hiện

Định dạng xác định

>>> value = 4 * 20
>>> 'The value is {value}.'.format(value=value)
'The value is 80.'

Dây nối

>>> 'The value is {}.'.format(value)
'The value is 80.'

Xử lý lỗi

Dẫn đầu và dấu vết trắng trong biểu cảm bị bỏ qua

Thứ tự đánh giá biểu thức

Thảo luận

>>> value = 1234
>>> f'input={value:#06x}'
'input=0x04d2'

Thảo luận Python-Ideas

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
0

Không sử dụng Globals () hoặc người dân địa phương ()

Sự chỉ rõ

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
1

Điều này trả về một lỗi vì trình biên dịch đã không thêm tham chiếu đến X bên trong đóng. Bạn cần thêm một tham chiếu theo cách thủ công cho X để hoạt động này:

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
2

Ngoài ra, sử dụng locals () hoặc globals () giới thiệu rò rỉ thông tin. Một thói quen được gọi là quyền truy cập vào người gọi locals () hoặc globals () có quyền truy cập vào nhiều thông tin hơn cần thiết để thực hiện nội suy chuỗi.

Guido đã tuyên bố [5] rằng bất kỳ giải pháp nào cho phép nội suy chuỗi tốt hơn sẽ không sử dụng locals () hoặc globals () trong việc thực hiện nó. .

Sự chỉ rõ

Trong mã nguồn, các chuỗi F là các chữ cái được đặt trước bằng chữ ’f, hoặc f f. Ở mọi nơi mà PEP này sử dụng ‘F,’ F, cũng có thể được sử dụng. ‘F, có thể được kết hợp với‘ R, hoặc ‘R, theo một trong hai thứ tự, để tạo ra các chữ F-String thô. ‘F, có thể không được kết hợp với‘ B,: PEP này không đề xuất thêm các chuỗi F nhị phân. ‘F, có thể không được kết hợp với‘ U.

Khi mã hóa các tệp nguồn, F-Strings sử dụng các quy tắc giống như các chuỗi bình thường, chuỗi thô, chuỗi nhị phân và chuỗi được trích dẫn ba. Nghĩa là, chuỗi phải kết thúc với cùng một ký tự mà nó đã bắt đầu: nếu nó bắt đầu bằng một trích dẫn, nó phải kết thúc bằng một trích dẫn duy nhất, v.v. Điều này ngụ ý rằng bất kỳ mã nào hiện đang quét mã Python tìm kiếm Để nhận ra chuỗi F (tất nhiên là phân tích cú pháp trong một chuỗi F là một vấn đề khác).

Sau khi mã hóa, các chuỗi F được phân tích cú pháp vào các chuỗi và biểu thức theo nghĩa đen. Biểu thức xuất hiện trong niềng răng xoăn

>>> value = 4 * 20
>>> 'The value is {value}.'.format(value=value)
'The value is 80.'
3 và
>>> value = 4 * 20
>>> 'The value is {value}.'.format(value=value)
'The value is 80.'
4. Trong khi quét chuỗi cho các biểu thức, bất kỳ niềng răng gấp đôi
>>> value = 4 * 20
>>> 'The value is {value}.'.format(value=value)
'The value is 80.'
5 hoặc
>>> value = 4 * 20
>>> 'The value is {value}.'.format(value=value)
'The value is 80.'
6 bên trong các phần theo nghĩa đen của chuỗi F đều được thay thế bằng nẹp đơn tương ứng. Niềng răng mở theo nghĩa đen nhân đôi không biểu thị sự khởi đầu của một biểu thức. Một nẹp xoăn đóng một lần
>>> value = 4 * 20
>>> 'The value is {value}.'.format(value=value)
'The value is 80.'
4 trong phần theo nghĩa đen của chuỗi là một lỗi: niềng răng xoăn đóng theo nghĩa đen phải được nhân đôi
>>> value = 4 * 20
>>> 'The value is {value}.'.format(value=value)
'The value is 80.'
6 để thể hiện một nẹp đóng.

Các phần của chuỗi F bên ngoài niềng răng là chuỗi theo nghĩa đen. Những phần theo nghĩa đen sau đó được giải mã. Đối với các chuỗi F không phải raw, điều này bao gồm việc chuyển đổi các đường thoát hiểm, chẳng hạn như

>>> value = 4 * 20
>>> 'The value is {value}.'.format(value=value)
'The value is 80.'
9,
>>> 'The value is {}.'.format(value)
'The value is 80.'
0,
>>> 'The value is {}.'.format(value)
'The value is 80.'
1,
>>> 'The value is {}.'.format(value)
'The value is 80.'
2,
>>> 'The value is {}.'.format(value)
'The value is 80.'
3,
>>> 'The value is {}.'.format(value)
'The value is 80.'
4 và được đặt tên là các ký tự Unicode
>>> 'The value is {}.'.format(value)
'The value is 80.'
5 vào các ký tự Unicode liên quan của chúng [6].

Backslashes có thể không xuất hiện ở bất cứ đâu trong các biểu thức. Nhận xét, sử dụng ký tự

>>> 'The value is {}.'.format(value)
'The value is 80.'
6, không được phép bên trong một biểu thức.

Theo mỗi biểu thức, một chuyển đổi loại tùy chọn có thể được chỉ định. Các chuyển đổi được phép là

>>> 'The value is {}.'.format(value)
'The value is 80.'
7,
>>> 'The value is {}.'.format(value)
'The value is 80.'
8 hoặc
>>> 'The value is {}.'.format(value)
'The value is 80.'
9. Chúng được đối xử giống như trong
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8:
>>> 'The value is {}.'.format(value)
'The value is 80.'
7 gọi
>>> f'The value is {value}.'
'The value is 80.'
2 trên biểu thức,
>>> 'The value is {}.'.format(value)
'The value is 80.'
8 gọi
>>> f'The value is {value}.'
'The value is 80.'
4 trên biểu thức và
>>> 'The value is {}.'.format(value)
'The value is 80.'
9 gọi
>>> f'The value is {value}.'
'The value is 80.'
6 trên biểu thức. Các chuyển đổi này được áp dụng trước cuộc gọi đến
>>> f'The value is {value}.'
'The value is 80.'
7. Lý do duy nhất để sử dụng
>>> 'The value is {}.'.format(value)
'The value is 80.'
7 là nếu bạn muốn chỉ định một định dạng định dạng áp dụng cho
>>> f'The value is {value}.'
'The value is 80.'
9, chứ không phải loại biểu thức.

Các chuỗi F sử dụng cùng một ngôn ngữ nhỏ định dạng định dạng là

>>> value = 1234
>>> f'input={value:#06x}'
'input=0x04d2'
0. Tương tự như
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8, các nhà xác định định dạng tùy chọn có thể được bao gồm bên trong chuỗi F, được tách ra khỏi biểu thức (hoặc chuyển đổi loại, nếu được chỉ định) bởi một đại tràng. Nếu một định dạng định dạng không được cung cấp, một chuỗi trống được sử dụng.

Vì vậy, một chuỗi F trông giống như:

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
3

Biểu thức sau đó được định dạng bằng giao thức

>>> 'error: %s' % (msg,)
"error: ('disk failure', 32)"
8, sử dụng trình xác định định dạng làm đối số. Giá trị kết quả được sử dụng khi xây dựng giá trị của chuỗi F.

Lưu ý rằng

>>> 'error: %s' % (msg,)
"error: ('disk failure', 32)"
0 không được gọi trực tiếp trên mỗi giá trị. Mã thực tế sử dụng tương đương với
>>> value = 1234
>>> f'input={value:#06x}'
'input=0x04d2'
4 hoặc
>>> value = 1234
>>> f'input={value:#06x}'
'input=0x04d2'
5. Xem tài liệu của chức năng
>>> f'The value is {value}.'
'The value is 80.'
7 tích hợp để biết thêm chi tiết.

Biểu thức không thể chứa

>>> value = 1234
>>> f'input={value:#06x}'
'input=0x04d2'
7 hoặc
>>> value = 1234
>>> f'input={value:#06x}'
'input=0x04d2'
8 bên ngoài chuỗi hoặc dấu ngoặc đơn, ngoặc hoặc niềng răng. Ngoại lệ là toán tử
>>> value = 1234
>>> f'input={value:#06x}'
'input=0x04d2'
9 được phép là một trường hợp đặc biệt.

Trình tự thoát

Backslashes có thể không xuất hiện bên trong các phần biểu thức của chuỗi F, vì vậy bạn không thể sử dụng chúng, ví dụ, để thoát khỏi các trích dẫn bên trong chuỗi F:

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
4

Bạn có thể sử dụng một loại báo giá khác bên trong biểu thức:

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
5

Backslash thoát có thể xuất hiện bên trong các phần chuỗi của chuỗi F.

Lưu ý rằng cách chính xác để có một nẹp theo nghĩa đen xuất hiện trong giá trị chuỗi kết quả là tăng gấp đôi nẹp:

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
6

Giống như tất cả các chuỗi thô trong Python, không có quá trình xử lý thoát nào được thực hiện cho các dây F thô:

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
7

Do các quy tắc mã thông báo chuỗi Python sườn, chuỗi F

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
00 không hợp lệ. Tokenizer phân tích cú pháp này là 3 mã thông báo:
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
01,
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
02 và
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
03. Cũng giống như các chuỗi thông thường, điều này không thể được sửa bằng cách sử dụng các chuỗi thô. Có một số cách chính xác để viết chuỗi F này: với một ký tự trích dẫn khác:

Hoặc với ba trích dẫn:

Mã tương đương

Mã chính xác được sử dụng để thực hiện các chuỗi F không được chỉ định. Tuy nhiên, người ta đảm bảo rằng bất kỳ giá trị nhúng nào được chuyển đổi thành một chuỗi sẽ sử dụng phương thức giá trị đó ____ ____58. Đây là cơ chế tương tự mà

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8 sử dụng để chuyển đổi các giá trị thành chuỗi.

Ví dụ: mã này:

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
8

Có thể được đánh giá là:

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
9

Đánh giá biểu hiện

Các biểu thức được trích xuất từ ​​chuỗi được đánh giá trong bối cảnh xuất hiện chuỗi F. Điều này có nghĩa là biểu thức có quyền truy cập đầy đủ vào các biến cục bộ và toàn cầu. Bất kỳ biểu thức Python hợp lệ nào cũng có thể được sử dụng, bao gồm các cuộc gọi chức năng và phương thức.

Bởi vì các chuỗi F được đánh giá trong đó chuỗi xuất hiện trong mã nguồn, không có biểu thức bổ sung có sẵn với các chuỗi F. Cũng không có mối quan tâm bảo mật bổ sung nào: Bạn cũng có thể vừa viết cùng một biểu thức, không phải bên trong chuỗi F:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
0

Tương đương với:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
1

Các biểu thức được phân tích cú pháp tương đương với

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
06 [7].

Lưu ý rằng vì biểu thức được bao quanh bởi dấu ngoặc đơn trước khi đánh giá, các biểu thức có thể chứa các dòng mới. Ví dụ:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
2

Định dạng xác định

Định dạng định dạng cũng có thể chứa các biểu thức được đánh giá. Điều này cho phép mã như:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
3

Khi các biểu thức trong một định dạng định dạng được đánh giá (nếu cần), các định dạng định dạng không được giải thích bởi trình đánh giá chuỗi F. Giống như trong

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8, chúng chỉ được truyền vào phương pháp
>>> 'error: %s' % (msg,)
"error: ('disk failure', 32)"
0 của đối tượng được định dạng.

Dây nối

Các chuỗi F liền kề và chuỗi thông thường được nối. Các chuỗi thông thường được nối tại thời điểm biên dịch, và các chuỗi F được nối với nhau trong thời gian chạy. Ví dụ: biểu thức:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
4

mang lại giá trị:

Mặc dù phương pháp chính xác của thời gian chạy này không được xác định, mã trên có thể đánh giá thành:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
5

Mỗi chuỗi F được đánh giá hoàn toàn trước khi được nối với các chuỗi F liền kề. Điều đó có nghĩa là điều này:

Là lỗi cú pháp, vì chuỗi F đầu tiên không chứa nẹp đóng.

Xử lý lỗi

Lỗi thời gian biên dịch hoặc thời gian chạy có thể xảy ra khi xử lý chuỗi F. Lỗi thời gian biên dịch được giới hạn trong các lỗi có thể được phát hiện khi quét chuỗi F. Những lỗi này đều tăng

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
09.

Niềng răng chưa từng có:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
6

Biểu thức không hợp lệ:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
7

Lỗi thời gian chạy xảy ra khi đánh giá các biểu thức bên trong chuỗi F. Lưu ý rằng một chuỗi F có thể được đánh giá nhiều lần và đôi khi hoạt động và gây ra lỗi vào những thời điểm khác:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
8

or:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."
9

Dẫn đầu và dấu vết trắng trong biểu cảm bị bỏ qua

Để dễ dàng đọc, dẫn đầu và dấu vết trắng trong biểu thức bị bỏ qua. Đây là sản phẩm phụ của việc bao quanh biểu thức trong ngoặc đơn trước khi đánh giá.

Thứ tự đánh giá biểu thức

Các biểu thức trong một chuỗi F được đánh giá theo thứ tự từ trái sang phải. Điều này chỉ có thể phát hiện được nếu các biểu thức có tác dụng phụ:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
0

Thảo luận

Thảo luận Python-Ideas

Hầu hết các cuộc thảo luận về Python-Ideas [8] tập trung vào ba vấn đề:

  • Cách biểu thị các chuỗi F,
  • Cách chỉ định vị trí của các biểu thức trong các chuỗi F và
  • Có cho phép biểu thức python đầy đủ.

Cách biểu thị các chuỗi F

Bởi vì trình biên dịch phải được tham gia vào việc đánh giá các biểu thức có trong các chuỗi được nội suy, phải có một số cách để biểu thị cho trình biên dịch mà các chuỗi nên được đánh giá. PEP này đã chọn một ký tự

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
10 hàng đầu trước chuỗi theo nghĩa đen. Điều này tương tự như cách các tiền tố
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
11 và
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
12 thay đổi ý nghĩa của chính chuỗi, tại thời điểm biên dịch. Các tiền tố khác đã được đề xuất, chẳng hạn như
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
13. Không có tùy chọn nào có vẻ tốt hơn lựa chọn khác, vì vậy
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
10 đã được chọn.

Một tùy chọn khác là hỗ trợ các chức năng đặc biệt, được biết đến với trình biên dịch, chẳng hạn như

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
15. Điều này có vẻ như là quá nhiều phép thuật cho Python: không chỉ có cơ hội va chạm với các định danh hiện có, tác giả PEP cảm thấy rằng nó tốt hơn là biểu thị phép thuật với ký tự tiền tố chuỗi.

Cách chỉ định vị trí của các biểu thức trong chuỗi F

PEP này hỗ trợ cùng một cú pháp với

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8 để phân biệt văn bản thay thế bên trong các chuỗi: các biểu thức được chứa bên trong niềng răng. Có những tùy chọn khác được đề xuất, chẳng hạn như ________ 49,
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
18 hoặc
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
19.

Mặc dù

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
18 không nghi ngờ gì đã quen thuộc hơn với các kịch bản shell và người dùng của một số ngôn ngữ khác, nhưng trong Python
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8 được sử dụng rất nhiều. Một tìm kiếm nhanh các thư viện tiêu chuẩn Python, chỉ hiển thị một số ít sử dụng
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
9, nhưng hàng trăm cách sử dụng của
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8.

Một giải pháp thay thế được đề xuất khác là có văn bản thay thế giữa

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
24 và
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
25 hoặc giữa
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
24 và
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
27. Mặc dù cú pháp này có thể sẽ được mong muốn nếu tất cả các chữ viết để hỗ trợ nội suy, nhưng PEP này chỉ hỗ trợ các chuỗi đã được đánh dấu bằng
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
10 hàng đầu. Do đó, PEP đang sử dụng niềng răng không được trang bị để biểu thị văn bản được thay thế, để tận dụng sự quen thuộc của người dùng cuối với
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8.

Hỗ trợ các biểu thức Python đầy đủ

Nhiều người trong cuộc thảo luận Python-Ideas muốn hỗ trợ cho chỉ số nhận dạng duy nhất hoặc một tập hợp con giới hạn của các biểu thức python (chẳng hạn như tập hợp con được hỗ trợ bởi

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8). PEP này hỗ trợ các biểu thức python đầy đủ bên trong niềng răng. Nếu không có biểu thức đầy đủ, một số cách sử dụng mong muốn sẽ là cồng kềnh. Ví dụ:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
1

sẽ trở thành:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
2

Mặc dù điều đó đúng là các biểu thức rất xấu xí có thể được đưa vào các chuỗi F, nhưng PEP này đảm nhận vị trí mà việc sử dụng đó nên được giải quyết trong một đánh giá linter hoặc mã:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
3

Hỗ trợ tương tự trong các ngôn ngữ khác

Wikipedia có một cuộc thảo luận tốt về nội suy chuỗi trong các ngôn ngữ lập trình khác [9]. Tính năng này được triển khai bằng nhiều ngôn ngữ, với nhiều cú pháp và hạn chế khác nhau.

Sự khác biệt giữa các biểu thức F-String và Str.Format

Có một sự khác biệt nhỏ giữa các biểu thức giới hạn được phép trong

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8 và các biểu thức đầy đủ cho phép bên trong các chuỗi F. Sự khác biệt là cách tra cứu chỉ mục được thực hiện. Trong
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8, các giá trị chỉ mục không giống như số được chuyển đổi thành chuỗi:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
4

Lưu ý rằng giá trị chỉ mục được chuyển đổi thành chuỗi

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
33 khi nó được tra cứu trong Dict.

Tuy nhiên, trong các chuỗi F, bạn sẽ cần sử dụng một nghĩa đen cho giá trị

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
33:

Sự khác biệt này là bắt buộc vì nếu không, bạn sẽ không thể sử dụng các biến làm giá trị chỉ mục:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
5

Xem [10] để thảo luận thêm. Chính quan sát này đã dẫn đến các biểu thức Python đầy đủ được hỗ trợ trong các chuỗi F.

Hơn nữa, các biểu thức hạn chế mà

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8 hiểu không cần phải là biểu thức python hợp lệ. Ví dụ:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
6

Vì lý do này, trình phân tích cú pháp biểu thức str.format () không phù hợp để sử dụng khi thực hiện các chuỗi F.

Triple-Roted-String

Triple Trích dẫn dây F được cho phép. Những chuỗi này được phân tích cú pháp giống như chuỗi ba lần bình thường. Sau khi phân tích cú pháp và giải mã, logic chuỗi F thông thường được áp dụng và

>>> 'error: %s' % (msg,)
"error: ('disk failure', 32)"
0 được gọi trên mỗi giá trị.

Law F-String

RAW và FS FRING có thể được kết hợp. Ví dụ, chúng có thể được sử dụng để xây dựng các biểu thức thông thường:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
7

Ngoài ra, dây F thô có thể được kết hợp với các chuỗi được trích xuất ba.

Không có dây F nhị phân

Vì lý do tương tự mà chúng tôi không hỗ trợ

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
37, bạn không thể kết hợp
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
10 với các chữ
import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
11 theo nghĩa đen. Vấn đề chính là phương thức đối tượng
>>> 'error: %s' % (msg,)
"error: ('disk failure', 32)"
0 có thể trả về dữ liệu Unicode không tương thích với chuỗi byte.

Các chuỗi F nhị phân trước tiên sẽ yêu cầu một giải pháp cho

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
37. Ý tưởng này đã được đề xuất trong quá khứ, gần đây nhất là trong PEP 461. Các cuộc thảo luận về một tính năng như vậy thường gợi ý

  • Thêm một phương thức như
    import matplotlib.pyplot as plt
    plt.title(r'$\alpha > \beta$')
    plt.show()
    
    42 để một đối tượng có thể kiểm soát cách nó được chuyển đổi thành byte hoặc
  • import matplotlib.pyplot as plt
    plt.title(r'$\alpha > \beta$')
    plt.show()
    
    37 không phải là mục đích chung hoặc có thể mở rộng như
    >>> msg = ('disk failure', 32)
    >>> 'error: %s' % msg
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: not all arguments converted during string formatting
    
    8.

Cả hai đều vẫn là tùy chọn trong tương lai, nếu chức năng đó là mong muốn.

>>> msg = ('disk failure', 32) >>> 'error: %s' % msg Traceback (most recent call last): File "", line 1, in TypeError: not all arguments converted during string formatting 5, >>> msg = ('disk failure', 32) >>> 'error: %s' % msg Traceback (most recent call last): File "", line 1, in TypeError: not all arguments converted during string formatting 6 và >>> msg = ('disk failure', 32) >>> 'error: %s' % msg Traceback (most recent call last): File "", line 1, in TypeError: not all arguments converted during string formatting 7 là dự phòng

Các chuyển đổi

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
5,
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
6 và
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
7 không được yêu cầu nghiêm ngặt. Bởi vì các biểu thức tùy ý được cho phép bên trong các chuỗi F, mã này:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
8

Giống hệt với:

>>> msg = 'disk failure'
>>> 'error: %s' % msg
'error: disk failure'
9

Tương tự,

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
5 có thể được thay thế bằng các cuộc gọi đến
>>> f'The value is {value}.'
'The value is 80.'
2 và
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
7 bằng các cuộc gọi đến
>>> f'The value is {value}.'
'The value is 80.'
6.

Tuy nhiên,

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
5,
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
6 và
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
7 được hỗ trợ bởi PEP này để giảm thiểu sự khác biệt với
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8.
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
5,
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
6 và
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
7 được yêu cầu trong
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8 vì nó không cho phép thực hiện các biểu thức tùy ý.

Lambdas bên trong biểu thức

Bởi vì Lambdas sử dụng ký tự

>>> value = 1234
>>> f'input={value:#06x}'
'input=0x04d2'
7, chúng không thể xuất hiện bên ngoài dấu ngoặc đơn trong một biểu thức. Đại tràng được hiểu là sự khởi đầu của định dạng định dạng, có nghĩa là sự khởi đầu của biểu thức Lambda được nhìn thấy và không hợp lệ về mặt cú pháp. Vì ở đó, không có cách sử dụng thực tế nào cho một lambda đơn giản trong một biểu thức F-String, điều này không được thấy nhiều hạn chế.

Nếu bạn cảm thấy bạn phải sử dụng lambdas, chúng có thể được sử dụng bên trong dấu ngoặc đơn:

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
0

Có thể kết hợp với ‘u

Tiền tố ‘U đã được thêm vào Python 3.3 trong PEP 414 như một phương tiện để giảm khả năng tương thích nguồn với Python 2.7. Bởi vì Python 2.7 sẽ không bao giờ hỗ trợ F-String, nên không có gì đạt được bằng cách có thể kết hợp tiền tố ‘F, với‘ U.

Ví dụ từ mã nguồn Python

Dưới đây là một số ví dụ từ mã nguồn Python hiện đang sử dụng

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8 và cách chúng sẽ nhìn với các chuỗi F. PEP này không khuyến nghị chuyển đổi bán buôn thành F-String, đây chỉ là những ví dụ về cách sử dụng trong thế giới thực của
>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
8 và cách họ nhìn nếu được viết từ đầu bằng cách sử dụng F-String.

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
66:

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
1

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
67:

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
2

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
68:

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
3

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()
69:

>>> msg = ('disk failure', 32)
>>> 'error: %s' % msg
Traceback (most recent call last):
  File "", line 1, in 
TypeError: not all arguments converted during string formatting
4

Người giới thiệu

Bản quyền

Tài liệu này đã được đặt trong phạm vi công cộng.

\ R chỉ ra điều gì trong Python?

R có nghĩa là chuỗi sẽ được coi là một chuỗi thô, điều đó có nghĩa là tất cả các mã thoát sẽ bị bỏ qua.Ví dụ: '\ n' sẽ được coi là một nhân vật mới, trong khi r '\ n' sẽ được coi là các ký tự \ theo sau là n.the string is to be treated as a raw string, which means all escape codes will be ignored. For an example: '\n' will be treated as a newline character, while r'\n' will be treated as the characters \ followed by n .

F () trong Python là gì?

Các dây F F cung cấp một cách để nhúng các biểu thức bên trong các chữ viết, sử dụng 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 điểm chạy, không phải là một giá trị không đổi.Trong mã nguồn Python, một chuỗi F là một chuỗi theo nghĩa đen, có tiền tố với F, chứa các biểu thức bên trong niềng răng.F-strings provide a way to embed expressions inside string literals, using a minimal syntax. It should be noted that an f-string is really an expression evaluated at run time, not a constant value. In Python source code, an f-string is a literal string, prefixed with f , which contains expressions inside braces.

Bạn có thể kết hợp r và f

Chuỗi được định dạng có thể được kết hợp với một chuỗi thô bằng cách tiền tố chuỗi với FR.Đã sao chép! . Copied!