如何在 Python 中调用函数?九种方法任你挑选

1.直接函数调用

这是最简单、最直观的方式:

def test():
    print("This is a test")
test()



2.使用partial()函数

在 的内置库中functools,有一个专用于生成偏函数的偏函数partial。

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s


from functools import partial

power_2 = partial(power, n=2)
power_2(3)  # output: 9
power_2(4)  # output: 16



3. 使用 eval()

如果需要动态执行函数,可以使用 eval + string 来执行函数。

# demo.py
import sys


def pre_task():
    print("running pre_task")


def task():
    print("running task")


def post_task():
    print("running post_task")


argvs = sys.argv[1:]


for action in argvs:
    eval(action)()

执行:

$ python demo.py pre_task task post_task
running pre_task
running task
running post_task



4. 使用 getattr()

如果把所有的函数都放在类中,并定义为静态方法,就可以使用getattr()get和调用它们。

import sys


class Task:
    @staticmethod
    def pre_task():
        print("running pre_task")


    @staticmethod
    def task():
        print("running task")


    @staticmethod
    def post_task():
        print("running post_task")


argvs = sys.argv[1:]


task = Task()


for action in argvs:
    func = getattr(task, action)
    func()


5. 使用 __dict__()

我们都知道对象有一个__dict__()魔法方法,它存储任何对象的属性和方法。

您可以调用类方法使用__dict__.get

import sys


class Task:
    @staticmethod
    def pre_task():
        print("running pre_task")


func = Task.__dict__.get("pre_task")
func.__func__()
# Output
$ python /tmp/demo.py
running pre_task


6. 使用 global()

在 的内置库中functools,有一个专用于生成偏函数的偏函数partial。

import sys


def pre_task():
    print("running pre_task")


def task():
    print("running task")


def post_task():
    print("running post_task")


argvs = sys.argv[1:]


for action in argvs:
    globals().get(action)()
# Output
$ python /tmp/demo.py pre_task task post_task
running pre_task
running task
running post_task


7. 从文本编译和运行

您可以在字符串中定义您的函数,并使用该compile函数将其编译为字节码,然后用于exec执行它。

pre_task = """
print("running pre_task")
"""
exec(compile(pre_task, '', 'exec'))
# Or from a text file
with open('source.txt') as f:
    source = f.read()
    exec(compile(source, 'source.txt', 'exec'))



8. 使用attrgetter()

在 的内置库中operator,有一个获取属性的方法,称为attrgetter,获取函数后执行。

from operator import attrgetter


class People:
    def speak(self, dest):
        print("Hello, %s" %dest)


p = People()
caller = attrgetter("speak")
caller(p)("Tony")
# Output
$ python /tmp/demo.py
Hello, Tony


9. 使用methodcaller()

还有一个methodcaller方法在operator

from operator import methodcaller


class People:
    def speak(self, dest):
        print("Hello, %s" %dest)


caller = methodcaller("speak", "Tony")
p = People()
caller(p)
# Output
$ python /tmp/demo.py
Hello, Tony

相关文章

「强强联合」在Power BI 中使用Python(1)——导入数据

编辑搜图请点击输入图片描述近几年,Python是越来越火了,就连地产大佬潘石屹都在年近不惑之时开始学习Python编程语言,我们做数据分析和运营的怎能不熟练运用呢?编辑搜图图片模糊,建议替换或删除×请...

Pycharm导入python项目

进入PyCharm后,点击File→Open,然后在弹窗中选择需要导入项目的文件夹;打开了python项目后,需要配置该项目对应的python才可以正常运行;配置步骤:File→settings在设置...

零基础到发布:手把手教你创建并分发 Python 自定义库

作为程序员,我们经常依赖各种外部库来解决不同的问题。这些库由技术娴熟的开发者创建,为我们提供了节省时间和精力的解决方案。但你是否曾想过:“我也能创建属于自己的自定义库吗?”答案是肯定的!本文将为你详细...

彻底搞懂Python 中的 import 与 from import

对不少 Python 初学者来说,Python 导入其他模块的方式让他们很难理解。什么时候用import xxx?什么时候用from xxx import yyy?什么时候用from xxx.yyy...

python首行代码import *,from * import * 解析

python代码,一般第一行代码都是import *或from * import *,作用是导入功能模块,然后利用模块内的函数编写代码,减少大量的代码编写时间,是python的一大特色。但是,在实际写...

Python的RSA操作(私钥与公钥)

RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA...