当前位置: 首页 > 知识库问答 >
问题:

Python for。。else循环总是触发else

叶翰林
2023-03-14

我试图读取一个制表符分隔的文件,并收集除控制字符以外的所有字符。如果一个控制字符被命中,行的剩余部分也应该被忽略。我在Python3.5中尝试了以下代码,使用了一个for。。else循环:

import curses.ascii

input_file = ...
chars = set()
with open(input_file) as file:
    for line in file.readlines():
        source, target = line.split("\t")

        for c in source.strip() + target.strip():
            if curses.ascii.iscntrl(c):
                print("Control char hit.")
                break
            chars.add(c)
        else:
            print("Line contains control character:\n" + line)
            continue

        print("Line contains no control character:\n" + line.strip())

我希望这会检查每个字符是否为控制字符,如果它碰到一个(break被触发),则跳到下一行,从而触发else/continue语句。

相反,发生的情况是总是触发continue,即使if子句中的break语句从未到达行。因此,最终的print语句也永远不会到达。

我做错了什么?

共有1个答案

司马羽
2023-03-14

只有当循环的代码从未中断时,循环的代码块才会执行。如果行中没有控制字符,则只能在执行的另一块中看到继续语句。从for语句留档:

当项目用尽时(即序列为空或迭代器引发StopIteration异常时),执行else子句中的套件(如果存在),循环终止。

在第一个套件中执行的broch语句终止循环,而不执行elle子句的套件。

查看一行中是否有控制字符的更好测试是将any()函数与生成器表达式一起使用:

if any(curses.ascii.iscntrl(c) for c in source.strip() + target.strip()):
    print("Line contains control character:\n" + line)
    continue

或者可以使用正则表达式;这将更快,因为文本循环是在C代码中完成的,而不必在新的str对象中框接每个字符:

import re

control_char = re.compile(r'[\x00-\x31]')

if control_char.search(source.strip() + target.strip()):
    print("Line contains control character:\n" + line)
    continue
 类似资料:
  • 问题内容: 当然,这在Java(到目前为止)中是不可能的语句,但是理想情况下,我希望实现它,因为它是许多迭代的核心。例如,第一次创建它时,它被称为650,000+次。不幸的是,现实是我的实际代码没有内部循环。因此,它将同时通过和,同时浪费命令和时间。 之后,我还将它放在另一个循环中,在该循环中,由于已创建数据,它仅执行集合,并且在许多其他情况中都被嵌套,因此这是一个漫长的过程。 有什么想法或理论吗

  • 问题内容: 我有一个打开文件的代码,计算中值并将该值写入单独的文件。一些文件可能是空的,因此我编写了以下循环来检查文件是否为空,如果是,请跳过它,增加计数并返回循环。它对找到的第一个空文件执行预期的操作,但对第二个不执行预期的操作。循环在下面 输出如下 第二个问题是,t以某种方式从小数点后一位上升到15位,而最后一位似乎增加了小数位?感谢您提供的所有帮助 编辑 该错误 似乎仅适用于仅使用一行示例的

  • 如果有人感兴趣,服务总线设置也在下面: 提前致谢

  • 基本上,我要做的就是获取textfields数据,将其放入数组中,然后检查用户名/密码是否大于或等于6。我完全搞不懂为什么这总是要去别的地方?答案大概很明显,但我卡住了! 代码:

  • 本文向大家介绍Python带有“ else”子句的循环,包括了Python带有“ else”子句的循环的使用技巧和注意事项,需要的朋友参考一下 示例 的for和while复合语句(环路)可以可选地具有一个else条款(在实践中,这种用法是相当罕见的)。 该else子句仅在for循环通过迭代终止而终止之后执行,或者在while循环的条件表达式变为false终止之后才执行。 输出: 该else条款并没

  • Python 中,无论是 while 循环还是 for 循环,其后都可以紧跟着一个 else 代码块,它的作用是当循环条件为 False 跳出循环时,程序会最先执行 else 代码块中的代码。 以 while 循环为例,下面程序演示了如何为 while 循环添加一个 else 代码块: 程序执行结果为: https://www.xnip.cn/python/ 执行 else 代码块 上面程序中,当

  • 所以程序应该是:-获取用户的输入,直到用户键入“n或N”以显示停止的标志-当用户键入“n或N”时,程序正数和负数和。 还有我得到的 这个错误信息,我不知道是什么问题。提前谢谢你!

  • 这似乎很明显,但我之所以这么问,是因为我看到一些自定义验证器检查要验证的值是否为null,如果为null,则返回true。这似乎是个坏主意,因为如果开发人员忘记将添加到字段,那么email字段仍将通过验证。 奥勒蒂亚