我有以下代码,为了学习,希望看到一种更 Pythonic 的方式来实现这一点:
for value in response.values():
for encod in encodings:
if encod.lower() in value.lower():
return(encod)
我有以下代码,为了学习,希望看到一种更 Pythonic 的方式来实现这一点:
for value in response.values():
for encod in encodings:
if encod.lower() in value.lower():
return(encod)
假设您实际上打算只返回您找到的第一个匹配项(这就是您的代码所做的),除了最后一行中不必要的括号外,您的代码没有什么不符合 Python 标准的,您可以将其替换为:
return encod
Pythonic并不意味着“写一个单行”或“为了它而使用 Python 的特定功能”。这意味着,除其他外,“以最容易理解和最具表现力的方式编写代码”。
参见:Python 之禅
如果您正在寻找其他方式,可以使用以下方法:
return next(encod for value in response.values()
for encod in encodings
if encod.lower() in value.lower())
其中的部分next(...)
是一个生成器表达式,如果满足条件,则为每个in生成每个encod
in 。这个生成器的第一个元素是我们返回的(参见 参考资料)。encodings
value
response.values()
encod.lower() in value.lower()
next()
虽然,在实践中,我通常会选择你已经拥有的。这是做你想做的事情的最简单和最清晰的方法,而且绝不是非Pythonic。
您的代码只会返回第一个匹配的实例,但您仍然可以使用列表推导或者更好的生成器表达式。
return next(v for v in response.values() if v.lower in map(lower, encodings))
只是为了提供另一种使用笛卡尔积的方法。我喜欢这个,因为它符合我的想法:“检查每一对值”。
import itertools
for (encoding, value) in itertools.product(encodings, response.values()):
if encoding.lower() in value.lower():
return encoding
您可以将其作为列表输出吗?列表推导会使其更加 Pythonic。
return [encod for value in response.values() for encod in encodings if encod.lower() in value.lower()]