Python 四大内置函数:filter()、float()、format()、frozenset()

Python 四大内置函数:filter()、float()、format()、frozenset()

一、filter():数据过滤的"智能筛子"

1.1 基础用法:基于条件过滤元素

filter()函数使用指定函数来过滤可迭代对象中的元素,只保留函数返回真值的元素。

# 基础过滤示例 numbers =[1,2,3,4,5,6,7,8,9,10]# 过滤偶数 even_numbers =list(filter(lambda x: x %2==0, numbers))print(f"偶数: {even_numbers}")# 输出: [2, 4, 6, 8, 10]# 过滤None值 mixed_data =[0,1,False,True,None,"hello","",3.14] truthy_values =list(filter(None, mixed_data))print(f"真值元素: {truthy_values}")# 输出: [1, True, 'hello', 3.14]# 等价生成器表达式# filter(function, iterable) 相当于:# (item for item in iterable if function(item)) # 当function不是None时# (item for item in iterable if item) # 当function是None时

1.2 实际应用:数据清洗和验证

classDataCleaner:@staticmethoddefremove_outliers(data, threshold_func):"""移除异常值"""returnlist(filter(threshold_func, data))@staticmethoddefvalidate_emails(email_list):"""验证邮箱格式(简单版本)"""defis_valid_email(email):returnisinstance(email,str)and'@'in email and'.'in email.split('@')[-1]returnlist(filter(is_valid_email, email_list))@staticmethoddeffilter_by_type(data, target_type):"""按类型过滤数据"""returnlist(filter(lambda x:isinstance(x, target_type), data))# 使用示例 cleaner = DataCleaner()# 移除数值异常值 numbers =[10,15,100,12,8,200,14] normal_numbers = cleaner.remove_outliers(numbers,lambda x: x <50)print(f"正常数值: {normal_numbers}")# 邮箱验证 emails =["[email protected]","invalid","test@domain","[email protected]"] valid_emails = cleaner.validate_emails(emails)print(f"有效邮箱: {valid_emails}")# 类型过滤 mixed_data =[1,"hello",3.14,[1,2],"world",42] strings_only = cleaner.filter_by_type(mixed_data,str)print(f"仅字符串: {strings_only}")

二、float():数值转换的"精确天平"

2.1 基础用法:创建浮点数

float()函数从数字或字符串创建浮点数,支持多种输入格式。

# 从数字创建print(f"从整数创建: {float(42)}")# 输出: 42.0print(f"从浮点数创建: {float(3.14)}")# 输出: 3.14# 从字符串创建print(f"带符号字符串: {float('+1.23')}")# 输出: 1.23print(f"带空格字符串: {float(' -12345\\n')}")# 输出: -12345.0print(f"科学计数法: {float('1e-003')}")# 输出: 0.001print(f"大写科学计数法: {float('+1E6')}")# 输出: 1000000.0print(f"无穷大: {float('-Infinity')}")# 输出: -inf# 特殊值print(f"NaN: {float('nan')}")# 输出: nanprint(f"无穷大: {float('inf')}")# 输出: inf# 无参数调用print(f"无参数: {float()}")# 输出: 0.0

2.2 实际应用:安全数值转换和数据处理

classSafeFloatConverter:@staticmethoddefsafe_float_conversion(value, default=0.0):"""安全转换为浮点数"""try:returnfloat(value)except(ValueError, TypeError):return default @staticmethoddefparse_numeric_strings(string_list):"""从字符串列表中解析数值"""deftry_convert(s):try:returnfloat(s)except(ValueError, TypeError):returnNone converted =filter(lambda x: x isnotNone,map(try_convert, string_list))returnlist(converted)@staticmethoddefvalidate_float_range(value, min_val=None, max_val=None):"""验证浮点数范围"""try: num =float(value)if min_val isnotNoneand num < min_val:returnFalseif max_val isnotNoneand num > max_val:returnFalsereturnTrueexcept(ValueError, TypeError):returnFalse# 使用示例 converter = SafeFloatConverter()# 安全转换 test_values =["3.14","invalid","99.9",None,"1e2"] safe_results =[converter.safe_float_conversion(v)for v in test_values]print(f"安全转换结果: {safe_results}")# 数值字符串解析 numeric_strings =["123","45.67","1e-3","not_a_number","-999"] parsed_numbers = converter.parse_numeric_strings(numeric_strings)print(f"解析后的数值: {parsed_numbers}")# 范围验证 values_to_check =[10,"25.5","1000","-5","invalid"]for val in values_to_check: is_valid = converter.validate_float_range(val, min_val=0, max_val=100)print(f"{val} 在0-100范围内: {is_valid}")

三、format():字符串格式化的"魔术师"

3.1 基础用法:值格式化

format()函数将值转换为格式化字符串,支持丰富的格式化选项。

