Как я могу вызвать одну функцию внутри другой? - PullRequest
0 голосов
/ 04 марта 2020

Я просто хочу создать отдельную функцию в классе игральных костей, которая позволила бы мне сохранять каждый «бросок» в списке list_of_rolls в функции «бросок». поэтому, когда вызывается «rolls», он отображает список всех выполненных «roll» (если есть).

Я пытался использовать global, но это не сработало (возможно, я сделал это неправильно), я также слышал использование глобальных является плохой привычкой, поэтому, если есть другой способ, я бы не возражал. мои отступы правильны, это просто не показано здесь.

import random


class Dice:

    def roll(self):
        x = random.randint(1, 6)
        y = random.randint(1, 6)
        roll_list = (x, y)
        return roll_list

    def rolls(self):
        list_of_rolls = []
        final = list_of_rolls.append()
        return final

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Вы должны бросить кубики в rolls, вызвав функцию roll, которую вы можете сделать

import random


class Dice:

def roll(self):
    x = random.randint(1, 6)
    y = random.randint(1, 6)
    roll_list = (x, y)
    return roll_list

def rolls(self,times):
    return [self.roll() for _ in range(times)]


print(Dice().rolls(7))
0 голосов
/ 04 марта 2020

Есть несколько способов сделать это. Однако я просто собираюсь предложить самый простой способ - использовать текстовый файл для хранения истории бросков внутри самого класса Dice. Обратите внимание, что con будет несколько экземпляров Dice будут иметь доступ к одному и тому же файлу истории Однако эта реализация может быть не оптимизирована, так как каждый раз, когда вы бросаете кубик, вы открываете файл и добавляете в него новые броски. Это может быть не идеально, если вам нужны миллионы рулонов. Тем не менее, я оставлю это вам для улучшения / оптимизации решения.

import random

class Dice:
    list_of_rolls = []
    filename = "./roll_history.txt" # a textfile to store history of rolls

def __init__(self):
    try: # just to check if file exists if not create one for storing
        file = open(self.filename, "r")
    except FileNotFoundError:
        print("File not found")
        file = open(self.filename, "x") #creates file
    finally:
        file.close()

    with open(self.filename, 'r') as opened_file_object:
        self.list_of_rolls = opened_file_object.read().splitlines()
    print(self.list_of_rolls)

def roll(self):
    x = random.randint(1, 6)
    y = random.randint(1, 6)
    roll_list = (x, y)
    self.list_of_rolls.append(roll_list) # updates the array with latest roll
    file = open(self.filename, 'a') # 'a' for appending new rolls
    # I append a newline so that the rolls are more readable in the text file
    file.write('(' + str(x) + ',' + str(y) + ')\n') # appends a newline
    return roll_list

def rolls(self):
    return self.list_of_rolls

print(Dice().roll()) # append 2 dice rolls here
print(Dice().roll())
print(Dice().rolls()) # you should see 2 dice rolls here

попробуйте закрыть программу python и запустить ее снова,

Dice() # you should be able to see past rolls
0 голосов
/ 04 марта 2020

Объявите list_of_rolls как переменную-член класса вместо определения ее в функции. Создайте конструктор для его инициализации. Если вы делаете это после имени класса, чем это делается для класса, а не на уровне экземпляра.

import random
class Dice:
    # list_of_rolls = [] # becomes class variable and dont use it

    def __init__(self):
         self.list_of_rolls = []        

    def roll(self):
...