2013-05-01 87 views
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。

+3

当你说“我得到一个错误”,你必须告诉我们错误是什么。否则,我们只能猜测或尝试自行解决。 – Gabe 2013-05-01 03:55:35

+3

请勿将'all'用作变量名称。您将覆盖内置的[all](http://docs.python.org/3.3/library/functions.html#all) – dawg 2013-05-01 04:08:21

回答

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='') 
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

你让2个错误:

  • 要调用函数f在参数e上,你做f(e),而不是ef()
  • 给一个函数作为参数,给出它的名字,而不是一个字符串与我TS名

所以修正的版本是:

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

    for i in transform('abCdeFg', str.upper): 
    print(i, end='') 
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 /除外:

>>> 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'