在类方法上使用eval()函数

时间:2019-06-13 18:24:23

标签: python

我正在尝试解决hackerrank challenge

  

样本输入

S = "qA2"
     

在第一行中,如果S有任何字母数字字符,则打印True。否则,请打印False
  在第二行中,如果S具有任何字母字符,则打印True。否则,请打印False
  在第三行中,如果S有任何数字,则打印True。否则,请打印False
  在第四行中,如果S具有任何小写字符,则打印True。否则,请打印False
  在第五行中,如果S具有任何大写字符,则打印True。否则,打印False

我知道可以使用更简单的方法,但是我想使用eval()。 与其使用所有方法,不如使用多行代码,我想使用其中包含方法的列表(此处为cmd),然后使用for循环遍历它,而eval()应该将其转换为方法({{ 1}})。如果eval(i+"."+j)中的任何字符i返回True,则输出true。

代码/尝试:

list(s)

跟踪/错误:

if __name__ == '__main__':
    s = input()
    cmd=["isalnum()","isalpha()"]
    for j in cmd:
        print (any([eval(i+"."+j) for i in list(s)]))

1 个答案:

答案 0 :(得分:4)

这是有问题的,因为当您在eval()语句中串联字符串时,会得到类似于q.isalnum()的内容。当您真的想在字符'q'.isalnum()上调用方法时,第一个方法是像变量一样使用q。像这样:

'q'

除了使用字符串作为命令外,您还可以使用函数本身:

if __name__ == '__main__':
    s = input()
    cmd=["isalnum()","isalpha()"]
    for j in cmd:
        print (any([eval("'{}'.{}".format(i, j)) for i in list(s)]))

然后您就不需要使用eval了,

cmd=[str.isalnum, str.isalpha]

编辑:

为了完整起见,您还可以删除if __name__ == '__main__': s = input() cmd=[str.isalnum,str.isalpha] for j in cmd: print (any([j(i) for i in list(s)])) 内的括号以创建生成器,而不是列表理解。这很好,因为一旦生成器首先达到第一个any()结果,生成器将停止,而列表理解将评估整个字符串。您也不需要将True转换为列表,因为字符串本身是可迭代的。然后剩下的就是:

s