当前位置:   article > 正文

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

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

 

  1. import asyncio
  2. list = []
  3. async def StartState(nums):
  4. '''
  5. 开始状态S0
  6. :param nums:输入的条件
  7. :return:
  8. '''
  9. #你的代码在这里#
  10. print('Start Transition :')
  11. list.append('S0')
  12. if next(nums) == 1:
  13. await State1(1,next(nums))
  14. else:
  15. await State1(0,next(nums))
  16. async def State1(transition_value: int, input_value):
  17. '''
  18. 状态S1
  19. :param transition_value:上一个状态到S1状态的条件,例如StartState转换到State1时,transition_value为1
  20. :param input_value:输入的条件nums
  21. :return: 当转换结束时,返回S1状态转换到其他状态的动作
  22. '''
  23. #你的代码在这里#
  24. i=len(list)
  25. list.append('S1')
  26. print('{0} calling {1} value = {2}'.format(list[i-1],list[i],transition_value))
  27. if input_value == 1:
  28. await State2(1,next(nums))
  29. else:
  30. await State3(0,next(nums))
  31. async def State2(transition_value: int, input_value):
  32. '''
  33. 状态S2
  34. :param transition_value:上一个状态到S2状态的条件,例如StartState转换到State2时,transition_value为0
  35. :param input_value:输入的条件nums
  36. :return:当转换结束时,返回S2状态转换到其他状态的动作
  37. '''
  38. #你的代码在这里#
  39. i=len(list)
  40. list.append('S2')
  41. print('{0} calling {1} value = {2}'.format(list[i - 1], list[i], transition_value))
  42. if input_value == 1:
  43. await State3(1,next(nums))
  44. else:
  45. await State1(0,next(nums))
  46. async def State3(transition_value: int, input_value):
  47. '''
  48. 状态S3
  49. :param transition_value:上一个状态到S3状态的条件,例如State2转换到State3时,transition_value为1
  50. :param input_value:输入的条件nums
  51. :return:当转换结束时,返回S3状态转换到其他状态的动作
  52. '''
  53. #你的代码在这里#
  54. i = len(list)
  55. list.append('S3')
  56. print('{0} calling {1} value = {2}'.format(list[i - 1], list[i], transition_value))
  57. if input_value == 1:
  58. await EndState(1)
  59. else:
  60. await State1(0,next(nums))
  61. async def EndState(transition_value: int):
  62. '''
  63. 结束状态S4
  64. :param transition_value:上一个状态到S4状态的条件
  65. :return:返回转换结束时的动作
  66. '''
  67. #你的代码在这里#
  68. i = len(list)
  69. list.append('S4')
  70. print('{0} calling {1} value = {2}'.format(list[i - 1], list[i], transition_value))
  71. if __name__ == "__main__":
  72. nums = iter(eval(input()))
  73. loop = asyncio.get_event_loop()
  74. loop.run_until_complete(StartState(nums))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/616908
推荐阅读
相关标签
  

闽ICP备14008679号