Python2.6+는 원래 '%' 연산자를 대체하기 위해 str.format 함수를 추가합니다. '%'보다 사용법이 더 직관적이고 유연합니다. 사용방법에 대해 자세하게 소개되어 있습니다.
다음은 '%'를 사용한 예입니다.
"" "PI is %f..." % 3.14159 # => 'PI is 3.141590...' "%d + %d = %d" % (5, 6, 5+6) # => '5 + 6 = 11' "The usage of %(language)s" % {"language": "python"} # => 'The usage of python'
형식은 printf와 매우 유사합니다. C언어 맞죠? '%'는 연산자이므로 왼쪽과 오른쪽에 하나의 매개변수만 배치할 수 있으므로 오른쪽에 있는 여러 값을 튜플이나 딕셔너리에 포함해야 하므로 튜플과 딕셔너리는 함께 사용할 수 없으므로 유연성이 부족합니다. .
동일한 예를 형식 메서드를 사용하여 다시 작성했습니다.
"PI is {0}...".format(3.14159) # => 'PI is 3.14159...' "{0} + {1} = {2}".format(5, 6, 5+6) # => '5 + 6 = 11' "The usage of {language}".format(language = "Python") # => 'The usage of Python'
매우 직관적이지 않나요? (물론 C 언어를 사용할 때는 전자의 형식 표현도 좋아합니다:-) )
형식 문자열
"{named} consist of intermingled character {0} and {1}".format("data", "markup", \ named = "Formats trings") format(10.0, "7.3g") # => ' 10' "My name is {0} :-{{}}".format('Fred') # => 'My name is Fred :-{}'
첫 번째 줄의 ''에 주의하세요. 문을 줄바꿈해야 하는 경우 끝에 백슬래시를 사용하여 이스케이프해야 합니다.
'%'를 사용하면 이와 같이 튜플과 딕셔너리를 혼합할 수 없습니다. 실제로 여기에는 Python의 기능인 명명된 매개변수가 있습니다. 배열을 정의할 때 *args, **kwargs 구문을 사용하여 컬렉션과 사전을 확장할 수 있습니다. 명명된 매개변수는 끝에 배치된다는 점에 유의해야 합니다.
두 번째 문은 형식 내장 함수가 단일 값의 형식을 지정하는 데 사용됨을 나타냅니다.
세 번째 문은 {}의 이스케이프를 나타냅니다. 왜냐하면 {}는 형식이 지정된 문자열의 특수 문자이고 직접 표시될 수 없기 때문입니다. 이스케이프 방법은 한 수준 더 중첩하는 것입니다.
속성 및 인덱스 사용
"My name is {0.name}".format(open('out.txt', 'w')) # => 'My name is out.txt'
'{0.name}'은 object open('out.txt', 'w').name
"My name is {0[name]}".format(dict(name='Fred')) # => 'My name is Fred'
속성에 대한 인덱스를 사용할 수도 있습니다.
obj[key]는 obj.____getitem____('key')
표준 지정자(Specifiers)
C로 작성됨 언어 프로그래머는 printf의 복잡성을 알고 있어야 합니다. format은 또한 값의 형식을 해석한 다음 이를 문자열에 삽입하는 데 사용되는 여러 표준 지정자를 정의합니다. 예:
"My name is {0:8}".format('Fred') # => 'My name is Fred '
':' 뒤에는 지정자가 옵니다. 위 예에서 지정자는 '8'(최소 너비) 하나만 갖습니다. 이는 삽입된 값의 너비가 8 이상이어야 함을 의미합니다. '프레드'는 4개만 있어서 4개의 공백이 더 추가됩니다.
지정자의 자세한 형식은 다음과 같습니다:
[[fill]align][sign][#][0][minimumwidth][.precision][type]
(C의 printf보다 더 간결하지는 않습니다!)
참고: '[]' 요소가 선택사항임을 나타냅니다. 따라서 모든 형식 지정자는 선택 사항입니다! 이전 예제와 마찬가지로 이는 거의 사용되지 않습니다(단지 예제를 더 명확하게 하기 위해). 사실, 이것들은 매우 유용합니다.
하나씩 살펴보겠습니다.
1. [fill]align은 배열을 의미합니다. 최소폭을 삽입된 값보다 크게 설정하면 앞선 예시의 '내 이름은 프레드'처럼 공백이 생깁니다. 기본적으로 공백은 오른쪽에 배치됩니다. 즉, 삽입된 값은 기본적으로 왼쪽 정렬됩니다. {0:>8}을 시도하면 결과는 'My name is Fred'가 됩니다.
fill은 공백을 채우는 데 사용되는 문자를 나타냅니다. 채우기는 정렬이 지정된 경우에만 유용합니다! align은 다음 식별자일 수 있습니다:
ce58efa43cda09ae2c6b79d462002bf8 오른쪽 정렬
= 정렬 표시 뒤에 공백을 두십시오. 이는 숫자에만 유효합니다. 그것은 무엇을 의미합니까? 아래에서 설명하겠지만 align은 숫자의 양수 및 음수 부호를 표시하며 이는 숫자에만 유효합니다. '='를 지정하면 공백 앞에 숫자의 양수 및 음수 부호가 표시됩니다. 예: format(-12, "0=8") # => '-0000012' 여기서는 단일 값의 형식을 지정하기 위한 내장 함수 형식이 사용됩니다. '0'은 공백을 채우는 데 사용되는 채우기 요소입니다. '='는 최소 너비가 8이므로 공백이 5개만 있음을 의미합니다. 정렬은 어떻습니까? Align은 실제로 더하기 및 빼기 기호의 표시 방법을 설명합니다. 여기서는 기본 '-'가 사용되며 이에 대해서는 나중에 설명합니다.
^ 가운데 정렬
2. 숫자에만 유효합니다.
+ 더하기 및 빼기 기호 표시
- 더하기 기호는 표시하지 않고 빼기 기호를 표시합니다. 최소 너비를 지정하지 않으면 음수는 항상 양수보다 기호 위치를 하나 더 많이 차지합니다. 기본값
' '(공백) 더하기 기호를 대체하려면 공백을 사용하세요.
3 # 표시되는 숫자의 접두사는 나타냅니다. 십진법(0b, 0o, 0x)
4.0 공백을 '0'으로 채웁니다.
5. 최소 너비는 최소 너비를 지정하며 여러 번 사용되었습니다.
6. 정밀도 '정밀도'는 소수점 이하 자릿수를 나타내는 숫자입니다.
7. 유형 값 유형:
① 정수 유형:
b 바이너리
c 문자 유형, 숫자를 유니코드를 나타내는 문자로 변환
d 십진수
o 8진수
x 16진수, 소문자 표시
X 16진수, 대문자 표시
n과 d 동작 동일, 지역 숫자 표현 사용
''(비어 있음, 공백 없음)은 d
②부동 소수점 수
와 같습니다.e 科学计数法表示,小写e
E 科学计数法表示,大写E
f 显示为定点数,默认小数点后六位
F 同f
g 自动选择是否用科学记数法表示
G 同g
n 同g,使用本地表示方式
% 使用百分比表示
''(空) 同g
每个对象可以重写自己的格式化说明符,例如datatime类重写了后可以这样表示:
"Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now())
预先转换
':'之后是格式说明符,之前还可以加预先转换的标识
!r 调用对象的_repr_方法来转换成标准字符串
!s 调用对象的_str_方法来转换成字符串
重写_format_方法
我们在格式化一个字符串时,首先格式化每个值,然后再插入字符串内。格式化值调用的就是format内置方法。format则是简单地调用该值的_format_方法。
def format(value, format_spec): return value.__format__(format_spec)
在object类内实现了_format方法,只是将本身用str()转换成字符串,然后将字符串传入内置的format方法,实际上就是调用转换为字符串后的format_方法。
class object: def __format__(self, format_spec): return format(str(self), format_spec)
int/float/str自身实现了_format_方法,前面已经介绍了它们各自的说明符。
结束语
还有一点儿是自定义Formatter,不过平常也用不到。留作下篇string模块源码解读的内容吧。建议有兴趣的朋友多看看Python标准库的源码,很有学习价值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。
更多Python实现字符串格式化的方法小结相关文章请关注PHP中文网!