动态循环遍历Python函数中的函数列表

新手上路,请多包涵

我想看看是否可以在一个函数中运行一个函数列表。我能找到的最接近的东西是遍历整个模块。我只想使用预先选择的功能列表。

这是我原来的问题:

  1. 给定一个字符串,检查每个字母以查看是否满足 5 个测试中的任何一个。
  2. 如果至少有 1 个字母通过检查,则返回 True。
  3. 如果字符串中的所有字母都未通过检查,则返回 False。
  4. 对于字符串中的每个字母,我们将检查这些函数:isalnum()、isalpha()、isdigit()、islower()、isupper()
  5. 每个测试的结果应该打印到不同的行。

样本输入

    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 许可协议

阅读 468
2 个回答

您循环访问函数列表的方式略有不同。这将是一种有效的方法。您需要存储在列表中的函数是 str.funcname 给出的通用字符串函数。一旦你有了这些函数列表,你就可以使用 for 循环遍历它们,就像对待普通函数一样对待它!

 raw = 'asdfaa3fa'
functions = [str.isalnum, str.isalpha, str.isdigit, str.islower,  str.isupper]  # list of functions

for fn in functions:     # iterate over list of functions, where the current function in the list is referred to as fn
    for ch in raw:       # for each character in the string raw
        if fn(ch):
            print(True)
            break

示例输出:

 Input                     Output
===================================
"qA2"         ----->      True True True True True
"asdfaa3fa"   ----->      True True True True

我还注意到您似乎使用索引进行迭代,这让我觉得您可能来自 C/C++ 这样的语言。 for in 循环结构在 python 中非常强大,所以我会阅读它 (y)。

上面是一种更 pythonic 的方法来做到这一点,但作为一种学习工具,我写了一个工作版本,它尽可能地匹配你尝试做的方式,以具体地告诉你哪里出了问题。这是评论:

 raw = 'asdfaa3fa'
lst = [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]   # notice youre treating the functions just like variables and aren't actually calling them. That is, you're writing str.isalpha instead of str.isalpha()
for f in range(0,5):
    counter = 0
    for i in xrange(len(raw)):
        if lst[f](raw[i]) == True:  # In your attempt, you were checking if lst[f]==True; lst[f] is a function so you are checking if a function == True. Instead, you need to pass an argument to lst[f](), in this case the ith character of raw, and check whether what that function evaluates to is true
            print lst[f]
            counter = 1
            print True
            break
    if counter == 0:
        print False

原文由 gowrath 发布,翻译遵循 CC BY-SA 3.0 许可协议

所有其他答案都是正确的,但由于您是初学者,我想指出您代码中的问题:

 lst = [raw[i].isalnum(),raw[i].isalpha(),raw[i].isdigit(),raw[i].islower(),raw[i].isupper()]

第一:不确定 当前在您的代码中截断了哪个值,但它似乎指向字符串中的某处 - 这导致评估单个字符,而不是整个字符串 raw

第二:当你构建你的列表时,你已经在调用你想要插入的方法,它的效果是插入的不是函数本身,而是它们的返回值(这就是为什么你在打印语句中看到所有这些 True 值的原因).

尝试按如下方式更改您的代码:

 lst = [raw.isalnum, raw.isalpha, raw.isdigit, raw.islower, raw.isupper]

原文由 andreas-hofmann 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