gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:04:15 27 4
gpt4 key购买 nike

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

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() 并不合适,因为您要交换 bossplayer 参数;您只需定义一个 slash 变量并以正确的顺序传入 bossplayer 参数:

from functools import partial

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

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

所有这些都假设您希望能够管理多个玩家和老板。如果您的 playerboss 变量是全局变量(也许只有 one player 和 one boss 可以战斗) ,那么您只需在定义 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)

要让玩家踢 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如果您需要在类里面使用此功能。

关于python - 我在 python 中的函数正在被调用,即使我只是定义它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34335718/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com