Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.05.2015
Сообщений: 2

Ищу совета опытных людей

25.07.2019, 21:46. Показов 1000. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый! Я недавно начал изучать сей чудный язык, да и в общем программирование и решил попрактиковаться в написании первых программ)Решил написать что на подобии личного дневника. Я бы хотел попросить опытных людей взглянуть на мой код и написать критику и если можно посоветовать в каком направлении идти. За помощь очень буду благодарен.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import os
import shutil
directory = 'C:/python/zapis/save'
mypath = 'C:/python/zapis/save/'
files = os.listdir(directory)
def create (): #Функция для создания нового "аккаунта" папки
    b = input('Создать аккаунт?  ')
    if b == ('да'):
        mypathi = input('Назовите свой аккаунт : ') 
        mypath = os.path.join('C:/python/zapis/save', mypathi) #Указывает путь для новой папки
        if not os.path.isdir(mypath):
            os.makedirs(mypath) 
        vibr()  
    else :
        print ('Программа окончена')
        exit()
def delete (): #Удаление "аккаунтов"
    d = input ('Введите имя пользователя для удаления : ')
    print ('Внимание аккаунт и все записи будут безвозвратно стерты...')
    e = input ('Точно ли вы хотите удалить аккаунт под именем ' + d + ' да или нет : ')
    if e == ('да'):
        shutil.rmtree('C:/python/zapis' + d , ignore_errors=True) #Строка для удаления и обхода ошибок если таковые выйдут
    elif e == ('нет'):
        vibr ()
def vibr (): #Основная часть кода
    print ('''Выберете действие
    1)Выберете пользоваеля
    2)Удалить пользователя''')
    c = input('Введите нужный пункт меню : ')
    if c == ('2'):
        delete ()
    elif c == ('1'):
        os.walk(directory) #Проходит по папке "аккаунтами" и выводит в списке все папки
        print (files)
    else: 
        print ('Попробуйте снова')
        vibr ()
    try:
        Name = input('Введите имя вашего аккаунта : ')
        print(os.listdir("C:/python/zapis/save/" + Name))#Выполняет вход в "аккаунт" папку
        put = os.path.join('C:/python/zapis/save/' + Name + '/') 
    except FileNotFoundError:
        print ('Такого файла не найдено, проверьте имя и попробуйте еще раз')
        vibr ()
    print ('''Что будем делать?
    1)Прочитать записи
    2)Новая запись
    3)Удалить запись
    4)Выйти''')
    call = input('Введите номер каталога : ')
    if call == ('1'):   
        now =('да')
        while now != ('нет'):
            try:
                filename = input('Выберете файл для чтения ') + '.txt'
                file = open(put + filename, 'r')
                print(file.read())
            except FileNotFoundError:
                print ('Такого файла не найдено, проверьте имя и попробуйте еще раз')
                now = input ('продолжить ? ')
                if now == ('да') or ('Да'):
                    continue
                else:
                    break
    if call == ('2'):
        filenamee = input('Укажите имя записи : ') + '.txt'
        text = open(put + filenamee, 'w')
        text.write(input())
    if call == ('3'):
        filename2 = input('Укажите имя записи : ') + '.txt'
        try:
            os.remove(put + filename2)
        except OSError:
            pass
        k = input('Продолжить? Да или нет : ')
        if k == ('да'):
            vibr()
        else:
            exit()
print ('Приветствую вас')
a = input('Есть ли у вас аккаунт? ')
if a == ('нет'):
    create ()
elif a == ('да'):
    vibr ()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2019, 21:46
Ответы с готовыми решениями:

Прошу совета у опытных людей. Цикл while и 2 условия через логическое или (or)
Есть код. В два счетчика попадают числа, не важно как. Я хотел, чтобы при выполнении одного из условий, программа выходила из цикла. В...

Задача для опытных людей, на создание учёта персонала в отделе
Добрый вечер, всем. Помогите решить задачу. Разработать приложение, которое будет хранить в оперативной памяти список сотрудников,...

прошу совета у людей, работающих python-программистами
всем привет! у меня назрела парочка вопросов) сразу оговорюсь, что у меня нету технического образования и я никогда в жизни не...

