成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python函數調用的九大方法,鮮為人知

開發 前端
分享調用函數的9種方法:getattr, partial, eval, __dict__, globals, exec, attrgetter, methodcaller, 和 __call__。其中一些函數調用方法,在函數式編程或元編程場景中大量使用。相信你在今后的學習或工作中會遇到!

分享調用函數的9種方法:getattr, partial, eval, __dict__, globals, exec, attrgetter, methodcaller, 和 __call__。其中一些函數調用方法,在函數式編程或元編程場景中大量使用。相信你在今后的學習或工作中會遇到!

1. 直接調用函數(__call__)

最簡單最直接的使用方法:

def func():
    print('Hello, world!')
func() # Hello, world!

func.__call__() # 一樣的

2. partial 函數

在python的內置庫functools中有一個partial函數,可以讓我們可以把一個函數的一部分參數填入,然后調用。看起來沒什么用,遇到的時候有大用。

from functools import partial
# 請仔細品!
def func(domain, user):
    echo = f"Hello, {user}@{domain}!"
    print(echo)


func_userA = partial(func, user="userA")
func_userB = partial(func, user="userB")
func_userA("example.com") # Hello, userA@example.com!
func_userB("example.com") # Hello, userB@example.com!

3. eval 函數

如果需要動態執行函數,可以使用 eval 來執行動態代碼。

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

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

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

cmdList = ["pre_task()","task()","post_task()"]
for cmd in cmdList:
    eval(cmd) # 執行函數
# running pre_task
# running task
# running post_task

4. getattr 函數

運行類中的靜態方法

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")

#?? 沒有括號的字符串。
cmdList = ["pre_task", "task", "post_task"]

task = Task()

for cmd in cmdList:
    func = getattr(task, cmd)
    func()

5. dict 方法

首先我們需要知道,每個python對象都有一個內置的__dict__()方法,這個方法返回一個字典,包含了對象的所有屬性。如下圖,我們可以看到list的__dict__()方法返回的所有屬性,其中紅框內的,你是否有些熟悉?

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

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

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


func = Task.__dict__.get("pre_task")
func.__func__() # running pre_task
func() # 為什么不這樣用?

6. globals 函數

import sys

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

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

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

cmdList = ["pre_task", "task", "post_task"]

for cmd in cmdList:
    func = globals().get(cmd)
    func()
# running pre_task
# running task
# running post_task

7. exec 函數

你可以在一個字符串中定義你的函數,并使用compile函數將它編譯成字節碼,然后使用exec來執行它。

# 方式1
pre_task = """
print("running pre_task")
"""
exec(compile(pre_task, '', 'exec'))
# running pre_task

# 方式2
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") # Hello, Tony
# 本文第四條
caller2 = getattr(p, "speak")
caller2("Tony") # Hello, Tony

9. methodcaller 函數

from operator import methodcaller

class People:
    def speak(self, dest):
        print(f"Hello, {dest}")

caller = methodcaller("speak", "Tony")
p = People()
caller(p)

小節

總結下,本文分享了使用函數的9種方法:getattr, partial, eval, __dict__, globals, exec, attrgetter, methodcaller, 和 __call__。

請仔細品味,思考下他們的使用場景。其中一些函數調用方法,在函數式編程或元編程場景中大量使用。相信你在今后的學習或工作中會遇到!

責任編輯:華軒 來源: 哈希編程
相關推薦

2024-05-20 13:02:30

Python編程開發

2009-07-09 17:38:35

2022-07-19 08:46:15

NeofetchLinux

2010-01-07 10:05:51

IT顧問特質

2023-09-26 12:34:29

Python迭代過濾函數

2011-05-03 13:13:52

編程PHPJava

2014-04-22 16:38:12

GitHubGitHub 使用技巧

2024-09-10 08:35:57

2024-01-15 18:02:09

docker系統文件格式

2023-07-26 07:51:30

CSSgap 屬性

2024-06-05 10:35:24

Python字符串函數

2021-07-07 10:59:48

python代碼編程語言

2021-08-03 09:55:37

Python函數編程語言

2009-09-14 09:45:20

Chrome谷歌操作系統

2023-04-23 15:11:26

2019-10-08 16:24:33

Chrome瀏覽器

2022-05-30 09:01:13

CSS技巧前端

2014-07-29 14:25:43

Unix命令

2015-08-18 10:57:52

機房制冷數據中心

2017-11-08 14:55:16

Linux命令sudo
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久色 | 国产剧情一区二区三区 | 日韩精品在线一区 | 亚洲国产一区视频 | 成人av片在线观看 | 黄网站免费在线观看 | 日韩视频一区二区三区 | 免费观看一级毛片 | 国产精品久久久久久中文字 | 一区二区伦理电影 | 亚洲国产偷 | 精品亚洲一区二区三区 | 欧美色综合一区二区三区 | 久久久成人免费一区二区 | 成人网在线观看 | 中文字幕免费视频 | 四虎在线播放 | 欧美爱爱视频网站 | 久久亚洲春色中文字幕久久久 | 午夜视频网 | 伊人久久免费视频 | 国产成人99久久亚洲综合精品 | 日韩欧美理论片 | 黄色片在线看 | 911影院| 国产精品一区二区电影 | 亚洲精品视频一区 | 91国产在线视频在线 | 日韩精品视频在线观看一区二区三区 | 特级做a爰片毛片免费看108 | 免费特级黄毛片 | 久久久久久av | 国产成人精品午夜视频免费 | 99久久婷婷国产综合精品 | 国产精品久久久久一区二区三区 | 在线国产视频 | 成人综合在线视频 | 91精品国产一区二区三区 | 亚洲精品乱码8久久久久久日本 | 亚洲区一区二 | 日韩欧美在线观看 |