Skip to main content
 首页 » 编程设计

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

2025年05月04日15落叶

我有一个叫做攻击的函数:

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 总是做的事情,还是我做错了什么,因为我不想调用这些(抱歉,如果我没有使用正确的术语,我有点新)

请您参考如下方法:

你在这里调用函数:

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()预定义一些参数并为这些参数存储一个新的可调用对象。

使用 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) 

这假设您稍后在调用这些函数时仍想指定玩家和老板。例如,您可以调用 kick(player, boss)。

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

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

调用 slash 或 kick 会添加任何额外的参数,所以 slash(player, boss)调用将这两个参数添加到您已经定义的参数上的函数。

所有这些都假设您希望能够管理多个玩家和老板。如果您的 player 和 boss 变量是全局变量(也许只有 one player 和 one boss 可以战斗) ,那么您只需在定义 lambda 或 partial 时传入它们,而不会传入额外的参数。例如:

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) 

要让玩家踢 Boss,您只需调用 kick()。

partial 对象和 lambda 之间的区别在于您可以内省(introspection) 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() object如果您需要在类里面使用此功能。