一、 itertools模块
itertools是一个和迭代器相关的标准库,其中包含许多用来处理可迭代对像的工具函数
二、部分函数介绍
1、使用product()扁平化多层嵌套循环
题来了
list1 = [1, 2, 4, 5, 6, 3]
list2 = [1, 2, 4, 5]
list3 = [2, 4, 5]
求以上三个列表,寻找加一起是4的三个数
写法1:
number1 = [1, 2, 4, 5, 6, 3]
number2 = [1, 2, 4, 5]
number3 = [2, 4, 5]
for num1 in number1:
for num2 in number2:
for num3 in number3:
if num1 + num2 + num3 == 4:
print(f"{num1}+{num2}+{num3}={num1 + num2 + num3}")
输出:
1+1+2=4
三层for循环看起来有点脑瓜疼,试试下种
写法2:
from itertools import product
number1 = [1, 2, 4, 5, 6, 3]
number2 = [1, 2, 4, 5]
number3 = [2, 4, 5]
for num1, num2, num3 in product(number1, number2, number3):
if num1 + num2 + num3 == 4:
print(f"{num1}+{num2}+{num3}={num1 + num2 + num3}")
输出结果:
1+1+2=4
是不是更简洁呢
product()接收多个迭代对像,然后生成一个笛卡尔积,什么是笛卡尔积呢,其实我也没弄懂,我就作了个实验
from itertools import product number1 = [1,2] number2 = [2,3] print(list(product(number1,number2)))输出结果:[(1, 2), (1, 3), (2, 2), (2, 3)]
我理解就是把数组中的元素全部组合一次,然后出来一个全部组合
那如果他是个字典,组出来是什么样呢
number1 = {"key1": 1, "key2": 2} number2 = {"key1": 4, "key2": 5} print(list(product(number1, number2)))[('key1', 'key1'), ('key1', 'key2'), ('key2', 'key1'), ('key2', 'key2')]
三、使用islice()实现循环内隔行处理
有这样一个文本内容
jdflakfjalkfjakdlfj ------------------ fdsjalksfjak;sfja;lfj ------------------- fldsajflkasfj;ajf我想要除了“--------------------”以外的内容
写法一:
def get_userful_data():
with open("./file.txt", "r") as f:
for row_index, line in enumerate(f):
if row_index % 2 == 0:
yield line.strip()
if __name__ == '__main__':
result = get_userful_data()
while True:
try:
print(next(result))
except StopIteration:
break
输出:
jdflakfjalkfjakdlfj
fdsjalksfjak;sfja;lfj
fldsajflkasfj;ajf
方法二:islice(seq,start,end,step),我们只要设置step步长就行
def get_userful_data():
with open("./file.txt", "r") as f:
for line in islice(f,0,None,2):
yield line
if __name__ == '__main__':
result = get_userful_data()
while True:
try:
print(next(result))
except StopIteration:
break
输出:
jdflakfjalkfjakdlfj
fdsjalksfjak;sfja;lfj
fldsajflkasfj;ajf
四、用takewhile 代替break
names = ["leilei","huahua","mama","dongdong"]这是一个列表,如果名子等于mama就退出循环
1、写法一
def is_contain_mama(name):
return "mama" in name
def print_name_contain_mama(names):
for name in names:
if is_contain_mama(name):
break
print(name)
if __name__ == "__main__":
names = ["leilei", "huahua", "mama", "dongdong"]
print_name_contain_mama(names)
2、写法二:takewhile(prodicate,iterable)
takewhile(prodicate,iterable)
会在迭代第二个参数iterable的过程中,不断使用当前值调用prodicate函数,如果就继续下个迭代,如果是假就中止迭代
def is_contain_mama(name):
return "mama" not in name
def print_name_contain_mama(names):
for name in takewhile(is_contain_mama,names):
print(name)
if __name__ == "__main__":
names = ["leilei","huahua","mama","dongdong"]
print_name_contain_mama(names)