[英]Importing variables from a function inside another file
我正在尝试使用另一个文件中的函数为某些变量生成随机值,但它似乎不起作用
功能
def common_monsterstat():
mattack = random.randint(1, 5)
mdefense = random.randint(0, 1)
mhealth = random.randint(5, 10)
mmaxhealth = mhealth
使用函数的代码(函数所在的文件名为 monsterstats.py)
from monsterstats import *
common_monsterstat()
def battlesys():
print("You challenged Monster!")
print("Monster's health: " + mhealth)
在def common_monsterstat()
函数中添加了一个用于 mmaxhealth 的返回语句。 然后在第二个代码中将 mhealth 分配给common_monsterstat()
函数。 我建议你在 python 上学习函数、全局和局部变量 :)
这是修复代码:
def common_monsterstat():
mattack = random.randint(1, 5)
mdefense = random.randint(0, 1)
mhealth = random.randint(5, 10)
mmaxhealth = mhealth
return mmaxhealth
from monsterstats import *
mhealth= common_monsterstat()
def battlesys():
global mhealth
print("You challenged Monster!")
print("Monster's health: " + mhealth)
如果这只是设置数据,请不要使用函数。 Yu 可以定义按名称导入的常量。 在“monsterstatps.py”中:
import random
mattack = random.randint(1, 5)
mdefense = random.randint(0, 1)
mhealth = random.randint(5, 10)
然后在你的“main.py”中:
from monsterstats import *
def battlesys():
print("You challenged Monster!")
print("Monster's health: " + mhealth)
从长远来看,您可能会定义一个包含这些值的class Stats
,并导入该类的一个实例。
与其拥有所有自由浮动变量,不如将它们分组到一个类中可能更容易。 例如,您可以拥有一个用于通用统计的类,并创建一个工厂函数来创建该类的实例。
class Stats:
def __init__(self, attack, defense, health, maxhealth):
self.attack = attack
self.defense = defense
self.health = health
self.maxhealth = maxhealth
def common_monsterstat():
mattack = random.randint(1, 5)
mdefense = random.randint(0, 1)
mhealth = random.randint(5, 10)
mmaxhealth = mhealth
return Stats(
attack=mattack,
defense=mdefense,
health=mhealth,
maxhealth=mmaxhealth,
)
在 main 方法中,您可以使用工厂方法来检索统计信息:
from monsterstats import *
stats = common_monsterstat()
def battlesys():
print("You challenged Monster!")
print("Monster's health: " + stats.health)
为了使编写此类更加容易,您可以利用数据类,它非常适合纯数据对象。
from dataclasses import dataclass
@dataclass
class Stats:
attack: int
defense: int
health: int
maxhealth: int
...
你的范围有问题。 创建函数时,您为其赋值的每个变量都是局部变量(除非您使用global
关键字)。 您可以像这样使用全局关键字:
mhealth=0
def common_monsterstat():
global mhealth
mattack = random.randint(1, 5)
mdefense = random.randint(0, 1)
mhealth = random.randint(5, 10)
mmaxhealth = health
def battlesys():
print("You challenged Monster!")
print("Monster's health: " + mhealth)
common_monsterstat()
这将使您的代码更改全局运行状况,而不是创建它的副本...
但更好的方法是简单地返回健康变量,因为根据我的经验,全局关键字可能会在一段时间后变得混乱。 但是,如果您需要您的游戏真正高效,而您可能不需要,使用 global 可以避免创建太多变量(虽然不确定它是否会更高效,我只是这么认为 :))所以,您可以像这样做:
def common_monsterstat():
mattack = random.randint(1, 5)
mdefense = random.randint(0, 1)
mhealth = random.randint(5, 10)
mmaxhealth = mhealth
return mhealth
def battlesys():
mhealth=common_monsterstat()
print("You challenged Monster!")
print("Monster's health: " + mhealth)
common_monsterstat()
battlesys()
这将创建一个local
变量,为其赋值,将其返回到另一个变量中,然后打印它......看起来更复杂但实际上更容易......
如果您需要任何澄清,请告诉我! PS:你可能想为你的怪物起一个随机的名字,并用一个 f-string 以更酷的方式命名:
monsters=['centaurus','dwarf','spider']
def battlesys():
print(f"You challenged {r.choice(monsters)}!")
print("Monster's health: " + health)
PPS:您没有在代码中导入随机...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.