头歌python实训通关八——进程和线程——进阶

第1关:异步状态转换器

任务描述

本关任务:编写一个异步状态转换器

相关知识

状态机是一个对真实世界的抽象,而且是逻辑严谨的数学抽象,所以明显非常适合用在数字领域。可以应用到各个层面上,例如硬件设计,编译器设计,以及编程实现各种具体业务逻辑的时候。现在请你实现一个异步的有限状态机

一个有限状态机包含如下几个要素: 状态:系统所处的状态,在运行过程中又可以分为当前状态和下一阶段状态;一个状态机至少要包含两个状态。例如门,有 open 和 closed 两个状态。 事件:也可以理解为每一次运行的输入;事件就是执行某个操作的触发条件或者口令。对于门,“按下开门按钮”就是一个事件。 条件:根据输入事件执行的判定条件,条件是基于状态的,当前所处的每一种状态,都可以有自己对应的一套判定条件,来决定下一步进入哪一种状态;也就是从一个状态变化为另一个状态。例如“开不开门”根据有没有钥匙的条件。 动作:确定切换路径后,执行的附加操作。事件发生以后要执行动作。例如事件是“按开门按钮”,动作是“开门”。 变换:就是从一个状态变化为另一个状态。例如“开门过程”就是一个变换。 举例:街上的自动售货机中明显能看到状态机逻辑。假设有一台只卖2元一瓶的汽水的售货机,只接受五毛和一块的硬币。初始状态是”未付款“,中间状态有”已付款5毛“,”已付款1块“,”已付款1.5块“,”已足额付款“,四个状态。状态切换的触发条件是”投一块硬币“和”投5毛硬币“两种,”到达足额付款“状态,还要进行余额清零和弹出汽水操作。 在下图中,可以看到系统有 S1, S2, S3, S4 四个状态, 0 和 1 是状态机可以从一个状态到另一个状态的值,例如,只有当只为1的时候,S0可以转换到S1,当只为0的时候, S0可以转换到S2。这个转换的过程就是根据条件来切换状态,题目中,我们会输入一组数字作为事件,根据这一组数字,完成状态转换并输出相应的动作,从 S0 开始,叫做 初始状态,最后到 S4,叫做结束状态。

请你根据输入的一组数字,输出各个状态的转换过程。(状态一定从S0开始,到S4结束)。

为了完成本关任务,你需要掌握: 1.协程相关内容 2.asyncio模块

编程要求

根据提示,在右侧编辑器补充代码,实现一个状态转换器。

测试说明

平台会对你编写的代码进行测试:

测试输入: [1,0,0,1,1,1] 预期输出: Start Transition : S0 calling S1 value = 1 S1 calling S3 value = 0 S3 calling S1 value = 0 S1 calling S2 value = 1 S2 calling S3 value = 1 S3 calling S4 value = 1

 

import asyncio
list = []


async def StartState(nums):
    '''
    开始状态S0
    :param nums:输入的条件
    :return:
    '''
    #你的代码在这里#
    print('Start Transition :')
    list.append('S0')
    if next(nums) == 1:
        await State1(1,next(nums))
    else:
        await State1(0,next(nums))

async def State1(transition_value: int, input_value):
    '''
    状态S1
    :param transition_value:上一个状态到S1状态的条件,例如StartState转换到State1时,transition_value为1
    :param input_value:输入的条件nums
    :return: 当转换结束时,返回S1状态转换到其他状态的动作
    '''
    #你的代码在这里#
    i=len(list)
    list.append('S1')
    print('{0} calling {1} value = {2}'.format(list[i-1],list[i],transition_value))
    if input_value == 1:
        await State2(1,next(nums))
    else:
        await  State3(0,next(nums))

async def State2(transition_value: int, input_value):
    '''
    状态S2
    :param transition_value:上一个状态到S2状态的条件,例如StartState转换到State2时,transition_value为0
    :param input_value:输入的条件nums
    :return:当转换结束时,返回S2状态转换到其他状态的动作
    '''
    #你的代码在这里#
    i=len(list)
    list.append('S2')
    print('{0} calling {1} value = {2}'.format(list[i - 1], list[i], transition_value))
    if input_value == 1:
        await State3(1,next(nums))
    else:
        await State1(0,next(nums))

async def State3(transition_value: int, input_value):
    '''
    状态S3
    :param transition_value:上一个状态到S3状态的条件,例如State2转换到State3时,transition_value为1
    :param input_value:输入的条件nums
    :return:当转换结束时,返回S3状态转换到其他状态的动作
    '''
    #你的代码在这里#
    i = len(list)
    list.append('S3')
    print('{0} calling {1} value = {2}'.format(list[i - 1], list[i], transition_value))
    if input_value == 1:
        await EndState(1)
    else:
        await State1(0,next(nums))

async def EndState(transition_value: int):
    '''
    结束状态S4
    :param transition_value:上一个状态到S4状态的条件
    :return:返回转换结束时的动作
    '''
    #你的代码在这里#
    i = len(list)
    list.append('S4')
    print('{0} calling {1} value = {2}'.format(list[i - 1], list[i], transition_value))

if __name__ == "__main__":
    nums = iter(eval(input()))
    loop = asyncio.get_event_loop()
    loop.run_until_complete(StartState(nums))

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值