一:filter函数(筛选)
filter()函数:
filter函数能够从可迭代对象(如字典、列表)中筛选某些元素,并生成一个新的迭代器。可迭代对象是一个可以被“遍历”的Python对象,也就是说,它将按顺序返回各元素,这样我们就可以在for循环中使用它。
语法是:
function是调用过滤规则的函数名,iterable是要过滤的迭代器对象,
filter(function, iterable)
filter函数的功能:
规则匹配,就为真。意思就是筛选匹配的数据。
例子一:
方法1:
def names_vowels(x):
if x[0].lower() in 'aeiou':
return x
creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie']
# creature_names这个列表会一个一个元素传递给names_vowels函数去处理,返回函数处理的值存入filtered_names,由于是creature_names是迭代器,因此存放到filtered_names,这个也是生成器器。可以使用__next__方法一个一个取。
filtered_names = filter(names_vowels, creature_names)
# 可以把filtered_names生成器器转化为列表的形式,生成器的本质其实也是迭代器,列表也是迭代器。
lst01 = list(filtered_names)
print(lst01)
结果:
['Ashley', 'Olly']
方法2:
# filter()中使用lambda函数的方法
creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie']
filtered_names = filter(lambda x: x[0].lower() in 'aeiou', creature_names)
print(list(filtered_names))
结果:
['Ashley', 'Olly']
例子二:
方法1:
lst02 = ["周芷若", "周星驰", "周润发", "刘德华","张伯通", "周杰伦", "周洋拉拉"]
# lst02中的每个元素,只要是以周开头的,就筛选出这个元素,并且以生成器的存放方式
l2 = filter(lambda x: x.startswith("周"), lst02)
print(list(l2))
结果:
['周芷若', '周星驰', '周润发', '周杰伦', '周洋拉拉']
方法2:
# filter()中使用lambda函数的方法
lst02 = ["周芷若", "周星驰", "周润发", "刘德华","张伯通", "周杰伦", "周洋拉拉"]
l2 = filter(lambda x: x.startswith("周"), lst02)
# l2是生成器,获取可以从通过__next__()方法来分批提取数据。
print(l2.__next__())
print(l2.__next__())
#由于上面取了二次元素,因此下面元素要从第三次,然后第三次以后所有的筛选出来的元素转换成列表
print(list(l2))
结果:
周芷若
周星驰
['周润发', '周杰伦', '周洋拉拉']
总结:
在filter()函数中,使用lambda函数得到的结果与使用常规函数得到的结果相同。如果所要过滤数据更复杂了,还可能要使用正则表达式,这可能会提高代码的可读性。
二:map函数(映射)
map函数
例子一:
# 使用 Python map 函数将字符串列表转换为整数列表:
list_of_strings = ["5","6","7","8","9", "10"]
result = map(int,list_of_strings)
print(list(result))
输出:
[5, 6, 7, 8, 9, 10]
--------------------------------------------------------------------------------------
语法:
map(insert function here, insert iterable here)
详解原理:
map() :
只是 Python map 函数的名称,没什么特别的。
insert function here:
是你将在函数中写入的空间。在上面的代码示例中,我们使用了 int 函数。我们可以使用另一个内置函数,如 len() ,或者我们可以构建自己的函数并在这里也使用它。
insert iterable here:
是你将在你选择的可迭代项目中写入的空间。在本例中,我们插入了列表(list_of_strings)。
result:
是我们存储新转换项目的变量。
让我们转到最后一行代码。同样,它将从内而外执行:
print(list(result))
list() 接收我们新转换的可迭代项,并告诉我们的计算机这些项是列表的一部分。
-----------------------------------------------------------------------------------------
例子二:
# 使用lambda函数
lst03 = [1, 2, 3, 4, 5, 6]
# 冒号前面的含义,比如 item: item * item,冒号前面item是迭代器lst03会一个一个这样传入,传入一个后,冒号后面item * item进行规则换算得出结果返回ls,ls这里是生成器,也是迭代器。
ls = map(lambda item: item * item, lst03)
result = list(ls)
#把上面的生成器以list的形式全部显示出来,否则就是一次取一个元素。
print(result)
结果:
[1, 4, 9, 16, 25, 36]
总结:
Python map 函数不是遍历字符串列表的每个元素,而是将整个字符串列表转换为数字列表。你节省了内存,并且代码运行得更快。
三:zip函数
zip() 函数
作用:
将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。我们可以使用 list() 转换来输出列表。
注意:
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
例子一:
dict_one = {'name': 'John', 'last_name': 'Doe', 'job': 'Python Consultant'}
dict_two = {'name': 'Jane', 'last_name': 'Doe', 'job': 'Community Manager'}
# 将某个字典的键值对合并为一个元组。
for (k1, v1), (k2, v2) in zip(dict_one.items(), dict_two.items()):
print(k1, '->', v1)
print(k2, '->', v2)
#结果:
name -> John
name -> Jane
last_name -> Doe
last_name -> Doe
job -> Python Consultant
job -> Community Manager
例子二:
total_sales = [52000.00, 51000.00, 48000.00]
prod_cost = [46800.00, 45900.00, 43200.00]
for sales, costs in zip(total_sales, prod_cost):
profit = sales - costs
print(f'Total profit: {profit}')
结果:
Total profit: 5200.0
Total profit: 5100.0
Total profit: 4800.0