1

这是我的函数,它应该将另一个函数应用于给定迭代中的每个元素。

def transform(iterable,f):
        all=(i for i in iterable)
        return (e.f() for e in all)

for i in transform('abCdeFg','upper'):
      print(i,end='')

它应该做的是将所有字母大写,但我得到一个错误。我究竟做错了什么?我正在使用 Python 3.3。

4

4 回答 4

4

e.f是字面意思e.ff它与您的变量无关。要按名称获取属性,请使用getattr

def transform(iterable,f):
        all=(i for i in iterable)
        return (getattr(e, f)() for e in all)

for i in transform('abCdeFg','upper'):
      print(i,end='')

此外,您可能会发现内置map函数很有用:

def function(l):
    return l.upper()

for i in map(function, 'abCdeFg'):
    print(i, end='')
于 2013-05-01T03:48:23.340 回答
1

你犯了2个错误:

  • 要在参数 e 上调用函数 f,请执行 f(e),而不是 ef()
  • 给一个函数作为参数,给出它的名字,而不是一个带有名字的字符串

所以一个更正的版本是:

   def transform(iterable, f):
     return (f(i) for i in iterable)

   for i in transform('abCdeFg', str.upper):
     print(i, end='')
于 2013-05-01T03:49:04.330 回答
0

错误在这一行:

return (e.f() for e in all)

问题是 str 变量e没有方法f()。你应该改为:

def transform(iterable,f):
        all=(i for i in iterable)
        return (f(e) for e in all)

for i in transform('abCdeFg',str.upper):
      print(i,end='')
于 2013-05-01T03:45:47.650 回答
0

如果你想按照你写的那样做,你需要这样做:

def transform(s,f):
    return getattr(type(s), f)(s)


for i in transform('abCdeFg','upper'):
      print(i,end='')

印刷:

ABCDEFG

正如其他人所说,这更直接:

print('abCdeFg'.upper())

您也不应该使用 Python 内置函数作为名称。(即,避免调用genex all,因为您将覆盖内置函数all。)

使用 getattr 您还可以返回没有给定方法的类型的默认值:

>>> def transform(s,f):
...     return getattr(type(s), f, lambda s: 'no bueno')(s)
>>> transform(1,'upper')
'no bueno'

或使用 try / except:

>>> def transform(s,f):
...     try:
...         return getattr(type(s), f)(s)
...     except AttributeError as e:
...         return e
... 
>>> transform(1,'upper')
AttributeError("type object 'int' has no attribute 'upper'",)

您还可以将 join 与 map 一起使用:

>>> ''.join(map(lambda c: str.upper(c), 'abCdeFg'))
'ABCDEFG'

或者加入一个理解:

>>> ''.join(c.upper() for c in 'abCdeFg')
'ABCDEFG'
于 2013-05-01T04:12:28.920 回答