微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何遍历函数参数?

如何解决如何遍历函数参数?

def grade(*score):
  for i in range(0,score):
    if score >= 90:
      return "A"
    elif score >=80:
      return "B"
    elif score >=70:
      return "C"
    elif score >=60:
      return "D"
    else:
      return "F"

print(grade(87,92,100,54,72,84,81,74))

我希望能够遍历参数并在每次循环中返回正确的成绩。

解决方法

您可以使用for循环,将每个年级附加到列表中,然后返回列表。

def grade(*score):

  grades = []

  for i in score:
    if i >= 90:
      grades.append("A")
    elif i >=80:
      grades.append("B")
    elif i >=70:
      grades.append("C")
    elif i >=60:
      grades.append("D")
    else:
      grades.append("F")

  return grades

print(grade(87,92,100,54,72,84,81,74))
,

您可以尝试使用这种有趣的紧凑方法来完成此操作(并且我不确定您是否记错了,但是可以,这是一个元组):

def grade(score):
  scores = {range(90,101):"a",range(80,90):"b",range(70,80):"c",range(60,70):"d",range(1,60):"f"}
  return tuple([scores[gradeRange] for i in score for gradeRange in scores.keys() if i in gradeRange])

print(grade((100,30,70)))
("a","f","c")
,

如评论中所述,这里有比循环args更好的设计。将功能应用于单个元素,这是评估等级所需的最小粒度单位。将循环放入您可能想应用于多个元素的每个函数中,充其量是最多的浪费,并且实际上在最坏的情况下会对调用方造成可读性和维护危害。

根据经验,当一个函数在一个单元上运行时,将循环移至调用方(例如int)。仅在需要对可迭代对象进行操作(例如sortminsum)时在函数内部循环。

也请避免使用较长的if-else链。如果您有30个桶而不是5个桶怎么办?编写30条if-else语句是不可扩展的。称之为过早,但是当我的if-else链增长超过3个左右时,我会感到不安。

这是我的建议,它利用了大多数存储桶可被10整除的事实,而我们只需要处理

>>> def grade(x): return "FFFFFFDCBAA"[x//10]
... 
>>> grade(99)
'A'
>>> grade(100)
'A'
>>> grade(80)
'B'
>>> grade(89)
'B'
>>> grade(60)
'D'
>>> grade(59)
'F'

如果您想变得更健壮,请折腾另一行并检查边界,如果参数超出范围,则加IndexError,如果参数类型不正确,则加ValueError

借助我们新的grade函数,我们可以将其应用于单个等级或呼叫者选择的可迭代等级:

>>> grades = [87,74]
>>> [grade(x) for x in grades]
['B','A','F','C','B','C']
>>> list(map(grade,grades)) # alternately
['B','C']

在实际的应用程序中,grades列表不仅仅是凭空产生的一堆文字或变量-还必须处于某种数据结构的状态。如果您坚持按原样进行功能设计,那么您可能会有一个额外的循环,或者被包装和拆包数据结构,或者两者兼而有之。

还有一个语义/可读性问题:grade(100,20,64)尚不清楚应该执行什么操作。 grade是否会返回所有分数的平均值并得出最终成绩?减少是此类可变参数函数的典型模式(例如summin等)。当调用者使用[grade(x) for x in grades]时,很显然我们正在使用映射操作,将函数grade分别应用于每个元素而不是集合作为一个单元。按照这种逻辑,更好的函数名称可能是score_to_letter_grade或类似名称,可以清楚地描述正在执行的1:1操作。

此外,如果您只想对一件事进行评分,那么无论使用什么作为保持呼叫者整洁的即时突破者,您都将列表作为输出。如果内置的int如此工作,那么后面将是一个很大的痛苦:x = int(x)[0]仅将x解析为整数到字符串。

这里的情况不是那么可怕,因为代码量很少,但是可以在这样的微观规模上解释大的设计问题,而责任的这种错误分配在应用于更大的代码库时会产生设计上的负担。

,
for student in grade_tuple:
  print(grade(student))
  • 假设您重写grade()只是希望获得一个分数...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。