代码之家  ›  专栏  ›  技术社区  ›  Dane234345

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

  •  -1
  • Dane234345  · 技术社区  · 3 年前

    我试图使用另一个文件中的函数为一些变量生成随机值,但它似乎不起作用

    作用

    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)
    
    4 回复  |  直到 3 年前
        1
  •  0
  •   Jogvi    3 年前

    你的视野有问题。创建函数时,为其赋值的每个变量都是局部变量(除非使用 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 变量,为其赋值,将其返回到另一个变量中,然后打印它。。。看起来更复杂,但实际上更容易。。。

    如果你需要任何澄清,请告诉我! 附言:你可能想给你的怪物取一个随机的名字,并用一个f字串以更酷的方式命名:

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

    PPS:您没有在代码中导入random。。。

        2
  •  0
  •   Yusuf Syam    3 年前

    内部 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)
    
        3
  •  0
  •   Tim Roberts    3 年前

    如果这只是设置数据,请不要使用函数。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 ,并导入该类的实例。

        4
  •  0
  •   flakes    3 年前

    与其拥有所有自由浮动变量,不如将它们分组到一个类中。例如,您可以拥有一个用于泛型统计的类,并创建一个工厂函数来创建该类的实例。

    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方法中,您可以使用factory方法检索统计信息:

    from monsterstats import *
    
    stats = common_monsterstat()
    
    def battlesys():
      print("You challenged Monster!")
      print("Monster's health: " + stats.health)
    

    为了使编写此类更加容易,您可以利用dataclass,它非常适合于纯数据对象。

    from dataclasses import dataclass
    
    @dataclass
    class Stats:
        attack: int
        defense: int
        health: int
        maxhealth: int
    
    ...