这是我的函数,它应该将另一个函数应用于给定迭代中的每个元素。
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。
这是我的函数,它应该将另一个函数应用于给定迭代中的每个元素。
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。
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='')
你犯了2个错误:
所以一个更正的版本是:
def transform(iterable, f):
return (f(i) for i in iterable)
for i in transform('abCdeFg', str.upper):
print(i, end='')
错误在这一行:
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='')
如果你想按照你写的那样做,你需要这样做:
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'