簡體   English   中英

在新函數中使用函數的結果(以及更多函數)

[英]Using the result from a function in a new one (plus more)

我正在嘗試執行以下操作:

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)    

為什么不這樣做:

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. 您無需在此處將方法引用傳遞給另一個方法 我的意思是,在amountOfHashes(count_range_in_list,ctr)您可以僅將count_range_in_list為參數,並像amountOfHashes(ctr)一樣amountOfHashes(ctr)定義。 或者更好的是,在方法名稱中使用蛇形而不是駝峰式,因此您最終得到了amount_of_hashes(ctr) 即使你不得不執行count_range_in_listamount_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 ,可以為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

可以通過以下方式對列表中的數字進行計數:

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)*'#')                                                     
####

有很多方法可以做到這一點。 一種方法是使用帶范圍的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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM