Hướng dẫn do spaces matter in python - không gian có quan trọng trong python không

Khi tôi viết mã cho một dự án cá nhân hoặc nếu tôi chỉ kiểm tra mọi thứ, tôi có xu hướng mã như thế này, chỉ vì nó làm tôi hạnh phúc:

def importcontacts(request):
  context                       = initialize_context(request)
  context['form']               = UploadedFileForm()
  token                         = get_token(request)

  if request.method == 'POST':
    form                        = UploadFileForm(request.POST, request.FILES)

    if form.is_valid():
      contacts                  = request.FILES['file']
      fs                        = FileSystemStorage()
      filename                  = fs.save('import_data.json', contacts)
      uploaded_file_url         = fs.url(filename)
      context['fails']          = ct.import_contacts(uploaded_file_url,
                                                     token,
                                                     context['user']['email'],
                                                     context['user']['name'])
      messages.success(request, 'Contacts imported successfully.')

      return render(request, 'contactsdb/importresult.html', context)

  return render(request, 'contactsdb/import.html', context)

Rõ ràng điều này không tuân thủ PEP8 và tôi sẽ không bao giờ đưa thứ gì đó như thế này vào sản xuất nhưng đồng thời tôi không thực sự biết tại sao và tôi cũng không thực sự hiểu tại sao mã thậm chí vẫn hoạt động khi đặt ra như đây. Tôi cho rằng tất cả không gian làm cho mã chậm hơn?

Googling đã không giúp tôi tìm thấy câu trả lời của mình. Tôi không tìm kiếm ai đó để nói với tôi "Bạn không bao giờ nên làm điều đó, blah blah", tôi nhận thức rõ! Tôi chỉ muốn biết lý do tại sao điều này không ổn.

Một chuyến tham quan nhanh về cú pháp ngôn ngữ Python

Python ban đầu được phát triển như một ngôn ngữ giảng dạy, nhưng sự dễ sử dụng và cú pháp sạch đã khiến nó được những người mới bắt đầu và các chuyên gia chấp nhận. Sự sạch sẽ của cú pháp của Python đã khiến một số người gọi nó là "mã giả thực thi", và thực sự kinh nghiệm của tôi là nó thường dễ đọc và hiểu một kịch bản Python hơn là đọc một kịch bản tương tự được viết, ở đây Chúng ta sẽ bắt đầu thảo luận về các tính năng chính của cú pháp của Python.

Cú pháp đề cập đến cấu trúc của ngôn ngữ (nghĩa là, những gì cấu thành một chương trình được hình thành chính xác). Hiện tại, chúng tôi sẽ không tập trung vào ngữ nghĩa - ý nghĩa của các từ và ký hiệu trong cú pháp - nhưng sẽ trở lại điều này vào một điểm sau.

Xem xét ví dụ mã sau:

In [1]:

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)

lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]

Kịch bản này là một chút ngớ ngẩn, nhưng nó nhỏ gọn minh họa một số khía cạnh quan trọng của cú pháp Python. Hãy đi qua nó và thảo luận về một số tính năng cú pháp của Python

Kịch bản bắt đầu bằng một bình luận:

Nhận xét trong Python được biểu thị bằng một dấu hiệu pound (

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
5), và bất cứ điều gì trên dòng theo dấu hiệu pound đều bị thông dịch viên bỏ qua. Điều này có nghĩa là, ví dụ, bạn có thể có những nhận xét độc lập như ý kiến ​​vừa hiển thị, cũng như các bình luận nội tuyến theo một tuyên bố. Ví dụ:

x += 2  # shorthand for x = x + 2

Python không có bất kỳ cú pháp nào cho các nhận xét đa dòng, chẳng hạn như cú pháp

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
6 được sử dụng trong C và C ++, mặc dù các chuỗi đa dòng thường được sử dụng để thay thế cho các nhận xét đa dòng (nhiều hơn về thao tác chuỗi này và biểu thức thông thường) .

