在新功能(以及更多功能)中使用功能的结果

时间:2019-08-04 18:34:56

标签: python

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

1)计算数据列表中相同数字的数量。例如:在三个数字之间,包括10和20。

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)    

4 个答案:

答案 0 :(得分:2)

为什么不这样做呢?

Python 3.x:

def amount_of_hashes(ctr):

    while ctr > 0:
        print('#', end = '')
        ctr = ctr-1

Python 2.x:

def amount_of_hashes(ctr):

        while ctr > 0:
            print '#',
            ctr = ctr-1

答案 1 :(得分:2)

我首先要清除您似乎有的疑问。

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

  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_hashescount_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

答案 2 :(得分:1)

可以通过以下方式对列表中的数字进行计数:

def count_range_in_list(li, mini, maxi):
    return len([i for i in li if mini <= i <= maxi])

然后进行多个散列甚至更加简单。只需将包含哈希符号的字符串乘以数字即可。

print(ount_range_in_list(data, 0, 10)*'#')

IPython中的示例:

In [1]: 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]            

In [2]: def count_range_in_list(li, mini, maxi): 
   ...:     return len([i for i in li if mini <= i <= maxi]) 
   ...:                                                                                                  

In [3]: print(count_range_in_list(data, 0, 10)*'#')                                                      


In [4]: print(count_range_in_list(data, 10, 20)*'#')                                                     
###

In [5]: print(count_range_in_list(data, 20, 30)*'#')                                                     
####

答案 3 :(得分:0)

有很多方法可以做到这一点。一种方法是使用带有范围的for循环:

# Most basic
def count_range_in_list(li, min, max):
    ctr = 0
    hashes = ""
    for x in li:
        if min <= x <= max:
            ctr += 1
            hashes += "#"
    print("There are {0} numbers = {1}".format(ctr, hashes))

# more declarative
def count_range_in_list(li, min, max):
    nums = [x for x in li if min <= x <= max]
    hashes = "".join(["#" for n in nums])
    print("There are {0} numbers = {1}".format(len(nums), hashes))