2012-07-19 40 views
5

Tôi đang cố gắng thực hiện chuyển đổi kiểu bằng cách sử dụng trình tạo, nhưng tôi muốn chuyển sang phần tử tiếp theo trong trình vòng lặp khi tôi tạo thành công một giá trị. Nỗ lực hiện tại của tôi sẽ mang lại nhiều giá trị trong trường hợp biểu thức thành công:Chỉ sản lượng một lần cho mỗi lần lặp

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 

Điều này được thực hiện như thế nào?

+0

tôi m khá chắc chắn tôi chỉ thiếu một cái gì đó, nhưng những gì là một trường hợp diễn viên của bạn để 'int' sẽ thất bại nhưng dàn diễn viên của bạn thành' float' sẽ thành công? –

+2

@NolenRoyalty - xem xét chuỗi: ''1.0'' – mgilson

+0

@mgilson có ý nghĩa hoàn hảo, nhờ: D –

Trả lời

4

Bạn sẽ có thể continue vòng lặp này giống như bất kỳ khác:

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

Như một mặt lưu ý, tôi đã luôn luôn nghĩ rằng continue là một cái tên xa lạ đối với cấu trúc điều khiển này ...

Và, đây là mã được sửa của bạn trong hành động:

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) 
4

Tôi không biết nếu nó gọi tiếp theo() tại mỗi khối thử, nhưng nếu đây là mối quan tâm của yo u, tại sao bạn không làm

try: 
    item = int(item) 
except (ValueError, TypeError) as WrongTypeerror 
    try: 
     item = float(item) 
    except (ValueError, TypeError) as WrongTypeError 
     pass 
yield item 
0

này hoạt động:

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 

Đây là kết quả:

>>> list(type_convert(["13", 3.5, True])) 
[13, 3, 1] 
0

Dưới đây là một câu trả lời tổng quát:

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) 
Các vấn đề liên quan