5

ジェネレーターを使用して型変換を実行しようとしていますが、値が正常に生成されたら、イテレーターの次の要素に移動したいと思います。私の現在の試みでは、式が成功した場合に複数の値が生成されます。

def type_convert(data):
    for item in data:
        try:
            yield int(item)
        except (ValueError, TypeError) as WrongTypeError:
            pass
        try:
            yield float(item)
        except (ValueError, TypeError) as WrongTypeError:
            pass
        yield item

これはどのように達成されますか?

4

4 に答える 4

4

continue他のループと同じように、このループを実行できるはずです。

try:
    yield int(item)
    continue
except (ValueError, TypeError) as WrongTypeError:
    pass

ちなみに、私はいつもcontinueこの制御構造の奇妙な名前だと思っていました...

そして、これが実際の修正されたコードです:

def type_convert(data):
    for item in data:
        try:
            yield int(item)
            continue
        except (ValueError, TypeError) as WrongTypeError:
            pass
        try:
            yield float(item)
            continue
        except (ValueError, TypeError) as WrongTypeError:
            pass
        yield item


for a in type_convert(['a','1','1.0']):
    print (a)
于 2012-07-19T18:41:03.440 に答える
4

各tryブロックでnext()が呼び出されるかどうかはわかりませんが、これが気になる場合は、実行してみませんか。

try:
  item =  int(item)
except (ValueError, TypeError) as WrongTypeerror
   try:
       item = float(item)
   except (ValueError, TypeError) as WrongTypeError
       pass
yield item
于 2012-07-19T18:42:37.280 に答える
0

これは機能します:

def type_convert(data):
    for item in data:
        try:
            yield int(item)
            continue
        except (ValueError, TypeError) as WrongTypeError:
            pass
        try:
            yield float(item)
            continue
        except (ValueError, TypeError) as WrongTypeError:
            pass
        yield item

結果は次のとおりです。

>>> list(type_convert(["13", 3.5, True]))
[13, 3, 1]
于 2012-07-19T18:47:29.730 に答える
0

一般的な答えは次のとおりです。

def type_convert(*args):
    datatypes = []
    for arg in args:
        if type(arg) == type(type):
            datatypes += [arg]
        else:
            data = arg
    for item in data:
        for datatype in datatypes:
            try:
                yield datatype(item)
                break
            except (ValueError, TypeError) as WrongTypeError:
                pass
        else:
            yield item  # unable to convert to any datatype

for a in type_convert(int, float, ['a','1','1.0']):
    print (a)
于 2012-07-19T20:28:22.867 に答える