【发布时间】:2017-01-18 06:11:17
【问题描述】:
我想看看是否可以遍历函数中的函数列表。我能找到的最接近的事情是遍历整个模块。我只想使用预先选择的功能列表。
这是我原来的问题:
- 给定一个字符串,检查每个字母,看看 5 个测试是否满足。
- 如果至少有 1 个字母通过检查,则返回 True。
- 如果字符串中的所有字母都未通过检查,则返回 False。
- 对于字符串中的每个字母,我们将检查这些函数:isalnum()、isalpha()、isdigit()、islower()、isupper()
- 每个测试的结果应该打印到不同的行。
示例输入
qA2
示例输出(必须打印到单独的行,如果至少一个字母通过,则为 True,或者如果所有字母都未通过每次测试,则为 false):
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
那么我该如何修复这段代码来满足上面的所有规则呢?
使用来自所有 cmets 的信息 - 此代码满足上述规则,同时动态循环每个方法。
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]
【问题讨论】:
-
为什么不将所有这些测试封装到一个名为
isValid()的大函数中? -
嗯...让我现在重新编写代码,看看我能得到什么。将使用新版本进行编辑。
-
一个角色如何通过 islower() 和 isupper() 测试?或者您的意思是如果任何字符与任何测试匹配,则返回 True?
-
所以假设字符串是'sdgSGd'。 islower 的测试将显示 True。 isupper 的测试将显示 True。两者也在不同的线路上。检查每个字母,而不是整个字符串。
-
@jhub1 我把你的问题缩短了很多(删除了我们在这里所说的“绒毛”),以使其更直截了当。但是,我留下了您的“cmets 的解决方案”,尽管它们在问题中也没有一席之地。我这样做只是因为它们还没有明确地出现在答案中:我建议你自己编辑它们并将它们发布在你自己的答案中(这是总结答案的好方法)。