鱼C论坛

 找回密码
 立即注册
查看: 2528|回复: 5

[已解决]有没大哥哥小姐姐懂这个的

[复制链接]
发表于 2022-8-20 23:02:55 | 显示全部楼层 |阅读模式

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

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

x
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[0] * step
        new_y = pos_y + direction[1] * step
        # 检查移动后是否超出x轴边界
        if new_x < legal_x[0]:
            pos_x = legal_x[0] - (new_x - legal_x[0])
        elif new_x > legal_x[1]:
            pos_x = legal_x[1] - (new_x - legal_x[1])
        else:            
            pos_x = new_x
        # 检查移动后是否超出y轴边界
        if new_y < legal_y[0]:
            pos_y = legal_y[0] - (new_y - legal_y[0])
        elif new_y > legal_y[1]:
            pos_y = legal_y[1] - (new_y - legal_y[1])
        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([1, 0], 10))   ############这里为什么不能用move([1,0])(10)  ,闭包不是可以这样吗?会报错reate.<locals>.moving() missing 1 required positional argument: 'step' =创建。<局部变量>。moving()缺少1个必需的位置参数:“step”


print('向上移动130步后,位置是:', move([0, 1], 130))
print('向左移动10步后,位置是:', move([-1, 0], 10))
最佳答案
2022-8-24 14:09:17
本帖最后由 jackz007 于 2022-8-24 14:17 编辑
gaoxiuhua520 发表于 2022-8-24 13:49
############这里为什么不能用move([1,0])(10)  ,闭包不是可以这样吗?会报错reate..moving() missing  ...


        move 指向 create() 的内嵌函数 moving(),move() 就是 create() . moving() ,如你所见,move() 只能有一个括号,代表调用 create() 的内嵌函数 moving(),move([1,0])(10) 却写了 2 个括号,究竟代表什么,反正我是完全没有看懂。
        带 2 个括号的形式,应该这样写:
create()([1,0] , 10) 
        不过,如果这样写,每次移动都是从 (0 , 0) 开始,多次移动的坐标之间不存在继承性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[0]:
        v = p[1] - (p[0] - v)
    elif v > p[1]:
        v = p[0] + (v - p[1])
    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[0] * (step % (legal_x[1] - legal_x[0]))
        new_y = pos_y + direction[1] * (step % (legal_y[1] - legal_y[0]))
        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:\[00.Exerciese.2022]\Python>python x.py
向右移动 10步后,位置是: (10, 0)
向上移动130步后,位置是: (10, -70)
向左移动 10步后,位置是: (0, -70)
向右移动570步后,位置是: (-30, -70)
向上移动330步后,位置是: (-30, 60)
向左移动420步后,位置是: (-50, 60)

D:\[00.Exerciese.2022]\Python>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-21 07:29:49 | 显示全部楼层
建议发帖时,不要老是发有没大哥哥小姐姐懂这个的
这样你在查看你自己的帖子时  所有帖子主题都一样   自己不懵圈吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-24 13:49:23 | 显示全部楼层
jackz007 发表于 2022-8-21 00:39
这个代码在我这里没有任何问题

        运行实况:

############这里为什么不能用move([1,0])(10)  ,闭包不是可以这样吗?会报错reate.<locals>.moving() missing 1 required positional argument: 'step' =创建。<局部变量>。moving()缺少1个必需的位置参数:“step”   我意思为什么这里为什么不是move([1,0])(10) 课程里都是可以这样写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-24 14:09:17 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-8-24 14:17 编辑
gaoxiuhua520 发表于 2022-8-24 13:49
############这里为什么不能用move([1,0])(10)  ,闭包不是可以这样吗?会报错reate..moving() missing  ...


        move 指向 create() 的内嵌函数 moving(),move() 就是 create() . moving() ,如你所见,move() 只能有一个括号,代表调用 create() 的内嵌函数 moving(),move([1,0])(10) 却写了 2 个括号,究竟代表什么,反正我是完全没有看懂。
        带 2 个括号的形式,应该这样写:
create()([1,0] , 10) 
        不过,如果这样写,每次移动都是从 (0 , 0) 开始,多次移动的坐标之间不存在继承性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-26 13:28:48 | 显示全部楼层
jackz007 发表于 2022-8-24 14:09
move 指向 create() 的内嵌函数 moving(),move() 就是 create() . moving() ,如你所见,move ...

谢谢了,又看懂一些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 23:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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