- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
"""
A module for printing funny frames.
Copyright (C) 2021 Ingostnus.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
from math import sqrt
_str = "sample" # String to be turned into a funny frame.
_sep = ' ' # Separator, i.e. a string to be inserted between each letter of the _str.
_vertical_separator_mode = 'F' # Determines whether separator should be printed between each row.
# ... 'F' --> off. 'T' --> on.
def get_user_input() -> None:
"""
This function lets user input desired values and override the defaults.
"""
global _str; _str = str(input("String: "))
global _sep; _sep = str(input("Character: "))
global _vertical_separator_mode; _vertical_separator_mode = str((input("VSM (T/F):")))
if _vertical_separator_mode == 'T':
print("VMS is ON!!!")
def print_frame(printer = print) -> list:
"""
This function is designed for printing a frame. Custom printer function
may be supplied to process the output in a specific way.
"""
buffer_len = (len(_str) + len(_sep) * (len(_str) - 1))**2
# First line.
printer(''.join([_str[i] + _sep if i < (len(_str) - 1) else _str[-1] for i in range(len(_str))]))
# Second -- pre last lines.
empty_space = ' ' * (int(sqrt(buffer_len)) - 2)
for i in range(1, len(_str) - 1):
# If vertical separator mode is toggled, print vertical separator.
if _vertical_separator_mode == 'T':
printer(_sep + empty_space + _sep)
printer(_str[i] + empty_space + _str[-(i + 1)])
# Last line.
printer(''.join([_str[-(i + 1)] + _sep if i < (len(_str) - 1) else _str[0] for i in range(len(_str))]))
# To give the best perfomance and flexibility, this module should be used as
# an imported library. Though, its basic functionality can be used even if
# it's executed directly.
if __name__ == '__main__':
get_user_input()
print_frame()
Переписала код https://govnokod.ru/27348 на питон, добавив чуть-чуть улучшений и немноже4ко документацци.
KoWe4Ka_l7porpaMMep 11.04.2021 08:06 # 0
gologub 11.04.2021 10:39 # 0
JloJle4Ka 11.04.2021 14:08 # 0
BelCodeMonkey 11.04.2021 10:57 # +1
В этом коде если в разделителе больше одного символа, то разделитель начинает съезжать по правой вертикальной границе. Также нет разделителя в предпоследней строке.
JloJle4Ka 11.04.2021 11:05 # +1
Я просто забыл, о чём был код, а пересчитывать было лень, поэтому я написал заново, как запомнил.
OCETuHCKuu_nemyx 11.04.2021 11:16 # +1
booratihno 11.04.2021 14:36 # 0
дальше не читал
JloJle4Ka 11.04.2021 15:40 # 0
_PHP_ 11.04.2021 15:47 # 0
JloJle4Ka 11.04.2021 15:49 # 0
TOPT 12.04.2021 10:27 # +2
JloJle4Ka 12.04.2021 05:25 # 0
Для новичков: не переопределяйте глобальные переменные вообще, то есть избегайте global. Считайте каждое появление global в коде ошибкой, если нет особых причин для использования этой конструкции (как в примере с multiprocessing). Если не получается избавится от global, то создайте минимальный пример кода и задайте отдельный вопрос: "как избавиться от global, делая X"
Какой глобофоб )))
примером из жизни может послужить любая крупная поделка на php, когда тебе нужно найти место, где эта переменная объявляется. так в питоне поиск global переменной сразу сократится до одного файла.
И чем это плохо? Чем же? Нет, с пхп всё понятно – там это ОЧЕНЬ плохо. А в питоне почему это моветон?
bormand 12.04.2021 10:06 # +1
Ну это как статик глобалка в няшной. С одной стороны это уже намного лучше, чем настоящая глобалка. А с другой -- тестированию немного мешает, да и о многопоточности приходится задумываться.
З.Ы. Для мелкой одноразовой скриптушни и так сойдёт, конечно.
JloJle4Ka 12.04.2021 10:22 # 0
В данном конкретном случае наилучший вариант был бы передавать _str и _sep как аргументы с дефолтными значениями.
bormand 12.04.2021 10:29 # 0
DypHuu_niBEHb 12.04.2021 15:13 # 0
bormand 12.04.2021 15:20 # 0
DypHuu_niBEHb 12.04.2021 15:27 # 0
ну тогда нужно эту структуру отдавать из функции
Ключ слово "global" пахнет говном. Если можно не пахнуть говном, то лучше не пахнуть говном. Нет?
bormand 12.04.2021 15:30 # 0
DypHuu_niBEHb 12.04.2021 15:31 # +1
govno = get_user_input()
print_govno(govno)
никакова глобал
KoWe4Ka_l7porpaMMep 12.04.2021 16:13 # 0
DypHuu_niBEHb 12.04.2021 15:15 # 0
Если же это ридонли константы, то можно читать их вообще без global (и лучше наверное сделать их большими буквами, хотя в питоне (в отличие от языка японских богов) это на ридонли не влияает)
bormand 12.04.2021 11:05 # 0
JloJle4Ka 12.04.2021 11:09 # 0
bormand 12.04.2021 12:42 # +2
JloJle4Ka 12.04.2021 12:50 # 0