# 基本格式化print(f"整数格式化: {format(12345,',')}")# 输出: 12,345print(f"浮点数格式化: {format(3.14159,'.2f')}")# 输出: 3.14print(f"百分比格式化: {format(0.256,'.1%')}")# 输出: 25.6%# 对齐和填充print(f"右对齐: {format('hello','>10')}")# 输出: ' hello'print(f"左对齐: {format('world','<10')}")# 输出: 'world 'print(f"居中对齐: {format('test','^10')}")# 输出: ' test 'print(f"零填充: {format(42,'05d')}")# 输出: 00042# 数字格式化print(f"十六进制: {format(255,'x')}")# 输出: ffprint(f"八进制: {format(64,'o')}")# 输出: 100print(f"二进制: {format(10,'b')}")# 输出: 1010# 与str()的比较 value =3.1415926print(f"str()版本: {str(value)}")# 输出: 3.1415926print(f"format()版本: {format(value,'.3f')}")# 输出: 3.142

3.2 实际应用:自定义格式化和报表生成

classReportFormatter:@staticmethoddefformat_currency(amount, currency_symbol='¥'):"""格式化货币金额"""returnformat(amount,f'{currency_symbol},.2f')@staticmethoddefformat_percentage_data(values):"""格式化百分比数据"""return[format(val,'.2%')for val in values]@staticmethoddefcreate_aligned_table(data, column_widths):"""创建对齐的表格数据""" formatted_rows =[]for row in data: formatted_cells =[]for i, cell inenumerate(row): width = column_widths[i]# 根据内容类型选择格式化方式ifisinstance(cell,(int,float)): formatted =format(cell,f'>{width}')else: formatted =format(str(cell),f'<{width}') formatted_cells.append(formatted) formatted_rows.append(' '.join(formatted_cells))return formatted_rows @staticmethoddefformat_scientific_data(numbers, precision=3):"""格式化科学数据"""return[format(num,f'.{precision}e')for num in numbers]# 使用示例 formatter = ReportFormatter()# 货币格式化 amounts =[1234.56,7890.12,45.67,1000000] currency_formatted =[formatter.format_currency(amt)for amt in amounts]print(f"货币格式化: {currency_formatted}")# 百分比数据 percentages =[0.1234,0.5678,0.9876] percent_formatted = formatter.format_percentage_data(percentages)print(f"百分比格式化: {percent_formatted}")# 表格对齐 table_data =[["产品","销量","增长率"],["手机",1500,0.25],["电脑",800,0.15],["平板",1200,0.30]] aligned_table = formatter.create_aligned_table(table_data,[10,8,10])print("对齐表格:")for row in aligned_table:print(row)# 科学数据 scientific_data =[1234567,0.000123,987654321] sci_formatted = formatter.format_scientific_data(scientific_data)print(f"科学计数法: {sci_formatted}")

四、frozenset():不可变集合的"保险箱"

4.1 基础用法:创建不可变集合

frozenset()函数创建不可变的集合对象,适合作为字典键或集合元素。

# 从可迭代对象创建 fset1 =frozenset([1,2,3,4,5])print(f"从列表创建: {fset1}")# 输出: frozenset({1, 2, 3, 4, 5})# 从字符串创建 fset2 =frozenset("hello")print(f"从字符串创建: {fset2}")# 输出: frozenset({'h', 'e', 'l', 'o'})# 从范围创建 fset3 =frozenset(range(5))print(f"从范围创建: {fset3}")# 输出: frozenset({0, 1, 2, 3, 4})# 空集合 empty_fset =frozenset()print(f"空集合: {empty_fset}")# 输出: frozenset()# 作为字典键 dict_with_frozenset ={frozenset([1,2,3]):"集合1",frozenset([4,5,6]):"集合2"}print(f"字典键示例: {dict_with_frozenset}")

4.2 实际应用:数据去重和集合运算

classSetOperations:@staticmethoddefcreate_immutable_lookup_table(data_list):"""创建不可变查找表""" unique_items =frozenset(data_list)return{item: index for index, item inenumerate(unique_items)}@staticmethoddeffind_common_elements(*sequences):"""查找多个序列的共同元素"""ifnot sequences:returnfrozenset()# 将所有序列转换为frozenset并求交集 sets =[frozenset(seq)for seq in sequences] common = sets[0]for s in sets[1:]: common = common.intersection(s)return common @staticmethoddefcreate_immutable_config(config_dict):"""创建不可变配置""" frozen_config ={}for key, value in config_dict.items():ifisinstance(value,(list,set)): frozen_config[key]=frozenset(value)else: frozen_config[key]= value return frozen_config @staticmethoddefset_operations_example():"""集合运算示例""" A =frozenset([1,2,3,4,5]) B =frozenset([4,5,6,7,8])print(f"集合A: {A}")print(f"集合B: {B}")print(f"并集: {A.union(B)}")print(f"交集: {A.intersection(B)}")print(f"差集(A-B): {A.difference(B)}")print(f"对称差集: {A.symmetric_difference(B)}")# 使用示例 operations = SetOperations()# 创建查找表 data =["apple","banana","apple","cherry","banana"] lookup_table = operations.create_immutable_lookup_table(data)print(f"查找表: {lookup_table}")# 查找共同元素 list1 =[1,2,3,4,5] list2 =[3,4,5,6,7] list3 =[5,6,7,8,9] common = operations.find_common_elements(list1, list2, list3)print(f"共同元素: {common}")# 不可变配置 config ={"allowed_users":["user1","user2","user3"],"permissions":{"read","write"},"max_connections":100} frozen_config = operations.create_immutable_config(config)print(f"不可变配置: {frozen_config}")# 集合运算演示 operations.set_operations_example()

五、版本变更与兼容性说明

5.1 各函数的版本演进

filter()函数

  • 始终是Python的核心内置函数
  • 在Python 3中返回迭代器(Python 2中返回列表)

float()函数的版本变更

# 3.6版本:支持数字分组下划线print(f"分组数字: {float('1_000_000.5')}")# 输出: 1000000.5# 3.7版本:参数变为仅限位置形参# float(number=0.0) -> 现在必须使用位置参数# 3.8版本:__float__()未定义时回退至__index__()classCustomNumber:def__index__(self):return42 custom_num = CustomNumber()print(f"回退转换: {float(custom_num)}")# 输出: 42.0

format()函数的版本变更

# 3.4版本:当format_spec不是空字符串时,object().__format__(format_spec)会触发TypeErrortry: result =object().__format__('s')print(f"对象格式化: {result}")except TypeError as e:print(f"格式化错误: {e}")

frozenset()函数

  • 从Python 2.4开始引入
  • 始终保持稳定的API

六、最佳实践与实用技巧

6.1 安全使用建议

classBestPractices:@staticmethoddefsafe_data_processing():"""安全数据处理示例"""# 1. filter()与异常处理结合defsafe_filter_function(func, iterable):defwrapper(item):try:return func(item)except Exception:returnFalsereturnfilter(wrapper, iterable)# 2. float()转换的最佳实践defrobust_float_conversion(value):"""健壮的浮点数转换"""if value isNone:return0.0try:returnfloat(value)except(ValueError, TypeError):# 尝试清理字符串ifisinstance(value,str): cleaned = value.strip()# 移除货币符号等非数字字符import re cleaned = re.sub(r'[^\d.-]','', cleaned)try:returnfloat(cleaned)except ValueError:passreturn0.0# 3. format()的类型检查defsafe_format(value, format_spec):"""安全的格式化函数"""try:returnformat(value, format_spec)except(ValueError, TypeError):returnstr(value)return{'safe_filter': safe_filter_function,'robust_float': robust_float_conversion,'safe_format': safe_format }# 使用示例 practices = BestPractices() tools = practices.safe_data_processing()# 测试安全过滤 data =[1,2,"3","invalid",5] safe_result =list(tools['safe_filter'](lambda x: x >2, data))print(f"安全过滤结果: {safe_result}")# 测试健壮转换 test_values =["123.45","$99.99","1,000.50","invalid"] converted =[tools['robust_float'](v)for v in test_values]print(f"健壮转换结果: {converted}")# 测试安全格式化 format_test =[1000,"hello",3.14159] formatted =[tools['safe_format'](v,',.2f')for v in format_test]print(f"安全格式化: {formatted}")

6.2 性能优化技巧

defperformance_tips():"""性能优化建议"""# 1. 使用filter()代替列表推导式(当处理大数据时) large_data =range(1000000)# 更高效的方式(惰性求值) filtered_data =filter(lambda x: x %2==0, large_data)# 2. 避免不必要的float()调用defefficient_numeric_processing(numbers):# 先检查类型,避免不必要的转换 processed =[]for num in numbers:ifisinstance(num,(int,float)): processed.append(num *1.1)# 直接运算else:try: processed.append(float(num)*1.1)except ValueError: processed.append(0.0)return processed # 3. frozenset()用于快速查找 large_set =frozenset(range(1000000))# 查找操作非常快速print(f"查找性能测试: {999999in large_set}")return"性能优化技巧演示完成" performance_tips()

七、总结与实用建议

通过本文的详细解析,我们深入了解了四个重要的Python内置函数:

  1. filter() - 数据过滤的智能筛子
  2. float() - 数值转换的精确天平
  3. format() - 字符串格式化的魔术师
  4. frozenset() - 不可变集合的保险箱

