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 を使用しています。

4

4 に答える 4

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='')
于 2013-05-01T03:48:23.340 に答える
1

あなたは 2 つの間違いを犯しました:

  • 引数 e で関数 f を呼び出すには、ef() ではなく f(e) を実行します。
  • 関数をパラメーターとして指定するには、その名前の文字列ではなく、その名前を指定します

したがって、修正版は次のようになります。

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

   for i in transform('abCdeFg', str.upper):
     print(i, end='')
于 2013-05-01T03:49:04.330 に答える
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 ビルトインを名前として使用しないでください。(つまり、組み込み関数allallを上書きするため、ジェネクスの呼び出しは避けてください。)

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'
于 2013-05-01T04:12:28.920 に答える