跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Python

Python 内置函数:enumerate()、eval()和 exec()

综述由AI生成系统介绍了 Python 内置函数 enumerate()、eval() 和 exec() 的基础用法与实际应用。enumerate() 用于遍历获取索引与值;eval() 执行字符串表达式并返回值;exec() 执行代码块语句。文章提供了数据处理、配置解析、动态模块加载等场景的代码示例,并重点强调了 eval() 和 exec() 的安全风险,建议使用受限命名空间、白名单函数或 ast.literal_eval 等替代方案以确保安全。

数字游民发布于 2026/3/22更新于 2026/5/512K 浏览
Python 内置函数:enumerate()、eval()和 exec()

一、enumerate():迭代计数的"索引器"

1.1 基础用法:为迭代对象添加计数

enumerate() 函数用于将一个可迭代对象(如列表、元组等)组合为一个索引序列,同时返回索引和对应的元素值。默认计数从 0 开始,但可通过 start 参数自定义起始值。

# 基本示例
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
print(list(enumerate(seasons)))
# 输出:[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

# 自定义起始值
print(list(enumerate(seasons, start=1)))
# 输出:[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

# 等价于手动实现
def enumerate(iterable, start=0):
    n = start
    for elem in iterable:
        yield n, elem
        n += 1
1.2 实际应用:遍历时获取索引和值
class DataProcessor:
    @staticmethod
    def process_with_index(data_list):
        """带索引处理数据"""
        processed = []
        for index, value in enumerate(data_list, start=1):
            processed.append(f"{index}: {value.upper()}")
        return processed

    @staticmethod
     ():
        
        positions = [index  index, value  (data)  value == target]
         positions


     ():
        
        batches = []
         batch_num, i  ((, (items), batch_size)):
            batch = items[i:i + batch_size]
            batches.append((batch_num + , batch))
         batches


processor = DataProcessor()

data = [, , ]
result = processor.process_with_index(data)
()


positions = processor.find_element_positions([, , , ], )
()


items = (())
batches = processor.batch_processing(items, batch_size=)
()
def
find_element_positions
data, target
"""查找元素所有出现的位置"""
for
in
enumerate
if
return
@staticmethod
def
batch_processing
items, batch_size=3
"""分批次处理数据并标记批次号"""
for
in
enumerate
range
0
len
1
return
# 使用示例
# 处理数据带索引
'apple'
'banana'
'cherry'
print
f"带索引处理:{result}"
# 查找元素位置
'a'
'b'
'a'
'c'
'a'
print
f"元素位置:{positions}"
# 分批次处理
list
range
10
3
print
f"分批次:{batches}"

二、eval():动态表达式求值的"计算器"

2.1 基础用法:执行字符串表达式

eval() 函数用于执行一个字符串表达式,并返回表达式的值。可以指定全局和局部命名空间来控制执行环境。

# 基本数学表达式
x = 1
result = eval('x + 1')
print(f"eval('x + 1') = {result}")
# 输出:2

# 使用自定义命名空间
globals_dict = {'x': 10, 'y': 20}
locals_dict = {'z': 30}
result = eval('x + y + z', globals_dict, locals_dict)
print(f"自定义命名空间:{result}")
# 输出:60

# 安全警告:避免执行用户输入
# eval("__import__('os').system('rm -rf /')") # 危险操作!
2.2 实际应用:配置解析和动态计算
class ExpressionEvaluator:
    def __init__(self):
        self.safe_globals = {'__builtins__': {}, 'abs': abs, 'max': max, 'min': min, 'sum': sum}

    def safe_eval(self, expression, variables=None):
        """安全求值,限制可用函数"""
        if variables:
            env = self.safe_globals.copy()
            env.update(variables)
        else:
            env = self.safe_globals
        try:
            return eval(expression, env)
        except Exception as e:
            return f"错误:{e}"

    def calculate_from_config(self, config_str, values):
        """从配置字符串计算值"""
        try:
            return eval(config_str, {'values': values})
        except:
            return None

# 使用示例
evaluator = ExpressionEvaluator()
# 安全求值
print(f"安全计算:{evaluator.safe_eval('2 * 3 + 4')}")
print(f"带变量计算:{evaluator.safe_eval('a + b', {'a': 5, 'b': 3})}")

