Найти - Пользователи
Полная версия: Хьюстон, у нас проблемы.
Начало » Python для новичков » Хьюстон, у нас проблемы.
1 2 3 4
white
doza_and
вопрос совершенно неясен.

не знаю как бы объяснить.

 class Data:
    def __init__(self, name, health):
        self.name = name
        self.health = health
        print(self.name)
        print(self.health)
    def rez(self):
        rez  = int(name1.health) - int(name2.health)
        print(rez)
while 1==1:
    name1 = input()
    health1 = input()
    name2 = input()
    health2 = input()
    name1 = Data(name1, health1)
    name2 = Data(name2, health2)
    name1.rez()

Правильно ли я понимаю:
после того как пользователь ввел:
name1 = input()
health1 = input()
name2 = input()
health2 = input()
В классе появились (не знаю как их назвать) переменные self.name = name1 ; self.health = health1 и т.д. .
Когда цикл while пошел на 2ой круг он затер предыдущие значение self.name, self.health? В моем понимании они должны как бы сохранится!?
Тот же вопрос с методом rez, после каждого круга цикла значения заменяются на новые?
И собственно как тогда можно реализовать что бы значения метода rez оставались как бы в памяти, ну и как потом можно к этим значениям обратится?

Сам смутно понимаю как я хочу, что бы было)
PEHDOM
white
Правильно ли я понимаю:
после того как пользователь ввел:
name1 = input()
health1 = input()
name2 = input()
health2 = input()
В классе появились (не знаю как их назвать) переменные self.name = name1 ; self.health = health1 и т.д. .
нет, неправильно, после ввода пользователем данных, создаються ДВА экземпляра(инстанса, обьекта) класса Data у котороых есть атрубуты self.name , self.health (у каждого свое) котороые связываються с переменными name1 и name2.
white
Когда цикл while пошел на 2ой круг он затер предыдущие значение self.name, self.health? В моем понимании они должны как бы сохранится!?
они как бы и сохранились, он создал новые два экземпляра класса Data и связал их с переменными name1 и name2. Теперь обращение к этим переменным будет вызывать уже новые экземпляры класса, а старые никуда не делись, просто вы бльше не можете к ним обращаться, и они будут удалены сборщиком мусора как только так сразу.
white
Тот же вопрос с методом rez, после каждого круга цикла значения заменяются на новые?
да, потому как они вычисляються в момент вызова метода, и нигде после этого не храняться..
white
И собственно как тогда можно реализовать что бы значения метода rez оставались как бы в памяти, ну и как потом можно к этим значениям обратится?
чтобы они “оставались как бы в памяти” их нужно как бы записать в память.И так как вы лучше не делать. класс Data не дожен знать что есть какието инстансы name1 и name2. сделайте rez() просто функцией или если уж хотите делать методом класса то передавайте в него втоой обьект, а еще можно использовать магический метод __sub__()
AD0DE412
white

 class Test:
    var = []
    def __init__(self, test):
        self.test = test
        self.var.append(test)
        
    def show(self):
        print("-->", self.test)
for i in range(5):
    var =Test(i)
    var.show()
    print(var.var)

 ('-->', 0)
[0]
('-->', 1)
[0, 1]
('-->', 2)
[0, 1, 2]
('-->', 3)
[0, 1, 2, 3]
('-->', 4)
[0, 1, 2, 3, 4]

как видете в классе можно сохранять данные доступные всем экземплярам класса

white
Всем спасибо что помогли хоть чуть чуть разобраться.
К сожалению я понял, что таким способом успеха мне не добиться, и концепция изменилась.
Теперь будет , что то типа базы в которую я ввожу данные, они сохраняются. потом опять ввожу и они тоже сохраняются)), но могут выполняться и математические операции типа сложения и вычитания (до этого я дойду позже)
Я не буду вас просить, что бы вы написали это за меня т.к. этим я занимаюсь сугубо для интереса.
Периодически возникают вопросы которые я не знаю как задать гугля, и вот очередной вопрос из этой рубрики:

 class Data():
    var = []
    def __init__ (self, name, price):
        self.name = name
        self.price = price
def file():
    text = open('text.txt', 'a')
    text.write(str(name.name)+ "  " +str(name.price) + "\n")
def sech():
    i = input("Кого ищем:  ", )
    text = open('text.txt', 'r')
    for num, line in enumerate(text, 1):
        if i in line:
            print(str(num) + "  " + line)
            Data.var = line
        else:
            pass
 
while 1==1:
    name = input("Имя: ", )
    price = input("Цена: ", )
    name = Data(name, price)
    file()
    sech()
    print(Data.var)

проблема такая:
1. Почему в переменную var записывается только последняя строка из поиска? У AD0DE412 ,который ответил постом выше , все получается. Взял часть его алгоритма.
2. как можно реализовать в функции sech поиск конкретной строки с условием, что я не знаю есть ли эта строка там?
3. “база данных” в txt это извращение?
PEHDOM
white
1. Почему в переменную var записывается только последняя строка из поиска? У AD0DE412 ,который ответил постом выше , все получается. Взял часть его алгоритма.
потому что var это список, и если вы хотите добавить в него элемент нужно вызывать метод списка append(), а вы делаете Data.var = line, и Data.var, вжух-вжух, и уже не список, а строка.
white
2. как можно реализовать в функции sech поиск конкретной строки с условием, что я не знаю есть ли эта строка там?
ну у строк есть метот find() ишет подстроку в строке, возвращает индекс первого вхождения или -1 если не нашло
white
3. “база данных” в txt это извращение?
ну вообще да, хотя если у вас будет там всего сотня другая значений, то можно и в виде txt(csv, json,или на крайняк dbf)
white
PEHDOM
ну у строк есть метот find() ишет подстроку в строке, возвращает индекс первого вхождения или -1 если не нашло

