在python中怎么实现goto功能

作者&投稿:塔杜 (若有异议请与网页底部的电邮联系)
用python用goto语法怎么用~

应该是没有,结构化语言中不推荐使用goto这样的语句。 Python是通过if、while、for、break这样的语句实现跳转的

使用语句traceback.extract_stack()

给一个使用这个语句的实例:
//用try..except捕获异常,然后traceback.print_exc()打印
#!/usr/bin/python
import sys
import traceback
import test1

a=10
b=0

try:
print test1.division(a,b)
except:
print 'invoking division failed.'
traceback.print_exc()
sys.exit(1)

执行test2.py失败抛出异常。

$python test2.py
execution python-2.5.1/python (enodeb/linux)
b eq 0
invoking division failed.
Traceback (most recent call last):
File "test2.py", line 10, in
test1.division(a,b)
File "/home/fesu/test1.py", line 6, in division
sys.exit(1)
SystemExit: 1

1、首先点击输入下方的代码:

from goto import *

@patch

 def f2():

 goto(10)

2、然后输入下方的代码:

 print 'should not see this'

 label(10)

 for i in range(1,99999):

 print i

3、然后在输入下方的代码就完成了:

 if i == 5:

 goto('out')

 label('out')

 f2()

扩展资料:

用法是:

1、from goto import *。注意暂时不支持import goto,

2、对需要使用goto的函数,前面加个@patch

3、用label(x)和goto(x)的形式写label和goto。x可以是数字或字符串。

goto模块的代码如下:

goto.py



1、首先点击输入下方的代码:

from goto import *

@patch

 def f2():

 goto(10)

2、然后输入下方的代码:

 print 'should not see this'

 label(10)

 for i in range(1,99999):

 print i

3、然后在输入下方的代码就完成了:

 if i == 5:

 goto('out')

 label('out')

 f2()

扩展资料:

用法是:

1、from goto import *。注意暂时不支持import goto,

2、对需要使用goto的函数,前面加个@patch

3、用label(x)和goto(x)的形式写label和goto。x可以是数字或字符串。

goto模块的代码如下:

goto.py



一、具体用法

首先安装一个 goto 的包(因为官方是没有 goto 语句的)

pip install goto-statement

具体的语法--注意: 对需要使用goto的函数,前面加个@patch

from goto import with_goto

@with_goto

def range(start, stop):

i = start

result = []

label .begin

if i == stop:

goto .end

result.append(i)

i += 1

goto .begin

label .end

return result

二、原理解析

原理:通过给所有函数修改trace,然后在异常时就会执行设置的函数。

sys.settrace(_trace)

frame = sys._getframe().f_back

while frame:

frame.f_trace = _trace

frame = frame.f_back



扩展资料:

Goto语句与结构化程序设计

goto语句问题的提出直接推动了结构化程序设计(structuredprogramming)的思想和程序设计方法学的诞生和发展。结构化程序设计方法引入了工程思想和结构化思想,使大型软件的开发和编程都得到了极大的改善。

结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句。

1.自顶向下:程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。

2.逐步求精:对复杂问题,应设计一些子目标作为过渡,逐步细化。

3.模块化:一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为子目标,再进一步分解为具体的小目标,把每一个小目标称为一个模块。

4.限制使用goto语句

结构化程序设计方法的起源来自对goto语句的认识和争论。肯定的结论是,在块和进程的非正常出口处往往需要用goto语句,使用goto语句会使程序执行效率较高;在合成程序目标时,goto语句往往是有用的,如返回语句用goto。

否定的结论是,goto语句是有害的,是造成程序混乱的祸根,程序的质量与goto语句的数量成反比,应该在所有高级程序设计语言中取消goto语句。取消goto语句后,程序易于理解、易于排错、容易维护,容易进行正确性证明。作为争论的结论,1974年Knuth发表了令人信服的总结,并证实了:

(1)goto语句确实有害,应当尽量避免;

(2)完全避免使用goto语句也并非是个明智的方法,有些地方使用goto语句,会使程序流程更清楚、效率更高。

(3)争论的焦点不应该放在是否取消goto语句上,而应该放在用什么样的程序结构上。其中最关键的是,应在以提高程序清晰性为目标的结构化方法中限制使用goto语句

参考资料:

百度百科——goto语句



goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。

用法是:

1. from goto import *。注意暂时不支持import goto,不是不能实现,是暂时没时间写。

2.对需要使用goto的函数,前面加个@patch

3.用label(x)和goto(x)的形式写label和goto。x可以是数字或字符串。

 goto模块的代码如下:

import dis,pdb


#dummy functions serving as target of bytecode patching

def goto(label):

    pass


def label(label):

    pass


#

def decode_bytecode(fun):

    """Input: a function

       Ouput: a list of pairs (opcode, arguments)"""

    c = fun.func_code.co_code

    n = len(c)

    i = 0

    while i < n:

        op = c[i]

        i += 1

        arguments = ""

        if ord(op) >= dis.HAVE_ARGUMENT:

            arguments = c[i : i+2]

            i += 2

        yield (op, arguments)


def sample():

    goto(200)

    if 1 == 2:

        sample()

    else:

        print 'sample'

        

def test_decode(fun):

    for op,arg in decode_bytecode(fun):

        if arg=='':

            print dis.opname[ord(op)]

        else:

            print dis.opname[ord(op)] +' '+str(ord(arg[0]))+' '+str(ord(arg[1]))

        

def match_pattern(seq, i, p):

    """

    try to match pattern p to seq[i:], return None if match failed

    seq: output of decode_bytecode

    p -> [instr, instr, ...]

    instr -> (opcode, arg, arg)      opcode is a opcode string

    arg -> ''                        I don't give a damn about this arg

    arg -> integer                   match arg with number

    arg -> string                    the arg is key of the returned match dict from which the arg value can be extracted

    arg -> lambda                    lambda is evaluated with the argument, false return means failed match

    """

    #pdb.set_trace()

    m = {}


    for op, arg1, arg2 in p:

        if i==len(seq):

            return None

        

        if dis.opmap[op] != ord(seq[i][0]):

            return None


        if arg1 == '':

            pass

        else:

            if seq[i][1] == '': return None

            

            a1 = ord(seq[i][1][0])

            if type(arg1) is str:

                m[arg1]=a1

            elif type(arg1) is int:

                if arg1 != a1: return None

            elif not arg1(a1):

                return None


        #don't need arg2 in this program


        i+=1


        

    return m

        

