首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA函数之旅-filter函数

  • 25-03-03 04:23
  • 3889
  • 8263
blog.csdn.net

目录

一、filter函数的常见应用场景:     

二、filter函数的使用注意事项:

1、filter函数:

1-1、Python:

1-2、VBA:

2、相关文章:

个人主页:非风V非雨-CSDN博客


一、filter函数的常见应用场景:     

        filter函数在Python中有多种实际应用场景,它通常用于从可迭代对象中筛选出满足特定条件的元素。以下是一些具体的应用示例:

1、筛选数字:筛选出一个列表中的所有偶数或奇数。

2、筛选字符串:从字符串列表中筛选出特定长度的字符串。

3、筛选文件:在处理文件或目录时,筛选出特定类型的文件。

4、筛选对象属性:从对象列表中筛选出具有特定属性的对象。

5、筛选字典中的项:从字典中筛选出满足条件的键值对。

6、数据清洗:在处理数据集时,可以使用filter()来清洗数据,去除不符合条件的数据点。

        这些只是filter()函数的一些常见应用场景,实际上它可以用于任何需要从可迭代对象中筛选出特定元素的情况。需要注意的是,由于filter()返回的是迭代器,如果需要多次访问筛选后的结果,或者需要将其与其他Python数据结构(如列表)进行交互,通常需要将迭代器转换为列表或其他类型。

二、filter函数的使用注意事项:

        在Python中使用filter()函数时,下列注意事项需要牢记:

1、输入类型:filter()函数的第一个参数是一个函数,第二个参数是一个可迭代对象(如列表、元组、字符串等),确保传递给filter()的第二个参数是一个可迭代对象,否则会出现类型错误。

2、函数返回值:传递给filter()的函数应该返回一个布尔值(`True`或`False`)。filter()会基于这个返回值来决定是否将元素包含在返回的迭代器中,如果函数返回非布尔值,将会导致不可预期的结果。

3、迭代器的使用:filter()函数返回的是一个迭代器,而不是列表或其他类型的可迭代对象。如果需要列表,你需要将迭代器转换为列表,例如使用list()函数。

4、性能考虑:对于大型数据集,使用filter()可能会比使用列表推导式(list comprehension)稍慢一些,因为列表推导式可以一次性构建结果列表,而filter()需要逐个元素进行过滤。在性能敏感的代码中,可能需要考虑使用其他方法。

5、可读性:虽然filter()函数在某些情况下可以使代码更简洁,但有时候使用列表推导式可能更直观和易读。选择哪种方法取决于具体的场景和个人的编码风格。

6、Python版本差异:在Python 2中,filter()函数直接返回列表,而在Python 3中返回的是迭代器。如果你在Python 2和Python 3之间迁移代码,需要注意这个差异。

7、空迭代器的处理:如果传递给filter()的可迭代对象是空的,或者过滤条件不满足任何元素,那么返回的迭代器将为空。在迭代或使用返回的迭代器之前,你可能需要检查它是否为空。

8、函数定义的位置:如果传递给filter()的函数是在filter()调用之后才定义的,那么将会引发一个`NameError`,因为Python在运行时需要知道这个函数的定义。确保在调用filter()之前已经定义了函数。

        只有遵循这些注意事项,你才能更有效地使用filter()函数来处理数据。然而,在很多情况下,使用列表推导式或其他Python特性可能更加灵活和直观。因此,在选择使用filter()之前,最好先评估一下其他选项是否更适合你的需求。