Kết thúc dòng chấm dứt câu lệnh

Dòng tiếp theo trong tập lệnh là

Đây là một hoạt động gán, trong đó chúng tôi đã tạo một biến có tên

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
7 và gán nó là giá trị
# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
8. Lưu ý rằng phần cuối của tuyên bố này được đánh dấu đơn giản bởi phần cuối của dòng. Điều này trái ngược với các ngôn ngữ như C và C ++, trong đó mọi tuyên bố phải kết thúc bằng dấu chấm phẩy (
# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
9).

Trong Python, nếu bạn muốn một tuyên bố tiếp tục đến dòng tiếp theo, có thể sử dụng điểm đánh dấu "

lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
0" để chỉ ra điều này:

In [2]:

x = 1 + 2 + 3 + 4 +\
    5 + 6 + 7 + 8

Cũng có thể tiếp tục các biểu thức trên dòng tiếp theo trong ngoặc đơn mà không cần sử dụng điểm đánh dấu "

lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
0":

In [3]:

x = (1 + 2 + 3 + 4 +
     5 + 6 + 7 + 8)

Hầu hết các hướng dẫn kiểu Python đề xuất phiên bản thứ hai của tiếp tục dòng (trong ngoặc đơn) sang lần đầu tiên (sử dụng điểm đánh dấu "

lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
0").

Bán kết có thể chấm dứt một cách tùy ý

Đôi khi nó có thể hữu ích để đặt nhiều câu lệnh trên một dòng. Phần tiếp theo của kịch bản là

Điều này cho thấy ví dụ về cách bán kết (

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
9) trong C có thể được sử dụng tùy chọn trong Python để đặt hai câu lệnh trên một dòng. Về mặt chức năng, điều này hoàn toàn tương đương với việc viết

Sử dụng một dấu chấm phẩy để đặt nhiều tuyên bố trên một dòng thường không được khuyến khích bởi hầu hết các hướng dẫn theo phong cách Python, mặc dù đôi khi nó tỏ ra thuận tiện.

Thụt lề: vấn đề khoảng trắng! ¶

Tiếp theo, chúng ta đến khối chính của mã:

for i in range(10):
    if i < midpoint:
        lower.append(i)
    else:
        upper.append(i)

Đây là một câu lệnh dòng điều khiển hợp chất bao gồm một vòng lặp và một điều kiện-chúng ta sẽ xem xét các loại câu lệnh này trong một khoảnh khắc. Hiện tại, hãy xem xét rằng điều này thể hiện những gì có lẽ là đặc điểm gây tranh cãi nhất của cú pháp của Python: Whitespace có ý nghĩa!

Trong các ngôn ngữ lập trình, một khối mã là một tập hợp các câu lệnh nên được coi là một đơn vị. Ví dụ, trong C, các khối mã được biểu thị bằng niềng răng xoăn:

// C code
for(int i=0; i<100; i++)
   {
      // curly braces indicate code block
      total += i;
   }

Trong Python, các khối mã được ký hiệu bằng vết lõm:

for i in range(100):
    # indentation indicates code block
    total += i

Trong Python, các khối mã thụt luôn luôn đi trước dấu hai chấm (

lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
4) trên dòng trước.

Việc sử dụng thụt lề giúp thực thi phong cách thống nhất, có thể đọc được mà nhiều người thấy hấp dẫn trong mã Python. Nhưng nó có thể gây nhầm lẫn cho những người không quen biết; Ví dụ: hai đoạn trích sau đây sẽ tạo ra kết quả khác nhau:

>>> if x < 4:         >>> if x < 4:
...     y = x * 2     ...     y = x * 2
...     print(x)      ... print(x)

Trong đoạn trích bên trái,

lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
5 nằm trong khối thụt lề và sẽ chỉ được thực thi nếu
lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
6 nhỏ hơn
lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
7. Trong đoạn trích bên phải
lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
5 nằm ngoài khối và sẽ được thực thi bất kể giá trị của
lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
6!

Việc Python sử dụng không gian trắng có ý nghĩa thường gây ngạc nhiên cho những người chơi progamer đã quen với các ngôn ngữ khác, nhưng trên thực tế, nó có thể dẫn đến mã nhất quán và dễ đọc hơn nhiều so với các ngôn ngữ không thực thi thụt vào các khối mã. Nếu bạn thấy Python sử dụng khoảng trắng không đồng ý, tôi khuyến khích bạn dùng thử: Như tôi đã làm, bạn có thể thấy rằng bạn đến để đánh giá cao nó.

Cuối cùng, bạn nên lưu ý rằng lượng khoảng trắng được sử dụng cho các khối mã thụt vào người dùng, miễn là nó nhất quán trong suốt tập lệnh. Theo quy ước, hầu hết các hướng dẫn phong cách khuyên dùng các khối mã thụt theo bốn không gian và đó là quy ước chúng tôi sẽ làm theo trong báo cáo này. Lưu ý rằng nhiều trình chỉnh sửa văn bản như Emacs và VIM chứa các chế độ Python tự động thực hiện thụt bốn không gian.

Khoảng trắng trong các dòng không quan trọng trong

Mặc dù câu thần chú của khoảng trắng có ý nghĩa đúng với khoảng trắng trước các dòng (biểu thị một khối mã), thì không gian trắng trong các dòng mã python không quan trọng. Ví dụ, cả ba biểu thức này đều tương đương:

In [4]:

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
0

Việc lạm dụng tính linh hoạt này có thể dẫn đến các vấn đề với khả năng đọc mã - trên thực tế, lạm dụng không gian trắng thường là một trong những phương tiện chính của việc cố ý làm xua tan mã (mà một số người làm cho thể thao). Sử dụng Whitespace một cách hiệu quả có thể dẫn đến mã dễ đọc hơn nhiều, đặc biệt là trong trường hợp các nhà khai thác theo dõi nhau - so sánh hai biểu thức sau đây để thống nhất theo số âm:

đến

Tôi tìm thấy phiên bản thứ hai với không gian dễ đọc hơn nhiều trong một cái nhìn thoáng qua. Hầu hết các hướng dẫn theo phong cách Python khuyên bạn nên sử dụng một không gian duy nhất xung quanh các nhà khai thác nhị phân và không có khoảng trống xung quanh các toán tử Unary. Chúng ta sẽ thảo luận về các nhà khai thác của Python hơn nữa trong ngữ nghĩa Python cơ bản: các nhà khai thác.

Dấu ngoặc đơn là để nhóm hoặc gọi tor

Trong đoạn mã trước, chúng ta thấy hai cách sử dụng dấu ngoặc đơn. Đầu tiên, chúng có thể được sử dụng theo cách điển hình để phát biểu nhóm hoặc hoạt động toán học:

Chúng cũng có thể được sử dụng để chỉ ra rằng một chức năng đang được gọi. Trong đoạn trích tiếp theo, hàm

x += 2  # shorthand for x = x + 2
0 được sử dụng để hiển thị nội dung của một biến (xem thanh bên). Cuộc gọi chức năng được biểu thị bằng một cặp dấu ngoặc đơn mở và đóng, với các đối số cho hàm có trong:

In [7]:

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
1

Một số chức năng có thể được gọi mà không có đối số nào cả, trong trường hợp đó, dấu ngoặc đơn mở và đóng vẫn phải được sử dụng để chỉ ra đánh giá chức năng. Một ví dụ về điều này là phương pháp danh sách

x += 2  # shorthand for x = x + 2
1:

In [8]:

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
2

"

x += 2  # shorthand for x = x + 2
2" sau
x += 2  # shorthand for x = x + 2
1 chỉ ra rằng chức năng nên được thực thi và được yêu cầu ngay cả khi không cần đối số.

Bên cạnh: một lưu ý về hàm x += 2 # shorthand for x = x + 2 0

Trên đây, chúng tôi đã sử dụng ví dụ về hàm

x += 2  # shorthand for x = x + 2
0. Hàm
x += 2  # shorthand for x = x + 2
0 là một mảnh đã thay đổi giữa Python 2.x và Python 3.x. Trong Python 2,
x += 2  # shorthand for x = x + 2
7 hành xử như một tuyên bố: đó là bạn có thể viết

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
3

Vì nhiều lý do, những người duy trì ngôn ngữ đã quyết định rằng trong Python 3

x += 2  # shorthand for x = x + 2
0 sẽ trở thành một chức năng, vì vậy bây giờ chúng tôi viết

# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)
4

Đây là một trong nhiều cấu trúc không tương thích ngược giữa Python 2 và 3. Khi viết cuốn sách này, người ta thường tìm thấy các ví dụ được viết trong cả hai phiên bản Python và sự hiện diện của câu lệnh

x += 2  # shorthand for x = x + 2
7 thay vì hàm
x += 2  # shorthand for x = x + 2
0 là Thường thì một trong những dấu hiệu đầu tiên mà bạn đang xem mã Python 2.

Hoàn thành và học thêm

Đây là một cuộc thám hiểm rất ngắn gọn về các tính năng thiết yếu của cú pháp Python; Mục đích của nó là cung cấp cho bạn một khung tham chiếu tốt cho khi bạn đọc mã trong các phần sau. Một vài lần chúng tôi đã đề cập đến "hướng dẫn phong cách" Python, có thể giúp các nhóm viết mã theo phong cách nhất quán. Hướng dẫn phong cách được sử dụng rộng rãi nhất trong Python được gọi là PEP8 và có thể được tìm thấy tại https://www.python.org/dev/peps/pep-0008/. Khi bạn bắt đầu viết thêm mã Python, sẽ rất hữu ích khi đọc qua điều này! Các gợi ý về phong cách chứa đựng sự khôn ngoan của nhiều bậc thầy Python, và hầu hết các đề xuất vượt ra ngoài những người bán hàng đơn giản: chúng là những khuyến nghị dựa trên kinh nghiệm có thể giúp tránh những sai lầm và lỗi tinh tế trong mã của bạn.

Không gian có quan trọng trong Python không?

Whitespace có thể rất hữu ích trong các biểu thức và câu lệnh khi được sử dụng đúng cách.Nếu không có đủ khoảng trắng, thì mã có thể khó đọc, vì tất cả đều được ghép lại với nhau.Nếu có quá nhiều khoảng trắng, thì có thể khó kết hợp trực quan các thuật ngữ liên quan trong một tuyên bố.. If there is not enough whitespace, then code can be difficult to read, as it's all bunched together. If there's too much whitespace, then it can be difficult to visually combine related terms in a statement.

Python có nhạy cảm với không gian không?

Python là một ngôn ngữ lập trình nhạy cảm với khoảng trắng sử dụng các không gian trên mạng và thụt lề thay vì niềng răng xoăn hoặc từ khóa bắt đầu/kết thúc. that uses “spaces” and indenting instead of curly braces or “begin/end” keywords.

Không gian có quan trọng khi mã hóa không?

Trả lời 52C5A21F7C82CA24A3003207.Thông thường trong không gian JavaScript không quan trọng.Normally in JavaScript space does not matter.

Python có hoạt động với không gian không?

Trong Python, các ký tự được sử dụng cho khoảng cách được gọi là ký tự khoảng trắng.Chúng bao gồm dòng mới, không gian, tab, trả lại vận chuyển, thức ăn, v.v ... Phương thức chuỗi python () được sử dụng để xác định xem một đối số có tất cả các ký tự khoảng trắng như: '' - không gian.characters that are used for spacing are called as whitespace characters. They include newline, spaces, tabs, carriage return, feed, etc. The Python String isspace() method is used to determine whether an argument has all whitespace characters such as: ' ' – Space.