我们都写过条件语句,并且可能至少使用过一次完整的 if-elif-else 结构。
例如,为所需的浏览器创建 Web 驱动程序实例时:
browser = get_browser() if browser == 'chrome': driver = Chrome() elif browser == 'firefox': driver = Firefox() else: raise ValueError('Browser not supported')
此代码段支持使用 Chrome 和 Firefox 进行测试,如果提供不受支持的浏览器,则会引发异常。
一个鲜为人知的事实是,Python 支持将 else 子句与循环和异常处理结合使用。
假设我们有一个单词列表,我们想要打印它们,只要它们以大写字母开头。最后,我们要检查是否所有单词都已处理,如果是,则执行特定逻辑。
我们可以使用标志变量 is_all_words_processed,如果遇到无效单词,则将其设置为 False,然后在循环外检查它以执行逻辑。
seasons = ['Winter', 'Spring', 'Summer', 'Autumn'] is_all_words_processed = True for season in seasons: if not season.istitle(): is_all_words_processed = False break print(season) if is_all_words_processed: print('All seasons were processed')
Python 允许我们通过将所有单词都有效时的逻辑放入 else 子句中来避免附加变量:
seasons = ['Winter', 'Spring', 'Summer', 'Autumn'] for season in seasons: if not season.istitle(): break print(season) else: print('All seasons were processed')
只有当循环自然完成且没有中断时,else 块才会执行。如果循环被break中断,则else子句将不会运行。
这是用 while 循环重写的相同示例。对于 while,else 子句的行为方式相同:
seasons = ['Winter', 'Spring', 'Summer', 'Autumn'] index = 0 while index < len(seasons): if not seasons[index].istitle(): break print(seasons[index]) index += 1 else: print('All seasons were processed')
else 子句也可以用于异常处理。除了块之外,它必须在所有之后出现。仅当 try 块中没有引发异常时,else 块内的代码才会执行。
例如,让我们读取一个包含两列数字的文件并打印它们的商。我们需要处理无效的文件名,而任何其他错误(例如,将值转换为数字或除以零)都会导致程序崩溃(我们不会处理它们)。
file_name = 'input.dat' try: f = open(file_name, 'r') except FileNotFoundError: print('Incorrect file name') else: for line in f: a, b = map(int, line.split()) print(a / b) f.close()
在此示例中,try 块仅包含可能引发捕获的异常的代码。
官方文档建议使用 else 块来避免无意中捕获 try 块之外的代码引发的异常。尽管如此,在异常处理中使用 else 可能感觉并不直观。
这是我在采访中提出的一个问题。
假设我们有一个带有 find_element 方法的 Driver 类。 find_element 方法要么返回一个元素,要么引发 ElementNotFoundException 异常。在此示例中,它的实现是随机返回一个元素或以相等的概率引发异常。
使用基本的 Python 语法,实现一个方法 smart_wait(self, locator: str, timeout: float, step: float),该方法每步秒检查具有给定定位器的元素。如果在超时秒内找到该元素,则返回;否则,引发 ElementNotFoundException 异常。
browser = get_browser() if browser == 'chrome': driver = Chrome() elif browser == 'firefox': driver = Firefox() else: raise ValueError('Browser not supported')
这是实现此方法的一种方法:
seasons = ['Winter', 'Spring', 'Summer', 'Autumn'] is_all_words_processed = True for season in seasons: if not season.istitle(): is_all_words_processed = False break print(season) if is_all_words_processed: print('All seasons were processed')
我们可以通过使用 return 而不是 break 来稍微缩短逻辑,但现在让我们将其保留为 i 。
其实这个方法是在Selenium的WebDriverWait类中实现的——until方法:
seasons = ['Winter', 'Spring', 'Summer', 'Autumn'] for season in seasons: if not season.istitle(): break print(season) else: print('All seasons were processed')
现在,让我们使用 else 重写此方法以进行异常处理和循环:
完成这些转换后,我们获得了一个使用 else 语句进行异常处理和循环的方法:
seasons = ['Winter', 'Spring', 'Summer', 'Autumn'] index = 0 while index < len(seasons): if not seasons[index].istitle(): break print(seasons[index]) index += 1 else: print('All seasons were processed')
我能说什么...这是 Python 鲜为人知的功能之一。不频繁使用可能会使其在每种情况下使用起来不太直观——这可能会导致混乱。然而,了解它并在需要时有效地应用它无疑是值得的。
新年快乐!???
P.S.真的很可怕吗?:
我自己写文章,但使用 ChatGPT 翻译它们。为了翻译,我删除了所有代码片段,但 ChatGPT 恢复了所有代码片段?
以上是Python 中奇怪的else的详细内容。更多信息请关注PHP中文网其他相关文章!