繁体   English   中英

从另一个文件中的函数导入变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM