将Object.method()的“method()”部分作为参数

时间:2015-12-01 20:32:46

标签: python string function parameters

首先,请允许我说这是一个黑客问题,虽然我可以做到这一点,但是让我放纵自己更深层次的蟒蛇好奇心。

我欢迎对我的一般方法发表评论,但我的具体问题与这篇文章的标题有关。

问题:

  

任务

     

您将获得一个字符串S.您的任务是查找字符串S是否包含,   字母数字字符,字母字符,数字,小写   和大写字符。

     

输入格式

     

包含单行,字符串S。

     

约束

     

0      

输出格式

     

在第一行中,如果S有任何字母数字字符,则打印为True,否则打印为False。

     

在第二行中,如果S有任何字母字符,则打印为True,否则打印为False。

     

在第三行中,如果S有任何数字,则打印为True,否则打印为False。

     

在第四行中,如果S具有任何小写字符,则打印为True,否则打印为False。

     

在第五行中,如果S具有任何大写字符,则打印True,否则打印False。

尝试过的代码:

S = input()

def testing(S, fun):
    for x in S:
        if x.fun:
            print(x.fun)
            break
    else:
        print(False)

testing(S, .isalnum())
testing(S, .isalpha())
testing(S, .isdigit())
testing(S, .islower())
testing(S, .isupper())

我不确定如何将我的字符串方法放入我的testing函数中,这样我就可以针对字符串的每个字母运行它们。

我显然可以通过一个kwarg并做一个选择案例,但这不是我正在寻找的。我确信有一种方法可以用lambdas做到这一点(也许不是传递.method()我会通过lambda x: x.method()),而是(1)我对lambdas不太确定,(2)我有这个理论,我真的很想写一个初学者总能读的代码,而lambdas不是初学者。

1 个答案:

答案 0 :(得分:3)

通过使用声明方法的类名,可以将实例方法分配给变量,就像它是普通函数一样。例如:

fun = str.isalnum
print (fun('123'))

所以你的代码最终会看起来像这样:

def testing(S, fun):
    for x in S:
        if fun(x):
            print(fun(x))
            break
    else:
        print(False)

testing(S, str.isalnum)

或更简洁:

def testing(S, fun):
    print(any(fun(x) for x in S))