1

Тема: Потрібна допомога

Доброго дня. Я недавно почав вивчати програмування. Розпочав з Python.
В книжці по якій я його вивчаю є така програма (це тільки перша версія, в книжці далі вона вдосконалюється, але ця версія повинна теж працювати):

class HotDog:
    def __init__(self):
        self.cooked_level = 0
        self.cooked_string = "Сира"
        self.condiments = ["Булочка"]
    def cook(self, time):
        self.cooked_level = self.cooked_level + time
    if self.cooked_level > 8:
        self.cooked_string = "Згорівша"
    elif self.cooked_level > 5:
        self.cooked_string = "Добре прожарена"
    elif self.cooked_level > 3:
        self.cooked_string = 'Середньої прожарки'
    else:
        self.cooked_string = 'Сира'
myHotDog = HotDog()
print myHotDog.cooked_string
print myHotDog.condiments
Я її трохи змінив на свій лад, але точна версія з книжки має ту ж помилку:
Traceback (most recent call last):
  File "C:/practice/persha p z class (HotDog).py", line 1, in <module>
    class HotDog:
  File "C:/practice/persha p z class (HotDog).py", line 8, in HotDog
    if self.cooked_level > 8:
NameError: name 'self' is not defined

Прошу пояснити в чому проблема і що потрібно зробити, щоб її виправити. Буду дуже вдячний.

Подякували: FakiNyan1

2 Востаннє редагувалося koala (15.01.2018 20:47:54)

Re: Потрібна допомога

В Python важливе значення мають відступи, це мали пояснювати до того, як вводити класи. Проблемний рядок знаходиться на одному рівні із чим?
І користуйтеся на форумі тегами code (знак <> над полем для редагування).

Подякували: FakiNyan, Eff1c, Monolith, leofun014

3

Re: Потрібна допомога

в книжці програма виглядає так:
class HotDog:
    def __init__(self):
        self.cooked_level = 0
        self.cooked_string = "Сырая"
        self.condiments = []
    def cook(self, time):
    self.cooked_level = self.cooked_level + time
    if self.cooked_level > 8:
        self.cooked_string = "Сгоревшая"
    elif self.cooked_level > 5:
        self.cooked_string = "Хорошо прожаренная"
    elif self.cooked_level > 3:
        self.cooked_string = "Средней прожарки"
    else:
        self.cooked_string = "Сырая"
myDog = HotDog()
print myDog.cooked_level
print myDog.cooked_string
print myDog.condiments
Але при запуску такої програми виділяє слово self (з виділеного рядка).
Ps. Можете поснити що робить <>, я щось не дуже зрозумів.

4 Востаннє редагувалося koala (15.01.2018 21:17:17)

Re: Потрібна допомога

<> додає теги code, які дозволяють писати таке:

class HotDog:
    def __init__(self):
        self.cooked_level = 0
        self.cooked_string = "Сырая"
        self.condiments = []

А у вас у книжці помилка з відступами - у функції cook немає жодного рядка, self на наступному рядку вже поза функцією, тому і виділяє. І якщо у вас із цим проблеми, то візьміть іншу книжку, яка не починається з класів.

Подякували: Eff1c1

5

Re: Потрібна допомога

koala написав:

<> додає теги code, які дозволяють писати таке:

class HotDog:
    def __init__(self):
        self.cooked_level = 0
        self.cooked_string = "Сырая"
        self.condiments = []

А у вас у книжці помилка з відступами - у функції cook немає жодного рядка, self на наступному рядку вже поза функцією, тому і виділяє. І якщо у вас із цим проблеми, то візьміть іншу книжку, яка не починається з класів.

Дякую.

6

Re: Потрібна допомога

Прихований текст

ставлю вподобайку за переклад свинособачого на людську

7 Востаннє редагувалося Eff1c (15.01.2018 21:33:15)

Re: Потрібна допомога

class HotDog:
    def __init__(self):
        self.cooked_level = 0
        self.cooked_string = "Сира"
        self.condiments = ["Булочка"]
    def cook(self, time):
        self.cooked_level = self.cooked_level + time
        if self.cooked_level > 8:
            self.cooked_string = "Згорівша"
        elif self.cooked_level > 5:
            self.cooked_string = "Добре прожарена"
        elif self.cooked_level > 3:
            self.cooked_string = 'Середньої прожарки'
        else:
            self.cooked_string = 'Сира'
myHotDog = HotDog()
print myHotDog.cooked_string
print myHotDog.condiments

myHotDog = HotDog()
print myHotDog.cooked_string
print myHotDog.condiments
Ось як треба було написати, а я щось не додумався(((
Ще раз дякую.

8

Re: Потрібна допомога

Розумію, що не в тему. Але хочу підняти таке питання. Є люди кому заходять відступи в Пітоні? Це ж до біса не зручно! Як в Паскалі begin...end, які просто заповнюють пустий простір і роблять кашу так і тут відступи. мені особисто складніше читати пітонівський код з відступами. {} на мою думку зручніші, особливо якщо писати в сі-шному стилі...

Подякували: 0xDADA11C71

9

Re: Потрібна допомога

Все нормально в Пайтоні з відступами. Класична пастка в плюсах:

{
if( some_complex_condition1() ){
  i++;
  str = "A";
}
if( more_easy_condition2() ){
  i++;
  str = "B";
}
if( very_complicated_condition_with_lambdas3([](int i){return i<=8;}) )
  i++;
  str = "C";
}

Бачите, що тут в результаті str завжди буде C? Багато часу витратите на перевірку умови в дужках витратите? А в Пайтоні таке неможливо в принципі.

Подякували: 0xDADA11C7, Monolith, ReAl, leofun015

10

Re: Потрібна допомога

Значить, то я так через одне місце пишу :)

11

Re: Потрібна допомога

Monolith написав:

Розумію, що не в тему. Але хочу підняти таке питання. Є люди кому заходять відступи в Пітоні? Це ж до біса не зручно! Як в Паскалі begin...end, які просто заповнюють пустий простір і роблять кашу так і тут відступи. мені особисто складніше читати пітонівський код з відступами. {} на мою думку зручніші, особливо якщо писати в сі-шному стилі...

Заходить.
Особливо при тому, що варіацій візуальних - лише одна, а не "єгипетські", "одна під одною "," таяк хочу",  "таяк хочу - 2" та ін. :)

12 Востаннє редагувалося ReAl (16.01.2018 21:15:57)

Re: Потрібна допомога

Ну так, якось так:

Прихований текст

http://replace.org.ua/extensions/om_images/img/5a5e4f6d6f8a7/indent_style.jpg

p.s. сам використовую приблизно 1TBS (tab=4)

Подякували: FakiNyan, koala, leofun01, Monolith4

13

Re: Потрібна допомога

так-то вже давно є лінтери, котрі слідкують за тим, аби форматування було гарнененьким

14

Re: Потрібна допомога

Monolith написав:

Розумію, що не в тему. Але хочу підняти таке питання. Є люди кому заходять відступи в Пітоні? Це ж до біса не зручно! Як в Паскалі begin...end, які просто заповнюють пустий простір і роблять кашу так і тут відступи. мені особисто складніше читати пітонівський код з відступами. {} на мою думку зручніші, особливо якщо писати в сі-шному стилі...

Я не пробував писати на сі, але відступи в python мені здаються цілком логічними.

15

Re: Потрібна допомога

з кожним написаним рядком на пітоні переконуюся, що вивчення його насправді слід починати з

import this

щодо відступів, то
...
Readability counts.
...

і відступи - зручне і  красиве рішення

16 Востаннє редагувалося Eff1c (17.01.2018 20:13:44)

Re: Потрібна допомога

Знову проблеми...
Програма працює до виділеного місця.

class BankAccount:
    def __init__(self, name, number_score, score_account):
        self.name = name
        self.number_score = number_score
        self.score_account = score_account
    def __str__(self):
        msg = self.name + ' на вашому рахунку ' + self.score_account + ' грн.'
        return msg
        print 'Номер рахунку:', self.number_score
    def operacia_d(self, dobav):
        self.score_account = self.score_account + dobav
    def operacia_v(self, znaty):
        self.score_account = self.score_account - znaty
MyAccount = BankAccount('Ілля', '54321', '40')
print MyAccount
def vvid():
    if vibir == 1:
        dob = input('Яку суму ви хочете добавити на ваш рахунок: ')
        #!!!!!!
        MyAccount.operacia_d(dob)
        #!!!!!
        print 'На ваш рахунок було нараховано ' + dob + ' грн.'
        print 'Тепер на вашому рахунку ' + MyAccount.score_account + ' грн.'
    else:
        zna = input('Яку суму ви хочете зняти з вашого рахунку: ')
        MyAccount.operacia_v(zna)
        print 'З вашого рахунку було знято ' + zna + ' грн.'
        print 'Тепер на вашому рахунку ' + MyAccount.score_account + ' грн.'
vibir = input('Щоб добавити грошей на рахунок напишіть 1, щоб зняти - 2: ')
while vibir == 1 or vibir == 2:
    vvid()
    vibir = input('Щоб добавити грошей на рахунок напишіть 1, щоб зняти - 2: ')
print 'Це не 1 і не 2, тому я завершую роботу.'

А далі така помилка 

Traceback (most recent call last):
  File "C:/practice/zavdannya.py", line 29, in <module>
    vvid()
  File "C:/practice/zavdannya.py", line 19, in vvid
    MyAccount.operacia_d(dob)
  File "C:/practice/zavdannya.py", line 11, in operacia_d
    self.score_account = self.score_account + dobav
TypeError: cannot concatenate 'str' and 'int' objects

17

Re: Потрібна допомога

input вводить рядок, dob автоматично отримує рядковий тип.

MyAccount.operacia_d(float(dob))

Але б і перевірити, чи ніхто не відповів "дуже-дуже багато!" і всяке інше (від'ємне число), тому краще перетворити до виклику і зробити всі перевірки.

Подякували: Eff1c1

18

Re: Потрібна допомога

Eff1c написав:

Знову проблеми...
Програма працює до виділеного місця.

class BankAccount:
    def __init__(self, name, number_score, score_account):
        self.name = name
        self.number_score = number_score
        self.score_account = score_account
    def __str__(self):
        msg = self.name + ' на вашому рахунку ' + self.score_account + ' грн.'
        return msg
        print 'Номер рахунку:', self.number_score
    def operacia_d(self, dobav):
        self.score_account = self.score_account + dobav
    def operacia_v(self, znaty):
        self.score_account = self.score_account - znaty
MyAccount = BankAccount('Ілля', '54321', '40')
print MyAccount
def vvid():
    if vibir == 1:
        dob = input('Яку суму ви хочете добавити на ваш рахунок: ')
        #!!!!!!
        MyAccount.operacia_d(dob)
        #!!!!!
        print 'На ваш рахунок було нараховано ' + dob + ' грн.'
        print 'Тепер на вашому рахунку ' + MyAccount.score_account + ' грн.'
    else:
        zna = input('Яку суму ви хочете зняти з вашого рахунку: ')
        MyAccount.operacia_v(zna)
        print 'З вашого рахунку було знято ' + zna + ' грн.'
        print 'Тепер на вашому рахунку ' + MyAccount.score_account + ' грн.'
vibir = input('Щоб добавити грошей на рахунок напишіть 1, щоб зняти - 2: ')
while vibir == 1 or vibir == 2:
    vvid()
    vibir = input('Щоб добавити грошей на рахунок напишіть 1, щоб зняти - 2: ')
print 'Це не 1 і не 2, тому я завершую роботу.'

А далі така помилка 

Traceback (most recent call last):
  File "C:/practice/zavdannya.py", line 29, in <module>
    vvid()
  File "C:/practice/zavdannya.py", line 19, in vvid
    MyAccount.operacia_d(dob)
  File "C:/practice/zavdannya.py", line 11, in operacia_d
    self.score_account = self.score_account + dobav
TypeError: cannot concatenate 'str' and 'int' objects

Не можна додавати рядок тексту і число. При ініціалалізації об'єкту ти (як ти і просив до тебе звертатись), передаєш текстові дані, хоча треба числові.

19 Востаннє редагувалося Eff1c (17.01.2018 20:59:38)

Re: Потрібна допомога

ReAl написав:

input вводить рядок, dob автоматично отримує рядковий тип.

MyAccount.operacia_d(float(dob))

Але б і перевірити, чи ніхто не відповів "дуже-дуже багато!" і всяке інше (від'ємне число), тому краще перетворити до виклику і зробити всі перевірки.

Я замінив так як ви показали. Помилка та ж сама.
Я схоже робив тут без флоат (34 р) і все працювало:

class HotDog:
    def __init__(self):
        self.cooked_level = 0
        self.cooked_string = "сира"
        self.condiments = ["Bulochka, Sosuska"]
    def __str__(self):
        msg = 'сосиска'
        if len(self.condiments) > 0:
            msg = msg + ' c '
        for i in self.condiments:
            msg = msg + i + ', '
        msg = msg.strip(', ')
        msg = self.cooked_string + ' ' + msg + '.'
        return msg
    def cook(self, time):
        self.cooked_level = self.cooked_level + time
        if self.cooked_level > 8:
            self.cooked_string = "згорівша"
        elif self.cooked_level > 5:
            self.cooked_string = "добре прожарена"
        elif self.cooked_level > 3:
            self.cooked_string = 'середньої готовності'
        else:
            self.cooked_string = 'сира'
    def addCondiment(self, condiment):
        self.condiment.append(condiment)
myHotDog = HotDog()
print 'Сосиска', myHotDog.cooked_string
print 'До хотдогу входять', myHotDog.condiments
def vvid():
    level = input("Скільки хвилин смажити сосиску (використовуйте цифри): ")
    print 'Готуємо сосиску', level, 'хвилини...'
    #!!!!
    myHotDog.cook(level)
    #!!!!
    if myHotDog.cooked_string == 'сира':
        x = 'Сосиска ще досі'
    else:
        x = 'Тепер сосиска'
    print x, myHotDog.cooked_string
vvid()
y = input('Введіть 1 щоб продовжити: ')
while y == 1:
    vvid()
    y = input('Введіть 1 щоб продовжити: ')
print 'Це не 1 тому програма завершує роботу'

20

Re: Потрібна допомога

я б вам радив   пройти курс по базових типах даних і операціях з ними, а тоді вже переходити до класів.
наприклад https://www.codecademy.com/learn/learn-python