python - 在新函数中使用函数的结果(加上更多)
问题描述
我正在尝试执行以下操作:
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)
解决方案
我将首先清除您似乎有的一些疑问。
首先,如何在另一个函数内部使用一个函数的值:
您不需要在此处将方法的引用传递给另一个方法。我的意思是,
amountOfHashes(count_range_in_list,ctr)
您可以将count_range_in_list
其作为参数删除,然后将其定义为amountOfHashes(ctr)
. 或者更好的是,在方法名称中使用蛇形大小写而不是驼峰形大小写,这样你最终会得到amount_of_hashes(ctr)
. 即使您必须在count_range_in_list
内部执行amount_of_hashes
,Python 也足够聪明,可以让您在不传递函数引用的情况下执行此操作,因为这两个方法已经在同一个文件中。为什么你只需要
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_hashes
and 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
推荐阅读
- html - 如何居中元素?
- php - 如何在自定义循环中获得 woocommerce 可变产品的最低和最高价格?
- c - 从 C 项目中提取所有枚举的最佳方法
- javascript - Web Components: Is there an equivalent to attributeChangedCallback for properties?
- swift - 具有圆形背景的自定义分段控件
- javascript - 有没有办法将 Firefox 的窗口宽度调整为 100 像素?或者有没有其他浏览器可以让我的窗口宽度低于 100 像素?
- android - 将 viewModelScope 与 LiveData 一起使用时出现问题
- r - 在 Shiny App 的 Filter dplyr 中将函数作为参数传递
- javascript - 添加自定义图像以在材质 ui 底部导航中制作图标
- autocomplete - Algolia 自动完成 - 如何以英语显示自动完成建议?