почему странное исправление для промежутка на струне - PullRequest
0 голосов
/ 29 февраля 2020

Пошел на перерыв и решил настроить мой 2-х секундный декоратор, в ожидании ранней ранней весны (скрестите пальцы). Спустя двадцать минут после добавления зонтов (вам, возможно, придется заменить их на другой символ UTF-8), первая строка сводила меня с ума, независимо от того, что «я буду sh это сработало таким образом», что я бросил в строку.

Наконец, использование оператора + (вторая строка) устранило мою проблему, хотя его нельзя было использовать в первом разделении. Итак, я спрашиваю вас: почему интервал вообще отсутствует (когда оба оператора конкатенации одинаковы), и, ну, почему этот нестандартный подход работает?

from functools import wraps

def dasher(f):
    @wraps(f)
    def wrapped(*args, **kwargs):
        brella = '\U00002602'
        print(f"{brella} #", f"{brella} # "*8, f"{brella}")
        print(f"{brella} #", f"{brella} # "*8 + f"{brella}") # concat and crazy
        # print("\U00002602 #","\U00002602 # "*8,"\U00002602")
        # print(f"\U00002602 #",f"\U00002602 # "*8,f"\U00002602")

        print()
    return wrapped

@dasher
def dashed():
    pass

dashed()

☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ #  ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂

Pythoni c Рефакторинг

Благодаря ответу Криса Дойла в комментариях, после объяснения различий между , и +, следующие вещи немного усложняются, но расширяют удобство использования, иллюстрируя интервал, избегая при этом необходимости sep=''.

print(' # '.join(brella*3), '#' ,' xx '.join(brella*5) , '#' ,' # '.join(brella*3))
print(' # '.join(brella*3) + ' o ' +' xx '.join(brella*5) + ' o ' +' # '.join(brella*3))

С выводом:

☂ # ☂ # ☂ # ☂ xx ☂ xx ☂ xx ☂ xx ☂ # ☂ # ☂ # ☂
☂ # ☂ # ☂ o ☂ xx ☂ xx ☂ xx ☂ xx ☂ o ☂ # ☂ # ☂ 

1 Ответ

1 голос
/ 29 февраля 2020

Когда вы передаете несколько элементов для печати по умолчанию, в качестве разделителя будет использоваться пробел. Поэтому, когда вы даете свою первую строку, вы заканчиваете ее #. затем вы следуете за запятой и передаете следующий элемент для печати (так как разделителем по умолчанию для элементов в печати является пробел, первый элемент и второй элемент будут разделены пробелом. Таким образом, у вас будет hash space umbrella

однако ваша вторая строка, которую вы умножаете, оканчивается пробелом, затем вы ставите запятую, а затем третий элемент. Таким образом, ваш второй элемент оканчивается пробелом, а печать помещается в интервал между вашим вторым и третий пункт, в результате чего у вас будет двойной пробел, поэтому у вас будет hash space space umbrella

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

В качестве альтернативы вы можете просто умножить свой brella на 10, а затем используйте «#» в качестве соединителя, чтобы соединить их всех.

brella = '\U00002602'
print(f"{brella} #", f"{brella} # "*8, f"{brella}")
print(f"{brella} #", f"{brella} # "*8 + f"{brella}")
print(f"{brella} # ", f"{brella} # "*8, f"{brella}", sep='')
print(' # '.join(brella*10))

ВЫХОД

☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ #  ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂
...