在Python中,回调函数是一种常见的编程模式,它允许一个函数在某个事件发生时被调用。以下是如何在Python中使用回调函数的一些示例:
基本使用
def func1(func2):
func2()
def func2():
print('我是func2函数')
func1(func2) 输出:我是func2函数
带参数的回调函数
def ser1(a):
return a * 100
def ser2(b):
return b * 20
def ser(ser1, a, ser2, b):
print(ser1(a) + ser2(b))
ser(ser1, 1, ser2, 1) 输出:102
使用`concurrent.futures`模块
from concurrent.futures import ThreadPoolExecutor
def callback(result):
print('任务完成,结果为:', result)
def task(x, y):
return x + y
with ThreadPoolExecutor() as executor:
future = executor.submit(task, 2, 3)
future.add_done_callback(callback) 当任务完成时,回调函数会被执行
面向对象的回调实现
class BaseHandler(object):
def crawl(self, url, kwargs):
if kwargs.get('callback'):
callback = kwargs['callback']
if isinstance(callback, basestring) and hasattr(self, callback):
func = getattr(self, callback)
elif hasattr(callback, 'im_self') and callback.im_self is self:
func = callback
resp = requests.get(url)
return func(resp)
class Anjuke(BaseHandler):
def on_start(self):
self.crawl(start_url, callback=self.index_url)
def index_url(self, response):
print(response.text)
a = Anjuke()
print(a.on_start())
使用`apply_async`和`Callable`
def apply_async(func, args=(), callable=None):
result = func(*args)
if callable:
callable(result)
def print_result(result):
print('Got:', result)
def add(x, y):
return x + y
apply_async(add, args=(2, 3), callable=print_result) 输出:Got: 5
使用`ResultHandler`类
class ResultHandler:
def __init__(self):
self.sequence = 0
def handler(self, result):
self.sequence += 1
print('[{}] Got:{}'.format(self.sequence, result))
rh = ResultHandler()
rh.handler(10) 输出: Got:10
rh.handler(20) 输出: Got:20
示例:使用`call.py`和`called.py`
call.py
import called
def callback():
print('in callback')
def main():
called.test_call(callback)
print('in call.py')
main()
called.py
def test():
print('in called.py test')
def test_call(p_call):
print('in called.py test_call')
p_call()
if __name__ == '__main__':
test_call(callback) 输出:in called.py test_call in callback
这些示例展示了如何在Python中实现和使用回调函数。回调函数可以用于多种场景,如异步编程、事件驱动编程等。希望这些示例能帮助你理解Python中回调函数的使用方式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://sigusoft.com/bj/23675.html