таким способом у меня не получается, т.к. я не понял как это работает. Придумал чуть чуть другой способ, но возникли трудности. Хотел бы проконсультироваться
 import random
class Data():
    def __init__ (self, name, price):
        self.name = name
        self.price = price    
def file():
    text = open('text.txt', 'a')
    text.write(str(name.name)+ " " +str(name.price) +" "+ "\n")
def sech():
    i = input("Кого ищем:  ", )
    text = open('text.txt', 'r')
    for num, line in enumerate(text, 1):
        if i in line:
            b = random.randint(0, 10000)
            print(str(num) + "  " + line)
            lin = line + str(b)
            print(lin)
        else:
            pass
    sech1(line)
def sech1(lin):
    f = str(input("поиск: ", ))
    text = open('text.txt', 'r')
    for lin in text:
        if f in lin:
            print(lin)
        else:
            pass
    return
while 1==1:
    name = input("Имя: ", )
    price = input("Цена: ", )
    name = Data(name, price)
    file()
    sech()

В функции sech я вывожу и нумерую строки найденные по переменной i. т.к. в файле может быть уйма одинаковых данных, было принято решение cсоздать переменную b = random.randint(0, 10000). Так я пытался создать для строки уникальный id. Дальше передаю переменную lin (в моем понимании это line + id) в функцию sech1. В общем в ищет у меня по моему id. Я понимаю, что я ничего не понимаю.
Хотелось бы понять, что я не так делаю.

Я понимаю что наверное проще сразу передать уникальный id в фаил и потом просто искать по нему.

Сложно у вас все)

Если сделать :
     name = input("Имя: ", )
    price = input("Цена: ", )
    ib = id(name)
    name = Data(name, price, ib)
    file()
    sech()

Возможно ли что переменная id может повторятся, после того как я заново запущу скрип.

или надежнее будет если сделать так:
     name = input("Имя: ", )
    price = input("Цена: ", )
    ib = random.randint(0, 100000)
    name = Data(name, price, ib)
    file()
    sech()
white
Всем огромное спасибо за подсказки. Но походу использовать txt в моей задумке это гиблое дело.
Так что я пропаду на какое то время, пока не придумаю другой способ реализации)

Но все же, подскажите как удалить найденную строку из фала.
Понимаю что это делается путем перезаписи файла, но не в какую получается.
PEHDOM
white
Возможно ли что переменная id может повторятся, после того как я заново запущу скрип.
да вполне возможно
 ib = random.randint(0, 100000)
это тоже не гарантирует уникальность ИД, шанс что переменная повториться в таком случае будет равен кличество_строк_в файле/100000. Вводите или сквозную нумерацию, или как варинт берите время создания в милисекундах (+ 3-4 случайных символа если есть шанс что строки будут добавляться по несколько в миллисекунду..)
white
подскажите как удалить найденную строку из фала.
Понимаю что это делается путем перезаписи файла, но не в какую получается.
Писал по памяти, Мб чегото забыл, но сам принцип работы такой:
 infile = 'file1.txt'
outfile = "file2.txt"
delete_string = 'Mary had a little lamb'
infile = open(infile)
outfile = open(outfile, "w+")
for line in infile:
    if line.rstrip() == delete_string:
        continue
    outfile.write(line)
infile.close()
outfile.close()

white
PEHDOM
Писал по памяти, Мб чегото забыл, но сам принцип работы такой:

Спасибо! Надо будет пробовать по вашему.
 def dell (num):
## Удаляем найденную строку ##
    print ("переданное значение из sech1: ", num)
    text = open('text.txt', 'r')
    spisok = text.readlines()
    w = int(num)
    text.close()
    text1 = open('text.txt', 'w')
    spisok[w-1] = " \n"
    text1.writelines(spisok)
    text1.close()
Способ который я сейчас использую создает пустые строки, думаю ваш будет лучше работать.

Сейчас вот понял, что я даже не знаю как собрать из кусочков в одно целое. И как это должно все выглядеть. tkinter очень сильно ограничивает в возможностях
white
Добрый день!
Всех с праздником!
Начал я складывать из “кубиков” одну целую программу), и не пойму. Если выше делал все работало а именно у меня получалось дописывать файл, то почему теперь не записывает. Всю голову сломал не пойму в чем косяк.

 class Data():
    def __init__(self, name, price, ib):
        self.name = name
        self.price = price
        self.ib = ib
    
def vvod_data():
    intiker = intik.get()
    inprice = inpri.get()
    try:
        inprice = float(inprice)
        ib = 123
        name = str(intiker)
        price =str(inprice)
        name = Data(name, price, ib)
        file()
    except:
        print("fault")
def file():
    text = open('text123.txt', 'a')
    text.write(str(name.name)+ " " +str(name.price) +" "
               + str(name.ib)+ " " + "\n")
    text.close()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB