Người mới bắt đầu: Tại sao các hoạt động không có trong các lệnh đầu ra?


23

Tôi đang xem qua một cuốn sách lập trình giới thiệu và nó liệt kê một ví dụ đơn giản trong mã giả:

Start
  input myNumber
  set myAnswer = myNumber * 2
  output myAnswer
Stop

Tại sao chúng ta không thể bỏ qua việc tạo một biến khác được gọi myAnswervà chỉ đưa thao tác vào lệnh đầu ra, như thế này:

Start
  input myNumber
  output myNumber * 2
Stop

Tại sao cái trước đúng và cái sau không?


39
Cuốn sách nói rằng bạn không thể?
Tulains Córdova

2
Cuốn sách không nói rằng tôi không thể; nó không nói gì về nó
dùng1485207

5
Tôi nghĩ sẽ khá hợp lý khi bắt đầu với khối thứ hai ngắn hơn, sau đó chuyển đổi sang khối thứ nhất nếu bạn cần.
Mateen Ulhaq

13
Câu trả lời ngắn gọn: bạn có thể, tác giả chỉ đang làm điều này (trong một nỗ lực) để làm cho nó rõ ràng hơn (mặc dù thành thật mà nói, nó có thể không thực sự làm cho nó rõ ràng hơn ...).
Jules

1
Cả hai cách làm việc. Với nhiều kinh nghiệm bạn sẽ tìm thấy, rằng đối với khả năng đọc mã hóa nghiêm trọng quan trọng hơn nhiều so với tính đơn giản hoặc tính nguyên bản của mã. Mã của bạn phải dễ đọc bởi nhiều người khác đang duy trì nó.
Frantisek Kossuth

Câu trả lời:


36

Bạn có thể nhưng cái khác là để bạn thấy những gì đang diễn ra và vì vậy bạn có thể sử dụng myAnswersau này trong chương trình. Nếu bạn sử dụng cái thứ hai, bạn không thể sử dụng lại myAnswer.

Vì vậy, sau này trong chương trình bạn có thể muốn:

myAnswer + 5
myAnswer + 1
etc.

Bạn có thể có các hoạt động khác nhau mà bạn muốn sử dụng nó cho.

Xem xét trao đổi số:

Start
  input myNumber
  set myAnswerA = myNumber * 2
  output myAnswerA
  set myAnswerB = myNumber * 3
  output myAnswerB
  set temp = myAnswerA
  set myAnswerA = myAnswerB
  set myAnswerA = temp
  output myAnswerA
  output myAnswerB
Stop

Điều đó sẽ khó khăn nếu không có biến. Sách máy tính bắt đầu thực sự cơ bản, và hầu hết lập trình đều dễ dàng cho đến khi bạn thấy sự phức tạp. Hầu hết mọi thứ đều tầm thường trong các hướng dẫn, và nó chỉ phức tạp khi bạn thấy mọi thứ làm hoặc không có ý nghĩa.


1
Vì vậy, đó là logic hợp lệ nhưng nó không phải là cách thực hành tốt nhất vì nó không cho phép tôi sử dụng lại hoạt động trong các phần khác của chương trình?
dùng1485207

@ user1485207 Xem chỉnh sửa của tôi. Trong chương trình nhỏ bé này, nó không thành vấn đề. Tác giả biết rằng bạn sẽ làm được nhiều hơn là xuất ra giá trị sau này. Nó chỉ là phức tạp bạn có thể thấy điều này. Gắn bó với nó.
johnny

ah ok, tôi hiểu rồi. Tôi sẽ tiếp tục thông qua cuốn sách với ý nghĩ này. Cảm ơn.
dùng1485207

29
@ user1485207 Cả hai cách đều có vị trí của chúng. Đôi khi bạn có thể phải sử dụng biến phụ. Đôi khi bạn có thể không cần thêm biến nhưng muốn sử dụng nó bởi vì trong một số trường hợp, chỉ cần đặt một cái gì đó được suy nghĩ kỹ càng làm cho nó rõ ràng hơn nhiều. Đôi khi bạn không muốn sử dụng biến phụ vì nó chỉ thêm tiếng ồn. Và nhiều lần, sự khác biệt không thực sự quan trọng.
8bittree

3
Tôi nghĩ rằng nó là hợp lệ để trả về kết quả của một hoạt động mà không cần gán nó cho một biến trước đó. Nhưng tôi đã có thói quen tạo ra một resultbiến ngay cả đối với các hàm ngắn, do đó việc gỡ lỗi bằng cách thêm print(result)rất nhanh. Đó là sự tiện lợi hơn là thực hành tốt.
Chân phải

33

Một lý do khác, việc gán set myAnswer = myNumber * 2cho giá trị kết quả là một tên . Một người đọc phiên bản hai dòng mã của bạn chỉ biết rằng nó in ra giá trị của myNumber * 2. Một người đọc phiên bản ba dòng có thể thấy đó myNumber * 2câu trả lời .

Nó có vẻ không quan trọng trong một ví dụ tầm thường như vậy, nhưng đôi khi, việc gán giá trị kết quả cho một biến có tên có ý nghĩa có thể giúp các lập trình viên khác đọc và hiểu mã của bạn dễ dàng hơn nhiều .


10
+1, mặc dù điều này chỉ áp dụng khi tên có ý nghĩa. Sử dụng các bình tạm thời như thế này có tên i, resulthoặc một số định danh vô nghĩa khác không có gì để cải thiện sự rõ ràng và chỉ làm xáo trộn mã
Alexander - Tái lập lại

7
@Alexander: Những cái tên vô nghĩa vẫn có thể có ý nghĩa. itốt hơn là một chỉ số mảng. Nếu có result, chức năng phải kết thúc bằng return resulthoặc tương đương với đạo đức. Và cứ thế ...
Kevin

6
@Kevin "Những cái tên vô nghĩa vẫn có thể có ý nghĩa" uhhh ... bạn có chắc không? lol
Alexander - Tái lập Monica

3
@Kevin Nếu bạn đang đi return result, thì bạn cũng có thể chỉ nội tuyến để trả lại bất cứ điều gì bạn đang chỉ định cho kết quả. Chúng ta có thể thấy đó là một kết quả. Bạn đang trả lại nó, chúng tôi nhận được điều đó.
Alexander - Tái lập Monica

5
@Alexander: Rõ ràng bạn có thể nội tuyến trả về nếu đó là một biểu thức đơn giản, nhưng nếu bạn cần xây dựng nó qua nhiều câu lệnh thì sao? Sử dụng một sơ đồ đặt tên nhất quán cho thấy rõ những gì bạn đang làm trong những trường hợp này.
Kevin

14

Đó là mã giả. Nó không phải là bất kỳ ngôn ngữ được thực hiện cụ thể.

Một số ngôn ngữ lập trình không hỗ trợ đánh giá một biểu thức và sau đó đưa ra kết quả trong cùng một dòng mã. Ví dụ, hầu hết các nhà lắp ráp không hỗ trợ điều đó. Có lẽ tác giả của cuốn sách muốn thể hiện mọi thứ trong một thời trang cấp thấp.


2
Và một số ngôn ngữ (ví dụ C) cho phép cả hai cùng một lúc - bạn có thể viết những thứ như "đầu ra (answer = answer * 2)" nếu bạn thực sự muốn! (nhưng hãy cẩn thận hơn "đầu ra (answer == answer * 2)" có nghĩa là một cái gì đó khá khác biệt ...
alephzero

9

Các câu trả lời khác đã đề cập đến các chi tiết cơ học cụ thể và các ví dụ về thời điểm một hoặc hình thức khác sẽ tốt hơn, nhưng tôi muốn đề cập thêm một chút nền tảng, loại triết học:

Bạn đang học một ngôn ngữ.

Một ngôn ngữ là một cái gì đó trong đó các ý tưởng có thể được thể hiện và hiểu (truyền đạt). Một ngôn ngữ lập trình máy tính có thuộc tính bổ sung mà nó có thể được phân tích cơ học bởi một máy được thiết kế để thực hiện hành động (thực thi) dựa trên các ý tưởng (quyết định) được chỉ định và cung cấp bằng cách sử dụng ngôn ngữ đó.

Trong bất kỳ ngôn ngữ nào cũng hữu ích, có nhiều hơn một cách để diễn đạt gần như bất kỳ ý tưởng nào có thể diễn đạt bằng ngôn ngữ đó.


Hãy xem xét sự đa dạng của các sắc thái có sẵn trong ngôn ngữ tiếng Anh. Ngay cả một câu đơn giản, chẳng hạn như

Con mèo nhảy lên cái hộp.

có thể được thay đổi để thể hiện các ý tưởng hơi khác nhau hoặc nhấn mạnh vào các phần khác nhau của cảnh trong khi đề cập đến cùng một hành động vũ trụ vật lý chính xác.

Đầu tiên là các biến thể ngữ pháp:

Chiếc hộp được con mèo nhảy lên.

Lên hộp nhảy con mèo.

Sau đó, các biến thể rộng hơn và rộng hơn, vẫn đề cập đến cùng một hành động vật lý:

Chiếc hộp rung lên dưới tác động của con mèo.

Con mèo đi xuống với một tiếng uỵch trên đỉnh hộp.

Con mèo nhảy nhẹ lên không trung và hạ cánh ngay ngắn trên một chiếc hộp gần đó.

Chỉ cần nhìn vào ý nghĩa của từ "gần đó" trong câu cuối cùng đó. Sự bao gồm của nó truyền tải một loạt các khái niệm mới không hiện diện.


Luôn luôn có nhiều hơn một cách để làm điều đó, Python Zen ngược lại.


Tất nhiên, sẽ có MỘT cách thể hiện hoàn hảo ý định của bạn và phù hợp nhất, giống như bạn chỉ chọn MỘT trong số các câu tiếng Anh ở trên tùy thuộc vào chính xác những gì bạn muốn giao tiếp. Đó là những gì Zen của Python nói về.

Nhưng trong một khóa học lập trình giới thiệu hoặc một khóa học tiếng Anh giới thiệu, trước tiên bạn phải học các cách khác nhau (từ, đoạn mã) trong đó bạn có thể đưa ra một ý tưởng trước khi bạn sẽ phát triển phán đoán để chọn ra cách phù hợp nhất.


3
Tất nhiên, Python phá vỡ quy tắc riêng của nó. Bạn có lambdas và các chức năng lồng nhau; vòng lặp, hiểu danh sách và biểu thức trình tạo; phao, số thập phân và phân số; và __init____new__, chỉ cần đến tên một vài. Vấn đề là mỗi cái đều phù hợp với một vấn đề khác nhau. Bạn sẽ không chọn một trong những câu tiếng Anh đó một cách ngẫu nhiên, cũng như không chọn một trong những tính năng ngôn ngữ Python này một cách ngẫu nhiên.
Kevin

1
@Kevin, vâng, đồng ý. Vấn đề là đối với một người hoàn toàn mới lập trình, tính chính xác của cú pháp cần thiết có thể khiến cho dường như chỉ có một cách duy nhất có thể thực hiện được, tức là sao chép mã chính xác từ nguyên văn hướng dẫn, tương tự như các vấn đề toán học ở trường trung học (573 x 247) chỉ có một câu trả lời đúng. Xem thêm những câu hỏi như "là gì các chương trình để thu nhỏ file?" Nếu bạn đọc câu trả lời của tôi, tôi không nói sẽ làm bất cứ điều gì một cách ngẫu nhiên; Tôi nói rằng bạn đang luôn làm cho sự lựa chọn khi bạn lập trình.
tự đại diện

1
Điều đó chắc chắn công bằng. Tôi nghĩ vấn đề là bạn đang đơn giản hóa / trình bày sai về Zen của Python một chút. Toàn bộ vấn đề là những quyết định đó cuối cùng được quyết định bởi các đường viền của vấn đề của bạn, và không phải là những lựa chọn bạn có thể đưa ra một cách tự do. Bạn có thể cần phải trải qua rất nhiều lần lặp và tái cấu trúc để tìm ra một cách để làm điều đó, một cách hoàn toàn phù hợp với yêu cầu của bạn, có thể đọc được, súc tích, thậm chí thanh lịch. Nhưng đối với bất kỳ vấn đề nào, cần có một giải pháp lý tưởng như vậy và một ngôn ngữ được thiết kế tốt sẽ nhẹ nhàng hướng dẫn bạn hướng tới nó. Đó là ý nghĩa của Zen.
Kevin

4
Một người hoài nghi có thể nói 'Trong Python chỉ có một cách để làm điều đó, nhưng mọi phiên bản mới của Python đều áp dụng chức năng "và bây giờ cho một cái gì đó hoàn toàn khác" theo cách mà phiên bản trước đã làm';)
alephzero

3
trích dẫn từ PEP20: "Nên có một cách tốt nhất và chỉ nên có một cách rõ ràng để làm điều đó. Mặc dù cách đó ban đầu có thể không rõ ràng trừ khi bạn là người Hà Lan."
vaxquis

5

Bạn chỉ hỏi về myAnswerbiến có vẻ là dư thừa. Các câu trả lời khác đã giải thích một số lý do tại sao và khi nào nên bỏ qua hoặc sử dụng nó nhưng đây là một câu hỏi nữa: làm thế nào về điều này?

Start
  output input * 2
Stop

hoặc thậm chí đó

Start output input * 2 Stop

Trong hầu hết các ngôn ngữ, điều này vẫn sẽ hoạt động nhưng bạn có thể đọc nó không? Thật khó khăn vì vậy chúng tôi thường sử dụng các biến của trình trợ giúp vì máy tính không phải là người duy nhất đọc mã. Chúng tôi cần duy trì và hiểu nó trong vài tháng và việc viết mã mà bạn vẫn có thể hiểu được sau đó trở nên khó khăn hơn ... thường chỉ sau vài ngày bạn sẽ không biết tại sao bạn lại làm một việc cụ thể .


2
... Hoặc thậm chí chỉ (*2). Tuy nhiên, tôi sẽ phản đối rằng việc thực hiện đầu vào không nhất thiết phải được thể hiện một cách an toàn khi chỉ truy cập vào một biến / thực hiện một phép toán số học: nó có thể có tác dụng phụ có thể quan sát được.
rẽ trái

2

Bạn có thể thực hiện cả hai biến thể (trong trường hợp đơn giản này), nhưng biến thể đầu tiên trở nên dễ đọc hơn và có cấu trúc cho các trường hợp phức tạp hơn. Biến thể đầu tiên hiển thị mô hình IPO với một dòng cho mỗi bước (hai trong số đó đã có tên đúng):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.