列表的Python函数`yield`,返回单个元素

列表的Python函数`yield`,返回单个元素,第1张

概述是否有可能在传递列表时生成一个生成生成器的函数,但是在给定单个值时会返回? 以此为例: 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 是否有可能在传递列表时生成一个生成生成器的函数,但是在给定单个值时会返回?

以此为例:

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时,您将获得单独的值,否则您将获得生成器表达式,该表达式必须使用next协议进行迭代.

就我个人而言,我觉得你的第二个版本很好并且它是一致的,因为它使得job2015成为一个生成器功能,并且正如Martijn PIEters在评论中提到的那样它没有让它的调用者猜测它得到了什么,更好地坚持这一点.

注意:第一版和第二版的代码不同.我选择第二个版本中的代码来显示这个想法.

总结

以上是内存溢出为你收集整理的列表的Python函数`yield`,返回单个元素全部内容,希望文章能够帮你解决列表的Python函数`yield`,返回单个元素所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1193288.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存