You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:31:47