嵌套函数不起作用,为什么?

时间:2013-05-01 03:42:45

标签: python python-3.3 nested-function

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

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 个答案:

答案 0 :(得分:4)

e.f字面上是e.f。它与您的f变量无关。要按名称获取属性,请使用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='')

答案 1 :(得分:1)

你犯了两个错误:

  • 要在参数e上调用函数f,可以执行f(e),而不是e.f()
  • 要将函数作为参数提供,请提供其名称,而不是名称为
  • 的字符串

因此更正的版本将是:

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

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

答案 2 :(得分: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='')

答案 3 :(得分: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(lambda c: str.upper(c), 'abCdeFg'))
'ABCDEFG'

或者加入理解:

>>> ''.join(c.upper() for c in 'abCdeFg')
'ABCDEFG'