이 경우를 f- 문자열로 Pythonic 방식으로 형식화하는 방법을 알고 싶습니다.
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
문제는 f- 문자열 '\'
의 {...}
표현식 부분 내에서 사용할 수 없다는 것 입니다. 예상 출력 :
Winners are:
Adam
Bob
Cyril
답변:
당신은 할 수 없습니다. 백 슬래시는 중괄호 안에 나타날 수 없습니다 {}
. 이렇게하면 다음과 같은 결과가 나타납니다 SyntaxError
.
>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash
이것은 f- 문자열 에 대한 PEP 에 지정되어 있습니다.
백 슬래시는 f- 문자열의 표현식 부분에 나타나지 않을 수 있습니다. [...]
한 가지 옵션은 '\n'
이름을 지정한 다음 -string .join
내부에있는 f
것입니다. 즉, 리터럴을 사용하지 않습니다.
names = ['Adam', 'Bob', 'Cyril']
nl = '\n'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)
결과 :
Winners are:
Adam
Bob
Cyril
@wim에 지정된 또 다른 옵션 chr(10)
은 \n
반환 된 다음 거기에 참여하는 데 사용 하는 것입니다.f"Winners are:\n{chr(10).join(names)}"
물론 또 다른 방법은 '\n'.join
사전에 이름을 추가하는 것입니다.
n = "\n".join(names)
text = f"Winners are:\n{n}"
결과는 동일한 결과입니다.
이것은 f
-strings와 str.format
. 후자의 경우 해당 키가 포함 된 괴상한 사전의 압축을 풀 때 부여 된 구두점을 항상 사용할 수 있습니다.
>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"
(이러지 마세요.)
전자에서는 구두점을 사용하는 식별자를 가질 수 없기 때문에 구두점을 사용할 수 없습니다.
옆으로 : 다른 답변이 대안으로 제안 했듯이 나는 확실히 print
또는을 선택할 것 format
입니다. 내가 제공 한 옵션 은 어떤 이유로 든 f- 문자열 을 사용해야 하는 경우에만 적용됩니다 .
새로운 것이 있다고해서 모든 것을 시도해야한다는 의미는 아닙니다 ;-)
구분 기호가있는 문자열 목록을 인쇄하기 위해 f- 문자열 또는 기타 포맷터가 필요하지 않습니다. sep
키워드 인수를 사용하여 다음 을 수행하십시오 print()
.
names = ['Adam', 'Bob', 'Cyril']
print('Winners are:', *names, sep='\n')
산출:
Winners are:
Adam
Bob
Cyril
즉, 여기에서 str.join()
/를 사용 str.format()
하는 것은 f- 문자열 해결 방법보다 더 간단하고 읽기 쉽습니다.
print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))
print(*dir(some_object), sep='\n')
또는 print(*vars(some_object), sep='\n')
.
str.join()
: text = '\n'.join(['Winners are:', *names])
. BTW print()
는 모든 파일 에 쓰는 데 사용할 수 있습니다 ( 기본적으로 file
인수로 지정됨 sys.stdout
).
다른 사람들이 말했듯이 f- 문자열에 백 슬래시를 사용할 수는 없지만 다음을 사용하여이 문제를 해결할 수 있습니다 os.linesep
(하지만 \n
모든 플랫폼에 적용되는 것은 아니며 바이너리 파일을 읽거나 쓰지 않는 한 권장되지 않습니다. Rick의 주석 참조 ).
>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril
또는 가독성이 떨어지는 방식이지만 다음 \n
과 chr()
같이 보장됩니다 .
>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril
os.linesep
그냥 읽기 또는 읽기와 이진 모드에서 쓰기 위해 . 이 경우에도 똑같이 작동한다는 것을 알고 있지만 시작하는 것은 나쁜 습관입니다. 그러나 다시 말하지만 나는 반대표가 아니었다. 경고는 나에게 충분합니다. :)
다른 답변은 개행 문자를 f- 문자열 필드에 넣는 방법에 대한 아이디어를 제공합니다. 그러나 나는 OP가 제시 한 예 (OP의 실제 사용 사례를 나타낼 수도 있고 아닐 수도 있음)의 경우 이러한 아이디어 중 어느 것도 실제로 사용해서는 안된다고 주장합니다.
f- 문자열 사용의 요점은 코드 가독성을 높이는 것입니다. 으로 할 수없는 f- 문자열로 할 수있는 일은 없습니다 format
. 이에 대해 더 읽을 수있는 것이 있는지 신중하게 고려하십시오 (할 수 있다면).
f"Winners are:\n{'\n'.join(names)}"
...아니면 이거:
newline = '\n'
f"Winners are:\n{newline.join(names)}"
...아니면 이거:
"Winners are:\n{chr(10).join(names)}"
대 이것 :
"Winners are:\n{}".format('\n'.join(names))
마지막 방법은 적어도 읽을 수있는 정도입니다.
요컨대, 반짝이는 새 드라이버가 있다고해서 드라이버가 필요할 때 망치를 사용하지 마십시오. 코드는 작성된 것보다 훨씬 더 자주 읽습니다.
다른 사용 사례의 경우 chr(10)
아이디어 나 newline
아이디어가 적절할 수 있습니다. 그러나 주어진 사람에게는 아닙니다.
f"Winners are:\n{chr(10).join(names)}"