关键知识点总结:

  • filter(func, iterable)惰性过滤元素,支持None函数
  • float(x)从数字或字符串创建浮点数,支持科学计数法
  • format(value, spec)灵活格式化值,支持对齐、精度等选项
  • frozenset(iterable)创建不可变集合,适合作为字典键

版本兼容性提醒:

  • 注意float()在3.7+版本中变为仅限位置参数
  • format()在3.4+版本中对空对象有更严格的错误处理
  • 使用数字分组下划线需要Python 3.6+

实用场景推荐:

  • filter():数据清洗、条件过滤、异常值处理
  • float():用户输入处理、科学计算、数据转换
  • format():报表生成、数据展示、国际化格式化
  • frozenset():配置管理、查找表、集合运算

安全使用建议:

  1. 始终验证输入:特别是在使用float()转换用户输入时
  2. 使用异常处理:包装filter()和float()调用
  3. 选择合适的数据结构:需要不可变性时使用frozenset()
  4. 考虑性能影响:大数据集使用filter()的惰性求值特性

进阶学习方向:

  • 深入学习functools模块的函数式编程工具
  • 研究decimal模块进行精确小数计算
  • 探索collections模块的更多数据结构
  • 了解格式化字符串字面值(f-string)的使用

这些内置函数是Python编程的基础工具,掌握它们的特性和最佳实践将显著提升代码质量和开发效率。

Read more

【数据结构与算法】环与相遇:链表带环问题的底层逻辑与工程实现

【数据结构与算法】环与相遇:链表带环问题的底层逻辑与工程实现

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人等方向学习者 ❄️个人专栏:《C语言》《【初阶】数据结构与算法》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、带环链表 * 1.1题目 * 1.2 算法原理 * 1.3 代码 * 1.4 数学证明 * 1.4.1 为什么带环slow与fast必定能相遇? * 1.4.2 fast一定只能走2步吗?可以是2步甚至更多吗? * 1.4.2.1 以3步为例 * 1.4.3结论 * 二、环形链表(寻找相遇点) * 2.1 题目

By Ne0inhk

Python金融数据获取终极指南:告别繁琐,5分钟掌握专业级数据源

Python金融数据获取终极指南:告别繁琐,5分钟掌握专业级数据源 【免费下载链接】mootdx通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 还在为金融数据获取而苦恼吗?面对复杂的行情接口、繁琐的数据格式转换,很多数据分析师和量化交易爱好者都感到力不从心。今天,我将为你揭秘一个强大的Python工具——mootdx,它能让你轻松获取通达信金融数据,为你的投资分析提供坚实的数据支撑。 🎯 你的数据获取痛点,我们懂! 数据获取的三大难题: * 接口复杂难上手:传统行情接口学习成本高,文档晦涩 * 数据格式不统一:不同来源的数据格式各异,转换工作繁琐 * 更新维护成本高:数据源不稳定,需要频繁调整和维护 mootdx正是为解决这些痛点而生,它提供了: * 📊 一站式数据解决方案:从历史数据到实时行情,全面覆盖 * 🔄 智能连接优化:自动选择最佳服务器,确保数据稳定获取 * 💡 开发体验升级:简洁的API设计,让数据获取变得简单高效 🚀 快速上手:5分钟开启数据

By Ne0inhk
Python Anaconda 换源: 设置清华源

Python Anaconda 换源: 设置清华源

为 Anaconda 设置清华源可以极大地提升软件包下载和更新的速度。以下是详细的步骤,分为两个主要部分:为 conda 本身设置频道镜像和为 pip 设置索引镜像。 方法一:通过命令行快速设置(推荐) 这是最快捷的方法,通过执行几条命令即可完成。 1. 打开终端(Windows 用 Anaconda Prompt, Mac/Linux 用 Terminal)。 验证配置: 执行以下命令查看当前的配置,确认 channels 里已经都是清华源的地址。 conda config --show channels (可选但推荐)移除默认的官方频道: 为了避免 conda 在官方源和清华源之间来回切换,可以移除默认的 defaults 频道。 conda config --remove channels defaults 设置搜索时显示频道地址: conda config

By Ne0inhk

Python 进阶爬虫:解析知识星球 API

一、知识星球 API 核心原理与接口分析 知识星球的前端页面采用动态加载技术(JavaScript 渲染),所有内容数据均通过后端 API 接口以 JSON 格式返回,前端再将数据渲染为可视化页面。因此,API 爬虫的核心逻辑是模拟前端请求,直接调用 API 接口获取原始 JSON 数据,而非解析 HTML 页面。 1.1 API 接口基础架构 知识星球的 API 接口遵循 RESTful 设计规范,核心请求域名为<font>https://api.zsxq.com</font>,所有接口均通过 HTTPS 协议传输,确保数据安全性。接口主要分为三大类: * 认证类接口:

By Ne0inhk