我想看看是否可以在一个函数中运行一个函数列表。我能找到的最接近的东西是遍历整个模块。我只想使用预先选择的功能列表。
这是我原来的问题:
- 给定一个字符串,检查每个字母以查看是否满足 5 个测试中的任何一个。
- 如果至少有 1 个字母通过检查,则返回 True。
- 如果字符串中的所有字母都未通过检查,则返回 False。
- 对于字符串中的每个字母,我们将检查这些函数:isalnum()、isalpha()、isdigit()、islower()、isupper()
- 每个测试的结果应该打印到不同的行。
样本输入
qA2
示例输出(必须打印到单独的行,如果至少一个字母通过,则为真,否则所有字母均未通过每次测试,则为假):
True
True
True
True
True
我写这个是为了一次测试。当然,我可以只写 5 组不同的代码,但这看起来很难看。然后我开始想我是否可以循环遍历他们要求的所有测试。
仅一个测试的代码:
raw = 'asdfaa3fa'
counter = 0
for i in xrange(len(raw)):
if raw[i].isdigit() == True: ## This line is where I'd loop in diff func's
counter = 1
print True
break
if counter == 0:
print False
我尝试运行所有测试的循环失败:
raw = 'asdfaa3fa'
lst = [raw[i].isalnum(),raw[i].isalpha(),raw[i].isdigit(),raw[i].islower(),raw[i].isupper()]
counter = 0
for f in range(0,5):
for i in xrange(len(raw)):
if lst[f] == True: ## loop through f, which then loops through i
print lst[f]
counter = 1
print True
break
if counter == 0:
print False
那么我该如何修复这段代码来满足那里的所有规则呢?
使用来自所有评论的信息——此代码满足上述规则,并动态循环遍历每个方法。
raw = 'ABC'
functions = [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]
for func in functions:
print any(func(letter) for letter in raw)
getattr 方法(我认为这称为内省方法?)
raw = 'ABC'
meths = ['isalnum', 'isalpha', 'isdigit', 'islower', 'isupper']
for m in meths:
print any(getattr(c,m)() for c in raw)
列表理解方法:
from __future__ import print_function ## Changing to Python 3 to use print in list comp
raw = 'ABC'
functions = [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]
solution = [print(func(raw)) for func in functions]
原文由 jhub1 发布,翻译遵循 CC BY-SA 4.0 许可协议
您循环访问函数列表的方式略有不同。这将是一种有效的方法。您需要存储在列表中的函数是 str.funcname 给出的通用字符串函数。一旦你有了这些函数列表,你就可以使用 for 循环遍历它们,就像对待普通函数一样对待它!
示例输出:
我还注意到您似乎使用索引进行迭代,这让我觉得您可能来自 C/C++ 这样的语言。 for in 循环结构在 python 中非常强大,所以我会阅读它 (y)。
上面是一种更 pythonic 的方法来做到这一点,但作为一种学习工具,我写了一个工作版本,它尽可能地匹配你尝试做的方式,以具体地告诉你哪里出了问题。这是评论: