python 函数内使用 exec() 的注意事项

在用jupyter notebook使用exec()的时候,遇到神奇的问题,如下:

(exec(str)函数就是将里面的字符串当做语句执行,类似于c里面的define,其中一个坑可以参见

点击打开链接http://www.cnblogs.com/rim99/p/6980120.html)

另外一个坑:

抛出问题:(写了很丑的函数)


预期是Survived_0,Survived_1应该都可以打印出来,但是却报错,说没有Survived_0这个变量,a,b语句明明都打印出来,为什么没有?

<think>我们正在讨论Python内置函数使用技巧和最佳实践。根据引用[2],Python内置函数是解释器预装的核心工具集,无需导入即可使用,覆盖数据类型转换、数学运算、迭代处理、对象操作等关键领域。熟练使用内置函数能减少30%以上的代码量。下面我将介绍一些常用内置函数使用技巧和最佳实践。 1. **map()和filter()与列表推导式的选择** - 在Python中,`map()`和`filter()`函数可以实现对可迭代对象的转换和过滤。但列表推导式通常更简洁和易读。 - 例如,将列表中的每个元素平方: ```python # 使用map nums = [1, 2, 3] squared = list(map(lambda x: x**2, nums)) # 使用列表推导式 squared = [x**2 for x in nums] ``` 推荐使用列表推导式,因为它更清晰。 2. **enumerate()同时获取索引和值** - 在遍历列表时,如果需要索引,可以使用`enumerate()`代替`range(len(list))`。 ```python fruits = ['apple', 'banana', 'cherry'] for index, fruit in enumerate(fruits): print(index, fruit) ``` 这样更简洁,且可避免使用`range`和索引访问。 3. **zip()并行迭代多个序列** - 当需要同时遍历多个列表时,`zip()`可以将多个可迭代对象打包成元组序列。 ```python names = ['Alice', 'Bob', 'Charlie'] ages = [25, 30, 35] for name, age in zip(names, ages): print(f"{name} is {age} years old") ``` 4. **sorted()与key参数的高级排序** - `sorted()`可以对列表进行排序,通过`key`参数可以指定排序依据。 ```python # 按字符串长度排序 words = ['apple', 'fig', 'banana'] sorted_words = sorted(words, key=len) # 按字典的值排序 scores = {'Alice': 85, 'Bob': 72, 'Charlie': 90} sorted_scores = sorted(scores.items(), key=lambda x: x[1]) ``` 5. **any()和all()进行条件判断** - `any(iterable)`:如果可迭代对象中任意元素为真,则返回True。 - `all(iterable)`:如果可迭代对象中所有元素为真,则返回True。 ```python numbers = [1, 0, 3] print(any(numbers)) # True,因为存在非零元素 print(all(numbers)) # False,因为0为False ``` 6. **使用get()避免字典键错误** - 访问字典时,如果键不存在,使用`dict[key]`会引发KeyError。使用`get(key, default)`可以避免。 ```python d = {'a': 1, 'b': 2} value = d.get('c', 0) # 键'c'不存在,返回0 ``` 7. **利用functools.partial创建偏函数** - 虽然`functools.partial`不是内置函数,但它是标准库中常用的工具函数,用于固定原函数的部分参数。 ```python from functools import partial def power(base, exponent): return base ** exponent square = partial(power, exponent=2) print(square(5)) # 25 ``` 8. **使用setdefault()设置字典默认值** - 当需要为字典中不存在的键设置默认值时,可以使用`setdefault(key, default)`。 ```python d = {} d.setdefault('key', []).append(1) # 如果'key'不存在,则设置为空列表再追加 ``` 9. **eval()exec()的安全风险** - `eval()`和`exec()`可以执行字符串形式的代码,但存在安全风险,应避免执行不可信的输入。 10. **利用dir()和help()进行探索** - 在交互式环境中,可以使用`dir(obj)`查看对象的属性和方法,使用`help(obj)`查看帮助文档。 以上技巧和最佳实践可以帮助你更高效地使用Python内置函数。在实际编程中,应结合具体场景选择合适的内置函数,并注意代码的可读性和安全性。 §§相关问题§§ 1. 如何避免在使用内置函数时出现常见的错误? 2. 有哪些内置函数在性能优化中特别有效? 3. 在数据分析中,哪些内置函数最常用? 4. 如何结合内置函数和标准库函数提升代码效率?</think>### Python常用内置函数使用技巧与最佳实践 Python内置函数是无需导入即可直接使用的核心工具,合理运用能显著提升开发效率(减少30%以上代码量)[^2]。以下是关键函数使用技巧和最佳实践: --- #### 1. **数据处理三剑客:`map()`、`filter()`、`reduce()`** - **`map()`技巧**:结合lambda表达式实现快速转换 ```python # 传统方式 nums = [1, 2, 3] squared = [] for n in nums: squared.append(n**2) # 最佳实践:map + lambda squared = list(map(lambda x: x**2, nums)) # [1, 4, 9] ``` - **`filter()`技巧**:快速过滤数据 ```python # 筛选偶数 evens = list(filter(lambda x: x%2==0, range(10))) # [0, 2, 4, 6, 8] ``` - **`reduce()`注意**:需从`functools`导入,适合累积计算 ```python from functools import reduce product = reduce(lambda x,y: x*y, [1,2,3,4]) # 24 ``` > **最佳实践**:优先使用列表推导式(更Pythonic): > ```python > squared = [x**2 for x in nums] # 替代map > evens = [x for x in range(10) if x%2==0] # 替代filter > ``` --- #### 2. **高效迭代工具:`enumerate()`与`zip()`** - **`enumerate()`技巧**:同时获取索引和值 ```python fruits = ['apple', 'banana', 'cherry'] for idx, fruit in enumerate(fruits, start=1): # start定义起始索引 print(f"{idx}. {fruit}") ``` - **`zip()`技巧**:并行迭代多个序列 ```python names = ['Alice', 'Bob'] scores = [95, 88] for name, score in zip(names, scores): print(f"{name}: {score}") ``` > **最佳实践**:使用`zip(*iterable)`实现矩阵转置: > ```python > matrix = [[1,2,3], [4,5,6]] > transposed = list(zip(*matrix)) # [(1,4), (2,5), (3,6)] > ``` --- #### 3. **智能类型转换函数** - **安全转换技巧**:避免转换异常 ```python # int() 和 float() 的安全用法 num_str = "123" num = int(num_str) if num_str.isdigit() else 0 # 先验证后转换 ``` - **灵活容器转换**:`list()`/`tuple()`/`set()` ```python word = "hello" char_set = set(word) # {'h','e','l','o'} 自动去重 ``` > **最佳实践**:用`dict()`快速构建字典: > ```python > keys = ['a','b'] > values = [1,2] > my_dict = dict(zip(keys, values)) # {'a':1, 'b':2} > ``` --- #### 4. **高阶函数应用** - **`sorted()`高级用法**:自定义排序规则 ```python students = [{'name':'Bob','age':20}, {'name':'Alice','age':18}] # 按年龄排序 sorted_students = sorted(students, key=lambda x: x['age']) ``` - **`any()`/`all()`技巧**:快速逻辑判断 ```python checks = [True, False, True] print(any(checks)) # True(至少一个为真) print(all(checks)) # False(非全为真) ``` > **性能提示**:对大型数据集优先使用生成器表达式: > ```python > any(x > 10 for x in huge_list) # 比列表推导节省内存 > ``` --- #### 5. **调试与自省函数** - **`dir()`技巧**:探索对象属性 ```python print(dir(str)) # 查看字符串所有方法 ``` - **`help()`实时文档**: ```python help(filter) # 显示函数文档 ``` - **`isinstance()`最佳实践**:类型检查 ```python if isinstance(value, (int, float)): # 支持多类型检查 do_calculation(value) ``` --- ### 关键注意事项 1. **避免`eval()`安全风险**:执行字符串代码可能导致注入漏洞[^2] 2. **内存优化**:对大数据集使用`map()`/`filter()`返回的迭代器而非立即转换为列表 3. **可读性平衡**:复杂逻辑避免过度嵌套lambda,改用命名函数 4. **新特性优先**:Python 3.10+推荐使用`zip(strict=True)`确保等长迭代安全 > 统计显示,熟练使用内置函数可使代码行数减少30%,同时提升可维护性[^2]。建议通过交互环境(如Jupyter)实践`dir()`和`help()`来加深理解[^3]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值