4
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
26.07.2019, 14:12
CHELOVEK111, Буду давать свои рекомендации по ходу их появления.
Строка 5 ошибка
Python
1
files = os.listdir(directory)
Идет обращение к директории, которая может быть еще не создана.
Так как переменная files используется только внутри функции vibr, имеет смысл поместить ее внутрь этой функции, а переменную directory, к которой идет обращение в этой строке, объявить в функции vibr глобальной.

Добавлено через 33 минуты
После того, как я ввел у себя предлагаемые мной изменения, код заработал. Но некоторые предлогаемые вопросы не достаточно четкие и вызывают у пользователя чувство неопределенности. Но это распространенная ошибка разработчиков. Когда они тестируют свою программу, то многие вопросы у них не вызывают неопределенности, так как они знают что нужно отвечать. Такие недоработки программы устраняются только тестированием на пользователях не знакомых с программой. Это вообще то не совсем ошибка, это рабочий процесс по доводке программы.
Не берусь подробно тестировать Вашу программу, то есть все ее ветки, на это требуется время.
Что еще я могу порекомендовать, это необходимость изучить создание графического интерфейса. С графическим интерфейсом программа выглядит значительно презентабельнее. Но нужно иметь ввиду, что графический интерфейс значительно увеличивает размер вашего кода, что ощутимо, если ваш первоначальный код небольшого размера.
Не обращая внимание на злопыхателей, которым может не понравиться, что я в который раз выкладываю в качестве примера свой код (кстати никто им не мешает в качестве примера выкладывать свои коды, что бы люди их использовали), я его все таки выложу, так как он в качестве примера будет к месту.
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# файл *.pyw (расширение .pyw необходимо для подавления окна DOS)
 
from tkinter import *                              # импорт объектов для графики
import shelve                                      # импорт модуля для работы с базой данных 
 
class PhoneBook:
    # класс Телефонная книга
    def __init__(self, nameBook, dicRec={}):
        # метод инициализации атрибутов экземпляров класса  и передача в метод значений для атрибутов
        self.nameBook = nameBook                   # инициализация атрибута Имя книги
        self.dicRec = dicRec                       # перечень записей в виде словаря, по умолчанию пустой
    def loadBook(self):
        # загрузка записей из базы данных
        db = shelve.open(self.nameBook)            # открытие базы данных (имя берется из атрибута nameBook класса)
        self.dicRec = dict(db.items())             # загрузка записей из базы данных в атрибут dicRec класса (в словарь класса)
        db.close()                                 # закрытие базы данных
    def saveBook(self):
        # сохранение записей в базе данных
        db = shelve.open(self.nameBook)            # открытие базы данных
        for (key, record) in self.dicRec.items():  # запись содержимого из 
            db[key] = record                       # словаря класса в базу данных
        db.close()                                 # закрытие базы данных
 
class PhoneRec:
    # класс Запись
    def __init__(self, keyRec, char, label, phone, familyName, comment, delR=''):
        # инициализация атрибутов экземпляров класса
        self.keyRec = keyRec                       # ключ записи
        self.char = char                           # буква, на странице которой находится запись
        self.label = label                         # метка, к чему относится запись
        self.phone = phone                         # телефон
        self.familyName = familyName               # Ф.И.О.
        self.comment = comment                     # комментарий
        self.delR = delR                           # служебное поле для пометки записи:
                                                   # ''- видимая, 'с' - скрытая, 'у' - удаляемая
 
fieldnamesRec = ('keyRec', 'char', 'label', 'phone', 'familyName', 'comment', 'delR')  # кортеж имен полей в записи
activCh = 'А'                                      # буква, актмвная на текущий момент
typeRec = ''                                       # тип выводимых на экран записей, '' - открытые, "с" - скрытые
dicRem = {}                                        # словарь оставшихся не выведенными записей
 
def onDeleteRequest():
#    print('Got wm delete') # щелчок на кнопке X в окне: можно отменить или перехватить
    saveRec()
    window.destroy()         # возбудит событие <Destroy>
#def doRootDestroy(event):
#    print('Got event <destroy>') # для каждого виджета в корневом окне
def makeWidgets():
    # создание графической формы
    global entriesRec, entRec, lab1, alph          # перечень глобальных переменных, которые будут использоваться и за пределами функции
    entRec = {}                                    # словарь, в который будут заносится объекты ввода entFind (поиск) и entKeyRec (ключ)
    window = Tk()                                  # создание главного окна
    window.title('Телефоны')                       # заголовок окна
    window.geometry('1260x600+0+0')                # размеры окна
#    window.bind('<Destroy>', doRootDestroy)              # для корневого и дочерних 
    window.protocol('WM_DELETE_WINDOW', onDeleteRequest) # на кнопке X окна (перехватывает нажатие кнопки Х)
    form1 = Frame(window)                          # создание внутри окна window контейнера form1
    form1.pack()
    lab1 = Label(form1, text=activCh, fg="#eee", bg="#333", width=5)  # метка, показывающая
    lab1.pack(side=LEFT)                                              # активную букву
    Label(form1, text='  ', width=30).pack(side=LEFT)                 # вспомагательная пустая метка для улучшения расположения
    alph = ["А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", 
            "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Э", "Ю", "Я"]         # список букв
    for i in range(len(alph)):                     # создание кнопок с буквами
        Button(form1, text=alph[i], command=(lambda x=alph[i]: fetchChr(x))).pack(side=LEFT)
    ent = Entry(form1, width=27)                   # поле ввода для поиска
    ent.pack(side=LEFT)
    entRec['entFind'] = ent                        # поместить объект поля ввода в словарь entRec
    Button(form1, text="Поиск", command=fetchFind).pack(side=LEFT)     # создание кнопки Поиск
 
    form2 = Frame(window)                          # создание внутри окна window контейнера form2
    form2.pack()
    entriesRec = {}                # словарь, для занесения в него объектов Entry ячеек таблицы ввода записей
    fieldnamesRecCyr = ('№№', 'Буква', 'Метка', 'Телефон', 'ФИО', 'Комментарий', 'тип')  # кортеж имен полей на руском
    for (ix, label) in enumerate(fieldnamesRecCyr): # создание надписей заголовков столбцов таблицы
        lab = Label(form2, text=label)
        lab.grid(row=2, column=ix)
    for i in range(1, 26):         # создаются ячейки таблицы для ввода записей
        for (ix, label) in enumerate(fieldnamesRec):
            if label == 'keyRec' or label == 'char' or label == 'delR':  # выделяются столбцы, которые потом будут иметь особый режим доступа
                ent = Entry(form2, state='normal', width=6)
            else:
                ent = Entry(form2, width=40)
            ent.grid(row=i+2, column=ix)
            entriesRec[label+str(i)] = ent   # объекты ячеек таблицы заносятся в словарь, причем к имени 
                                             # столбца ячейки добавляется номер строки, 
                                             # тем самым однозначно определяются координаты ячейки,
                                             # что бы к ней обращаться
    form3 = Frame(window)                            # создание внутри окна window контейнера form3
    form3.pack()
    Button(window, text="Следующая страница", command=fetchNext).pack()  # кнопка Следующая страница
    Label(window, text='      ', width=10).pack(side=LEFT)       # вспомогательная пустая метка
    labKeyRec = Label(window, text='№').pack(side=LEFT)     # надпись перед полем ввода номера ключа
    ent = Entry(window, width=10)                                # поле ввода номера ключа
    ent.pack(side=LEFT)
    entRec['entKeyRec'] = ent             # занесение объекта поле ввода номера ключа в словарь entRec
    Button(window, text="Скрыть", command=hideRec).pack(side=LEFT)             # кнопка Скрыть (запись)
    Button(window, text="Показать скрытые", command=fetchHide).pack(side=LEFT) # кнопка Показать скрытые
    Button(window, text="Открыть", command=openRec).pack(side=LEFT)            # кнопка Открыть (запись)
    Label(window, text=' ', width=5).pack(side=LEFT)                           # вспомогательная пустая метка
    Button(window, text="Удалить", command=delKeyRec).pack(side=LEFT)          # кнопка удалить (запись)
    Label(window, text='      ', width=30).pack(side=LEFT)                     # вспомогательная пустая метка
    btns = Button(window, text="Сохранить", command=interSave).pack(side=LEFT)   # кнопка Сохранить (страницу)
    Label(window, text='      ', width=20).pack(side=LEFT)                     # вспомогательная пустая метка
    Button(window, text="Выход", command=fin).pack(side=LEFT)                  # кнопка Выход (из программы)
    return window                                              # функция makeWidgets возвращает окно window
 
def clear_sheet():
    # очистка листа
    for i in range(1, 26):
        for field in fieldnamesRec:
            if field == 'keyRec' or field == 'delR':              # для очистки полей keyRec и delR,
                entriesRec[field+str(i)].config(state='normal')   # нужно открыть их для записи
                entriesRec[field+str(i)].delete(0, END)
                entriesRec[field+str(i)].config(state='readonly')
            else:
                entriesRec[field+str(i)].delete(0, END)         # очистка остальных полей
def fetchChr(ch):
    # выбрать записи на букву ch
    global activCh, typeRec, lab1
    saveRec()                      # предварительно сохранить предыдущую страницу
    typeRec = ''                   # выбор для буквы делать только из открытых записей
    activCh = ch                   # сделать ch текущей буквой
    lab1.config(text=activCh)      # написать, для какой буквы выводятся записи
    dicRecChr = {}                 # словарь, в который помещаются выбранные записи
    for key in t1.dicRec.keys():      # выбор записей и помещение их в словарь
        if t1.dicRec[key].char == ch:
            dicRecChr[key] = t1.dicRec[key]
    fetch(dicRecChr)                        # вывод записей в таблицу формы
def interSave():
    # принудительное сохранение страницы и вывод страницы для текущей буквы
    fetchChr(activCh)
def fetchHide():
    # вывод скрытых записей
    global typeRec, lab1
    saveRec()
    lab1.config(text='скр')
    typeRec = 'с'
    fetch(t1.dicRec)
def fetch(dicR):
    # вывод записей из заданнго словаря
    global dicRem                        # словарь записей, оставшихся не выведенными
    clear_sheet()                        # очистка таблицы
    count = 1                            # счетчик показывающий номер строки, в которую выводится запись
    dicRe = dicR.copy()                  # словарь, ведущий учет записей, которые еще не выведены
    while count <= 25 and len(dicRe):    # в цикле, заполнение строк таблицы записями
        for key in dicR.keys():            # в цикле вывод записи удовлетворяющей условию
            if dicR[key].delR == typeRec:
                record = dicR[key]                   # запись для вывода
                for field in fieldnamesRec:          # в цикле последовательное заполнение полей в строке
                    if field == 'keyRec' or field == 'delR':    # поля, которые необходимо открыть для записи
                        entriesRec[field+str(count)].config(state='normal')
                        entriesRec[field+str(count)].insert(0, getattr(record, field))
                        entriesRec[field+str(count)].config(state='readonly')
                    else:
                        entriesRec[field+str(count)].insert(0, getattr(record, field))  # все остальные поля
                count += 1         # переход к следующей строке таблицы
                dicRe.pop(key)     # удаление записи, которая выведена из словаря учета оставшихся записей           
                if count > 25:     # если все строки таблицы заполнены, то выход из цикла while
                    break
            else:
                dicRe.pop(key) # удаление из словаря учета записи, которая не удовлетворяет условию вывода в таблицу
    dicRem = dicRe.copy()      # словарь записей, оставшихся не выведенными
 
def fetchNext():
    # вывод на следующей странице записей, оставшихся не выведенными
    saveRec()
    fetch(dicRem)
 
def delKeyRec():
    # физическое удаление из базы данных записи, которая указана в ячейке entKeyRec
    key = entRec['entKeyRec'].get()  # из ячейки entKeyRec берется ключ записи для удаления
    del t1.dicRec[key]               # запись удаляется из динамического словаря t1.dicRec
    db = shelve.open(t1.nameBook)    # открывается база данных
    del db[key]                      # указанная запись физически удаляется из базы данных
    db.close()                       # база данных закрывается
    for i in range(1, 26): # ищется строка таблицы с этой записью, и помечается как удаленная, 
        if entriesRec['keyRec'+str(i)].get() == key:         # что бы потом при сохранении страницы,
            entriesRec['delR'+str(i)].config(state='normal') # она не была вновь занесена в базу данных
            entriesRec['delR'+str(i)].insert(0, 'у')
            entriesRec['delR'+str(i)].config(state='readonly')
    entRec['entKeyRec'].delete(0, END)            # очищается ячейка, содержащая номер удаляемой записи
def hideRec():
    # пометить как скрытую
    key = entRec['entKeyRec'].get()  # из ячейки entKeyRec берется ключ записи для сокрытия
    for i in range(1, 26):           # ищется строка таблицы с этой записью, и помечается как скрытая
        if entriesRec['keyRec'+str(i)].get() == key:
            entriesRec['delR'+str(i)].config(state='normal')
            entriesRec['delR'+str(i)].insert(0, 'с')
            entriesRec['delR'+str(i)].config(state='readonly')
    entRec['entKeyRec'].delete(0, END)           # очищается ячейка, содержащая номер скрываемой записи записи
def openRec():
    # открыть скрытую запись
    key = entRec['entKeyRec'].get()   # из ячейки entKeyRec берется ключ записи для открытия
    for i in range(1, 26):            # ищется строка таблицы с этой записью, и помечается как открытая
        if entriesRec['keyRec'+str(i)].get() == key:
            entriesRec['delR'+str(i)].config(state='normal')
            entriesRec['delR'+str(i)].delete(0, END)
            entriesRec['delR'+str(i)].insert(0, '')
            entriesRec['delR'+str(i)].config(state='readonly')
    entRec['entKeyRec'].delete(0, END)           # очищается ячейка, содержащая номер открываемой записи 
 
def fetchFind():
    # поиск записей по заданной строке
    global lab1
    saveRec()
    clear_sheet()
    lab1.config(text='поиск')      # сигнализирует о режиме поиска
    strF = entRec['entFind'].get() # строка для поиска берется из ячейки entFind
    dicFind = {}                   # словарь, для занесения в него найденных записей
    for key in t1.dicRec.keys():   # в тлефонном справочнике ищутся записи содержащие искомую строку
        record = t1.dicRec[key]
        for field in fieldnamesRec:
            if (field != 'keyRec' and field != 'char' and field != 'delR' and # поиск в полях, за исключением перечисленных
                getattr(record, field).find(strF) != -1):
                dicFind[key] = record
                break
    fetch(dicFind)                  # вывод найденных записей
def saveRec():
    # сохранение текущей страницы
    global typeRec
    for i in range(1, 26):       # просмотр строк и при наличии хотя бы в одном поле строки данных, сохранение ее
        key = entriesRec['keyRec'+str(i)].get() # проверка наличия в строке ключа
        if entriesRec['delR'+str(i)].get() == 'у': # записи помеченные как удаленные пропускаются
            continue
        elif key:                # иначе, если запись не удаленная и с ключом, то она перезаписывается
            record = t1.dicRec[key]
            for field in fieldnamesRec:
                setattr(record, field, entriesRec[field+str(i)].get())
            t1.dicRec[key] = record
        else: # иначе, если в строке нет ключа, но в одном из полей есть данные, то создается запись-экземпляр
            existRec = False                                               # и помещается а словарь t1.dicRec
            for field in fieldnamesRec:
                if entriesRec[field+str(i)].get(): existRec = True # Если существует запись в поле на этой строке
            if existRec:     # если данные в строке существуют, то создается запись
                if entriesRec['char'+str(i)].get():  # если поле буквы не пусто, то в запись заносится эта буква
                    char = entriesRec['char'+str(i)].get()
                else:              # иначе в запись заносится буква, являющаяся на данный момент активной
                    char = activCh
                label = entriesRec['label'+str(i)].get()             # заполняются переменные
                phone = entriesRec['phone'+str(i)].get()             # для формирования записи
                familyName = entriesRec['familyName'+str(i)].get()
                comment = entriesRec['comment'+str(i)].get()
                if len(t1.dicRec)>0: # если телефонный справочник не пуст, то к максимальному значению ключа 
                    L = sorted(t1.dicRec.items(), key=lambda item: int(item[0]))  # прибавляется единица
                    keyRec = str(int(L[-1][0]) + 1)
                else:        # иначе записи присваивается ключ равный 1
                    keyRec = "1"
                record = PhoneRec(keyRec, char, label, phone, familyName, comment) # создается запись, экземпляр класса PhoneRec
                t1.dicRec[keyRec] = record     #  и записывается в словарь t1.dicRec
    t1.saveBook()  # словарь t1.dicRec сохраняется во внешней базе данных "Телефоны"
 
