内置函数
📌 转换和筛选
map(func, iter)
对可迭代对象中的每个元素应用一个指定的函数,返回一个迭代器,这个过程通常被称为映射或转换
filter(func, iter)
对可迭代对象中的每个元素进行过滤,只保留那返回值为True的元素,返回一个迭代器
tmp_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
map_list = map(lambda x: x * 2, tmp_list)
filter_list = filter(lambda x: x % 2 == 0, tmp_list)
print(list(map_list)) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
print(list(filter_list)) # [2, 4, 6, 8, 10]
📌 排序
sorted(iter, key=None, reverse=False)
对可迭代对象进行排序,并返回排序后的列表,原列表不会被修改;key可传方法名
tmp_list = ['Alias', 'xx', 'David', '1']
a = tmp_list.sort()
print(a) # None,list.sort()直接在原列表排序,返回None
b = sorted(tmp_list, key=len, reverse=True)
print(b) # ['Alias', 'David', 'xx', '1']
📌 求和求积
sum(iter, start=0)
可迭代对象中元素总和
functools.reduce(func, iter, initial=None)
可迭代对象进行分解计算,向量化运算,避免循环。
numbers = [1, 2, 3]
total = sum(numbers, start=10)
print(total) # 输出: 16
from functools import reduce
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers, 2) # 初始值为2
print(product) # 输出: 48
📌 all
all()
判断可迭代对象中所有元素是否都为真;如果可迭代对象为空,也会返回True。
list1 = [0, 1, 2, 3, 4, 5]
print(all(i > 0 for i in list1)) # False
📌 执行字符串表达式
eval()
可用于执行字符串中的有效代码或表达式,但处理不受信任输入的情况应避免使用。
ast.literal_eval()
只能处理基本数据类型的字面量,因此无法执行任何潜在有害的操作。当输入包含非预期的数据,抛ValueError异常。
总结:如果只是想安全地解析字符串形式的数据结构,应该使用ast.literal_eval
;如果需要执行更复杂的Python代码,则应谨慎使用eval
,并确保输入是可信的,以避免安全风险。
import ast
s = "[1, 2, {'key': 'value'}, 'hello']"
data = ast.literal_eval(s)
print(data) # 输出:[1, 2, {'key': 'value'}, 'hello']
str1 = "pow(data[1], 3)"
print(eval(str1)) # 输出:8
try:
print(ast.literal_eval(str1))
except ValueError as e:
print(e) # 非字面量表达式时抛异常
📌 执行代码块
exec(source, globals=None, locals=None)
同时传入globals和locals参数时,优先取局部变量进行计算
x = 10 # 全局变量
expr = """
z = 30
numbers = [x, y, z]
total = sum(numbers, start=10)
print(total)
"""
if __name__ == '__main__':
y = 20
exec(expr) # 70
# 传入变量
# exec(expr, {'y': 1}) # NameError: name 'x' is not defined
exec(expr, {'x': 1, 'y': 1}) # 42
exec(expr, {'x': 1, 'y': 1}, {'y': 2, 'z': 2}) # 43
📌 repr
repr(obj)
保留转义或者特殊字符
d = {'regex_str': '物品\t单价\t数量'}
print(d.get('regex_str')) # 直接print()会自动转义,输出:物品 单价 数量
print(repr(d.get('regex_str'))) # repr()会保留转义或者特殊字符,输出:'物品\t单价\t数量'
📌 反射机制
getattr(obj, func/attribute, defult=None)
从对象或实例中动态获取一个属性或者方法
与之相对应的方法还有:setattr(obj, func/attribute, value), hasattr(obj, func), delattr(obj, func)
class Person:
pass
class PersonSubclass(Person):
def introduce2(self):
print("test")
def re_func(funcname, obj=Person()):
r = getattr(obj, funcname)()
return r
person_subclass = PersonSubclass()
print(re_func("introduce2", person_subclass)) # 输出:test\nNone
补充
程序在运行时检查、分析和修改自身的行为与结构,这种特性称作反射机制。
一般而言,反射操作会比直接调用慢,会存在额外的性能开销,
📌 类型判断
isinstance(obj, type)
判断obj是否为指定的对象类型,考虑继承关系
type(obj)
返回obj的类型,不考虑继承关系
issubclass(sub, sup)
判断sub是否为sup的子类
class Practice:
"""
__doc__是描述信息,当定义类、方法,第一个语句(即本行)是字符串时,就会被自动赋值给__doc__属性。
"""
tmp = 1
print(Practice.__doc__) # 打印Practice类的描述信息
# 通过type方法动态创建子类
PracticeInherit = type("PracticeInherit", (Practice, object), {__doc__: "This is a practice class"})
print(PracticeInherit.tmp)
print(isinstance(PracticeInherit(), Practice)) # True
print(issubclass(PracticeInherit, Practice)) # True
class MyClass:
pass
print(isinstance(MyClass, type)) # 输出: True
print(isinstance(MyClass(), type)) # 输出: False