1、filter函数:
1-1、Python:
  1. # 1.函数:filter
  2. # 2.功能:用于过滤可迭代对象中不符合条件的元素,即通过指定条件过滤序列
  3. # 3.语法:filter(function, iterable)
  4. # 4.参数:
  5. # 4-1. function:用于实现判断的函数,可以为None
  6. # 4-2. iterable:可迭代对象,如列表、range对象等
  7. # 5.返回值:返回一个由符合条件的元素组成的新迭代器
  8. # 6.说明:
  9. # 7.示例:
  10. # 应用1:筛选数字
  11. def is_even(num):
  12. return num % 2 == 0
  13. even_numbers = filter(is_even, range(100))
  14. print(even_numbers)
  15. print(list(even_numbers))
  16. #
  17. # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
  18. # 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
  19. # 应用2:筛选字符串
  20. def is_length_three(s):
  21. return len(s) <= 5
  22. words = ['Myelsa', 'Jimmy', 'Lucy', 'Bob', 'Bruce']
  23. three_letter_words = list(filter(is_length_three, words))
  24. print(three_letter_words)
  25. # ['Jimmy', 'Lucy', 'Bob', 'Bruce']
  26. # 应用3:筛选文件
  27. import os
  28. def is_image_file(filename):
  29. return filename.endswith(('.png', '.jpg', '.jpeg', '.gif'))
  30. files = os.listdir(os.getcwd())
  31. image_files = list(filter(is_image_file, files))
  32. print(image_files)
  33. # ['input.jpg', 'output.jpg']
  34. # 应用4:筛选对象属性
  35. class Person:
  36. def __init__(self, name, age):
  37. self.name = name
  38. self.age = age
  39. def is_adult(person):
  40. return person.age >= 18
  41. people = [Person('Myelsa', 43), Person('Bruce', 6), Person('Jimmy', 15)]
  42. adults = list(filter(is_adult, people))
  43. for adult in adults:
  44. print(adult.name)
  45. # Myelsa
  46. # 应用5:筛选字典中的项
  47. def filter_dict_items(dictionary, condition):
  48. return {k: v for k, v in dictionary.items() if condition(k, v)}
  49. data = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
  50. filtered_data = filter_dict_items(data, lambda k, v: v > 2)
  51. print(filtered_data)
  52. # {'c': 3, 'd': 4}
  53. # 应用6:清洗数据
  54. data = [1, 2, None, 4, 5, '', 6]
  55. def is_valid(item):
  56. return item is not None and item != ''
  57. cleaned_data = list(filter(is_valid, data))
  58. print(cleaned_data)
  59. # [1, 2, 4, 5, 6]
  60. # 其他应用
  61. # 在Python中,filter()函数的高阶用法通常涉及到与其他高阶函数(如`map()`、`reduce()`)或函数式编程特性的结合,
  62. # 以及使用lambda表达式来定义匿名函数作为过滤条件。以下是一些filter()函数的高阶用法示例:
  63. # 结合Lambda表达式
  64. # Lambda表达式是一种创建匿名函数的简单方式,经常与filter()一起使用来定义过滤条件
  65. numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  66. # 使用lambda表达式筛选偶数
  67. even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
  68. print(even_numbers)
  69. # 链式过滤
  70. # 你可以通过组合多个filter()函数来实现链式过滤,即一个过滤器的输出作为另一个过滤器的输入
  71. # 假设有一个数字列表,先筛选出偶数,再从中筛选出大于5的数
  72. numbers = [1, 2, 3, 4, 6, 7, 8, 9, 10]
  73. # 链式过滤:先筛选偶数,再筛选大于5的数
  74. filtered_numbers = list(filter(lambda x: x > 5, filter(lambda x: x % 2 == 0, numbers)))
  75. print(filtered_numbers)
  76. # 与生成器表达式结合
  77. # 生成器表达式是另一种创建迭代器的方式,它们可以与filter()结合使用,以更简洁的方式表达过滤逻辑
  78. numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  79. # 使用生成器表达式筛选偶数,并与filter结果比较
  80. even_numbers_gen = (x for x in numbers if x % 2 == 0)
  81. even_numbers_filter = filter(lambda x: x % 2 == 0, numbers)
  82. # 二者结果相同,但生成器表达式语法更简洁
  83. print(list(even_numbers_gen))
  84. print(list(even_numbers_filter))
  85. # 自定义过滤函数
  86. # 除了使用lambda表达式,你还可以定义自己的过滤函数,并在filter()中使用它
  87. def is_prime(n):
  88. if n < 2:
  89. return False
  90. for i in range(2, int(n ** 0.5) + 1):
  91. if n % i == 0:
  92. return False
  93. return True
  94. numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  95. # 使用自定义的is_prime函数筛选质数
  96. primes = list(filter(is_prime, numbers))
  97. print(primes)
  98. # 与其他高阶函数结合
  99. # filter()函数经常与其他高阶函数(如`map()`、`reduce()`)一起使用,以在数据管道中执行一系列的转换和过滤操作
  100. from functools import reduce
  101. numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  102. # 首先使用map()将每个数平方,然后使用filter()筛选大于20的数,最后使用reduce()求和
  103. squared_numbers = map(lambda x: x ** 2, numbers)
  104. filtered_squared_numbers = filter(lambda x: x > 20, squared_numbers)
  105. sum_of_filtered = reduce(lambda x, y: x + y, filtered_squared_numbers, 0)
  106. print(sum_of_filtered) # 输出: 105 (即5^2 + 6^2 + 7^2 + 8^2 + 9^2 + 10^2)
1-2、VBA:
略,待后补。
2、相关文章:

2-1、Python-VBA函数之旅-bytes()函数 

2-2、Python-VBA函数之旅-callable()函数

Python算法之旅:Algorithm

Python函数之旅:Functions 

个人主页:https://blog.csdn.net/ygb_1024?spm=1010.2135.3001.5421 

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览61139 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://myelsa1024.blog.csdn.net/article/details/137853352"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top