Python 문자열 을 맞 추 는 7 가지 방법 요약

머리말
프로 그래 밍 소 가 조롱 하 는 것 을 어디서 봤 는 지 잊 어 버 렸 다.그 는 프로그래머 가 매일 두 가지 일 을 하 는데 그 중 하 나 는 문자열 을 처리 하 는 것 이 라 고 말 했다.많은 학우 들 이 공감 할 것 이 라 고 믿는다.
Python 에서 우 리 는 문자열 의 연결 문 제 를 자주 만 납 니 다.거의 모든 프로 그래 밍 언어 는 문자열 을 가장 기본 적 이 고 없어 서 는 안 되 거나 없어 서 는 안 되 는 데이터 형식 으로 지정 합 니 다.문자열 을 맞 추 는 것 은 필수 적 인 기능 이다.오늘 저 는 여러분 과 함께 Python 문자열 을 맞 추 는 7 가지 방식 을 배 웠 습 니 다.
다음은 더 이상 할 말 이 없 으 니 상세 한 소 개 를 살 펴 봅 시다.
1.C 언어 에서 온%방식

print('%s %s' % ('Hello', 'world'))
>>> Hello world
%번 포맷 문자열 의 방식 은 오래된 C 언어 에서 계승 되 는데 이것 은 많은 프로 그래 밍 언어 에서 유사 하 게 실현 된다.위의%s 는 하나의 문자열 만 을 대표 하 는 자리 표시 자 이 며,실제 내용 은 아 닙 니 다.실제 맞 춤 법 내용 은 하나의 단독%번호 뒤에 원 그룹 에 놓 여 있 습 니 다.
유사 한 자리 표시 자 는%d(하나의 정수 대표),%f(하나의 부동 소수점 대표),%x(16 진수 대표)등 이 있 습 니 다.%자리 차지 부 호 는 이러한 연결 방식 의 특징 이자 제한 이다.모든 자리 차지 부 호 는 특정한 의 미 를 가지 기 때문에 실제 적 으로 사용 하기 가 너무 번거롭다.
2.format()조합 방식

#    
s1 = 'Hello {}! My name is {}.'.format('World', 'Python ')
print(s1)
>>>Hello World! My name is Python .

#      
s2 = 'Hello {0}! My name is {1}.'.format('World', 'Python ')
s3 = 'Hello {name1}! My name is {name2}.'.format(name1='World', name2='Python ')
print(s2)
>>>Hello World! My name is Python .
print(s3)
>>>Hello World! My name is Python .
이 방식 은 괄호{}을 대체 문자 로 사용 하고 format 방법 에서 실제 연결 값 으로 전환 합 니 다.실제 적 으로%번호 조합 방식 에 대한 개선 임 을 쉽게 알 수 있다.이런 방식 은 Python 2.6 에서 도입 되 기 시작 했다.
상례 에서 간결 판 의 괄호 에는 내용 이 없고 순 서 를 잘못 알 기 쉬 운 것 이 단점 이다.로그 인 판 은 주로 두 가지 가 있 는데 하 나 는 시퀀스 번호 이 고 하 나 는 key-value 를 사용 하 는 방식 이다.실전 에서 우 리 는 다음 하 나 를 더 추천 합 니 다.순 서 를 잘못 세 지 않 을 뿐만 아니 라 직관 적 으로 읽 을 수 있 습 니 다.
3.()유사 모듈 방식

s_tuple = ('Hello', ' ', 'world')
s_like_tuple = ('Hello' ' ' 'world')

print(s_tuple) 
>>>('Hello', ' ', 'world')
print(s_like_tuple) 
>>>Hello world

type(s_like_tuple) >>>str
주의,상례 중 slike_tuple 은 원 그룹 이 아 닙 니 다.요소 간 에 쉼표 구분자 가 없 기 때문에 이 요소 들 은 빈 칸 으로 간격 을 두 거나 빈 칸 을 두 지 않 아 도 됩 니 다.type()을 사용 하여 보 니 str 형식 입 니 다.나 는 이것 이 무슨 원인 인지 알 아내 지 못 했 는데,아마도()괄호 안의 내용 이 Python 에 의 해 최적화 처리 되 었 을 것 이 라 고 추측 했다.
이런 방식 은 보기 에는 매우 빠 르 지만 괄호()내 요구 요 소 는 실제 문자열 이 므 로 변 수 를 혼용 할 수 없 기 때문에 유연성 이 부족 하 다.

#     ,      
str_1 = 'Hello'
str_2 = (str_1 'world')
>>> SyntaxError: invalid syntax
str_3 = (str_1 str_1)
>>> SyntaxError: invalid syntax
#           
str_4 = (str_1)
4.대상 템 플 릿 조합

from string import Template
s = Template('${s1} ${s2}!') 
print(s.safe_substitute(s1='Hello',s2='world')) 
>>> Hello world!
솔직히 나 는 이런 실현 방식 을 좋아 하지 않 는 다.대상 사상 에 의 해 독 해 된 악취 가 짙다.
긴 말 안 할 게 요.
5.자주 사용 하 는+번호 방식

str_1 = 'Hello world! ' 
str_2 = 'My name is Python .'
print(str_1 + str_2)
>>>Hello world! My name is Python .
print(str_1)
>>>Hello world! 
이런 방식 은 가장 자주 사용 되 고 직관 적 이 며 이해 하기 쉬 우 며 입문 급 의 실현 방식 이다.하지만 실수 하기 쉬 운 점도 두 군데 있다.
우선,새로 프로 그래 밍 에 들 어간 학생 들 은 실 수 를 하기 쉽 습 니 다.그들 은 문자열 이 가 변 적 이지 않 은 유형 이라는 것 을 모 릅 니 다.새로운 문자열 은 새로운 메모 리 를 독점 하고 원래 의 문자열 은 변 하지 않 습 니 다.상례 에서,맞 춤 법 앞 에 두 단락 의 문자열 이 있 는데,맞 춤 법 뒤에 실제 세 단락 의 문자열 이 있다.
그 다음으로 일부 경험 이 있 는 오래된 프로그래머 들 도 실 수 를 하기 쉽다.그들 은 맞 춤 법 횟수 가 3 을 넘 지 않 을 때+번 연결 부 호 를 사용 하면 다른 방식 보다 빠르다 고 생각 하지만 합 리 적 인 근거 가 없다.
사실 짧 은 글자 값 을 맞 출 때 CPython 의 상수 접 기(constant folding)기능 으로 인해 이 글자 들 의 액면가 가 더 짧 은 형식 으로 바 뀔 수 있 습 니 다.예 를 들 어'a'+'b'+'c'는'abc'로 바 뀌 고'hello'+'World'도'hello World'로 바 뀔 수 있 습 니 다.이러한 전환 은 컴 파일 기간 에 완 성 된 것 이 고 운행 기간 이 되면 더 이상 연결 작업 이 일어나 지 않 기 때문에 전체적인 계산 속 도 를 가속 화 할 것 이다.
상수 접 기 최적화 에는 한도 가 있 는데,그것 은 연결 결과 의 길이 가 20 을 초과 하지 않도록 요구한다.따라서 맞 춤 형 최종 문자열 의 길이 가 20 을 넘 지 않 을 때+번 연산 자 방식 은 뒤에서 언급 한 join 등 방식 보다 훨씬 빠 릅 니 다.이것 은+번 의 사용 횟수 와 무관 합 니 다.
주제 밖의 말:너 는 20 이라는 숫자 가 매우 익숙 하 다 고 생각 하 니?맞 아,우리 가 전에 파 이 썬 에서'특권 종족'은 무엇 이 었 지?문자열 류 의 특권 종족 도 20 으로 제한 된다 고 언급 했다.당시 에 도 컴 파일 기간 과 운영 기간 의 차 이 를 보 여 주 었 으 니 다시 보 는 것 을 권장 합 니 다.
6.join()조합 방식

str_list = ['Hello', 'world']
str_join1 = ' '.join(str_list)
str_join2 = '-'.join(str_list)
print(str_join1) >>>Hello world
print(str_join2) >>>Hello-world
str 대상 이 자체 적 으로 가지 고 있 는 join()방법 은 하나의 서열 적 인 파 라 메 터 를 받 아들 이면 조합 을 실현 할 수 있 습 니 다.연결 할 때 요소 가 문자열 이 아니라면 먼저 변환 해 야 합 니 다.이 방법 은 연결 시퀀스 대상(예 를 들 어 목록)의 요소 에 비교적 적용 되 고 통 일 된 간격 부 호 를 설정 하 는 것 을 알 수 있다.
맞 춤 형 길이 가 20 이 넘 을 때 이런 방식 은 기본적으로 최 우선 이다.그러나 그 단점 은 단편 적 이 고 서열 집합 에 있 지 않 은 요소 의 조합 에 적합 하지 않다 는 것 이다.
7.f-string 방식

name = 'world'
myname = 'python_cat'
words = f'Hello {name}. My name is {myname}.'
print(words)
>>> Hello world. My name is python_cat.
f-string 방식 은 PEP 498(Literal String Interpolation,문자 문자열 삽입 값)에서 나 와 Python 3.6 버 전에 서 도입 되 었 습 니 다.문자열 앞 에 f 표 지 를 추가 하고 문자열 중간 에 괄호{}로 다른 문자열 변 수 를 감 싸 는 것 이 특징 입 니 다.
이 방식 은 가 독성 에서 format()방식 을 순식간에 죽 이 고 긴 문자열 의 연결 을 처리 할 때 속도 가 join()방법 과 비슷 하 다.
그럼 에 도 불구 하고 이런 방식 은 다른 프로 그래 밍 언어 에 비해 우아 하지 않다.왜냐하면 이것 은 f 표 지 를 도 입 했 기 때문이다.다른 일부 프로그램 언어 는 셸 과 같이 더욱 세련 될 수 있다.

name="world"
myname="python_cat"
words="Hello ${name}. My name is ${myname}."
echo $words
>>>Hello world. My name is python_cat.
요약 하면 우리 가 앞에서 말 한'문자열 연결'은 사실은 결과 적 으로 이해 하 는 것 이다.실현 원리 에서 구분 하면 우 리 는 이런 방법 을 세 가지 유형 으로 나 눌 수 있다.
포맷 클래스:%,format(),template
연결 클래스:+,(),join()
플러그 인 클래스:f-string
문자열 목록 등 시퀀스 구 조 를 처리 하려 면 join()방식 을 사용 합 니 다.조립 길이 가 20 을 초과 하지 않 을 때+호 조작 부호 방식 을 선택한다.길이 가 20 이 넘 는 경우,높 은 버 전 은 f-string 을 사용 하고,낮은 버 전 은 상황 에 따라 format()또는 join()방식 을 사용 합 니 다.
One more thing:
이게 끝 인 줄 알 아?
도안내 스타일 아니 야!
나의 스타일 은 사고,체계 적 사고,그리고 프로 그래 밍 철학 을 추구 하 는 사고 이다.
최근 에 나 는 을 읽 고 있 는데 폴 그레이 엄 은 책 에서 이 문 제 를 제기 했다.
의미 상 문자열 은 많 든 적 든 목록 의 하위 집합 으로 이해 할 수 있 으 며,그 중의 모든 요 소 는 문자 이다.그렇다면 왜 문자열 을 하나의 데이터 구조 로 나열 해 야 합 니까?
저 자 는'프로 그래 밍 언어 설정 문자열 이 너무 일찍 최 적 화 된 예 인 것 같다'고 생각 합 니 다.이 관점 은 저 를 매우 감동 시 켰 습 니 다!앞에서 언급 한 일곱 가지 문자열 을 맞 추 는 방법 은 순식간에 종이 로 변해 닿 자마자 찢 어 질 정도 로 얇 았 다.
그러나 저 자 는 아직 부족 하 다 고 생각한다.그 는 더 놀 라 운 생각 을 가지 고 있다.
이보다 더 놀 라 운 예언 도 있다.논리 적 으로 정수 에 대해 서 는 별도의 표현법 을 설정 할 필요 가 없습니다.그것들 도 목록 으로 볼 수 있 기 때문에 정수 n 은 n 요소 의 목록 으로 표시 할 수 있 습 니 다.프로 그래 밍 언어 는 기본 데이터 형식 중 하나 인 정 수 를 포기 하 는 단계 로 발전 할 수 있 습 니까?
네가 이 말 을 다 읽 은 소감 이 어 떨 지 모르겠다.내 가 책 을 읽 을 때,비록 상하 문장의 언어 환경 이 깔 려 있 지만,여전히 경탄 해 마지 않 는 다.
다음 추천서 시리즈 의 서목 은'해커 와 화가'입 니 다.그 때 는 행운 의 추첨 이 있 을 것 입 니 다.'해커 와 화가'한 권 을 보 내 드 리 니 유의 하 시기 바 랍 니 다.
관련 PEP 링크 몇 개 첨부:
  • https://www.python.org/dev/peps/pep-0215/
  • https://www.python.org/dev/peps/pep-0292/
  • https://www.python.org/dev/peps/pep-3101/
  • https://www.python.org/dev/peps/pep-0498/
  • 총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기