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
5条答案
按热度按时间wlwcrazw1#
从函数返回一个布尔值,并根据返回值来决定是否继续,因为continue必须在循环中
vfhzx4xs2#
python中的
continue
关键字仅在for
或while
循环中可用。另外,块定义的变量(如a
)在全局作用域中不可用。我不知道你想要实现什么,但是假设你的代码,你想要提取一个条件到一个函数中,就像这样:
icnyk63a3#
根据您的需要,有几种最佳实践模式可以确切地说明如何执行此操作。
0.更好地分解代码
在做以下任何一项之前,停下来问问自己,你是否可以这样做:
这样好多了
1.读者会更清楚(理解循环控制流所需的一切都是循环的"本地"内容--它就在循环中,我们不需要查看更远的任何地方,比如函数定义,就可以知道循环何时、为什么或如何执行下一个操作),
1.它更简洁(比下面的任何解决方案都少样板代码),
1.它在技术上更有效(除非您 * 度量 * 性能问题,否则这并不重要,但这可能会吸引您;进入一个函数并从它返回,再加上以某种方式告诉函数外部的循环继续--要实现同样的事情需要做更多的工作),以及
1.它更简单(客观上:一起 * 复杂 * 的代码更少-例如,循环行为不再绑定到
sample
函数的主体)。但是,如果您必须:
1.添加布尔返回
对您的示例进行的最简单的更改是返回一个布尔值:
然而,不要总是盲目地用
True
来表示continue
--对于每个函数,使用适合该函数的值。事实上,在良好分解的代码中,布尔返回值是有意义的,甚至不知道你是否在continue
的某个循环中使用它。例如,如果你有一个名为
check_if_valid
的函数,那么布尔返回值在没有任何循环的情况下是有意义的--它告诉你输入是否有效--同时,根据上下文,这些循环中的 * 任一个 * 都是有意义的:一个二个一个一个
2.重复使用现有退货
如果您的函数已经返回了一些东西,或者您可以重新考虑代码,以便返回有意义,那么您可以问自己:是否有一种好方法可以根据返回值决定是否继续?
例如,假设在
sample
函数中,您实际上尝试执行以下操作:那么你可以这样重写:
当然,在这个简单的示例中,不使用
sample
函数会更简洁,但我相信您的sample
函数会更复杂。3.特殊"继续"返回
如果现有的返回值没有意义,或者您不想将循环耦合到函数的返回值,则下一个最简单的模式是创建并返回一个特殊的唯一"sentinel"对象示例:
(If这是模块API的一部分,如果您将其命名为
sample
而不是_sample
,那么我会将sentinel值命名为continue_
而不是_continue
...但是,除非万不得已,否则我也不会在API中创建类似的内容。)(If你在使用一个类型检查器,它抱怨返回的对象示例与你的正常返回值冲突,你可以创建一个
Continue
类并返回它的一个示例而不是object()
的一个示例,那么函数返回值的类型提示可以是你的正常返回类型和Continue
类型之间的一个类型联合。如果您的代码中有多个控制流构造,您希望像这样跨函数调用行进行走私。)4. Package 返回值(和"单子")
有时候,如果类型联合由于某种原因不够好,您可能希望创建一个 Package 器对象,并让它存储您的原始返回值,或者指示控制流。我只是为了完整性而提到这个选项,而没有示例,因为我认为Python中的大多数情况下前面的选项更好。但是如果您花时间学习"选项类型"和"可能是单子",就像那样。
(Also,请注意,在我所有的示例中,我都将通过全局变量传递的后门参数修改为显式明确传递的参数。这使得代码更容易理解、预测和验证正确性-您可能还没有看到这一点,但请注意隐式状态传递,随着您作为开发人员的成长,阅读其他人的更多代码,这会使代码更难遵循和保持正确。并处理bug。)
lstz6jyr4#
这是因为函数的作用域不知道我们在一个循环中,你必须把 continue 关键字放在循环中
vybvopom5#
continue
关键字不能在函数内部使用,必须在循环内部,有一个类似的问题here,也许你可以这样做。或者是这样的: