Python에서 문자열 형식 지정을 구현하는 방법 요약

高洛峰
풀어 주다: 2017-02-21 17:01:26
원래의
1385명이 탐색했습니다.

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은 다음 식별자일 수 있습니다:

  • < 왼쪽 정렬, 기본값

  • > 오른쪽 정렬

  • = 정렬 표시 뒤에 공백을 두십시오. 이는 숫자에만 유효합니다. 그것은 무엇을 의미합니까? 아래에서 설명하겠지만 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中文网!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