def int_to_bytecode_arg(i):

    return chr(i  % 256) +\

           chr(i // 256)


def patch(fun):

    NOP = chr(dis.opmap['NOP'])

    co = fun.func_code

    old = list(decode_bytecode(fun))

    new = [] #a list of characters

    

    #mapping from label to bytecode offset

    label_table={}

    #if a goto(label) is seen but label is not seen

    #record for the number the bytecode offset of the

    #argument for JUMP_ABSOLUTE for later patching

    goto_table={}


    i=0

    #pdb.set_trace()

    while i<len(old):

        m= match_pattern(old, i,

                         [('LOAD_GLOBAL','fun_name',''),

                          ('LOAD_CONST','label',''),

                          ('CALL_FUNCTION',1,''),

                          ('POP_TOP','','')])

        if m:

            stmt = co.co_names[m['fun_name']]

            label = co.co_consts[m['label']]

            

        if   m and stmt == 'goto':

            # we have a goto statement

            if label_table.has_key(label):

                arg = int_to_bytecode_arg(label_table[label])

            else:

                arg = '\xff\xff'

                goto_table[label] =\

                 goto_table.get(label, [])+[len(new)+1]

            new += chr(dis.opmap['JUMP_ABSOLUTE'])

            new += arg

            #todo

            #this is to maintain proper bytecode offset to

            #source code line number mapping. A better way

            #would be fixing the mapping instead of using

            #placeholders

            new += NOP*7

            i += 4

        elif m and stmt == 'label':

            # we have a label statement

            label_table[label]=len(new)

            if goto_table.has_key(label):

                for offset in goto_table[label]:

                    new[offset: offset+2]=int_to_bytecode_arg(len(new))

                del goto_table[label]

            new += NOP*10

            i += 4

        else:

            # emit as-is 

            new += old[i][0] #the opcode

            new += old[i][1] #its args if it has 

            i += 1


    if len(goto_table):

        #todo: output line number

        raise Exception('missing label')


    import types

    newcode = types.CodeType(co.co_argcount,

                       co.co_nlocals,

                       co.co_stacksize,

                       co.co_flags,

                       ''.join(new),

                       co.co_consts,

                       co.co_names,

                       co.co_varnames,

                       co.co_filename,

                       co.co_name,

                       co.co_firstlineno,

                       co.co_lnotab)

    return types.FunctionType(newcode,fun.func_globals)


使用如下例:

1 from goto import *
2
3 @patch
4 def f2():
5 goto(10)
6 print 'should not see this'
7 label(10)
8 for i in range(1,99999):
9 print i
10 if i == 5:
11 goto('out')
12 label('out')
13
14 f2()

用法是:

1. from goto import *。注意暂时不支持import goto,不是不能实现,是暂时没时间写。
2.对需要使用goto的函数,前面加个@patch
3.用label(x)和goto(x)的形式写label和goto。x可以是数字或字符串。

goto模块的代码如下:

goto.py


python中continue怎么用
python怎么跳出循环1、总之,你可以使用time.sleep函数来等待一段时间,并使用break语句来跳出循环。2、Pythoncontinue语句跳出本次循环,而break跳出整个循环。continue语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。continue语句用在while和for循环中。3、python中的break语句用法,常用在...

你知道怎么在Python中用输出欢迎消息吗?
我们可以使用 input() 函数提示用户输入姓名,并将用户输入的值保存到 name 变量中。然后,我们使用字符串格式化输出欢迎消息,其中 {name} 会被替换为用户输入的姓名。name = input("请输入你的姓名:")print("你好,{name}!")最终,程序会输出类似于下面的消息:需要注意的是,Python 中的 input(...

Python中的变量怎么使用?Python中的变量课程讲解
而如果你是零基础想要自学Python的话,那么就建议你进行专业系统的视频课程学习!为帮助广大Python学习爱好者提升,精选到了几套专业优质的Python自学视频课程,学习就可以掌握Python编程技巧以及第三方库使用方法~Python中的变量课程讲解:1.这节课来对比在C语言以及Python里面,这个变量在内存里面是如何存储的...

在Python中面向对象该如何编程
下面就来了解一下如何在Python中进行对象编程。一.如何定义一个类在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法。1.什么是面向对象面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的。应用在编程中,是...

python怎么换行
9、Python换行输入的方法可使用反斜杠连接多行代码,另一种方法是将代码或字符串用小括号括起来,实现换行还可以用三个单引号。10、运用图表上的\\n来实现换行在我们平时打字聊天中,我们的换行很直接,点回车即可那在python中我们要操作这种方式要怎么处理呢,输入一个例子第一种自动换行,我们可以跟我们...

python怎么下一行
具体如下:使用“\\”进行换行输入:在python中,Python用反斜线(“\\”)作为续行符(换行符),这里以python3.5为例。首先运行终端或者cmd命令行,输入的内容。本身就是输出helloworld!的字符串。但是这里使用了"\\"进行换行。这种换行方法也可以在编辑器中进行,这里以vim为例,输入与上图类似的代码,...

python中print怎么使用
如果要保存在 PyCharm 中运行的 Python 程序的输出,可以使用该函数将输出写入文件。例如,可以使用以下代码将程序的输出保存到名为 的文件中:print()output.txt 在此代码中,该函数用于在写入模式下打开文件,该函数用于将字符串“Hello, world!”写入文件。该语句用于在程序完成运行时自动关闭文件。

python中根号怎么输入
Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。Python解释器易于扩展,可以使用C或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型Python也可用于可定制化软件中的扩展...

python中的指针和对象怎么使用?python中的指针和对象课程讲解
python中的指针和对象课程讲解”的相关内容分享了,希望对于你的Python学习有所帮助!很多小伙伴问:Python怎么学?其实Python掌握是需要阶段性的学习的,学习Python零基础功能-Python编程技巧-Python核心原理分析循序渐进方可学会!所以,想学Python,但是无从下手,就来羽兔,点击链接:

Python中,输入一个三位数怎么表示?
在 Python 中,我们可以使用 input() 函数从键盘输入数据,并将其保存为字符串类型。要输入一个三位数,我们可以使用以下代码:num_str = input("请输入一个三位数:")在上面的代码中,input()函数会提示用户输入一个三位数,并将用户输入的内容保存在变量 num_str 中。由于 input() 函数返回的是...

彭阳县17093602855: python 标记与跳转 -
齐垄复方: 应该是没有,结构化语言中不推荐使用goto这样的语句. Python是通过if、while、for、break这样的语句实现跳转的

彭阳县17093602855: python怎么实现trace功能 -
齐垄复方: 使用语句traceback.extract_stack()给一个使用这个语句的实例: //用try..except捕获异常,然后traceback.print_exc()打印 #!/usr/bin/python import sys import traceback import test1a=10 b=0try:print test1.division(a,b) except:print '...

彭阳县17093602855: Python中goto到随机位置怎么表示? -
齐垄复方: 能相对的随机,比如取范围随机值,对范围值做条件进入,不能随便所有地方行任意GOTO,如果 想任意随机位置,C/C++这种编译性语言可以,可以取当前模板加载基址,从基址上偏移随机值,强行让CPU 转向地址,只是大多会报错

彭阳县17093602855: Python3,怎样重复进行多次判断? -
齐垄复方: hiiii,我用的是Wing IDE 101 3.1,应该可以吧.这个问题我们可以用一个简单的recursion.def identify(c): '''定义一个简单的识别函数''' if 'abc' != c: #当c不等于'abc'的时候 c1 = raw_input('try again:') #让使用者重新输入字符c1 return identify(c1...

彭阳县17093602855: 为什么Python没有goto -
齐垄复方: goto 这个语句可能会对程序逻辑造成影响,很多语言都不建议使用,或者干脆没有这个关键字

彭阳县17093602855: C++里 goto语句用法 -
齐垄复方: goto是无条件跳转,只要到了这里就从goto的地方开始运行.goto不是函数,是不会返回的,也没有结束定义语句

彭阳县17093602855: 存储过程中怎么使用goto语句,举个例子的相关推荐 -
齐垄复方: goto语句在C语言中不主张使用,可以用循环中加判断调用函数方式实现.goto简单的使用:main() { int a,b,c=0; loop: scanf("%d %d",&a,&b); if(a>b) goto loop1; else goto loop; loop1: c=b; b=a; a=b; printf("a=%d b=%d\n",a,b);

彭阳县17093602855: matlab如何实现goto功能 -
齐垄复方: 我也一直想这样比如用while,问题是Error是一个向量,而判断语句需要判断Error的每一个值都比e小才成立,如果Error是一个数,那么可以这样编,Error=1;for i=1 while Error>e j=j+1; x_start=x0; [x,a]=PM(D,x_start,j); y=D*x; y=y./y(1); x_new=y; Error=(x_new-x)./x_new;end...但现在Error是一个向量,一旦有一个分量大于e就必须j+1循环,该如何实现呢?已经懂了, 可以用any来判断矩阵,thanks anyway~

彭阳县17093602855: vc中goto语句的使用细则~~要详细的! -
齐垄复方: 推荐不用的还是不要用的好.goto没有太多使用规则,一般这样用:goto line1; 比如 line1:cout//代码 goto line1;

彭阳县17093602855: 如何在Python中使用break跳出多层循环 -
齐垄复方: 尽然你知道break是跳出一个小的循环那你应该也知道continue是结束当前执行的最大的循环,所以你可以把你想跳出的一些小的循环放在一个大的循环中然后使用continue 或者你可以把这些小的循环放在一个大的while循环语句中,然后自己在设置一下while里面的控制条件以及需要重新设置一个变量来进行控制

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网