鱼C论坛

 找回密码
 立即注册
查看: 2413|回复: 1

[已解决]二问:Py题 500个小孩

[复制链接]
发表于 2021-5-24 13:58:47 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Peteryo01223 于 2021-5-24 14:03 编辑

最后的 print 里,即:第67行,
  1. print(circle.head.gid)
复制代码

circle.head.gid,能帮我解释一下,gid 是怎们进来的么?
我想问:如果,circle.head 是 Circle 类的实例化属性。那么 Kid 类 的属性 gid,怎们能拿过去直接实例化 Circle 类的属性呢?这三个东西用两个英文句号链接在一起,我就没看懂。难道是,用 Circle类的一个实例化属性,放到了 Kid类里面,去进行实例化么?

正确的code如下:
  1. # 第一个类:kid
  2. # 第二个类:circle
  3. # kid 属性:编号gid,lefthand、righthand
  4. # 圈属性:head 和 tail。
  5. # 圈的行为:加入一个小孩,移除一个小孩。

  6. class Kid:
  7.     def __init__(self, gid):
  8.         self.gid = gid  # 小孩属性之编号
  9.         self.left = None  # 小孩属性之左手
  10.         self.right = None  # 小孩属性之右手


  11. class Circle:
  12.     # 初始化的时候,定义圈的头和尾
  13.     def __init__(self, count):
  14.         self.head = None
  15.         self.tail = None

  16.         for i in range(count):
  17.             self.add(Kid(i + 1))

  18.     def add(self, kid):
  19.         # 向圈里,加入一个小孩
  20.         # 如果圈里,一个孩子都没有
  21.         if self.head is None and self.tail is None:
  22.             # 如果头尾相同的情况,也就是说这个小孩就是答案
  23.             self.head = self.tail = kid.left = kid.right = kid

  24.         else:
  25.             # 向圈里,加小孩
  26.             kid.left = self.head  # 加入的小孩左手边是打头的小孩
  27.             kid.right = self.tail  # 加入的小孩的右手边,是末尾的小孩
  28.             self.head.right = kid  # 打头的小孩右手边,是加入的新小孩
  29.             self.tail.left = kid # 末尾的小孩右手边,是加入的新小孩
  30.             self.tail = kid  # 定义,加入的新小孩,成为了圈的尾。

  31.     def remove(self, kid):
  32.         # 从圈里面移除一个小孩
  33.         if kid is self.head:
  34.             self.head = kid.left
  35.         if kid is self.tail:
  36.             self.tail = kid.right

  37.         kid.left.right = kid.right
  38.         kid.right.left = kid.left
  39.         kid.left = None
  40.         kid.right = None


  41. circle = Circle(500)
  42. cur = circle.head
  43. step = 1

  44. while circle.head is not circle.tail:
  45.     # 当圈里不只一个小孩的时候,就继续。直到,圈里仅剩下,一个孩子为止。
  46.     cur = cur.left
  47.     # 让当先的教鞭,指向头上的小孩开始。指向下一个,左边的小孩,判断这个小孩要不要出圈。
  48.     if step % 3 == 0:
  49.         circle.remove(cur.right)
  50.         # 符合这个条件,则这个小孩出圈。
  51.         # 如果直接移除 cur,那就找不到 cur 本身的位置了。
  52.         # 所以,采用了指针指向左侧的下一个位置,然后移除这个位置右边的小孩。
  53.     step += 1
  54.     # 定义一个计步器step

  55. print(circle.head.gid)
复制代码
最佳答案
2021-5-24 14:03:26


这里主要是你 Circle 类中方法传入的参数对象都是  Kid 类 的实例

而且你 Circle 类 的 变量 head 被赋值为 kid 为 Kid 类的实例对象了

则此时你 circle.head.gid 相当于 调用的是此时 head 被赋值为的 Kid 类实例对象的 gid 属性

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-24 14:03:26 | 显示全部楼层    本楼为最佳答案   


这里主要是你 Circle 类中方法传入的参数对象都是  Kid 类 的实例

而且你 Circle 类 的 变量 head 被赋值为 kid 为 Kid 类的实例对象了

则此时你 circle.head.gid 相当于 调用的是此时 head 被赋值为的 Kid 类实例对象的 gid 属性

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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