当前位置:  开发笔记 > 编程语言 > 正文

我正在调用我在python中的函数,即使我只是定义它

如何解决《我正在调用我在python中的函数,即使我只是定义它》经验,为你挑选了1个好方法。

我有一个叫做攻击的功能:

def attack(name,minmultiplier,maxmultiplier,critchance,attacker,attackee):
    print(attacker[0],"used",name)
    multiplier=random.randint(minmultiplier,maxmultiplier)
    crit=random.randint(critchance,100)
    if crit==100 and ((attacker[2]*multiplier*2)-attackee[3]) > 0:
        attackee[1]=attackee[1]-((attacker[2]*multiplier*2)-attackee[3])
    elif ((attacker[2]*multiplier)-attackee[3]) > 0:
        attackee[1]=attackee[1]-((attacker[2]*multiplier)-attackee[3])
    else:
        print("You fail to hit",attackee[0])
    print(attackee[0],"'s health after",attacker[0],"'s attack is",attackee[1])

我正在为老板和玩家做一些实际的攻击:

boss=["Greed",1000,10,10,1]
slashp=attack("slash",1,2,5,player,boss)
slashb=attack("slash",1,2,5,boss,player)
kick=attack("kick",1,1,1,player,boss)
aiattacklist=[slashb]
attacknamelist=["slash","kick"]
attackfunclist=[slashp,kick]

即使我只将这些版本保存为变量,它们仍然被调用:

template used slash
You fail to hit Greed
Greed 's health after template 's attack is 1000
Greed used slash
template 's health after Greed 's attack is 58
template used kick
You fail to hit Greed
Greed 's health after template 's attack is 1000

这是python总是做的事情,还是我做错了什么,因为我不希望这些被调用(对不起,如果我没有使用正确的术语,我有点新)



1> Martijn Piet..:

你在这里调用函数:

slashp=attack("slash",1,2,5,player,boss)
slashb=attack("slash",1,2,5,boss,player)
kick=attack("kick",1,1,1,player,boss)

您在那里存储返回值,而不是函数.

如果你想存储一些预定义的参数,要么使用另一个函数来包装调用,使用lambda(基本上是创建函数的简化形式),或者用于functools.partial()预定义一些参数并为这些参数存储新的callable.

使用lambda看起来像这样:

shlashp = lambda player, boss: attack("slash", 1, 2, 5, player, boss)
shlashb = lambda player, boss: attack("slash", 1, 2, 5, boss, player)
kick = lambda player, boss: attack("kick", 1, 1, 1, player, boss)

这假设你在调用这些函数时仍然想要稍后指定播放器和boss .你打电话kick(player, boss),比如说.

使用functools.partial()在这里不合适,因为你正在交换bossplayer参数; 你只需要定义一个slash变量并以正确的顺序传入bossplayer参数:

from functools import partial

slash = partial(attack, 'slash', 1, 2, 5)
kick = partial(attack, 'kick', 1, 1, 1)

无论是打电话slash还是kick加上任何额外的参数,所以slash(player, boss)要求具有添加到你已经中定义的这两个参数的函数.

所有这一切都假设您希望能够管理多个玩家和老板.如果你playerboss变量是全局(也许只有永远一个球员和一个老板打),然后你只是通过那些定义时lambdapartial和你没有额外的参数传递.例如:

slashp = partial(attack, 'slash', 1, 2, 5, player, boss)
slashb = partial(attack, 'slash', 1, 2, 5, boss, player)
kick = partial(attack, 'kick', 1, 1, 1, player, boss)

并让玩家踢老板,你只需要打电话kick().

之间的区别partial对象和lambda是你可以反省partial对象; 你可以很容易地看到你定义的参数总是传入:

>>> from functools import partial
>>> def attack(*args): return args
...
>>> demo = partial(attack, 'kick', 1, 2, 5)
>>> demo.args
('kick', 1, 2, 5)
>>> demo()
('kick', 1, 2, 5)
>>> demo('player1', 'boss2')
('kick', 1, 2, 5, 'player1', 'boss2')

partial对象不能被用来作为一个类中的方法,一个函数对象即可.如果需要在类上使用此功能,请使用functools.partialmethod()对象.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有