百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python函数调用的12个方法,欢迎您来帮忙补充

itomcoil 2024-12-07 08:59 41 浏览

1、使用 functools.partial 函数

functools.partial 函数可以用来创建一个新的函数,它固定了原函数中的某些参数

import functools

def power(x, n):
    return x ** n

square = functools.partial(power, n=2)
cube = functools.partial(power, n=3)

print(square(2)) #4
print(cube(2)) # 8

定义了一个 power() 函数,用于计算 x 的 n 次方。然后使用 functools.partial 函数固定了 n=2 和 n=3,得到了新的函数 square 和 cube。最后分别调用这两个函数,并传入 x=2,输出结果

2、使用 map() 函数:map() 函数可以对一个可迭代对象中的每个元素都执行相同的操作,返回一个新的可迭代对象

def square(x):
    return x ** 2

numbers = [1, 2, 3, 4, 5]
squared_numbers = map(square, numbers)
print(list(squared_numbers))

定义了一个函数 square(),然后使用 map() 函数将其应用到列表 numbers 中的每个元素上,返回一个新的列表 squared_numbers

3、使用类的方法:如果将一个函数定义为类的方法,那么就需要使用该类的实例来调用该函数

class Person:
    def __init__(self, name):
        self.name = name

    def greet(self):
        print(f"Hello, my name is {self.name}.")

person = Person("Alice")
person.greet()

4、使用函数对象:在 Python 中,函数也是对象,因此可以将函数赋值给变量,然后通过该变量调用函数

def greet(name):
    print(f"Hello, {name}!")

hello = greet
hello("Alice")

定义了一个函数 greet(),然后将其赋值给变量 hello,最后通过 hello() 调用函数

5、使用 *args 和 **kwargs:当函数的参数个数不确定时,可以使用 *args 和 **kwargs 来传递不定数量的参数

#eg1
def multiply(*args):
    result = 1
    for arg in args:
        result *= arg
    return result

numbers = (2, 3, 5, 7)
print(multiply(*numbers))
#eg2
# 定义教授函数
def teach(subject):
    print(f"I am teaching {subject} now.")

# 使用 *args 和 **kwargs
def introduce(*args, **kwargs):
    print("I am a teacher.")
    print("My name is", kwargs.get("name"))
    for subject in args:
        teach(subject)

introduce("math", "English", name="Bob")

6、使用 lambda 函数:lambda 函数是一种匿名函数,可以在不定义函数名称的情况下定义简单的函数

# 使用 lambda 函数
teach2 = lambda subject: print(f"I am teaching {subject} now.")
teach2("history")

7、使用回调函数:回调函数是指传递给另一个函数的函数,当满足某个条件时,另一个函数将调用该函数

def is_even(x):
    return x % 2 == 0

def filter_numbers(numbers, callback):
    result = []
    for number in numbers:
        if callback(number):
            result.append(number)
    return result

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter_numbers(numbers, is_even)
print(even_numbers)

定义了一个 is_even() 函数,用于判断一个数是否为偶数。然后定义了一个 filter_numbers() 函数,用于筛选出满足某个条件的数字。最后将 is_even() 函数作为回调函数传递给 filter_numbers() 函数,并将数字列表 numbers 作为参数传递给它,得到所有偶数的列表 even_numbers

8、使用 exec() 或 eval() 函数:exec() 和 eval() 函数可以用来执行动态生成的 Python 代码

def create_function(code):
    namespace = {}
    exec(code, namespace)
    return namespace['add_numbers']

code = """
def add_numbers(x, y):
    return x + y
"""

add = create_function(code)
print(add(2, 3))

exec() 函数返回值为 None,因为它只是执行了一段代码,而没有返回任何值。

在上面的例子中,实际上是通过执行代码来定义了一个新的 add_numbers() 函数,并将它返回给了 create_function() 函数的调用者,将一个空字典传递给 exec() 函数,用来存储执行代码所定义的变量和函数。然后在返回值中使用这个字典来获取新定义的 add_numbers() 函数

9、使用装饰器(Decorator)。装饰器是一种特殊的语法,可以用来修改函数的行为或属性,同时不改变原函数的定义

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before function call")
        result = func(*args, **kwargs)
        print("After function call")
        return result
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

定义了一个装饰器 my_decorator(),它接受一个函数作为参数,并返回一个新的函数 wrapper()。wrapper() 函数可以在原函数被调用前后执行一些额外的代码,以修改原函数的行为。

然后,在 say_hello() 函数定义上方使用 @my_decorator 语法来应用装饰器。这相当于将 say_hello() 函数传递给 my_decorator() 函数,并将返回的新函数赋值给 say_hello()。因此,在调用 say_hello() 函数时,实际上是调用了经过装饰器修饰的新函数 wrapper(),从而实现了在函数调用前后执行一些额外的代码。

10、直接调用函数的 __call__() 方法

def add_numbers(x, y):
    return x + y

add = add_numbers  # 将函数对象赋值给变量 add
print(add(2, 3))   # 直接调用 add() 方法
print(add.__call__(2, 3))  # 使用 __call__() 方法调用函数

将函数对象 add_numbers 赋值给变量 add,然后可以直接使用 add() 方法来调用这个函数,也可以使用 add.__call__() 方法来调用

11、getattr() 函数调用方法。getattr() 函数用于获取对象的属性或方法,可以接受两个参数:第一个参数是对象,第二个参数是属性或方法的名称。如果对象有这个属性或方法,那么 getattr() 函数返回它的值或引用,否则抛出 AttributeError 异常。

import math

func_name = "sqrt"  # 函数名称
arg = 2             # 函数参数
func = getattr(math, func_name)  # 获取函数对象
result = func(arg)  # 调用函数并获取结果
print(result)       # 输出结果:1.4142135623730951

使用 getattr() 函数来获取 math 模块中的 sqrt 函数对象,并将其赋值给变量 func。然后,我们使用 func(arg) 的语法来调用这个函数,并获取结果。由于 math.sqrt() 函数用于计算平方根,因此在这个例子中,调用 func(2) 的结果应该是 1.4142135623730951。

需要注意的是,getattr() 函数只能用于获取属性或方法的值或引用,并不能修改它们。如果想要修改对象的属性或方法,可以使用 setattr() 函数或直接给属性赋值来实现

12、methodcaller() 用来返回一个函数,这个函数会调用指定对象的指定方法。methodcaller() 函数可以接受一个或多个参数,其中第一个参数是方法名称,后面的参数则是传递给方法的实际参数。

from operator import methodcaller

s = "hello world"
func = methodcaller("upper")
result = func(s)
print(result)  # 输出 "HELLO WORLD"

使用 methodcaller("upper") 创建了一个函数对象 func,它会调用字符串的 upper() 方法。然后,我们使用 func(s) 的语法来调用这个函数,并将字符串 s 作为参数传递进去。由于 upper() 方法会将字符串转换为大写形式,因此调用 func(s) 的结果应该是 "HELLO WORLD"。

需要注意的是,methodcaller() 函数返回的是一个函数对象,而不是实际的方法结果。如果需要获得方法的结果,必须使用返回的函数对象调用它。同时,由于 methodcaller() 函数返回的是一个函数对象,因此可以将其赋值给变量,并在需要的时候调用。

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...