Hướng dẫn can i use goto in python? - tôi có thể sử dụng goto trong python không?

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ếu bạn thực hiện "goto" bên trong một hàm, thực tế, bạn sẽ từ bỏ ngăn xếp gọi chức năng. Đây được coi là thực hành xấu, bởi vì các ngăn xếp 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 máy trạng thái hữu hạn có lẽ 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 kludgy với các vòng lặp và chuyển đổi, nhưng tôi tin rằng "cấp cao nhất" máy móc. 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 đầu tiên mô hình hóa không gian trạng thái biến 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ệ xử lý là trường hợp đặc biệt trong đó trộn goto với các chức năng 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 cấp cao nhất trong các ngôn ngữ hiện đại, là nhận ra rằng các gotos cấp 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, để giữ cho ngăn xếp cuộc gọi trống, bạn quay lại bất cứ khi nào bạn gọi một chức năng mới. Dưới đây là một ví dụ để in các 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 triển khai 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 vận động viên 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 thi 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 trợ giúp 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", vì 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 giúp ích.


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 đó là một trò đùa. Vui lòng không sử dụng nó trong mã thực!

Thêm các từ khóa 'goto' và 'đến' từ 'vào Python.

Các từ khóa 'goto' và 'đến từ' từ các cơ chế dòng điều khiển của Python và cho phép các lập trình viên Python sử dụng nhiều thành ngữ dòng điều khiển 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 đầu mã của bạn:

from goto import goto, comefrom, label

goto

'Goto' nhảy 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 ý được đặt trước với một 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 một ví dụ đầy đủ.

đến từ

'COMEFROM' trái ngược với '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" vào dòng "đến từ đâu đó". 'Commom' thường được sử dụng làm viện trợ gỡ 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 vi đá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 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 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.python.org/ Nó yêu cầu Python 2.3 trở lên.

Richie Hindle,

Phiên bản 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).. It's a (highly) structured programming language.

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.9 Pip Install -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 (): Goto.....
Giới hạn.@with_goto def x (): Hãy thử: Pass Cuối cùng: Nhãn.....
Thanks..

Tại sao Goto bị cấm?

"Tuyên bố GOTO thường được coi là một thực tiễn lập 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ó."The GOTO statement is generally considered to be a poor programming practice that leads to unwieldy programs. Its use should be avoided."

Những ngôn ngữ nào sử dụng goto?

Các câu lệnh GOTO Một số ngôn ngữ như Fortran và COBOL sử dụng phiên bản hai từ được sử dụng, trong khi các ngôn ngữ khác như C Family sử dụng phiên bản từ Goto.Nhưng Fortran bỏ qua không gian, vì vậy một trong hai phiên bản có thể được sử dụng.trong Fortran.FORTRAN and COBOL use the two word version go to, while other languages such as the C family use the single word version goto. But FORTRAN ignores spaces, so either version could be used. in FORTRAN.