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

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 添加一个 return 语句。然后在第二个代码中将 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 的一个实例。

与其拥有所有自由浮动变量,不如将它们分组到 class 中可能更容易。例如,您可以为通用统计信息创建一个 class,并创建一个工厂函数来创建该 class.

的实例
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,
    )

在主要方法中,您可以使用工厂方法检索统计信息:

from monsterstats import *

stats = common_monsterstat()

def battlesys():
  print("You challenged Monster!")
  print("Monster's health: " + stats.health)

为了更轻松地编写此 class,您可以利用数据class,它非常适合纯数据对象。

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()

这将使您的代码更改全局健康而不是创建它的副本...

但更好的方法是简单地 return 健康变量,因为根据我的经验,全局关键字会在一段时间后变得混乱。但是,如果你需要你的游戏非常高效,而你可能不需要,那么使用 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变量,给它赋值,return它到另一个变量,然后打印它...看起来更复杂但实际上更容易...

如果您需要任何说明,请告诉我! PS:您可能想为您的怪物取一个随机名称,并使用 f-string 以更酷的方式命名:

monsters=['centaurus','dwarf','spider']
def battlesys():
   print(f"You challenged {r.choice(monsters)}!")
   print("Monster's health: " + health)

PPS: 你没有在代码中导入 random...