列表的Python函数`yield`,返回单个元素
发布时间:2020-12-20 11:40:24 所属栏目:Python 来源:网络整理
导读:是否有可能在传递列表时生成一个生成生成器的函数,但是在给定单个值时会返回? 以此为例: def duty2015(x): if type(x) in [list,np.ndarray]: for xi in x: yield new_duty(xi) else: sd = 0 if x = 120000: return sd elif x = 250000: return (x-125000)
是否有可能在传递列表时生成一个生成生成器的函数,但是在给定单个值时会返回?
以此为例: def duty2015(x): if type(x) in [list,np.ndarray]: for xi in x: yield new_duty(xi) else: sd = 0 if x <= 120000: return sd elif x <= 250000: return (x-125000) * 0.02 elif x <= 925000: return 2500 + (x-250000)*0.05 elif x <= 1500000: return 36250 + (x-925000)*0.1 else: return 93750 + (x-1500000)*0.12 显然这不起作用,我得到了SyntaxError:’return’,带有生成器错误内的参数. 我意识到我可以做这样的事情: def duty2015(x): if type(x) in [list,np.ndarray]: for xi in x: for result in duty2015(xi): yield result else: sd = 0 if x <= 125000: yield sd elif x <= 250000: yield (x-125000) * 0.02 elif x <= 925000: yield 2500 + (x-250000)*0.05 elif x <= 1500000: yield 36250 + (x-925000)*0.1 else: yield 93750 + (x-1500000)*0.12 但是当我把它称为单个物品时,它给了我一个发电机,我宁愿只在它被调用更大的物品时得到它. 显然我可以把它作为一个列表,但同样这不是最佳的. 对于下面答案中的评论,这样的事情会更好: def duty_new(x,generator=False): if type(x) in [list,np.ndarray]: if generator: return (duty_new(xi) for xi in x) else: return [duty_new(xi) for xi in x] else: sd = 0 if x <= 125000: return sd elif x <= 250000: return (x-125000) * 0.02 elif x <= 925000: return 2500 + (x-250000)*0.05 elif x <= 1500000: return 36250 + (x-925000)*0.1 else: return 93750 + (x-1500000)*0.12 因此,在正常使用下,它将具有可预测的行为或返回与传递给它的相同类型的参数(至少对于合理的参数,并且可能使得它不仅仅通过numpy数组迭代),但是如果是需要发电机可以明确要求吗? 解决方法
返回一个生成器表达式,就像这样
def duty2015(x): if isinstance(x,list) or isinstance(x,np.ndarray): return (result for xi in x for result in duty2015(xi)) else: ... ... 现在,每当您使用单个元素调用duty2015时,您将获得单独的值,否则您将获得生成器表达式,该表达式必须使用 就我个人而言,我觉得你的第二个版本很好并且它是一致的,因为它使得job2015成为一个生成器功能,并且正如Martijn Pieters在评论中提到的那样它没有让它的调用者猜测它得到了什么,更好地坚持这一点. 注意:第一版和第二版的代码不同.我选择第二个版本中的代码来显示这个想法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |