Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2018, 16:17   #1
lexcher
Новичок
Джуниор
 
Регистрация: 11.04.2018
Сообщений: 4
По умолчанию Требуется критика кода.

Доброго времени суток, уважаемые форумачане. Хотел бы вас попросить покритиковать код. Версия python 3.6. Код во вложении.
В заранее благодарен.

Код:
import random


def search_position_letter(l, w):
    letter_position = w.index(l)
    return letter_position

def string_word_to_list_word(w):
    '''str(obj) => list(obj)'''
    list_word = list(w)
    return list_word

def list_word_to_string_word(w):
    '''list(obj) => str(obj)'''
    string_word = ''.join(w)
    return string_word

def same_letter(user_answer, word):
    '''Находит и возврощает список с индексами повторяющихся символов'''
    letter_list = []
    word = list(word)
    while user_answer in word:
        letter_list.append(word.index(user_answer))
        number = len(letter_list)
        letter_list[-1] += number - 1
        del word[word.index(user_answer)]
    return letter_list

def user_attempts_choice(user_attempts):
    if user_attempts == 1:
        attempts = 7
        return attempts
    elif user_attempts == 2:
        attempts = 5
        return attempts
    elif user_attempts == 3:
        attempts = 3
        return attempts
    else:
        return 'Неверный ввод.' 


words_list = ['книга', 'месяц', 'ручка', 'шарик', 'олень', 'носок']

while len(words_list) != 0:
    word = random.choice(words_list)
    crypto_word = '\u25A0' * len(word)
    user_attempts = int(input('Выберите уровень сложности: 1-легкий; 2-средний; 3-сложный: '))
    attempts = user_attempts_choice(user_attempts)
    print(f'В слове {len(word)} букв.')
    print(f'У вас есть {attempts} попыток, чтобы угадать слово.')
    while '\u25A0' in crypto_word:
        if attempts == 0:
            print('К сожалению у вас закончились попытки!')
            break
        user_answer = input('Введите букву или слово целиком: ')
        if user_answer == word:
            break
        if user_answer in word:
            crypto_word = string_word_to_list_word(crypto_word)
            if word.count(user_answer) > 1:
                letter_list = same_letter(user_answer, word)
                for i in letter_list:
                    crypto_word[i] = user_answer
            letter_position = search_position_letter(user_answer, word)
            crypto_word[letter_position] = user_answer
            crypto_word = list_word_to_string_word(crypto_word)
            print(crypto_word)
        else:
            print('Нет такой буквы!')
            attempts -= 1
            print(f'Осталось попыток: {attempts}')
    print(f'Поздравляем, это и правда слово "{word}"')
    del words_list[words_list.index(word)]
print('Поздравляем, вы угадали все доступные слова.')
Вложения
Тип файла: zip fortuna_demo.py.zip (1.1 Кб, 9 просмотров)

Последний раз редактировалось lexcher; 12.04.2018 в 16:28.
lexcher вне форума Ответить с цитированием
Старый 12.04.2018, 16:24   #2
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

мало кто любит качать архивы, рекомендую через тег CODE оформить
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 12.04.2018, 16:28   #3
lexcher
Новичок
Джуниор
 
Регистрация: 11.04.2018
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
мало кто любит качать архивы, рекомендую через тег CODE оформить
Благодарю, готово.
lexcher вне форума Ответить с цитированием
Старый 12.04.2018, 19:06   #4
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от lexcher Посмотреть сообщение
Благодарю, готово.
Из беглого просмотра где не нужно напрягаться мне не понравился метод def user_attempts_choice(user_attempts) : может использовать списки типа ключ значения? короче будет. остальное если вернусь может дополню
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 12.04.2018, 19:09   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И название функции сделать нормальное.
Во-первых непонятно что оно вообще означает.
Во-вторых имена функций обычно стараются делать глаголами.

И еще там переменная attempts, как будто это список/массив attempt'ов. Лучше например attemptsCount. (ну и там вообще не нужна переменная)

И аналогично про list_word. Хотя бы местами надо слова поменять. Или проще words_to_string.

И вместо search_position_letter лучше например find_letter_position.

И я хотел сказать, что same_letter я бы назвал is_same_letter, но судя по комментарию оба названия вообще мало подходит.

Кстати, может не стоит использовать однобуквенные идентификаторы? Особенно параметры.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 12.04.2018 в 19:26.
Alex11223 вне форума Ответить с цитированием
Старый 12.04.2018, 19:19   #6
lexcher
Новичок
Джуниор
 
Регистрация: 11.04.2018
Сообщений: 4
По умолчанию

Благодарю, принято к сведению.

Последний раз редактировалось Alex11223; 12.04.2018 в 19:24.
lexcher вне форума Ответить с цитированием
Старый 12.04.2018, 19:33   #7
lexcher
Новичок
Джуниор
 
Регистрация: 11.04.2018
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Кстати, может не стоит использовать однобуквенные идентификаторы? Особенно параметры.
Согласен. Можно ли называть параметры функции, такими же именами как в будущем в нее будут переданы названия аргументов?
lexcher вне форума Ответить с цитированием
Старый 12.04.2018, 19:36   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не знаю позволяет ли это Питон, но-моему это редко когда было бы полезно, скорее всего что-то не так с одним из названий.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.04.2018, 19:39   #9
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Названия методов \ функций следует называть согласно их действиям. если метод проверяет на число можно is_number если записывает set_data и так далее т.е посмотрев на название вашего метода Вы поняли что он делает
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Критика моего кода AcTiV Общие вопросы C/C++ 25 04.03.2013 10:00
Загадочный тип PChar, критика OCTAGRAM Обсуждение статей 4 11.11.2009 10:25
Требуется критика Serg Belyaev Софт 8 30.10.2009 15:51
Профессиональная критика биопрограмм doctor-tv Софт 3 24.01.2009 12:08