Страницы

Поиск по вопросам

Показаны сообщения с ярлыком форматирование. Показать все сообщения
Показаны сообщения с ярлыком форматирование. Показать все сообщения

понедельник, 9 марта 2020 г.

Python. Вывод текста по середине терминала

#python #python_3x #текст #форматирование #терминал


Как можно вывести текст в центре экрана терминала, используя shutil.get_terminal_size().columns
и shutil.get_terminal_size().lines?


    


Ответы

Ответ 1



Если текст уже разбит на строки, то достаточно просто отформатировать: >>> import shutil >>> lines = ['String right here', 'And here', 'Here', 'A-a-a-and here'] >>> width = shutil.get_terminal_size().columns >>> position = (width - max(map(len, lines))) // 2 >>> for line in lines: # left justtified ... print(' '*position + line) ... String right here And here Here A-a-a-and here >>> for line in lines: # right justified ... print(line.rjust(width // 2)) ... String right here And here Here A-a-a-and here >>> for line in lines: # center ... print(line.center(width)) ... String right here And here Here A-a-a-and here

Ответ 2



Если хочется в произвольном месте экрана в терминале печатать, то можно blessings модуль использовать: #!/usr/bin/env python from blessings import Terminal # $ pip install blessings lines = ['String right here', 'And here', 'Here', 'A-a-a-and here'] term = Terminal() with term.hidden_cursor(), term.fullscreen(): for i, line in enumerate(lines): x = (term.width - max(map(len, lines))) // 2 y = (term.height - len(lines)) // 2 + i with term.location(x, y): print(term.bold_white_on_black(line)) with term.location(0, term.height - 1): input('press to exit..') Терминал выглядит так: String right here And here Here A-a-a-and here press to exit.. В этом случае, содержимое терминала на время исполнения программы очищается—при выходе из программы терминал восстанавливается. Совместно с colorama модулем, некоторые возможности могут работать также и на Windows. Для забавы можно asciimatics модуль попробовать: #!/usr/bin/env python from asciimatics.effects import Print # $ pip install asciimatics from asciimatics.renderers import FigletText, SpeechBubble, Rainbow from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError def demo(screen): lines = ['String right here', 'And here', 'Here', 'A-a-a-and here'] renderers = [Rainbow(screen, FigletText(line, font='small')) for line in lines] x = (screen.width - max(r.max_width for r in renderers)) // 2 H = max(r.max_height for r in renderers) - 1 # text height effects = [Print(screen, renderer, y=(screen.height - H * len(renderers)) // 2 + i * H, x=x) for i, renderer in enumerate(renderers)] effects.append(Print(screen, SpeechBubble("Press X to exit"), screen.height - 5, speed=1, transparent=False, start_frame=100)) screen.play([Scene(effects, -1)], stop_on_resize=True) if __name__ == "__main__": while True: try: Screen.wrapper(demo) except ResizeScreenError: continue else: break На другие доступные эффекты можно в samples папке посмотреть.

среда, 26 февраля 2020 г.

Как лучше задавать число пробелов в табе - в виде значения переменной или в виде именованной константы?

#c #текст #форматирование #задачи


Книга Язык программирования Си. Денис Ритчи упражнение 1.20:


  Напишите программу detab, заменяющую символы табуляции во вводимом
  тексте нужным числом пробелов (до следующего "стопа" табуляции).
  Предполагается, что "стопы" табуляции расставлены на фиксированном
  расстоянии друг от друга, скажем, через n позиций. Как лучше задавать
  n - в виде значения переменной или в виде именованной константы?


Вопрос: Правильно ли я понял задание?

В Википедии сказано, что табуляция это 8 знакомест. Как бы табуляция это константное
число знакомест. Или я чего-то не понимаю?

Я задание понял так: если введена табуляция, заменить ее на 8 пробелов. И мне не
понятно, зачем в задании указывать на каком расстоянии друг от друга стопы табуляции?

И что такое "стопы" табуляции? Стоп и символ табуляции это одно и то же?

Я смотрел другие решения в интернете, у других людей, почему-то, количество пробелов
заменяемых на табуляцию, в разных вводимых строках - разное...
    


Ответы

Ответ 1



Нет, вы неверно понимаете, что такое табуляция. Но проще пояснить на примере. Вот, например, имеем: Это текст с пробелами И еще один текст Все они выровнены Вы предлагаете: Это текст с пробелами И еще один текст Все они выровнены Правильно: 0 0 1 2 0 8 6 4 Это текст с пробелами И еще один текст Все они выровнены Так понятно? Табулятор вносит столько пробелов, чтоб новое слово шло с очередной позиции табуляции, в данном случае - кратной 8 (что не обязательно, и вряд ли в Википедии сказано, что это строго 8. Скорее что-то вроде "распространенное значение - 8").

среда, 1 января 2020 г.

Как правильно оформлять try / catch в коде?

#c_sharp #исключения #форматирование


Начал очень часто сталкиваться с конструкциями try / catch, обычно оформляю их так:

try
{
     //Много кода
}
catch (Exception e)
{
    //Много кода
}


Теперь, скажем у меня что-то вроде:

try
{
     double.Parse("a"); //Тут только одна строчка
}
catch (ArgumentException e)
{
     //Ничего не делать
}


Будет ли плохо, если я напишу это так:

try
    { double.Parse("a"); }
catch (ArgumentException e) { }


Или так:

try { double.Parse("a"); }
catch (ArgumentException e) { }


Ну или например, вместо:

try
{
    return Convert.ToDouble(input);
}
catch (Exception e)
{ 
    return default(int);
}


Написать: 

try
    { return Convert.ToDouble(input); }
catch
    { return default(int); }


Просто заметил, что очень часто try / catch проверяющий одну - две строки занимает
по факту целых 8 - 9 и захотелось узнать, как можно в таких случаях поступить?
    


Ответы

Ответ 1



Да, обработка ошибок — это очень сложная часть программирования. Да, она часто требует большого объёма кода, и это нормально. Вы не должны пытаться уменьшить объём кода, ухудшая качество кода и экономя на обработке ошибок. Целью написания кода является правильный код, а не маленький код по объёму. По поводу оформления кода отступами/переносами строк, придерживайтесь стиля, принятого в вашей команде. Никаких рекомендаций по этому поводу нет. Я бы не экономил строчки путём втискивания кода в одну строку, но это вопрос личных предпочтений. А вот от игнорирования ошибок я бы вас предостерёг. Код наподобие try { double.Parse("a"); //Тут только одна строчка } catch (ArgumentException e) { //Ничего не делать } который просто проглатывает ошибку, скорее всего написан плохо: вместо того, чтобы выявить ошибку в другой части программы, мы просто закрываем на неё глаза, не думая о том, как же будет вести себя программа в исключительном случае. (Ну и в случае, когда исключение имеет хорошие шансы возникнуть и ошибки стоит ожидать, предпочтительно пользоваться функциями наподобие TryParse. Оставьте исключения для исключительных ситуаций.)

Ответ 2



В любой подобной ситуации с вопросом форматирования: В главную очередь смотрим стандарты, принятые в команде разработчиков вашего проекта. Если там не решения нашли — обращаемся к Сode conventions. P.S. Мартин Роберт советует: если вы пишите блок try-catch, это повод задуматься о том, не нужно ли что-то здесь выделить в новый метод.

Ответ 3



Исключения должны использоваться для обработки внештатного(исключительной) поведения, связанного с неожиданной ошибкой. Они не должны служить заменой проверкам выполнения условий. Если исключения можно избежать, просто проверив какое-то условие перед выполнением действия, то стоит так и сделать. Исключения следует приберечь для настоящих ошибок. Например есть такой метод public double getValueForPeriod(int periodNumber) { try { return values[periodNumber]; } catch(ArrayIndexOutOfBoundsException e) { return 0; } } Заменим выбрасывание исключения проверкой условия public double getValueForPeriod(int periodNumber) { if (periodNumber >= values.length) { return 0; } return values[periodNumber]; } Простой условный оператор работает быстрее чем проверка исключения и иногда может быть очевиднее блока обработки исключения.Этот процесс называется рефакторинг кода. Порядок рефакторинга Создайте условный оператор для граничного случая и поместите его перед try/catch блоком Переместите код из catch-секции внутрь этого условного оператора. В catch-секции поставьте код выбрасывания обычного безымянного исключения и запустите все тесты. Если никаких исключений не было выброшено во время тестов, избавьтесь от оператора try/catch. В вашем примере можно double.Parse("a") заменить таким образом double result; string st="а"; bool retVal= double.TryParse(st,result); if(retVal) { //ваш код } Про обработке исключений можете читать здесь

вторник, 31 декабря 2019 г.

Эстетичное форматирование json файла

#java #json #форматирование #gson


Я использую библиотеку Gson для сериализации в json. Делаю я примерно вот так:

new Gson().toJson(new MyObject());


Но при этом у меня получается одна единая строка, без отступов и переносов:

{"classes":[{"name":"warrior","skills":[]}]}


Каким образом можно форматировать эту строку в более эстетичный вид, при сериализации,
что бы потом можно было удобно менять значения? Та строка должна быть примерно такая:

{
    "classes":
    [
        {
            "name": "warrior",
            "skills": []
        }
    ]
}

    


Ответы

Ответ 1



Добавьте настройку в билдер, а не просто создавайте инстанс Gson через конструктор: Gson gson = new GsonBuilder().setPrettyPrinting().create(); String json = gson.toJson(new MyObject());

пятница, 20 декабря 2019 г.

Что дешевле: форматирование или конкатенация?

#python #строки #форматирование


Например, мне надо задать строковую переменную, в которой надо указать номер потока.Есть
два варианта.Первый - с помощью конкатенации:

name="Thread #" + foo


Второй - с помощью форматирования:

name="Thread #%i" % foo


Я знаю, что в python строки являются immutable типом, а значит операция конкатенации
приведет к созданию новой переменной. А что на счет форматирования?
    


Ответы

Ответ 1



Конкантенация быстрее форматирования %. from timeit import default_timer as timer foo = 'FooBar' t = timer() for _ in range(100000): name = "Thread #" + foo print('Total time: {:.3f} sec'.format(timer() - t)) t = timer() for _ in range(100000): name = "Thread #%s" % foo print('Total time: {:.3f} sec'.format(timer() - t)) t = timer() for _ in range(100000): name = "Thread #{}".format(foo) print('Total time: {:.3f} sec'.format(timer() - t)) t = timer() for _ in range(100000): name = f"Thread {foo}" print('Total time: {:.3f} sec'.format(timer() - t)) Результат: Total time: 0.018 sec Total time: 0.029 sec Total time: 0.044 sec Total time: 0.018 sec

Ответ 2



Обычная конкатенация , судя результатам измерения в статье по ссылке, с помощью оператора '+' быстрее любых других в Python - https://tproger.ru/translations/speedy-string-concatenation-python/

Ответ 3



Если вам нужно просто склеить две строки - используйте '+'. Если вам нужно склеить больше двух строк - используйте форматирование, как по мне - лучше str.format. Никогда не склеивайте строки через +=, лучше list + 'join'.

среда, 19 июня 2019 г.

Форматирование исходников с исключениями

Вот такой вот странный вопрос вдруг возник. Какие программы для форматирования исходников (в первую очередь на C, другие языки интересуют меньше) позволяют указывать области для исключений?
Столкнулся с куском кода, в котором пришлось расставлять не только осмысленные, но и фейковые комментарии (/* */), чтобы не потерять ясность после форматирования:
static int a[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* '0' - '9' */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* */ -1, -1, -1, -1, -1, -1, -1, /* 'A' - 'Z' */ 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, /* */ -1, -1, -1, -1, -1, -1, /* 'a' - 'z' */ 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, /* */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* ... up to 255 ... */ };
Для indent, bcpp и astyle этого хватает, но тут нужно в каждом частном случае подбирать варианты. И теоретически захотелось иметь возможность помечать неформатируемые блоки какими-то спецмаркерами.


Ответ

Это ж надо было столько времени тормозить, разглядывая маны...
AStyle, раздел Disable Formatting Indent, 1.10 Disabling Formatting

среда, 12 июня 2019 г.

Форматирование строки с десятичной дробью

У меня есть строка вида
"{0:.2f}sec/{1}".format(my_variable, other_variable)
my_variable это float. Я хочу чтобы она занимала 5 символов. Для обычной переменной я сделал бы так:
"{0: <5}".format(my_variable)
Я пробовал:
"{0:.2f <5} }sec/{1}".format(my_variable, other_variable) "{0:.2f: <5} }sec/{1}".format(my_variable, other_variable)
но вылетает
ValueError: Invalid conversion specification
Как сделать так, чтобы my_variable занимала 5 символов? Примеры вывода:
"23.45" " 2.34" " 0.30"


Ответ

Формат: {:5.2f}
>>> '{:5.2f}'.format(3.3) ' 3.30'

четверг, 30 мая 2019 г.

Python. Вывод текста по середине терминала

Как можно вывести текст в центре экрана терминала, используя shutil.get_terminal_size().columns и shutil.get_terminal_size().lines?


Ответ

Если текст уже разбит на строки, то достаточно просто отформатировать:
>>> import shutil >>> lines = ['String right here', 'And here', 'Here', 'A-a-a-and here'] >>> width = shutil.get_terminal_size().columns >>> position = (width - max(map(len, lines))) // 2 >>> for line in lines: # left justtified ... print(' '*position + line) ... String right here And here Here A-a-a-and here >>> for line in lines: # right justified ... print(line.rjust(width // 2)) ... String right here And here Here A-a-a-and here >>> for line in lines: # center ... print(line.center(width)) ... String right here And here Here A-a-a-and here

четверг, 20 декабря 2018 г.

Эстетичное форматирование json файла

Я использую библиотеку Gson для сериализации в json. Делаю я примерно вот так:
new Gson().toJson(new MyObject());
Но при этом у меня получается одна единая строка, без отступов и переносов:
{"classes":[{"name":"warrior","skills":[]}]}
Каким образом можно форматировать эту строку в более эстетичный вид, при сериализации, что бы потом можно было удобно менять значения? Та строка должна быть примерно такая:
{ "classes": [ { "name": "warrior", "skills": [] } ] }


Ответ

Добавьте настройку в билдер, а не просто создавайте инстанс Gson через конструктор:
Gson gson = new GsonBuilder().setPrettyPrinting().create(); String json = gson.toJson(new MyObject());