2013-05-01 151 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' 
相關問題