def fin():            # сохранение перед закрытием окна
    saveRec()
    window.destroy()
 
if __name__ == '__main__':
 
    t1 = PhoneBook("Телефоны")   # создание экземпляра класса PhoneBook
    t1.loadBook()                # загрузка внешней базы данных в словарь t1.dicRec,
                                 # с которым в дальнейшем будет производится вся работа, 
                                 # перед выгрузкой потом назад в базу данных
    window = makeWidgets()       # создание формы
    fetchChr('А')                # вывод в качестве стартовой страницу с буквой "А"
    window.mainloop()            # передача управления форме


Добавлено через 19 минут
CHELOVEK111, Добавлю. Мой код использует объектно ориентированное программирование (ООП). Некоторые считают, что ООП не нужен, я другого мнения. Например встроенный язык программирования используемый в таком популярном продукте как 1С , является объектно ориентированным. Но я свой код выложил в основном для того, что бы показать, как выглядит программа, использующая графический интерфейс. Хотя я в графике не силен, подробно использование графического интерфейса не изучал. Главу, посвященную ему, использовал скорее как справочник (то есть урывками).

Код рабочий, можете его запустить.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.07.2019, 09:57
Насчет объявления переменной directory как глобальной, это я переборщил. В этом не необходимости. Переменная directory находится в области видимости для функции vibr и потому и так доступна для чтения.

Добавлено через 7 минут
Объявление переменной directory как глобальной понадобилось бы, если бы мы хотели ее перезаписывать, или что бы она была доступна для чтения и из другой функции.
1
0 / 0 / 0
Регистрация: 04.05.2015
Сообщений: 2
27.07.2019, 18:54  [ТС]
Большое спасибо за ответ. До ООП я пока не добрался, так как я буквально 2 недели назад начал вообще знакомится с миром программирования. Но до него обязательно доберусь)
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.07.2019, 21:13
CHELOVEK111, Вы на верном пути. Python лучше всего подходит для того, что бы начать изучать программирование. После него при необходимости можно перейти к изучению любого другого языка. Питон наиболее прост для усвоение и при этом поддерживает все стили программирования. Он идеально подошел бы для уроков информатики в школе, но преподавателям лень уходить от привычной методики использующей Паскаль и осваивать Питон.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2019, 21:13
Помогаю со студенческими работами здесь

Прошу совета опытных людей о создании сайта
Здравствуйте товарищи. У вас тут в ветке «PHP для начинающих» какие то вопросы серьезные, не как не для начинающих))) Спрошу кратко и...

Ищу совета более опытных товарищей по поиску работы
Уважаемые коллеги подскажите пожалуйста, что с моим резюме не так? Ищу работа или подработку, но не как не могу найти. Может ваш свежий...

Ищу начинающих и опытных людей для общения и взаимопомощи
ищю начинающих и опытных людей для общения и взаимопомощи. пишите, буду рад

Консультация у более опытных людей
Всем привет, мне нужно сделать аналогичную игру: https://play.google.com/store/apps/details?id=com.appache.fingerdynamometersimulator ...

Нуждаюсь в консультации опытных людей
Помоги с заданиям. Для меня, который очень далёк от информатики. Эта задача кажется занапта сложная. Спасибо!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru