Python đọc tệp không có ký tự thoát

Tại sao Python âm thầm thêm dấu xuống dòng vào cuối một dòng văn bản khi nó ghi nó vào một tệp văn bản và sau đó cũng âm thầm xóa nó khi nó đọc nó từ tệp? . Tuy nhiên, đọc tệp ở dạng nhị phân sẽ cho thấy rằng dòng thực sự được kết thúc bằng một chuỗi thoát \r\n, cũng như đọc tệp bằng tiện ích tệp hex

Nếu bạn muốn đọc một dòng rưỡi văn bản từ tệp bằng lệnh read(size), bạn phải đếm số ký tự cần đọc, bao gồm ký tự \n ở cuối dòng đầu tiên. Trong trường hợp này, bạn bỏ qua ký tự \r, vì lệnh read(size) không bao giờ nhìn thấy nó

Tuy nhiên, con trỏ tệp nhìn thấy cả ký tự \r và \n ở cuối mỗi dòng văn bản và được tăng lên cho cả hai khi chúng được đọc. Nếu bạn sử dụng lệnh seek() để định vị con trỏ tệp đến một vị trí nào đó trong dòng thứ hai của tệp văn bản trước khi đọc một số ký tự, bạn phải đếm số ký tự để dịch chuyển con trỏ tệp từ đầu tệp. Thay vì chỉ thêm một cho \n ở cuối dòng văn bản, bạn phải thêm hai cho \r\n cặp ký tự thoát

Nếu phải đếm ký tự, bạn cần đảm bảo rằng chỉ có một ký tự thoát ở cuối dòng văn bản. Nếu bạn cần tính toán độ lệch của con trỏ tệp, bạn phải sử dụng thực tế là có hai ký tự thoát ở cuối dòng văn bản. Đây có phải là một lỗi hay có một số lý do bí ẩn cho hoạt động điên rồ này. Cố gắng hết sức tìm kiếm, tôi không thể tìm thấy bất kỳ tài liệu nào về “tính năng” này. Tôi đã tìm thấy một hoặc hai hướng dẫn về câu lệnh seek() sử dụng thực tế +1, nhưng chưa bao giờ giải thích về nó. Tôi đã sử dụng tiện ích tệp hex của mình để loại bỏ thủ công các ký tự thoát \r khỏi tệp văn bản và tất cả các lệnh đọc vẫn hoạt động chính xác, vì vậy nó khá thừa

Python cũng thay đổi mọi ký tự thoát solo \r mà nó tìm thấy trong tệp văn bản thành ký tự \n khi nó đọc nó. Nếu bạn thực sự muốn ký tự \r thì sao?

Một chương trình Python được đọc bởi trình phân tích cú pháp. Đầu vào cho trình phân tích cú pháp là một luồng mã thông báo, được tạo bởi bộ phân tích từ vựng. Chương này mô tả cách trình phân tích từ vựng chia tệp thành các mã thông báo

Python đọc văn bản chương trình dưới dạng các điểm mã Unicode; . Nếu tệp nguồn không thể được giải mã, a sẽ được nâng lên

2. 1. Cấu trúc dòng

Một chương trình Python được chia thành một số dòng logic

2. 1. 1. Dòng logic

Phần cuối của một dòng logic được biểu thị bằng mã thông báo NEWLINE. Các câu lệnh không thể vượt qua các ranh giới dòng logic trừ khi NEWLINE được phép theo cú pháp (e. g. , giữa các câu lệnh trong câu lệnh ghép). Một dòng logic được xây dựng từ một hoặc nhiều dòng vật lý bằng cách tuân theo các quy tắc nối dòng rõ ràng hoặc ngầm định

2. 1. 2. Đường vật lý

Một dòng vật lý là một chuỗi các ký tự được kết thúc bởi một chuỗi cuối dòng. Trong các tệp và chuỗi nguồn, bất kỳ trình tự kết thúc dòng nền tảng tiêu chuẩn nào cũng có thể được sử dụng - biểu mẫu Unix sử dụng ASCII LF (nguồn cấp dữ liệu), biểu mẫu Windows sử dụng trình tự ASCII CR LF (trả về theo sau bởi nguồn cấp dữ liệu) hoặc biểu mẫu Macintosh cũ sử dụng . Tất cả các hình thức này có thể được sử dụng như nhau, bất kể nền tảng. Phần cuối của đầu vào cũng đóng vai trò là dấu kết thúc ngầm định cho dòng vật lý cuối cùng

Khi nhúng Python, các chuỗi mã nguồn phải được chuyển đến các API Python bằng cách sử dụng các quy ước C tiêu chuẩn cho các ký tự xuống dòng (ký tự

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
9, đại diện cho ASCII LF, là dấu kết thúc dòng)

2. 1. 3. Nhận xét

Nhận xét bắt đầu bằng ký tự băm (_______1_______0) không phải là một phần của chuỗi ký tự và kết thúc ở cuối dòng vật lý. Một nhận xét biểu thị sự kết thúc của dòng logic trừ khi các quy tắc nối dòng ẩn được gọi. Nhận xét bị bỏ qua bởi cú pháp

2. 1. 4. Mã hóa khai báo

Nếu một nhận xét trong dòng đầu tiên hoặc thứ hai của tập lệnh Python khớp với biểu thức chính quy

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
1, thì nhận xét này được xử lý dưới dạng khai báo mã hóa; . Khai báo mã hóa phải xuất hiện trên một dòng của chính nó. Nếu là dòng thứ hai thì dòng đầu tiên cũng phải là dòng chỉ chú thích. Các dạng biểu thức mã hóa được khuyến nghị là

# -*- coding: <encoding-name> -*-

cũng được GNU Emacs công nhận và

# vim:fileencoding=<encoding-name>

được công nhận bởi VIM của Bram Moolenaar

Nếu không tìm thấy khai báo mã hóa, mã hóa mặc định là UTF-8. Ngoài ra, nếu byte đầu tiên của tệp là dấu thứ tự byte UTF-8 (

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
2), thì mã hóa tệp được khai báo là UTF-8 (điều này được hỗ trợ bởi notepad của Microsoft, trong số những mã khác)

Nếu một mã hóa được khai báo, thì tên mã hóa đó phải được Python nhận dạng (xem phần ). Mã hóa được sử dụng cho tất cả các phân tích từ vựng, bao gồm chuỗi ký tự, nhận xét và số nhận dạng

2. 1. 5. Nối dòng rõ ràng

Hai hoặc nhiều dòng vật lý có thể được nối thành dòng logic bằng cách sử dụng các ký tự dấu gạch chéo ngược (

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
3), như sau. khi một dòng vật lý kết thúc bằng dấu gạch chéo ngược không phải là một phần của chuỗi ký tự hoặc nhận xét, nó sẽ được nối với dòng sau tạo thành một dòng logic duy nhất, xóa dấu gạch chéo ngược và ký tự cuối dòng tiếp theo. Ví dụ

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

Một dòng kết thúc bằng dấu gạch chéo ngược không thể mang nhận xét. Dấu gạch chéo ngược không tiếp tục nhận xét. Dấu gạch chéo ngược không tiếp tục mã thông báo ngoại trừ chuỗi ký tự (i. e. , các mã thông báo không phải là chuỗi ký tự không thể được phân tách trên các dòng vật lý bằng dấu gạch chéo ngược). Dấu gạch chéo ngược là bất hợp pháp ở những nơi khác trên một dòng bên ngoài chuỗi ký tự

2. 1. 6. Nối dòng ẩn

Các biểu thức trong dấu ngoặc đơn, dấu ngoặc vuông hoặc dấu ngoặc nhọn có thể được chia thành nhiều dòng vật lý mà không cần sử dụng dấu gạch chéo ngược. Ví dụ

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year

Các dòng tiếp tục ngầm có thể mang ý kiến. Việc thụt lề của các dòng tiếp theo không quan trọng. Các dòng tiếp tục trống được cho phép. Không có mã thông báo NEWLINE giữa các dòng tiếp tục ngầm định. Các dòng tiếp tục hoàn toàn cũng có thể xảy ra trong các chuỗi được trích dẫn ba lần (xem bên dưới);

2. 1. 7. Dòng trống

Một dòng logic chỉ chứa khoảng trắng, tab, nguồn cấp dữ liệu biểu mẫu và có thể là nhận xét, sẽ bị bỏ qua (i. e. , không có mã thông báo NEWLINE nào được tạo). Trong quá trình nhập câu lệnh tương tác, việc xử lý dòng trống có thể khác nhau tùy thuộc vào việc triển khai vòng lặp đọc-eval-in. Trong trình thông dịch tương tác tiêu chuẩn, một dòng logic hoàn toàn trống (i. e. một chứa thậm chí không có khoảng trắng hoặc chú thích) chấm dứt một câu lệnh nhiều dòng

2. 1. 8. Thụt đầu dòng

Khoảng trắng ở đầu (dấu cách và tab) ở đầu dòng logic được dùng để tính mức độ thụt đầu dòng của dòng, từ đó được dùng để xác định nhóm các câu lệnh

Các tab được thay thế (từ trái sang phải) bằng một đến tám khoảng trắng sao cho tổng số ký tự cho đến và bao gồm cả phần thay thế là bội số của tám (đây là quy tắc giống như quy tắc được sử dụng bởi Unix). Tổng số khoảng trắng trước ký tự không trống đầu tiên sau đó xác định thụt đầu dòng của dòng. Không thể phân chia thụt đầu dòng trên nhiều dòng vật lý bằng dấu gạch chéo ngược;

Thụt lề bị từ chối do không nhất quán nếu tệp nguồn kết hợp các tab và khoảng trắng theo cách làm cho ý nghĩa phụ thuộc vào giá trị của tab trong khoảng trắng;

Lưu ý tương thích đa nền tảng. do bản chất của trình soạn thảo văn bản trên nền tảng không phải UNIX, sẽ không khôn ngoan khi sử dụng hỗn hợp khoảng trắng và tab để thụt đầu dòng trong một tệp nguồn. Cũng cần lưu ý rằng các nền tảng khác nhau có thể giới hạn rõ ràng mức thụt đầu dòng tối đa

Một ký tự nguồn cấp dữ liệu có thể xuất hiện ở đầu dòng; . Các ký tự nguồn cấp dữ liệu xuất hiện ở những nơi khác trong khoảng trắng ở đầu có tác dụng không xác định (ví dụ: chúng có thể đặt lại số lượng khoảng trắng về 0)

Mức thụt đầu dòng của các dòng liên tiếp được sử dụng để tạo mã thông báo INDENT và DEDENT, sử dụng ngăn xếp, như sau

Trước khi dòng đầu tiên của tệp được đọc, một số không được đẩy vào ngăn xếp; . Các số được đẩy vào ngăn xếp sẽ luôn tăng dần từ dưới lên trên. Ở đầu mỗi dòng logic, mức thụt đầu dòng của dòng được so sánh với đỉnh của ngăn xếp. Nếu nó bằng nhau, không có gì xảy ra. Nếu nó lớn hơn, nó sẽ được đẩy vào ngăn xếp và một mã thông báo INDENT được tạo. Nếu nó nhỏ hơn, nó phải là một trong những số xuất hiện trên ngăn xếp; . Ở cuối tệp, mã thông báo DEDENT được tạo cho mỗi số còn lại trên ngăn xếp lớn hơn 0

Đây là một ví dụ về một đoạn mã Python được thụt lề chính xác (mặc dù gây nhầm lẫn)

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r

Ví dụ sau đây cho thấy các lỗi thụt lề khác nhau

 def perm(l):                       # error: first line indented
for i in range(len(l)):             # error: not indented
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # error: unexpected indent
        for x in p:
                r.append(l[i:i+1] + x)
            return r                # error: inconsistent dedent

(Trên thực tế, ba lỗi đầu tiên được phát hiện bởi trình phân tích cú pháp; chỉ lỗi cuối cùng được tìm thấy bởi trình phân tích từ vựng — phần thụt đầu dòng của

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
5 không khớp với một cấp độ bật ra khỏi ngăn xếp. )

2. 1. 9. Khoảng trắng giữa các mã thông báo

Ngoại trừ ở đầu một dòng logic hoặc trong chuỗi ký tự, các ký tự khoảng trắng, tab và nguồn cấp dữ liệu biểu mẫu có thể được sử dụng thay thế cho nhau để phân tách các mã thông báo. Khoảng trắng là cần thiết giữa hai mã thông báo nếu cách nối của chúng có thể được hiểu là một mã thông báo khác (e. g. , ab là một mã thông báo, nhưng a b là hai mã thông báo)

2. 2. Các mã thông báo khác

Bên cạnh NEWLINE, INDENT và DEDENT, các loại mã thông báo sau tồn tại. mã định danh, từ khóa, chữ cái, toán tử và dấu phân cách. Các ký tự khoảng trắng (không phải là dấu kết thúc dòng, đã thảo luận trước đó) không phải là mã thông báo, nhưng dùng để phân định mã thông báo. Khi có sự mơ hồ, mã thông báo bao gồm chuỗi dài nhất có thể tạo thành mã thông báo hợp pháp, khi đọc từ trái sang phải

2. 3. Số nhận dạng và từ khóa

Định danh (còn được gọi là tên) được mô tả bằng các định nghĩa từ vựng sau

Cú pháp của mã định danh trong Python dựa trên phụ lục tiêu chuẩn Unicode UAX-31, với sự giải thích và thay đổi như được định nghĩa bên dưới;

Trong phạm vi ASCII (U+0001. U+007F), các ký tự hợp lệ cho số nhận dạng giống như trong Python 2. x. chữ hoa và chữ thường

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
6 đến
month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
7, dấu gạch dưới
month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
8 và, ngoại trừ ký tự đầu tiên, các chữ số
month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
9 đến
def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
0

Trăn 3. 0 giới thiệu các ký tự bổ sung từ bên ngoài phạm vi ASCII (xem PEP 3131). Đối với những ký tự này, việc phân loại sử dụng phiên bản của Cơ sở dữ liệu ký tự Unicode có trong mô-đun

Mã định danh không giới hạn về chiều dài. Trường hợp có ý nghĩa

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">

Các mã danh mục Unicode được đề cập ở trên là viết tắt của

  • Lu - chữ hoa

  • Ll - chữ thường

  • Lt - chữ cái đầu đề

  • Lm - chữ bổ nghĩa

  • Lo - các chữ cái khác

  • Nl - số chữ cái

  • Mn - dấu không khoảng cách

  • Mc - khoảng cách kết hợp dấu hiệu

  • Nd - số thập phân

  • Pc - dấu chấm câu kết nối

  • Other_ID_Start - danh sách rõ ràng các ký tự trong PropList. txt để hỗ trợ khả năng tương thích ngược

  • Other_ID_Continue - tương tự

Tất cả các mã định danh được chuyển đổi thành dạng NFKC bình thường trong khi phân tích cú pháp;

Tệp HTML không quy chuẩn liệt kê tất cả các ký tự nhận dạng hợp lệ cho Unicode 14. 0. 0 có thể được tìm thấy tại https. //www. unicode. tổ chức/Công khai/14. 0. 0/ucd/DerivedCoreProperties. txt

2. 3. 1. Từ khóa

Các định danh sau đây được sử dụng làm từ dành riêng hoặc từ khóa của ngôn ngữ và không thể được sử dụng làm định danh thông thường. Chúng phải được đánh vần chính xác như được viết ở đây

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

2. 3. 2. Từ khóa mềm

Mới trong phiên bản 3. 10

Một số định danh chỉ được bảo lưu trong các ngữ cảnh cụ thể. Chúng được gọi là từ khóa mềm. Các mã định danh

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
2,
def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
3 và
month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
8 về mặt cú pháp có thể đóng vai trò là từ khóa trong ngữ cảnh liên quan đến câu lệnh so khớp mẫu, nhưng sự phân biệt này được thực hiện ở cấp trình phân tích cú pháp, không phải khi mã hóa

Là từ khóa mềm, có thể sử dụng chúng với khớp mẫu trong khi vẫn duy trì khả năng tương thích với mã hiện có sử dụng

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
2,
def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
3 và
month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
8 làm tên định danh

2. 3. 3. Các loại định danh dành riêng

Một số loại định danh (ngoài từ khóa) có ý nghĩa đặc biệt. Các lớp này được xác định bởi các mẫu ký tự gạch dưới đầu và cuối

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
8

Không được nhập bởi

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
9

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
8

Trong một mẫu

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
3 trong một câu lệnh,
month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
8 là một biểu thị một

Một cách riêng biệt, trình thông dịch tương tác cung cấp kết quả của lần đánh giá cuối cùng trong biến

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
8. (Nó được lưu trữ trong mô-đun, bên cạnh các chức năng tích hợp sẵn như
 def perm(l):                       # error: first line indented
for i in range(len(l)):             # error: not indented
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # error: unexpected indent
        for x in p:
                r.append(l[i:i+1] + x)
            return r                # error: inconsistent dedent
6. )

Ở những nơi khác,

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
8 là một định danh thông thường. Nó thường được dùng để đặt tên cho các mục “đặc biệt”, nhưng nó không đặc biệt đối với bản thân Python

Ghi chú

Tên

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
8 thường được sử dụng cùng với quốc tế hóa;

Nó cũng thường được sử dụng cho các biến không sử dụng

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
0

Tên do hệ thống xác định, được gọi một cách không chính thức là tên “dunder”. Những tên này được xác định bởi trình thông dịch và việc triển khai nó (bao gồm cả thư viện chuẩn). Tên hệ thống hiện tại được thảo luận trong phần này và các nơi khác. Nhiều khả năng sẽ được xác định trong các phiên bản Python trong tương lai. Bất kỳ việc sử dụng tên

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
0 nào, trong bất kỳ ngữ cảnh nào, không tuân theo việc sử dụng được ghi chép rõ ràng, đều có thể bị vi phạm mà không có cảnh báo

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
2

Lớp-tên riêng. Các tên trong danh mục này, khi được sử dụng trong ngữ cảnh của định nghĩa lớp, được viết lại để sử dụng dạng đọc sai nhằm giúp tránh xung đột tên giữa các thuộc tính “riêng tư” của lớp cơ sở và lớp dẫn xuất. xem phần

2. 4. Chữ

Chữ là ký hiệu cho các giá trị không đổi của một số loại tích hợp

2. 4. 1. Chuỗi ký tự và byte

Chuỗi ký tự được mô tả bằng các định nghĩa từ vựng sau

stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "R" | "U" | "f" | "F"
                     | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | stringescapeseq
longstringitem  ::=  longstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
stringescapeseq ::=  "\" <any source character>
bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix    ::=  "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes     ::=  "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes      ::=  "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::=  shortbyteschar | bytesescapeseq
longbytesitem  ::=  longbyteschar | bytesescapeseq
shortbyteschar ::=  <any ASCII character except "\" or newline or the quote>
longbyteschar  ::=  <any ASCII character except "\">
bytesescapeseq ::=  "\" <any ASCII character>

Một hạn chế về cú pháp không được chỉ ra bởi các sản phẩm này là khoảng trắng không được phép giữa hoặc và phần còn lại của nghĩa đen. Bộ ký tự nguồn được xác định bởi khai báo mã hóa;

bằng tiếng Anh đơn giản. Cả hai loại chữ có thể được đặt trong dấu ngoặc đơn phù hợp (

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
5) hoặc dấu ngoặc kép (_______17_______6). Chúng cũng có thể được đặt trong các nhóm phù hợp gồm ba dấu ngoặc đơn hoặc kép (chúng thường được gọi là chuỗi ba dấu ngoặc kép). Ký tự dấu gạch chéo ngược (
month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
3) được sử dụng để thoát khỏi các ký tự có ý nghĩa đặc biệt, chẳng hạn như xuống dòng, chính dấu gạch chéo ngược hoặc ký tự trích dẫn

Các byte bằng chữ luôn có tiền tố là

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
8 hoặc
identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
9; . Chúng chỉ có thể chứa các ký tự ASCII;

Cả ký tự chuỗi và byte có thể tùy ý thêm tiền tố bằng một chữ cái

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
2 hoặc
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
3; . Do đó, trong chuỗi ký tự, các lần thoát của
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
4 và
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
5 trong chuỗi thô không được xử lý đặc biệt. Cho rằng Python 2. chữ unicode thô của x hoạt động khác với Python 3. x là cú pháp
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
6 không được hỗ trợ

Mới trong phiên bản 3. 3. Tiền tố

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
7 của byte nguyên văn đã được thêm vào như một từ đồng nghĩa của
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
8.

Mới trong phiên bản 3. 3. Hỗ trợ cho unicode theo nghĩa đen kế thừa (

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
9) đã được giới thiệu lại để đơn giản hóa việc bảo trì Python 2 kép. x và 3. cơ sở mã x. Xem PEP 414 để biết thêm thông tin.

Một chuỗi ký tự có

stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "R" | "U" | "f" | "F"
                     | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | stringescapeseq
longstringitem  ::=  longstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
stringescapeseq ::=  "\" <any source character>
0 hoặc
stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "R" | "U" | "f" | "F"
                     | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | stringescapeseq
longstringitem  ::=  longstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
stringescapeseq ::=  "\" <any source character>
1 trong tiền tố của nó là một chuỗi ký tự được định dạng; .
stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "R" | "U" | "f" | "F"
                     | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | stringescapeseq
longstringitem  ::=  longstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
stringescapeseq ::=  "\" <any source character>
0 có thể được kết hợp với
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
2, nhưng không được kết hợp với
identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
8 hoặc
stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "R" | "U" | "f" | "F"
                     | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | stringescapeseq
longstringitem  ::=  longstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
stringescapeseq ::=  "\" <any source character>
5, do đó có thể kết hợp các chuỗi định dạng thô, nhưng các ký tự byte được định dạng thì không

Trong các ký tự được trích dẫn ba lần, các dòng mới và dấu ngoặc kép không thoát được cho phép (và được giữ lại), ngoại trừ ba dấu ngoặc kép không thoát trong một hàng sẽ chấm dứt nghĩa đen. ("Trích dẫn" là ký tự được sử dụng để mở đầu nghĩa đen, tôi. e. hoặc là

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
5 hoặc là
identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
6. )

Trừ khi có tiền tố

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
2 hoặc
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
3, các chuỗi thoát trong chuỗi ký tự và byte được diễn giải theo các quy tắc tương tự như quy tắc được sử dụng bởi Tiêu chuẩn C. Các trình tự thoát được công nhận là

Trình tự thoát

Nghĩa

ghi chú

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
3

Dấu gạch chéo ngược và dòng mới bị bỏ qua

(1)

bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix    ::=  "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes     ::=  "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes      ::=  "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::=  shortbyteschar | bytesescapeseq
longbytesitem  ::=  longbyteschar | bytesescapeseq
shortbyteschar ::=  <any ASCII character except "\" or newline or the quote>
longbyteschar  ::=  <any ASCII character except "\">
bytesescapeseq ::=  "\" <any ASCII character>
1

Dấu gạch chéo ngược (

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
3)

bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix    ::=  "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes     ::=  "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes      ::=  "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::=  shortbyteschar | bytesescapeseq
longbytesitem  ::=  longbyteschar | bytesescapeseq
shortbyteschar ::=  <any ASCII character except "\" or newline or the quote>
longbyteschar  ::=  <any ASCII character except "\">
bytesescapeseq ::=  "\" <any ASCII character>
3

Trích dẫn đơn (

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
5)

bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix    ::=  "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes     ::=  "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes      ::=  "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::=  shortbyteschar | bytesescapeseq
longbytesitem  ::=  longbyteschar | bytesescapeseq
shortbyteschar ::=  <any ASCII character except "\" or newline or the quote>
longbyteschar  ::=  <any ASCII character except "\">
bytesescapeseq ::=  "\" <any ASCII character>
5

Trích dẫn kép (

identifier   ::=  xid_start xid_continue*
id_start     ::=  <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>
id_continue  ::=  <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>
xid_start    ::=  <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">
xid_continue ::=  <all characters in id_continue whose NFKC normalization is in "id_continue*">
6)

bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix    ::=  "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes     ::=  "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes      ::=  "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::=  shortbyteschar | bytesescapeseq
longbytesitem  ::=  longbyteschar | bytesescapeseq
shortbyteschar ::=  <any ASCII character except "\" or newline or the quote>
longbyteschar  ::=  <any ASCII character except "\">
bytesescapeseq ::=  "\" <any ASCII character>
7

Chuông ASCII (BEL)

bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix    ::=  "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes     ::=  "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes      ::=  "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::=  shortbyteschar | bytesescapeseq
longbytesitem  ::=  longbyteschar | bytesescapeseq
shortbyteschar ::=  <any ASCII character except "\" or newline or the quote>
longbyteschar  ::=  <any ASCII character except "\">
bytesescapeseq ::=  "\" <any ASCII character>
8

Xóa lùi ASCII (BS)

bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix    ::=  "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes     ::=  "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes      ::=  "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::=  shortbyteschar | bytesescapeseq
longbytesitem  ::=  longbyteschar | bytesescapeseq
shortbyteschar ::=  <any ASCII character except "\" or newline or the quote>
longbyteschar  ::=  <any ASCII character except "\">
bytesescapeseq ::=  "\" <any ASCII character>
9

Nguồn cấp dữ liệu định dạng ASCII (FF)

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
9

Nguồn cấp dữ liệu ASCII (LF)

# vim:fileencoding=<encoding-name>
01

Trả về vận chuyển ASCII (CR)

# vim:fileencoding=<encoding-name>
02

Thẻ ngang ASCII (TAB)

# vim:fileencoding=<encoding-name>
03

Thẻ dọc ASCII (VT)

# vim:fileencoding=<encoding-name>
04

Ký tự có giá trị bát phân ooo

(2,4)

# vim:fileencoding=<encoding-name>
05

Ký tự có giá trị hex hh

(3,4)

Trình tự thoát chỉ được nhận dạng bằng chuỗi ký tự là

Trình tự thoát

Nghĩa

ghi chú

# vim:fileencoding=<encoding-name>
06

Ký tự được đặt tên trong cơ sở dữ liệu Unicode

(5)

# vim:fileencoding=<encoding-name>
07

Ký tự có giá trị hex 16-bit xxxx

(6)

# vim:fileencoding=<encoding-name>
08

Ký tự có giá trị hex 32-bit xxxxxxxx

(7)

ghi chú

  1. Dấu gạch chéo ngược có thể được thêm vào cuối dòng để bỏ qua dòng mới

    # vim:fileencoding=<encoding-name>
    
    0

    Kết quả tương tự có thể đạt được bằng cách sử dụng , hoặc dấu ngoặc đơn và

  2. Như trong Tiêu chuẩn C, tối đa ba chữ số bát phân được chấp nhận

    Đã thay đổi trong phiên bản 3. 11. Số lần thoát bát phân có giá trị lớn hơn

    # vim:fileencoding=<encoding-name>
    
    09 tạo ra một. Trong phiên bản Python trong tương lai, chúng sẽ là một và cuối cùng là một.

  3. Không giống như trong Tiêu chuẩn C, yêu cầu chính xác hai chữ số hex

  4. Trong một byte ký tự, các ký tự thập lục phân và bát phân biểu thị byte có giá trị đã cho. Trong một chuỗi ký tự, những dấu thoát này biểu thị một ký tự Unicode với giá trị đã cho

  5. Đã thay đổi trong phiên bản 3. 3. Hỗ trợ bí danh tên đã được thêm vào.

  6. Cần có chính xác bốn chữ số hex

  7. Bất kỳ ký tự Unicode nào cũng có thể được mã hóa theo cách này. Cần có chính xác tám chữ số hex

Không giống như Tiêu chuẩn C, tất cả các chuỗi thoát không được nhận dạng đều được giữ nguyên trong chuỗi, i. e. , dấu gạch chéo ngược được để lại trong kết quả. (Hành vi này hữu ích khi gỡ lỗi. nếu một chuỗi thoát bị nhập sai, kết quả đầu ra sẽ dễ dàng được nhận ra là bị hỏng hơn. ) Cũng cần lưu ý rằng các chuỗi thoát chỉ được nhận dạng bằng ký tự chuỗi thuộc loại thoát không được nhận dạng đối với ký tự byte

Đã thay đổi trong phiên bản 3. 6. Các chuỗi thoát không được nhận dạng tạo ra một. Trong phiên bản Python trong tương lai, chúng sẽ là một và cuối cùng là một.

Ngay cả trong một nghĩa đen thô, dấu ngoặc kép có thể được thoát bằng dấu gạch chéo ngược, nhưng dấu gạch chéo ngược vẫn còn trong kết quả; . dấu gạch chéo ngược và dấu ngoặc kép; . Cụ thể, một chữ thô không thể kết thúc bằng một dấu gạch chéo ngược (vì dấu gạch chéo ngược sẽ thoát khỏi ký tự trích dẫn sau). Cũng lưu ý rằng một dấu gạch chéo ngược theo sau bởi một dòng mới được hiểu là hai ký tự đó là một phần của nghĩa đen, không phải là phần tiếp theo của dòng

2. 4. 2. Nối chuỗi ký tự

Nhiều chuỗi ký tự hoặc byte liền kề (được phân tách bằng khoảng trắng), có thể sử dụng các quy ước trích dẫn khác nhau, được cho phép và ý nghĩa của chúng giống như cách nối của chúng. Do đó,

# vim:fileencoding=<encoding-name>
18 tương đương với
# vim:fileencoding=<encoding-name>
19. Tính năng này có thể được sử dụng để giảm số lượng dấu gạch chéo ngược cần thiết, để chia các chuỗi dài thành các dòng dài một cách thuận tiện hoặc thậm chí để thêm nhận xét vào các phần của chuỗi, chẳng hạn

# vim:fileencoding=<encoding-name>
1

Lưu ý rằng tính năng này được xác định ở cấp độ cú pháp, nhưng được triển khai tại thời điểm biên dịch. Toán tử '+' phải được sử dụng để nối các biểu thức chuỗi trong thời gian chạy. Cũng lưu ý rằng nối theo nghĩa đen có thể sử dụng các kiểu trích dẫn khác nhau cho từng thành phần (thậm chí trộn các chuỗi thô và ba chuỗi được trích dẫn) và các chuỗi ký tự được định dạng có thể được nối với các chuỗi ký tự đơn giản

2. 4. 3. Chuỗi ký tự được định dạng

Mới trong phiên bản 3. 6

Một chuỗi ký tự hoặc chuỗi f được định dạng là một chuỗi ký tự có tiền tố là

stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "R" | "U" | "f" | "F"
                     | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | stringescapeseq
longstringitem  ::=  longstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
stringescapeseq ::=  "\" <any source character>
0 hoặc
stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "R" | "U" | "f" | "F"
                     | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | stringescapeseq
longstringitem  ::=  longstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
stringescapeseq ::=  "\" <any source character>
1. Các chuỗi này có thể chứa các trường thay thế, là các biểu thức được phân tách bằng dấu ngoặc nhọn
# vim:fileencoding=<encoding-name>
22. Trong khi các chuỗi ký tự khác luôn có giá trị không đổi, các chuỗi được định dạng thực sự là các biểu thức được đánh giá trong thời gian chạy

Chuỗi thoát được giải mã giống như trong chuỗi ký tự thông thường (ngoại trừ khi một ký tự cũng được đánh dấu là chuỗi thô). Sau khi giải mã, ngữ pháp cho nội dung của chuỗi là

# vim:fileencoding=<encoding-name>
2

Các phần của chuỗi bên ngoài dấu ngoặc nhọn được xử lý theo nghĩa đen, ngoại trừ bất kỳ dấu ngoặc nhọn kép nào

# vim:fileencoding=<encoding-name>
23 hoặc
# vim:fileencoding=<encoding-name>
24 được thay thế bằng dấu ngoặc nhọn đơn tương ứng. Một dấu ngoặc đơn mở duy nhất
# vim:fileencoding=<encoding-name>
25 đánh dấu một trường thay thế, bắt đầu bằng một biểu thức Python. Để hiển thị cả văn bản biểu thức và giá trị của nó sau khi đánh giá, (hữu ích trong việc gỡ lỗi), có thể thêm dấu bằng
# vim:fileencoding=<encoding-name>
26 sau biểu thức. Trường chuyển đổi, được giới thiệu bởi dấu chấm than
# vim:fileencoding=<encoding-name>
27 có thể theo sau. Định dạng định dạng cũng có thể được thêm vào, được giới thiệu bởi dấu hai chấm
# vim:fileencoding=<encoding-name>
28. Trường thay thế kết thúc bằng dấu ngoặc nhọn đóng
# vim:fileencoding=<encoding-name>
29

Các biểu thức trong chuỗi ký tự được định dạng được xử lý giống như các biểu thức Python thông thường được bao quanh bởi dấu ngoặc đơn, với một vài ngoại lệ. Không được phép sử dụng biểu thức trống và cả biểu thức gán và biểu thức gán

# vim:fileencoding=<encoding-name>
31 phải được bao quanh bởi dấu ngoặc đơn rõ ràng. Các biểu thức thay thế có thể chứa ngắt dòng (e. g. trong chuỗi trích dẫn ba lần), nhưng chúng không thể chứa nhận xét. Mỗi biểu thức được đánh giá trong ngữ cảnh xuất hiện chuỗi ký tự được định dạng, theo thứ tự từ trái sang phải

Đã thay đổi trong phiên bản 3. 7. Trước Python 3. 7, một biểu thức và khả năng hiểu có chứa một mệnh đề là bất hợp pháp trong các biểu thức ở dạng chuỗi ký tự được định dạng do sự cố triển khai.

Khi dấu bằng

# vim:fileencoding=<encoding-name>
26 được cung cấp, đầu ra sẽ có văn bản biểu thức,
# vim:fileencoding=<encoding-name>
26 và giá trị được đánh giá. Các khoảng trắng sau dấu ngoặc mở
# vim:fileencoding=<encoding-name>
25, trong biểu thức và sau dấu ngoặc kép
# vim:fileencoding=<encoding-name>
26 đều được giữ lại ở đầu ra. Theo mặc định,
# vim:fileencoding=<encoding-name>
26 làm cho biểu thức được cung cấp, trừ khi có định dạng được chỉ định. Khi một định dạng được chỉ định, nó sẽ mặc định là biểu thức trừ khi một chuyển đổi
# vim:fileencoding=<encoding-name>
41 được khai báo

Mới trong phiên bản 3. 8. Dấu bằng

# vim:fileencoding=<encoding-name>
26.

Nếu một chuyển đổi được chỉ định, kết quả đánh giá biểu thức sẽ được chuyển đổi trước khi định dạng. Chuyển đổi

# vim:fileencoding=<encoding-name>
43 cuộc gọi trên kết quả, cuộc gọi
# vim:fileencoding=<encoding-name>
41 và cuộc gọi
# vim:fileencoding=<encoding-name>
47

Kết quả sau đó được định dạng bằng giao thức. Trình xác định định dạng được chuyển đến phương thức

# vim:fileencoding=<encoding-name>
50 của biểu thức hoặc kết quả chuyển đổi. Một chuỗi trống được truyền khi định dạng định dạng bị bỏ qua. Kết quả được định dạng sau đó được đưa vào giá trị cuối cùng của toàn bộ chuỗi

Trình xác định định dạng cấp cao nhất có thể bao gồm các trường thay thế lồng nhau. Các trường lồng nhau này có thể bao gồm các trường chuyển đổi của riêng chúng và , nhưng có thể không bao gồm các trường thay thế được lồng sâu hơn. Giống như phương pháp được sử dụng

Các chuỗi ký tự được định dạng có thể được nối, nhưng các trường thay thế không thể được phân chia thành các ký tự

Một số ví dụ về chuỗi ký tự được định dạng

# vim:fileencoding=<encoding-name>
3

Hệ quả của việc chia sẻ cùng một cú pháp như các chuỗi ký tự thông thường là các ký tự trong các trường thay thế không được xung đột với phần trích dẫn được sử dụng trong chuỗi ký tự được định dạng bên ngoài.

# vim:fileencoding=<encoding-name>
4

Dấu gạch chéo ngược không được phép trong biểu thức định dạng và sẽ gây ra lỗi

# vim:fileencoding=<encoding-name>
5

Để bao gồm một giá trị cần thoát dấu gạch chéo ngược, hãy tạo một biến tạm thời

# vim:fileencoding=<encoding-name>
6

Không thể sử dụng các chuỗi ký tự được định dạng làm chuỗi tài liệu, ngay cả khi chúng không bao gồm các biểu thức

# vim:fileencoding=<encoding-name>
7

Xem thêm PEP 498 để biết đề xuất đã thêm các chuỗi ký tự được định dạng và , sử dụng cơ chế chuỗi định dạng có liên quan

2. 4. 4. Chữ số

Có ba loại chữ số. số nguyên, số dấu phẩy động và số ảo. Không có chữ phức (số phức có thể được tạo bằng cách cộng một số thực và một số ảo)

Lưu ý rằng chữ số không bao gồm một dấu hiệu;

2. 4. 5. Số nguyên

Chữ số nguyên được mô tả bằng các định nghĩa từ vựng sau

# vim:fileencoding=<encoding-name>
8

Không có giới hạn về độ dài của số nguyên ngoài những gì có thể được lưu trữ trong bộ nhớ khả dụng

Dấu gạch dưới được bỏ qua để xác định giá trị số của chữ. Chúng có thể được sử dụng để nhóm các chữ số để tăng khả năng đọc. Một dấu gạch dưới có thể xuất hiện giữa các chữ số và sau các từ chỉ định cơ sở như

# vim:fileencoding=<encoding-name>
56

Lưu ý rằng các số 0 đứng đầu trong số thập phân khác 0 không được phép. Điều này là để định hướng với các ký tự bát phân kiểu C, mà Python đã sử dụng trước phiên bản 3. 0

Một số ví dụ về số nguyên

# vim:fileencoding=<encoding-name>
9

Đã thay đổi trong phiên bản 3. 6. Dấu gạch dưới hiện được phép dùng cho mục đích nhóm theo nghĩa đen.

2. 4. 6. Chữ dấu chấm động

Chữ dấu phẩy động được mô tả bằng các định nghĩa từ vựng sau

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
0

Lưu ý rằng phần nguyên và số mũ luôn được diễn giải bằng cơ số 10. Ví dụ:

# vim:fileencoding=<encoding-name>
57 là hợp pháp và biểu thị cùng một số với
# vim:fileencoding=<encoding-name>
58. Phạm vi cho phép của dấu phẩy động phụ thuộc vào việc triển khai. Như trong số nguyên, dấu gạch dưới được hỗ trợ cho nhóm chữ số

Một số ví dụ về dấu phẩy động

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
1

Đã thay đổi trong phiên bản 3. 6. Dấu gạch dưới hiện được phép dùng cho mục đích nhóm theo nghĩa đen.

2. 4. 7. Chữ ảo

Nghĩa đen tưởng tượng được mô tả bằng các định nghĩa từ vựng sau đây

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
2

Một chữ ảo mang lại một số phức với một phần thực của 0. 0. Các số phức được biểu diễn dưới dạng một cặp số dấu phẩy động và có cùng giới hạn về phạm vi của chúng. Để tạo một số phức có phần thực khác 0, hãy thêm một số dấu phẩy động vào nó, e. g. ,

# vim:fileencoding=<encoding-name>
59. Một số ví dụ về nghĩa đen

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
3

2. 5. Toán tử

Các mã thông báo sau đây là toán tử

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
4

2. 6. Dấu phân cách

Các mã thông báo sau đóng vai trò là dấu phân cách trong ngữ pháp

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
5

Khoảng thời gian cũng có thể xảy ra trong dấu phẩy động và nghĩa đen. Một chuỗi ba giai đoạn có một ý nghĩa đặc biệt như một dấu chấm lửng theo nghĩa đen. Nửa sau của danh sách, các toán tử gán tăng cường, đóng vai trò là dấu phân cách theo từ vựng, nhưng cũng thực hiện một thao tác

Các ký tự ASCII in sau đây không được sử dụng trong Python. Sự xuất hiện của chúng bên ngoài chuỗi ký tự và nhận xét là một lỗi vô điều kiện

Readline có đọc dòng mới không?

Phương thức readline đọc một dòng từ tệp và trả về dưới dạng một chuỗi. Chuỗi do readline trả về sẽ chứa ký tự xuống dòng ở cuối . Phương thức này trả về chuỗi rỗng khi đến cuối tệp.

Thoát () trong Python là gì?

Escape sequence trong python sử dụng chuỗi . Nó được sử dụng để đại diện cho các ký tự khoảng trắng nhất định. “\t” là tab, “\n” là dòng mới và “\r” là dấu xuống dòng. the backslash “ ” is a special character, also called the “escape” character. It is used in representing certain whitespace characters: “\t” is a tab, “\n” is a new line, and “\r” is a carriage return.

Những câu lệnh nào ngăn việc diễn giải chuỗi thoát trong Python?

Lựa chọn đúng là col1\tcol2\tcol3\t .

Trình tự thoát nào sau đây là hợp lệ trong Python?

Sử dụng trình tự thoát