Python字符串与函数名互转原理及Pandas列唯一值获取方法
Python & Pandas 技术问题解答
问题1:在Python中如何将字符串转换为函数名,其工作机制是怎样的?
实现方法
根据函数所在的作用域,有几种实用的方式:
- 全局作用域的函数:直接用
globals()字典获取。比如你定义了def greet(): print("Hello"),那么func = globals()['greet']就能拿到函数对象,之后直接func()即可调用。 - 局部作用域的函数:用
locals()字典,用法和globals()一致,但仅对当前函数或代码块的局部命名空间有效。 - 类/模块中的函数:用
getattr()方法。比如函数在模块my_module里,就写getattr(my_module, 'func_name');如果是类的实例方法,比如class MyClass: def my_method(self): ...,则需要先实例化类,再用getattr(MyClass(), 'my_method')获取。
工作机制
Python的命名空间本质就是字典——globals()返回全局命名空间的字典,locals()返回当前局部命名空间的字典。字典的键是变量/函数的名称字符串,值是对应的对象(函数对象、变量值等)。所以用字符串作为键去取字典的值,就能拿到对应的函数对象,后续可直接调用。
举个完整例子:
def add(a, b): return a + b # 字符串转函数 func_str = "add" add_func = globals()[func_str] print(add_func(2, 3)) # 输出5
问题2:在Pandas中如何获取DataFrame某一列的唯一值?
常用的方法有这几个,按需选择即可:
- 获取唯一值数组:调用
df['column_name'].unique(),返回numpy数组,包含该列所有不重复的值,顺序是值在原列中首次出现的顺序。 - 统计唯一值数量:用
df['column_name'].nunique(),直接返回唯一值的个数,比len(df['column_name'].unique())更高效。 - 返回去重后的Series:用
df['column_name'].drop_duplicates(),返回保留每个唯一值首次出现行的Series,适合后续做DataFrame操作的场景。
原理说明
unique()底层依托Pandas的向量化处理能力,通过哈希表记录已出现的元素,最终返回未重复的集合。相比手动遍历去重,它利用numpy的高效计算,处理大数据量时速度优势明显。
举个例子:
import pandas as pd df = pd.DataFrame({ 'fruit': ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'] }) # 获取唯一值数组 unique_fruits = df['fruit'].unique() print(unique_fruits) # 输出: ['apple' 'banana' 'orange'] # 统计唯一值数量 print(df['fruit'].nunique()) # 输出: 3
问题3:在Python中如何将函数名转换为字符串参数'name'?
最直接的方式是用函数对象的__name__属性——几乎所有Python函数(包括类方法、内置函数)都自带这个特殊属性,存储了函数定义时的名称字符串。
实现方法
普通函数的例子:
def calculate_sum(a, b): return a + b # 函数转字符串 func_name_str = calculate_sum.__name__ print(func_name_str) # 输出: 'calculate_sum'
类方法的例子:
class Calculator: def multiply(self, a, b): return a * b # 类方法转字符串 method_name = Calculator.multiply.__name__ print(method_name) # 输出: 'multiply'
注意点
如果函数被装饰器包装,直接取__name__可能返回装饰器内部函数的名称,这时候需要用functools.wraps保留原函数的元信息:
import functools def my_decorator(func): @functools.wraps(func) # 关键:保留原函数的__name__等属性 def wrapper(*args, **kwargs): print("Before calling function") return func(*args, **kwargs) return wrapper @my_decorator def say_hello(): print("Hello") print(say_hello.__name__) # 输出: 'say_hello',而非'wrapper'
工作机制
Python中函数是一等对象,每个函数对象都包含内置特殊属性(双下划线开头结尾),__name__就是其中之一。它在函数定义时被自动赋值为函数的名称字符串,方便开发者在运行时获取函数元信息。
内容的提问来源于stack exchange,提问作者2ank3th
相关产品推荐
相关产品推荐

