python-3.x 我不能把“继续”命令放在定义中?

sg24os4d  于 2022-12-30  发布在  Python
关注(0)|答案(5)|浏览(140)

比如说

def sample():
    if a==1:
        print(a)
    else:
        continue

for i in language:
    a=i
    sample()

我想在循环中使用这个函数,但是continue命令给了我一个错误,因为没有循环,我该怎么办?

wlwcrazw

wlwcrazw1#

从函数返回一个布尔值,并根据返回值来决定是否继续,因为continue必须在循环中

vfhzx4xs

vfhzx4xs2#

python中的continue关键字仅在forwhile循环中可用。另外,块定义的变量(如a)在全局作用域中不可用。
我不知道你想要实现什么,但是假设你的代码,你想要提取一个条件到一个函数中,就像这样:

def condition(a):
    return a == 1

def sample(a):
   print(a)

for i in language:
    a=i
    if condition(a):
       sample(a)
    else:
       continue
icnyk63a

icnyk63a3#

根据您的需要,有几种最佳实践模式可以确切地说明如何执行此操作。

0.更好地分解代码

在做以下任何一项之前,停下来问问自己,你是否可以这样做:

def sample(a):
    print(a)

for i in language:
    if i != 1:
        continue
    sample(i)

这样好多了
1.读者会更清楚(理解循环控制流所需的一切都是循环的"本地"内容--它就在循环中,我们不需要查看更远的任何地方,比如函数定义,就可以知道循环何时、为什么或如何执行下一个操作),
1.它更简洁(比下面的任何解决方案都少样板代码),
1.它在技术上更有效(除非您 * 度量 * 性能问题,否则这并不重要,但这可能会吸引您;进入一个函数并从它返回,再加上以某种方式告诉函数外部的循环继续--要实现同样的事情需要做更多的工作),以及
1.它更简单(客观上:一起 * 复杂 * 的代码更少-例如,循环行为不再绑定到sample函数的主体)。
但是,如果您必须:

1.添加布尔返回

对您的示例进行的最简单的更改是返回一个布尔值:

def sample(a):
    if a==1:
        print(a)
    else:
        return True
    return False

for i in language:
    if sample(i):
        continue

然而,不要总是盲目地用True来表示continue--对于每个函数,使用适合该函数的值。事实上,在良好分解的代码中,布尔返回值是有意义的,甚至不知道你是否在continue的某个循环中使用它。
例如,如果你有一个名为check_if_valid的函数,那么布尔返回值在没有任何循环的情况下是有意义的--它告诉你输入是否有效--同时,根据上下文,这些循环中的 * 任一个 * 都是有意义的:
一个二个一个一个

2.重复使用现有退货

如果您的函数已经返回了一些东西,或者您可以重新考虑代码,以便返回有意义,那么您可以问自己:是否有一种好方法可以根据返回值决定是否继续?
例如,假设在sample函数中,您实际上尝试执行以下操作:

def sample(a):
    record = select_from_database(a)
    if record.status == 1:
        print(record)
    else:
        continue

那么你可以这样重写:

def sample(a):
    record = select_from_database(a)
    if record.status == 1:
        print(record)
    return record

for i in language:
    record = sample(a)
    if record.status != 1:
        continue

当然,在这个简单的示例中,不使用sample函数会更简洁,但我相信您的sample函数会更复杂。

3.特殊"继续"返回

如果现有的返回值没有意义,或者您不想将循环耦合到函数的返回值,则下一个最简单的模式是创建并返回一个特殊的唯一"sentinel"对象示例:

_continue = object()

def sample(a):
    if a==1:
        print(a)
    else:
        return _continue

for i in language:
    result = sample(i):
    if result = _continue:
        continue

(If这是模块API的一部分,如果您将其命名为sample而不是_sample,那么我会将sentinel值命名为continue_而不是_continue ...但是,除非万不得已,否则我也不会在API中创建类似的内容。)
(If你在使用一个类型检查器,它抱怨返回的对象示例与你的正常返回值冲突,你可以创建一个Continue类并返回它的一个示例而不是object()的一个示例,那么函数返回值的类型提示可以是你的正常返回类型和Continue类型之间的一个类型联合。如果您的代码中有多个控制流构造,您希望像这样跨函数调用行进行走私。)

4. Package 返回值(和"单子")

有时候,如果类型联合由于某种原因不够好,您可能希望创建一个 Package 器对象,并让它存储您的原始返回值,或者指示控制流。我只是为了完整性而提到这个选项,而没有示例,因为我认为Python中的大多数情况下前面的选项更好。但是如果您花时间学习"选项类型"和"可能是单子",就像那样。
(Also,请注意,在我所有的示例中,我都将通过全局变量传递的后门参数修改为显式明确传递的参数。这使得代码更容易理解、预测和验证正确性-您可能还没有看到这一点,但请注意隐式状态传递,随着您作为开发人员的成长,阅读其他人的更多代码,这会使代码更难遵循和保持正确。并处理bug。)

lstz6jyr

lstz6jyr4#

这是因为函数的作用域不知道我们在一个循环中,你必须把 continue 关键字放在循环中

vybvopom

vybvopom5#

continue关键字不能在函数内部使用,必须在循环内部,有一个类似的问题here,也许你可以这样做。

language = [1,1,1,2,3]
    a = 1
    
    def sample():
        if a == 1:
            print(a)
            return False
        else:
            return True
    
    for i in language:
        if sample():
            continue
        else:
            a = i

或者是这样的:

language = [1,1,1,2,3]
    a = 1
    
    def gen(base):
        for item in base:
            if a == 1:
               yield a
            else:
                continue
    
    for i in gen(language):
        a = i
        print(a)

相关问题