鱼C论坛

 找回密码
 立即注册
查看: 1707|回复: 10

[已解决]如何让return返回值后继续运行?

[复制链接]
发表于 2020-3-19 09:34:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wnhuiyou 于 2020-3-19 14:18 编辑

我现在想实现这么一个功能,return返回一个值之后,不要结束代码,让它继续在while里面循环,代码如下:

A.py
import B

t = B.tcp()

while True:
        print(t.tcp_server())

B.py
import socket

class tcp(object):

    def tcp_server(slef):

        # 创建套接字
        slef.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 绑定IP和端口
        slef.tcp_client_socket.bind(('192.168.0.114', 8081))

        # 设置监听
        slef.tcp_client_socket.listen(128)
        while True:
            # 等待连接
            slef. new_client_socket, slef.client_addr = slef.tcp_client_socket.accept()

            while True:
                # 接收客户端发送的请求
                slef.recv_data = slef.new_client_socket.recv(1024)

                # 回发信息给客户端
                slef.new_client_socket.send("成功!".encode("GBK"))

                if slef.recv_data.decode("GBK") == "退出":

                    # 关闭套接字
                    print("连接断开!")
                    slef.new_client_socket.close()
                    return exit()

                return slef.recv_data.decode('GBK')

我现在用网络调试工具,发送数据 A.py 能正常打印出来 我输入的数据,但是只能打印一次,因为return后 B.py 就结束了,无法做到 不停发送 不停接收  我了解到可以用迭代器 yield  但是我用了之后没有效果,想请教下大家怎么修改?

我把代码全部粘贴出来了
A.py
from ctypes import *
import B.tcp_server


dll = CDLL("D:\python\DLL\proRFL.dll")


class User_Car(object):

    def __init__(self, d_12, dlsCoID, CardNo, dai, LLock, pdoors, BDate, EDate, LLockNo):
        self.d_12 = d_12
        self.dlsCoID = dlsCoID
        self.CardNo = CardNo
        self.dai = dai
        self.LLock = LLock
        self.pdoors = pdoors
        self.BDate = BDate
        self.EDate = EDate
        self.LockNo = LLockNo
        self.cardHexStr = bytes(72)

    # 初始化
    def csh(self):
        ret = dll.initializeUSB(1)   # 打开USB接口
        return ret

    # 蜂鸣 1秒
    def jiao(self):
        self.ret = dll.Buzzer(1, 10)

        return self.ret

    # 发行“客人卡”,又称“宾客卡”或“房卡”
    def faka(self):
        self.ret = dll.GuestCard(self.d_12, self.dlsCoID, self.CardNo, self.dai, self.LLock, self.pdoors, self.BDate,  self.EDate, self.LockNo, self.cardHexStr)

        return self.ret

    # 读卡数据
    def du(self):
        self.buffData = bytes(72)
        self.ret = dll.ReadCard(self.d_12, self.buffData)

        return self.ret

    # 读卡锁号
    def suohao(self):
        self.LockNo = bytes(8)
        self.cardHexStr = self.buffData
        self.ret = dll.GetGuestLockNoByCardDataStr(self.dlsCoID, self.cardHexStr, self.LockNo)

        return self.ret


tcp = DLL.tcp_server.tcp()

p = tcp.tcp_server().split(',')

t = User_Car(p[0], p[1], p[2], p[3], p[4], p[5], p[6].encode('GB2312'), p[7].encode('GB2312'), p[8].encode('GB2312'))


# 发卡
t.faka()
print(t.cardHexStr.decode('UTF-8'))

# 读卡数据
t.du()
print(t.buffData.decode('GB2312'))

B.py
import socket
# 服务端


class tcp(object):

    def tcp_server(self):

        # 创建套接字
        self.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 绑定IP和端口
        self.tcp_client_socket.bind(('192.168.0.114', 8081))

        # 设置监听
        self.tcp_client_socket.listen(128)
        while True:
            # 等待连接
            self. new_client_socket, self.client_addr = self.tcp_client_socket.accept()

            while True:
                # 接收客户端发送的请求
                self.recv_data = self.new_client_socket.recv(1024)

                # 回发信息给客户端
                self.new_client_socket.send("成功!".encode("GBK"))

                if self.recv_data.decode("GBK") == "退出":

                    # 关闭套接字
                    print("连接断开!")
                    self.new_client_socket.close()
                    return exit()

                return self.recv_data.decode('GBK')





最佳答案
2020-3-19 10:16:08
yield在循环内使用就能不断返回值

比如
def test():
    s = 0
    while s < 100:
        yield s
        s += 1
for i in test():
    print(i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-19 10:16:08 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
yield在循环内使用就能不断返回值

比如
def test():
    s = 0
    while s < 100:
        yield s
        s += 1
for i in test():
    print(i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 10:24:29 | 显示全部楼层
最简单粗暴的方法,把 t = B.tcp()加到while循环里:
import B
while True:
        t = B.tcp()
        print(t.tcp_server())

第二个方法,把print写到class里去
import socket

class tcp(object):

    def tcp_server(slef):

        # 创建套接字
        slef.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 绑定IP和端口
        slef.tcp_client_socket.bind(('192.168.0.114', 8081))

        # 设置监听
        slef.tcp_client_socket.listen(128)
        while True:
            # 等待连接
            slef. new_client_socket, slef.client_addr = slef.tcp_client_socket.accept()

            while True:
                # 接收客户端发送的请求
                slef.recv_data = slef.new_client_socket.recv(1024)

                # 回发信息给客户端
                slef.new_client_socket.send("成功!".encode("GBK"))

                if slef.recv_data.decode("GBK") == "退出":

                    # 关闭套接字
                    print("连接断开!")
                    slef.new_client_socket.close()
                    return exit()

                print(slef.recv_data.decode('GBK'))
                return 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 10:28:11 | 显示全部楼层
只要在while里面就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 11:32:25 | 显示全部楼层
多嘴一句,slef 的正确拼写是 self。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 14:09:37 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-19 11:32
多嘴一句,slef 的正确拼写是 self。

对耶,可是为什么 我写slef 它没报错? 也能通过?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 14:10:12 | 显示全部楼层
wangka 发表于 2020-3-19 10:28
只要在while里面就行了

不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 14:12:01 | 显示全部楼层
txxcat 发表于 2020-3-19 10:24
最简单粗暴的方法,把 t = B.tcp()加到while循环里:

第一个方法,我也是了好像不像,因为我要接收那个数据后,进行一个另外的操作

第二个方法,可以循环发送,但是return回去的是空,这样A.py 就拿不到数据 做处理了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 14:12:36 | 显示全部楼层
hrp 发表于 2020-3-19 10:16
yield在循环内使用就能不断返回值

比如

这个是加在class里面吗? 还是 A.py文件里面?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 14:32:22 | 显示全部楼层
wnhuiyou 发表于 2020-3-19 14:09
对耶,可是为什么 我写slef 它没报错? 也能通过?

参数写什么都一样啦,不过官方建议是self
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-20 12:20:43 From FishC Mobile | 显示全部楼层
wnhuiyou 发表于 2020-3-19 14:12
这个是加在class里面吗? 还是 A.py文件里面?

写在你需要不断返回数据的函数里。但是如果没有什么必需要从中间返回数据然后继续往下执行的场景,没必要用yield,从调用处用循环重复调用函数,结果也是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 03:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表