gaoxiuhua520 发表于 2022-8-20 23:02:55

有没大哥哥小姐姐懂这个的

origin = (0, 0)         # 原点
legal_x = [-100, 100]   # x轴的移动范围
legal_y = [-100, 100]   # y轴的移动范围

def create(pos_x=0, pos_y=0):
# 初始化位于原点为主   
    def moving(direction, step):
    # direction参数设置方向,1为向右(向上),-1为向左(向下),0为不移动
    # step参数设置移动的距离
      nonlocal pos_x, pos_y
      new_x = pos_x + direction * step
      new_y = pos_y + direction * step
      # 检查移动后是否超出x轴边界
      if new_x < legal_x:
            pos_x = legal_x - (new_x - legal_x)
      elif new_x > legal_x:
            pos_x = legal_x - (new_x - legal_x)
      else:            
            pos_x = new_x
      # 检查移动后是否超出y轴边界
      if new_y < legal_y:
            pos_y = legal_y - (new_y - legal_y)
      elif new_y > legal_y:
            pos_y = legal_y - (new_y - legal_y)
      else:            
            pos_y = new_y
      return pos_x, pos_y
    return moving
   
move = create()reate.<locals>.moving() missing 1 required positional argument: 'step'

print('向右移动10步后,位置是:', move(, 10))   ############这里为什么不能用move()(10),闭包不是可以这样吗?会报错reate.<locals>.moving() missing 1 required positional argument: 'step' =创建。<局部变量>。moving()缺少1个必需的位置参数:“step”


print('向上移动130步后,位置是:', move(, 130))
print('向左移动10步后,位置是:', move([-1, 0], 10))

jackz007 发表于 2022-8-21 00:39:33

本帖最后由 jackz007 于 2022-8-21 10:34 编辑

      这个代码在我这里没有任何问题
origin = (0, 0)         # 原点
legal_x = [-100, 100]   # x轴的移动范围
legal_y = [-100, 100]   # y轴的移动范围

def foo(p , v):
    if v < p:
      v = p - (p - v)
    elif v > p:
      v = p + (v - p)
    return v

def create(pos_x = 0 , pos_y = 0):
# 初始化位于原点为主   
    def moving(direction , step):
    # direction参数设置方向,1为向右(向上),-1为向左(向下),0为不移动
    # step参数设置移动的距离
      nonlocal pos_x, pos_y
      new_x = pos_x + direction * (step % (legal_x - legal_x))
      new_y = pos_y + direction * (step % (legal_y - legal_y))
      pos_x , pos_y = foo(legal_x , new_x) , foo(legal_y , new_y)
      return pos_x , pos_y                  
    return moving
   
move = create()
print('向右移动 10步后,位置是:' , move([ 1 , 0] ,10))
print('向上移动130步后,位置是:' , move([ 0 , 1] , 130))
print('向左移动 10步后,位置是:' , move([-1 , 0] ,10))
print('向右移动570步后,位置是:' , move([ 1 , 0] , 570))
print('向上移动330步后,位置是:' , move([ 0 , 1] , 330))
print('向左移动420步后,位置是:' , move([-1 , 0] , 420))
      运行实况:
D:\\Python>python x.py
向右移动 10步后,位置是: (10, 0)
向上移动130步后,位置是: (10, -70)
向左移动 10步后,位置是: (0, -70)
向右移动570步后,位置是: (-30, -70)
向上移动330步后,位置是: (-30, 60)
向左移动420步后,位置是: (-50, 60)

D:\\Python>

wp231957 发表于 2022-8-21 07:29:49

建议发帖时,不要老是发有没大哥哥小姐姐懂这个的
这样你在查看你自己的帖子时所有帖子主题都一样   自己不懵圈吗

gaoxiuhua520 发表于 2022-8-24 13:49:23

jackz007 发表于 2022-8-21 00:39
这个代码在我这里没有任何问题

      运行实况:

############这里为什么不能用move()(10),闭包不是可以这样吗?会报错reate.<locals>.moving() missing 1 required positional argument: 'step' =创建。<局部变量>。moving()缺少1个必需的位置参数:“step”   我意思为什么这里为什么不是move()(10) 课程里都是可以这样写的

jackz007 发表于 2022-8-24 14:09:17

本帖最后由 jackz007 于 2022-8-24 14:17 编辑

gaoxiuhua520 发表于 2022-8-24 13:49
############这里为什么不能用move()(10),闭包不是可以这样吗?会报错reate..moving() missing...

      move 指向 create() 的内嵌函数 moving(),move() 就是 create() . moving() ,如你所见,move() 只能有一个括号,代表调用 create() 的内嵌函数 moving(),move()(10) 却写了 2 个括号,究竟代表什么,反正我是完全没有看懂。
      带 2 个括号的形式,应该这样写:
create()( , 10)
      不过,如果这样写,每次移动都是从 (0 , 0) 开始,多次移动的坐标之间不存在继承性。

gaoxiuhua520 发表于 2022-8-26 13:28:48

jackz007 发表于 2022-8-24 14:09
move 指向 create() 的内嵌函数 moving(),move() 就是 create() . moving() ,如你所见,move ...

谢谢了,又看懂一些
页: [1]
查看完整版本: 有没大哥哥小姐姐懂这个的