这是我的函数,它应该将另一个函数应用于给定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。
答案 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)
你犯了两个错误:
因此更正的版本将是:
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'