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

Python:如何实时获取函数调用的执行结果?

嘿,我看你想实时拿到循环里每一个i的结果,而不是等循环跑完只拿到最后那个值对吧?先给你提个代码里的小坑:你的func方法把return i放在了循环里面,这会导致函数第一次循环就直接退出,根本跑不到后面的i,只能拿到i=0,这肯定不是你要的效果~

下面给你几个实用的解决方案,你可以根据自己的场景选:

方案1:用生成器实时返回值

生成器天生就是用来逐个输出序列值的,非常适合这种场景。只需要把return改成yield,就能让函数每次循环都返回当前的i值,而不是直接退出:

import threading

class model(object):
    """docstring for model"""
    def __init__(self):
        pass
    def func(self):
        for i in range(1000):
            print('i', i)
            yield i  # 用yield替代return,每次迭代返回当前i

class WorkThread(threading.Thread):
    def __init__(self):  # 注意你之前写的是__int__,这里要改成__init__哦
        super(WorkThread, self).__init__()

    def run(self):
        model1 = model()
        # 迭代生成器,逐个获取实时的i值
        for result in model1.func():
            # 这里可以写你处理每个i的逻辑,比如更新日志、UI等
            print("实时拿到的i值:", result)

# 启动线程测试
t = WorkThread()
t.start()
t.join()
方案2:用回调函数传递结果

如果需要把实时结果交给外部的处理逻辑,可以让func接收一个回调函数,每次循环时调用这个函数把i传出去:

import threading

class model(object):
    """docstring for model"""
    def __init__(self):
        pass
    def func(self, callback):
        for i in range(1000):
            print('i', i)
            callback(i)  # 调用回调函数,实时传递i值

# 定义处理实时结果的回调函数
def handle_result(i):
    print("通过回调拿到的i值:", i)
    # 这里可以扩展成你需要的逻辑,比如写入文件、更新界面等

class WorkThread(threading.Thread):
    def __init__(self):
        super(WorkThread, self).__init__()

    def run(self):
        model1 = model()
        model1.func(handle_result)  # 传入回调函数

t = WorkThread()
t.start()
t.join()
方案3:PyQt信号与槽(适合GUI场景)

看你代码里注释了trigger = pyqtSignal(),应该是在PyQt环境下开发,那用信号发射的方式最稳妥——毕竟PyQt里跨线程更新UI只能用信号槽,不然会出问题:

from PyQt5.QtCore import QThread, pyqtSignal
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel

class model(object):
    """docstring for model"""
    def __init__(self):
        pass
    def func(self, signal):
        for i in range(1000):
            print('i', i)
            signal.emit(i)  # 发射信号,把i值传递出去

class WorkThread(QThread):
    # 定义一个传递int类型参数的信号
    update_signal = pyqtSignal(int)

    def __init__(self):
        super(WorkThread, self).__init__()

    def run(self):
        model1 = model()
        model1.func(self.update_signal)

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.label = QLabel("当前i值:", self)
        self.label.move(20,20)
        self.init_thread()

    def init_thread(self):
        self.thread = WorkThread()
        # 绑定信号与槽函数,实时更新UI
        self.thread.update_signal.connect(self.update_label)
        self.thread.start()

    def update_label(self, i):
        self.label.setText(f"当前i值:{i}")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(200, 100)
    window.show()
    sys.exit(app.exec_())

内容的提问来源于stack exchange,提问作者rosefun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:39:27