# 配置解析
config = "sum(values) / len(values)"
result = evaluator.calculate_from_config(config, [1, 2, 3, 4, 5])
print(f"配置计算结果:{result}")

三、exec():动态代码执行的"解释器"

3.1 基础用法:执行 Python 代码块

exec() 函数用于动态执行 Python 代码(字符串或代码对象),适合执行语句而非表达式。返回值始终为 None。

# 执行简单代码
exec('x = 10; y = 20; z = x + y')
print(f"执行后 z = {z}")
# 输出:30

# 使用命名空间控制执行环境
my_globals = {}
my_locals = {}
exec('''
def greet(name):
    return f"Hello, {name}!"
result = greet("World")
''', my_globals, my_locals)
print(f"函数执行:{my_locals['result']}")
# 输出:Hello, World!

# 安全警告:exec() 可执行任意代码,需谨慎使用
3.2 实际应用:动态模块加载和插件系统
class DynamicCodeManager:
    def __init__(self):
        self.environment = {'__builtins__': {}}

    def execute_safely(self, code_string, allowed_globals=None):
        """安全执行代码,限制访问"""
        env = self.environment.copy()
        if allowed_globals:
            env.update(allowed_globals)
        try:
            exec(code_string, env)
            return env
        except Exception as e:
            print(f"执行错误:{e}")
            return None

    def create_dynamic_class(self, class_code):
        """动态创建类"""
        env = {}
        exec(class_code, env)
        # 返回第一个定义的类
        for obj in env.values():
            if isinstance(obj, type) and obj.__module__ == '__main__':
                return obj
        return None

# 使用示例
manager = DynamicCodeManager()
# 动态创建函数
code = '''
def calculate_area(radius):
    return 3.14159 * radius ** 2
area = calculate_area(5)
'''
result_env = manager.execute_safely(code)
if result_env:
    print(f"动态函数结果:{result_env.get('area')}")

# 动态创建类
class_code = '''
class DynamicCalculator:
    def add(self, a, b):
        return a + b
    def multiply(self, a, b):
        return a * b
'''
dynamic_class = manager.create_dynamic_class(class_code)
if dynamic_class:
    calc = dynamic_class()
    print(f"动态类方法:{calc.add(2, 3)}")

四、高级技巧与最佳实践

4.1 安全使用 eval() 和 exec()
class SecureEvaluator:
    def __init__(self):
        self.allowed_functions = {'abs': abs, 'len': len, 'max': max, 'min': min, 'round': round, 'sum': sum}
        self.safe_globals = {'__builtins__': None, **self.allowed_functions}

    def ultra_safe_eval(self, expression, variables=None):
        """超安全求值,仅允许白名单函数"""
        env = self.safe_globals.copy()
        if variables:
            env.update(variables)
        try:
            return eval(expression, env)
        except Exception as e:
            return f"安全错误:{e}"

    def validate_code(self, code_string):
        """简单代码验证"""
        forbidden = ['import', 'os.', 'sys.', '__', 'open(']
        return not any(keyword in code_string for keyword in forbidden)

# 使用示例
secure_eval = SecureEvaluator()
print(f"安全计算:{secure_eval.ultra_safe_eval('abs(-5)')}")
print(f"代码验证:{secure_eval.validate_code('import os')}")
# False
4.2 组合使用枚举和求值
def analyze_data_structure(data):
    """综合分析数据结构"""
    analysis = {}
    # 使用 enumerate 获取索引信息
    if isinstance(data, (list, tuple)):
        analysis['indexed_items'] = list(enumerate(data))
        analysis['length'] = len(data)
    # 使用 eval 动态分析(安全范围内)
    safe_globals = {'data': data, 'len': len}
    try:
        analysis['size_info'] = eval('len(data)', safe_globals)
    except:
        analysis['size_info'] = '无法计算'
    return analysis

# 测试
sample_data = ['a', 'b', 'c']
result = analyze_data_structure(sample_data)
print(f"分析结果:{result}")

五、总结与实用建议

通过整理,我们系统了解了三个重要的内置函数:

  1. enumerate() - 迭代计数的索引器
  2. eval() - 动态表达式求值的计算器
  3. exec() - 动态代码执行的解释器

关键知识点总结:

  • enumerate(iterable, start=0) 返回 (索引,元素) 元组序列
  • eval(expression) 执行表达式并返回值,exec(code) 执行代码块返回 None
  • 两者都支持全局和局部命名空间参数

安全使用建议:

  1. 绝对避免直接执行用户输入:eval() 和 exec() 可执行任意代码,存在安全风险
  2. 使用限制环境:通过自定义 globals 参数控制可访问的函数和变量
  3. 优先考虑替代方案:如 ast.literal_eval() 用于安全求值字面量
  4. 明确需求区别:表达式求值用 eval(),代码块执行用 exec()

实用场景推荐:

  • enumerate():遍历需要索引的场景(如日志记录、批量处理)
  • eval():数学表达式计算、简单配置解析
  • exec():插件系统、动态代码生成

进阶学习方向:

  • 深入学习 Python 的 ast 模块进行代码分析
  • 研究命名空间和作用域的工作原理
  • 了解代码对象(code object)和编译过程

目录

  1. 一、enumerate():迭代计数的"索引器"
  2. 1.1 基础用法:为迭代对象添加计数
  3. 基本示例
  4. 输出:[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
  5. 自定义起始值
  6. 输出:[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
  7. 等价于手动实现
  8. 1.2 实际应用:遍历时获取索引和值
  9. 使用示例
  10. 处理数据带索引
  11. 查找元素位置
  12. 分批次处理
  13. 二、eval():动态表达式求值的"计算器"
  14. 2.1 基础用法:执行字符串表达式
  15. 基本数学表达式
  16. 输出:2
  17. 使用自定义命名空间
  18. 输出:60
  19. 安全警告:避免执行用户输入
  20. eval("import('os').system('rm -rf /')") # 危险操作!
  21. 2.2 实际应用:配置解析和动态计算
  22. 使用示例
  23. 安全求值
  24. 配置解析
  25. 三、exec():动态代码执行的"解释器"
  26. 3.1 基础用法:执行 Python 代码块
  27. 执行简单代码
  28. 输出:30
  29. 使用命名空间控制执行环境
  30. 输出:Hello, World!
  31. 安全警告:exec() 可执行任意代码,需谨慎使用
  32. 3.2 实际应用:动态模块加载和插件系统
  33. 使用示例
  34. 动态创建函数
  35. 动态创建类
  36. 四、高级技巧与最佳实践
  37. 4.1 安全使用 eval() 和 exec()
  38. 使用示例
  39. False
  40. 4.2 组合使用枚举和求值
  41. 测试
  42. 五、总结与实用建议
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Eino Embedding 组件核心用法与场景解析
  • Stable Diffusion 秋叶整合包本地部署与使用指南
  • AI 提示词助力代码重构与可读性提升
  • Spring Boot 实现三模安全登录:微信扫码 + 手机 + 邮箱验证码
  • Spark DataFusion Comet 向量化:Rust Native ScanExec 与 Selection Vectors
  • ChatGPT 使用教程:常用功能与技巧
  • 动态规划:买卖股票的最佳时机 I、II、III 详解
  • CISP 核心知识点思维导图汇总:应急响应、安全攻击与防护等
  • Whisper 音频转录工具使用指南
  • macOS 本地部署 Llama3:Ollama 与 Enchanted 实战指南
  • GLM-4.6V-Flash-WEB:单卡运行与双环境部署实践
  • 最大流与最小割算法详解:Dinic 算法实现与优化
  • AI 基建:Evomap 集成方案与 GEP 协议实践
  • AI Skills:前端新的效率神器
  • Git 工作流程详解:从核心概念到场景化选择
  • Stable Diffusion 视觉提示词注入攻击原理与实现
  • 数据库事务隔离级别与 Spring 传播行为深度解析
  • 大语言模型(LLM)微调方法总结
  • Python 正则表达式与网络爬虫实战练习
  • 吴恩达:提升大模型能力的四个关键步骤

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online