首页 > 解决方案 > 在新函数中使用函数的结果(加上更多)

问题描述

我正在尝试执行以下操作:

1)计算数据列表中相同数字的数量。例如:10 和 20 之间有 3 个数字。

2)用相同数量的'#'表示每个数字范围的值。例如:10 到 20 之间有 3 个数字 = ###。

理想情况下,两个值彼此相邻表示。

不幸的是,我真的无法弄清楚第二步,任何帮助都将不胜感激。

我的代码如下:

def count_range_in_list(li, min, max):
ctr = 0
for x in li:
    if min <= x <= max:
        ctr += 1
return ctr

def amountOfHashes(count_range_in_list,ctr):
  ctr = count_range_in_list()
  if ctr == 1:
    print ('#')
  elif ctr == 2:
     print ('##')
  elif ctr == 3:
     print ('###')
  elif ctr == 4:
     print ('####')
  elif ctr == 5:
     print ('#####')
  elif ctr == 6:
     print ('######')
  elif ctr == 7:
     print ('#######')
  elif ctr == 8:
     print ('########')
  elif ctr == 9:
     print ('#########')
  elif ctr == 10:
     print ('##########')


data = [90,30,13,67,85,87,50,45,51,72,64,69,59,17,22,23,44,25,16,67,85,87,50,45,51]
print(count_range_in_list(data, 0, 10),amountOfHashes)
print(count_range_in_list(data, 10, 20),amountOfHashes)
print(count_range_in_list(data, 20, 30),amountOfHashes)
print(count_range_in_list(data, 30, 40),amountOfHashes)
print(count_range_in_list(data, 40, 50),amountOfHashes)
print(count_range_in_list(data, 50, 60),amountOfHashes)
print(count_range_in_list(data, 60, 70),amountOfHashes)
print(count_range_in_list(data, 70, 80),amountOfHashes)
print(count_range_in_list(data, 80, 90),amountOfHashes)
print(count_range_in_list(data, 90, 100),amountOfHashes)    

标签: python

解决方案


我将首先清除您似乎有的一些疑问。

首先,如何在另一个函数内部使用一个函数的值:

  1. 您不需要在此处将方法的引用传递给另一个方法。我的意思是,amountOfHashes(count_range_in_list,ctr)您可以将count_range_in_list其作为参数删除,然后将其定义为amountOfHashes(ctr). 或者更好的是,在方法名称中使用蛇形大小写而不是驼峰形大小写,这样你最终会得到amount_of_hashes(ctr). 即使必须在count_range_in_list内部执行amount_of_hashes,Python 也足够聪明,可以让您在不传递函数引用的情况下执行此操作,因为这两个方法已经在同一个文件中。

  2. 为什么你只需要ctr?好吧,count_range_in_list已经返回了一个计数器,所以这就是我们所需要的。一个参数,名为ctr. 这样做时,要“在新函数中使用函数的结果”,我们可以:

def amount_of_hashes(ctr):
  ...

# now, passing the value of count_range_in_list in amount_of_hashes
amount_of_hashes(count_range_in_list(data, 10, 20))

您已经很好地了解了步骤 1),因此我们可以立即进行步骤 2)。

在 Python 中,最好动态地考虑迭代过程,例如您的迭代过程,而不是以硬编码的方式。也就是说amountOfHashes,可以通过这种方式避免创建方法来检查它们之间存在微小差异的相同条件,例如 中的那些:

# Method name changed for preference. Use the name that best fits you
def counter_hashes(ctr):
  # A '#' for each item in a range with the length of our counter
  if ctr == 0:
    return 'N/A'
  return ''.join(['#' for each in range(ctr)])

但正如 Roland Smith 所说,您可以取一个字符串并将其乘以一个数字 - 这将完全按照您的想法进行:多次重复该字符串。

>>> 3*'#'
###

所以你甚至不需要我的counter_hashes上面,你就可以了ctr*'#',就是这样。但为了保持一致,我将counter_hashes根据这个新发现进行更改:

def counter_hashes(ctr):
  # will still return 'N/A' when ctr = 0
  return ctr*'#' or 'N/A'

出于组织目的,由于您有特定需求(打印哈希哈希计数),因此您可能希望正确格式化进入的内容print,您可以为打印创建一个特定的方法,它同时调用counter_hashesand count_Range_in_list,并为您提供更清洁的之后的结果:

def hash_range(data, min, max):
  ctr = count_range_in_list(data, min, max)
  hashes = counter_hashes(ctr)
  print(f'{hashes} | {ctr} items in range')

然后它的使用和输出将变为:

>>> data = [90,30,13,67,85,87,50,45,51,72,64,69,59,17,22,23,44,25,16,67,85,87,50,45,51]
>>> hash_range(data, 0, 10)
N/A | 0 items in range
>>> hash_range(data, 10, 20)
### | 3 items in range
>>> hash_range(data, 20, 30)
#### | 4 items in range

等等。如果您只想立即打印东西,没有上述hash_range方法,如果您想要一个单行线,它会更简单但更冗长/重复:

>>> ctr = count_range_in_list(data, 10, 20)
>>> print(counter_hashes(ctr), ctr)
### 3

推荐阅读