一、函數解析:
1.Python zfill() 方法返回指定長度的字符串,原字符串右對齊,前面填充0
例子:
1->00001
2->00010
2.zip() 函數用於將可迭代的對象作爲參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的列表。
例子:
list1 = [1,2]
list2 =[3,4]
zip(list1,list2)
結果:
[(1,3),(2,4)]
3.bin() 返回一個整數 int 或者長整數 long int 的二進制表示。
例子:
print(bin(2))
結果:
ob10
所以要進行切片:
例子:
bin(i)[2:])
結果:
10
4.lambda lambda 可以理解爲一個簡易的函數“:”前面是形參,後面是表達式,表達式的值作爲返回值。
lambda x: x[0]
5…filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表
filter(function, iterable)
參數:
- function – 判斷函數。
- iterable – 可迭代對象
當 function 返回值是True,則返回當前迭代的對象
當 function 返回值是Fause,則不返回當前迭代的對象
最後,將所有滿足條件函數的迭代對象,保存在一個新的列表或迭代對象返回。
Python 3.x 返回迭代器
Python 2.x 返回列表。
6.map()函數:
map() 會根據提供的函數對指定序列做映射。
第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。
簡單來說,就是把後面那個可迭代對象一個一個放到function裏面去,記錄返回結果
map(function, iterable, …)
Python 2.x 返回列表。
Python 3.x 返回迭代器。
二、代碼解析
def subset(lst,target):
#i從1到2**len(lst)-1,一共執行2**n-1次
for i in range(1,2**len(lst)):
#得到一個列表
pick = list(mask(lst,bin(i)[2:]))
if sum(pick) == target:
#返回迭代器
yield pick
def mask(lst,m):
#m的值每次都不一樣:1的位置不同,1的個數不同,如:00001,00010,00100
#原字符串右對齊,左邊填充0
m = m.zfill(len(lst))
#filter()函數的作用:相當於m和lst取了一個與運算。我們把list中的每個元素看成是一個位子,lst = [-7,-3,-2,5,8]就有五個位子,
#分別與00001,00010等進行zip操作,會變成一個二個元素的元組的列表,如00001和lst進行zip:[(0,-7),(0,-3),(0,-2),(0,5),(1,8)]再進行過濾,對於元組的第二個元素是0的元組捨去,是1的保留,並且返回元組
#中的第一個數
#Python 3.x 返回迭代器
#Python 2.x 返回列表。
return map(lambda x: x[0],filter(lambda x: x[1] !="0",zip(lst,m)))
lst = [-7,-3,-2,5,8]
target = 0
k = subset(lst,target)
print(next(k))