(Python) Chương trình con: Thủ tục và Hàm - 1


Chương trình con

Chương trình con là một phần riêng biệt của chương trình có tên và giải quyết nhiệm vụ riêng của nó. Chương trình con nằm ở đầu chương trình chính và có thể được khởi chạy (được gọi) từ chương trình chính bằng cách chỉ định tên.

Việc sử dụng chương trình con cho phép bạn tránh trùng mã, nếu bạn cần viết cùng một mã ở những vị trí khác nhau trong chương trình. 
Các thư viện được nhập vào một chương trình (ví dụ: thư viện toán học toán học) bao gồm các chương trình con đã được biên dịch sẵn bởi một người nào đó. Các lập trình viên không cần phải suy nghĩ về những thuật toán mà họ thực hiện, mà chỉ cần áp dụng chúng, chỉ nghĩ về chính xác những gì họ đang làm. Đây là một tiết kiệm thời gian lớn. Không cần phải viết một thuật toán đã được viết bởi người khác.

Mỗi chương trình con chỉ nên thực hiện một tác vụ,  hoặc chỉ tính toán điều gì đó hoặc xuất ra một số dữ liệu hoặc làm điều gì đó khác. 

Có hai loại chương trình con - thủ tụchàm.

Các thủ tục con thực hiện một số hành động, chẳng hạn như hiển thị kết quả trên màn hình ở một dạng nhất định (ví dụ đơn giản, câu lệnh print() là một thủ tục con tiêu chuẩn in dữ liệu ra màn hình).

Các chương trình con hàm trả về kết quả (số, chuỗi ký tự, v.v.) mà chúng ta có thể sử dụng trong chương trình chính.

Hãy thử viết một thủ tục đơn giản:
Giả sử chúng ta cần hiển thị chuỗi "Error" trên màn hình mỗi khi code xảy ra lỗi có thể do lỗi của người dùng, ví dụ như khi nhập sai dữ liệu.
Điều này có thể được thực hiện bằng cách viết tuyên bố in("Lỗi") Và bây giờ hãy tưởng tượng rằng một dòng như vậy cần được chèn vào nhiều chỗ trong chương trình. Tất nhiên, bạn chỉ có thể viết nó ở khắp mọi nơi. Nhưng giải pháp này có hai nhược điểm.
1) Chuỗi này sẽ được lưu trong bộ nhớ nhiều lần.
2) Nếu muốn thay đổi đầu ra do lỗi, chúng ta sẽ phải thay đổi dòng này trong suốt chương trình, điều này khá bất tiện

Đối với những trường hợp như vậy, các thủ tục là cần thiết.
Một chương trình có thủ tục có thể trông như thế này:
  def printError(): # mô tả thủ tục in("Lỗi") ... printError() # bắt đầu thủ tục thực thi. # Chỉ cần chỉ định tên của thủ tục chúng tôi muốn thực hiện ... lỗi in()
Cần ghi nhớ!
  1. Thủ tục bắt đầu bằng từ def (từ tiếng Anh - define - để xác định). Sau tên của thủ tục, các dấu ngoặc trống và dấu hai chấm được viết . Các tham số có thể được chỉ định bên trong dấu ngoặc (chúng ta sẽ nói về điều này sau).
  2. Tất cả các câu lệnh được thực thi trong một thủ tục đều được thụt vào. 
  3. Để thực hiện một thủ tục, trong chương trình chính, bạn cần gọi thủ tục đó bằng tên và nhớ viết dấu ngoặc đơn!
  4. Bạn có thể gọi một thủ tục trong chương trình bao nhiêu lần tùy thích.

Tham số và đối số

Bây giờ, hãy tưởng tượng rằng chúng ta cần hiển thị các thông báo khác nhau để phản hồi lỗi của người dùng, tùy thuộc vào loại lỗi mà anh ta mắc phải.
Trong trường hợp này, bạn có thể viết quy trình của riêng mình cho mỗi lỗi:   xác định printErrorZero(): print("Lỗi. Chia hết cho 0!") xác định printErrorInput(): print("Lỗi nhập liệu!")
Điều gì xảy ra nếu có nhiều lỗi hơn có thể xảy ra? Giải pháp này sẽ không phù hợp với chúng tôi!
Chúng ta cần học cách kiểm soát quy trình bằng cách cho nó biết thông báo lỗi nào sẽ hiển thị.
Để làm điều này, chúng ta cần các tham số mà chúng ta sẽ viết trong ngoặc đơn sau tên thủ tục def printError(s): in("s")
Trong quy trình này, s là một tham số - một biến đặc biệt cho phép bạn kiểm soát quy trình.
 
Tham số là một biến xác định cách hoạt động của chương trình con. Tên tham số được phân tách bằng dấu phẩy trong tiêu đề chương trình con.


Bây giờ, khi gọi thủ tục, bạn cần chỉ ra trong ngoặc đơn giá trị thực sẽ được gán cho tham số (s) bên trong thủ tục của chúng ta printError("Lỗi! Chia hết cho 0!")
Giá trị như vậy được gọi là đối số.
 
Đối số là giá trị tham số được truyền cho chương trình con khi nó được gọi.

Một đối số có thể không chỉ là một giá trị hằng số mà còn có thể là một biến hoặc một biểu thức số học.

Biến cục bộ và biến toàn cục

Các biến được giới thiệu trong chương trình chính được gọi là toàn cầu (hoặc chia sẻ).

Bạn có thể truy cập các biến toàn cục từ bất kỳ chương trình con nào. 

Thông thường cần phải giới thiệu các biến bổ sung sẽ chỉ được sử dụng trong chương trình con. Các biến như vậy được gọi là cục bộ (hoặc cục bộ). Bạn chỉ có thể làm việc với chúng bên trong chương trình con mà chúng được tạo ra. Các quy trình còn lại không "biết" gì về chúng.

Như vậy, có thể giới hạn phạm vi (scope) của một biến chỉ cho chương trình con ở những nơi thực sự cần thiết. Trong lập trình, kỹ thuật này được gọi là đóng gói  - ẩn biến không bị thay đổi từ bên ngoài.

Phân tích ba chương trình: <đầu>


 

Mô tả Chương trình
1) Trong chương trình này, biến i là cục bộ. Nếu không có biến i trong chương trình chính thì chúng ta sẽ nhận được thông báo lỗi. Và nếu có một biến như vậy (thì đó là biến toàn cục), thì giá trị của nó sẽ được hiển thị trên màn hình. kiểm tra chắc chắn(): in(i)
2) Ở đây, ngay cả khi có một biến toàn cục i, thì một biến cục bộ mới i sẽ được tạo với giá trị là 2 và 2 sẽ xuất hiện trên màn hình. kiểm tra chắc chắn():   tôi = 2 in(i)
3) Trong chương trình này, có một biến toàn cục i có giá trị là 15. Giá trị của nó có thể được thay đổi bên trong chương trình con, vì điều này cần phải khai báo rõ ràng rằng nó là biến toàn cục ( sử dụng lệnh global ).
Quy trình sẽ làm việc với biến toàn cục i và nó sẽ được gán giá trị mới là 2. Giá trị 2 được hiển thị.
kiểm tra chắc chắn():   toàn cầu tôi tôi = 2 # chương trình chính tôi = 15 in(i)