Khi thực hiện "Goto", trước tiên người ta phải hỏi Goto là gì. Mặc dù có vẻ rõ ràng, hầu hết mọi người không nghĩ về cách Goto liên quan đến các ngăn xếp chức năng
Nội dung chính Hiển thị
- Chúng ta có thể sử dụng goto trong python không?
- Làm cách nào để cài đặt mô-đun Goto trong Python?
- In sao Goto bị cấm?
- Những ngôn ngữ nào sử dụng goto?
Nếu bạn thực hiện "goto" bên trong một chức năng, thực tế, bạn sẽ từ bỏ chức năng ngăn xếp. Đây được coi là một hành động xấu, bởi vì các Ngăn xếp có chức năng được thiết kế với kỳ vọng rằng bạn sẽ tiếp tục ở nơi bạn rời đi, sau khi ủy thác một nhiệm vụ trung gian. Đây là lý do tại sao GOTOS được sử dụng cho các trường hợp ngoại lệ và các trường hợp ngoại lệ có thể được sử dụng để mô phỏng Goto, mà tôi sẽ giải thích
Các trạng thái máy hữu hạn có thể là trường hợp sử dụng tốt nhất cho goto, mà hầu hết thời gian được thực hiện theo cách loại bỏ các vòng lặp và chuyển đổi, nhưng tôi tin rằng máy móc "cấp cao nhất". Trong trường hợp này, bạn muốn chắc chắn, nếu bạn có nhiều biến hơn, chúng là toàn cầu và không yêu cầu đóng gói. Hãy chắc chắn rằng bạn lần đầu tiên mô hình hóa không gian biến trạng thái của bạn [có thể khác với trạng thái thực thi, tức là máy trạng thái hữu hạn]
Tôi tin rằng có những lý do thiết kế hợp pháp để sử dụng goto, ngoại lệ lý do là trường hợp đặc biệt trong đó hợp nhất goto với các chức năng xử lý có ý nghĩa. Tuy nhiên, trong hầu hết các trường hợp, bạn muốn giới hạn bản thân ở "cấp cao nhất", vì vậy bạn không bao giờ gọi goto trong một chức năng, mà chỉ trong một phạm vi toàn cầu
Cách dễ nhất để mô phỏng goto cao cấp nhất trong các ngôn ngữ hiện đại, là nhận ra rằng các gotos cao nhất, chỉ cần yêu cầu các biến toàn cầu và một ngăn xếp cuộc gọi trống. Vì vậy, để ngăn chặn cuộc gọi trống, bạn quay lại bất kỳ khi nào bạn gọi một chức năng mới. Dưới đây là một ví dụ về số N Fibonacci đầu tiên
a = 0
b = 1
n = 100
def A[]:
global a, b
a = a + b
n -= 1
print[a]
return B[] if n > 0 else 0
def B[]:
global a, b
b = a + b
n -= 1
print[b]
return A[] if n > 0 else 0
A[]
Mặc dù ví dụ này có thể nhiều hơn so với phát triển vòng lặp, nhưng nó cũng mạnh mẽ và linh hoạt hơn nhiều, và không yêu cầu trường hợp đặc biệt. Nó cho phép bạn có một máy trạng thái hữu hạn đầy đủ. Bạn cũng có thể sửa đổi điều này với một nhân viên vận động Goto
def goto[target]:
while[target] target = target[]
def A[]:
global a, b
a = a + b
print[a]
return B
def B[]:
global a, b
b = a + b
print[b]
return A
goto[A]
Để thực hiện phần "trả lại", bạn có thể viết một hàm goto chỉ đơn giản là ném một ngoại lệ khi hoàn thành
def goto[target]:
target[]
throw ArgumentError["goto finished."]
def A[]:
global a, b
a = a + b
print[a]
goto[B]
def B[]
global a, b
b = a + b
print[b]
goto[A]
goto[A]
Vì vậy, bạn thấy, rất nhiều điều này là quá suy nghĩ và một chức năng hỗ trợ gọi một hàm và sau đó ném một lỗi là tất cả những gì bạn cần. Bạn có thể bọc nó thêm trong một chức năng "bắt đầu", bởi vì như vậy lỗi bị bắt, nhưng tôi không nghĩ rằng điều đó thực sự cần thiết. Mặc dù một số triển khai này có thể sử dụng hết ngăn xếp cuộc gọi của bạn, ví dụ về người chạy đầu tiên giữ cho nó trống và nếu các trình biên dịch có thể thực hiện tối ưu hóa cuộc gọi đuôi, điều đó cũng
Mô-đun "Goto" là một trò đùa của Cá tháng Tư, được xuất bản vào ngày 1 tháng 4 năm 2004. Vâng, nó hoạt động, nhưng đó chỉ là một trò đùa. Vui lòng không sử dụng nó trong mã thực thi
Add the words 'goto' and 'to' from 'vào Python
Các từ khóa 'goto' và 'đến từ' từ các dòng điều khiển cơ chế của Python và cho phép các thành viên lập trình Python sử dụng nhiều dòng điều khiển thành ngữ phổ biến trước đây đã bị từ chối đối với họ. Một số ví dụ được đưa ra dưới đây
Để bật các từ khóa mới, hãy thêm dòng sau vào mã đầu của bạn
from goto import goto, comefrom, label
đi đến
'Goto' jump trực tiếp thực hiện chương trình sang một dòng mã khác. Dòng đích phải được xác định bằng cách sử dụng câu lệnh 'Nhãn'. Các nhãn được xác định bằng cách sử dụng từ khóa 'nhãn' và có tên là số nhận dạng Python tùy chọn được đặt trước dấu chấm, như thế này
Để nhảy vào nhãn, hãy sử dụng từ khóa 'goto' như thế này
Tính toán goto
Bạn có thể sử dụng goto đã được tính toán bằng cách gán tên của nhãn cho một biến trong thời gian chạy và tham chiếu nó bằng dấu hoa thị như thế này
x = calculateLabelName[] goto *x
Giá trị của 'X' không nên bao gồm dấu chấm hàng đầu. Xem ví dụ 5 dưới đây để biết đầy đủ ví dụ
to from
'COMEFROM' left back with 'Goto'. Nó cho phép một đoạn mã để nói "Bất cứ khi nào nhãn X đạt được, thay vào đó hãy nhảy đến đây. " Ví dụ
# ...code 1... label .somewhere # ...code 2... comefrom .somewhere
Ở đây, "mã 2" sẽ không chạy - thực thi sẽ nhảy trực tiếp từ dòng "nhãn". where" into line "đến từ đâu". 'Commom' thường được sử dụng để làm viện trợ giải quyết lỗi - việc sử dụng mã sản xuất của nó không được khuyến khích vì nó có thể dẫn đến hành động đáng ngạc nhiên
Những hạn chế
Có một số lớp Goto và đến từ không còn nữa, và do đó có một số hạn chế về nơi nhảy có thể đi
- Không thể nhảy giữa các mô-đun hoặc chức năng
- Không nhảy vào giữa một vòng lặp hoặc mệnh đề 'cuối cùng'
- Không thể nhảy lên một dòng 'ngoại trừ' [vì không có ngoại lệ]
Ví dụ
Dưới đây là một số ví dụ về cách sử dụng Goto và Creomfrom
# Example 1: Breaking out from a deeply nested loop: from goto import goto, label for i in range[1, 10]: for j in range[1, 20]: for k in range[1, 30]: print i, j, k if k == 3: goto .end label .end print "Finished\n" # Example 2: Restarting a loop: from goto import goto, label label .start for i in range[1, 4]: print i if i == 2: try: output = message except NameError: print "Oops - forgot to define 'message'! Start again." message = "Hello world" goto .start print output, "\n" # Example 3: Cleaning up after something fails: from goto import goto, label # Imagine that these are real worker functions. def setUp[]: print "setUp" def doFirstTask[]: print 1; return True def doSecondTask[]: print 2; return True def doThirdTask[]: print 3; return False # This one pretends to fail. def doFourthTask[]: print 4; return True def cleanUp[]: print "cleanUp" # This prints "setUp, 1, 2, 3, cleanUp" - no "4" because doThirdTask fails. def bigFunction1[]: setUp[] if not doFirstTask[]: goto .cleanup if not doSecondTask[]: goto .cleanup if not doThirdTask[]: goto .cleanup if not doFourthTask[]: goto .cleanup label .cleanup cleanUp[] bigFunction1[] print "bigFunction1 done\n" # Example 4: Using comefrom to let the cleanup code take control itself. from goto import comefrom, label def bigFunction2[]: setUp[] if not doFirstTask[]: label .failed if not doSecondTask[]: label .failed if not doThirdTask[]: label .failed if not doFourthTask[]: label .failed comefrom .failed cleanUp[] bigFunction2[] print "bigFunction2 done\n" # Example 5: Using a computed goto: from goto import goto, label label .getinput i = raw_input["Enter either 'a', 'b' or 'c', or any other letter to quit: "] if i in ['a', 'b', 'c']: goto *i else: goto .quit label .a print "You typed 'a'" goto .getinput label .b print "You typed 'b'" goto .getinput label .c print "You typed 'c'" goto .getinput label .quit print "Finished\n" # Example 6: What happens when a label is missing: from goto import goto, label label .real goto .unreal # Raises a MissingLabelError exception.
Mô-đun này được phát hành theo giấy phép nền tảng phần mềm Python, có thể được tìm thấy tại http. //www. con trăn. org/ Nó yêu cầu Python 2. 3 trở lên
Richie Hindle,
Version 1. 0, phát hành ngày 1 tháng 4 năm 2004. Tải xuống tại đây
Chúng ta có thể sử dụng goto trong python không?
Không, Python không hỗ trợ nhãn và goto. Đó là một ngôn ngữ lập trình có cấu trúc [cao]. . Đó là một ngôn ngữ lập trình có cấu trúc [cao].
Làm cách nào để cài đặt mô-đun Goto trong Python?
Cài đặt. Hãy chắc chắn rằng bạn đang sử dụng Python 3. Cài đặt 9 Pip -u Goto -Label
Cách sử dụng. Một ví dụ đơn giản. Từ Nhập Goto với_goto từ Goto Nhập Goto, Nhãn # Tùy chọn, cho mục đích linter @With_Goto def X []. Đi đến
hạ giới[email protected]_goto def x []. Please try. Vượt qua Cuối cùng. Nhãn
Cảm ơn
In sao Goto bị cấm?
"Tuyên bố GOTO thường được coi là một thực tiễn thiết lập chương trình kém dẫn đến các chương trình khó sử dụng. Nên tránh sử dụng nó. " Câu lệnh GOTO thường được coi là một cách lập trình kém dẫn đến các chương trình khó sử dụng