파이썬의 문자열 리터럴은 작은 따옴표 또는 큰 따옴표로 묶음 -> 작은 따옴표 또는 큰 따옴표 세 개를 연달아 입력하는 방법도 가능
간단한 문자열 만들어 보기 • “Hello” • ‘안녕하세요’ • '''문자열을 공부하고 있습니다.''' • """문자열을 공부하고 있습니다."""
문자열 내부에 따옴표를 넣으려면?
큰따옴표(작은따옴표) 안에 작은따옴표(큰따옴표)로 문자를 표기해야 함
""안에 ""을 넣는다면, 단순 문자열이 두 번 반복되는 걸로 파이썬 인터프리터는 이해함 예 : ""안녕"하세요" → “”, “하세요” 가 독립된 문자열로 인식됨. 안녕은 문자열로 인식도 안됨
혹은 이스케이프 문자 (역슬래쉬 \ 기호와 함께 사용, 한국어 키보드에서는 원화표시 ₩)를 함께 사용 예 : \', \''
문자열 연산
문자열 연산에도 숫자형과 비슷하게 +, * 연산을 적용할 수 있음
+ : 주어진 여러 문자열 연결 (합치기) 문자열 + 문자열 + ,,, + 문자열 (O) 문자열 + 숫자형 (X)
* : 주어진 문자열 반복 문자열 * 반복 횟수(숫자) 반복 횟수(숫자) * 문자열
문자열 연산에도 아래 복합대입연산을 적용할 수 있음
문자열 in 연산 문자열 내부에 어떤 문자열이 있는지 확인하려면 in 연산자를 사용할 수 있고, true/false를 반환해줌
문자열 인덱싱
문자열 내부적으로 보면 하나의 단어는 각각 하나의 인덱스(index)에 맵핑 될 수 있음
기본적인 인덱스는 0부터 시작되며, 해당 문자열의 길이-1까지 인덱스가 존재함 “안녕하세요”는 길이가 5이므로, 인덱스는 0~4까지 가능
문자열을 받은 변수 혹은 문자열 자체에 대해서 인덱스를 대괄호[]와 함께 사용해서 접근할 수 있음
인덱스는 양수뿐만 아니라 음수도 가능함
문자열 슬라이싱
주어진 문자열에 대해서 특정 문자 1개에만 접근할 수 도 있지만, 문자열의 범위를 선택해야 하는 경우도 있음 예 : 문자열의 두 번째 문자부터 다섯 번째 문자까지 선택하기
이렇게 부분 문자열을 추출하는 방법을 슬라이싱이라고 하며, 대괄호와 :을 통해서 표시할 수 있음
작성 방법: [ : ] -> [부분 시작 문자의 인덱스 : 부분 끝 문자의 인덱스 + 1] 예 : a[1:4] → 문자열 a의 부분 시작 문자의 인덱스 1부터 부분 끝 문자의 인덱스 3 → “녕하세” 선택
생략 슬라이싱 • 대괄호 안에 넣는 숫자 둘 중 하나를 생략하여 사용할 수 있음 예 : [1:] [: 3] • 뒤의 값 생략 시 가장 최대 위치 (마지막 글자)까지 지정 [1:] → [1:가장 마지막 글자 인덱스 + 1] • 앞의 값 생략 시 가장 최소 위치 (첫번째 글자)부터 지정 [:3] → [0:가장 마지막 글자의 인덱스인 2 + 1]
슬라이싱에서도 인덱싱과 같이 음수도 가능 • a[1:-2] → “녕하”
여기서도 뒷 인덱스는 원하는 끝 문자의 index보다 하나 커야 함 부분 끝 문자의 인덱스 -3 + 1 = -2 A[-5: -2] → “안녕하”
음수를 사용하는 슬라이싱에서도 앞/뒤 숫자 중 하나를 생략할 수 있음
뒤의 값 생략 시 가장 최대 위치 (마지막 글자)까지 지정 → a[-4:] 앞의 값 생략 시 가장 최소 위치 (첫번째 글자)부터 지정 → a[:-1]
슬라이싱시 아무런 숫자를 주지 않으면? 전체 문자열을 슬라이싱 함
문자열 관련 함수
문자열 길이 구하기
len() 함수
()안에 문자열을 넣으면 주어진 문자열의 문자 개수(=문자열의 길이)를 계산해서 돌려줌 예 : len(“안녕하세요”) → 5라는 숫자를 돌려줌
문자열에 공백이나 이스케이프 문자가 있을 경우 그것도 count하여 돌려줌
문자열 찾기
find()라는 함수는 입력으로 주는 argument 문자가 처음 나타나는 위치(index 값)를 반환해주는 작업을 함
format() 함수
“”로 묶인 문자열 안에 있는 중괄호{} 안의 문자가 format() 함수의 argument 로 주는 값으로 대치됨 예 : “제 나이는 {} 살 입니다.”.format(20) → {} 대신 20으로 대치가 됨
C언어나 Java 같은 프로그래밍 언어와 달리, 파이썬에서는 코드를 작성할 때 프로그래머가 자료형을 지정하지 않아도 됨
프로그래밍 시 자료형을 지정하지 않아도 되긴 하지만, 파이썬 내부에서는 자동으로 자료형을 정해줌 • 런타임(실행 시간) 시에 자료형이 결정됨 • 자동으로 지정된 자료형은 어떻게 확인할 수 있나? -> type( )이라는 함수를 통해서 확인할 수 있음 • 실행시켜 보기 전에는 오류를 검출하기 어렵지만, 유연하고 빠르게 코딩이 가능
숫자형(수치 자료형)
숫자형(number)이란 숫자 형태로 이루어진 자료형으로, 123 같은 정수, 12.3 같은 실수, 2진수, 8진수, 16진수 등이 있음
정수를 2, 8, 16진법으로 변화할 수 있는 함수(메소드) 및 표현
정수(int, integer)와 실수(float, floating point)
정수와 2/8/16진법 사이의 변환처럼, 서로 다른 데이터 타입 사이의 변환이 가능함
float(변수이름) → 변수이름의 자료형을 float로 변환
int(변수이름) → 변수이름의 자료형을 int로 변환
정수와 문자열 사이의 형변환
str(변수이름) → 변수이름의 자료형을 str로 변환
산술 연산자
정수/실수 혹은 실수/정수 나누기 값은 소수점을 포함할 수 있으므로 실수형 값 반환
관계 연산자
관계 연산자 적용에서도 정수(실수)와 문자형의 비교는 ‘같다’, ‘다르다’ 여부만 적용할 수 있음
복합대입연산자
연산과 할당을 합쳐놓은 것
식을 간결하게 표현할 수 있고, 변수가 이전에 가졌던 값을 수정하여 할당하는 일에 활용될 수 있음
연산자의 우선순위
괄호()가 가장 높은 우선순위를 갖음
곱셈 / 나눗셈 / 나머지 / 몫보다는 제곱이 더 높은 순위를 갖고, 할당/복합대입 연산이 가장 낮은 우선 순위를 갖음
import threading
import os
def foo():
print('thread id', threading.get_native_id()) #스레드 ID 출력
print('process id', os.getpid()) #PID 출력
if __name__ == '__main__':
print('process id', os.getpid()) #PID 출력
thread = threading.Thread(target=foo).start() #스레드 생성
위 코드는 스레드를 생성하여 스레드 ID와 PID를 출력하는 코드이다.
PID는 6172, 프로세스 ID는 8892가 출력되었다.
멀티 스레드 생성하기
import threading
import os
def foo():
print('thread id', threading.get_native_id()) #스레드 ID 출력
print('process id', os.getpid()) #PID 출력
if __name__ == '__main__':
print('process id', os.getpid()) #PID 출력
thread1 = threading.Thread(target=foo).start() #스레드 생성
thread2 = threading.Thread(target=foo).start() #스레드 생성
thread3 = threading.Thread(target=foo).start() #스레드 생성
위 코드는 스레드를 3개 생성해서 각 스레드는 foo()함수를 호출한다.
동일 프로세스에서 호출한 스레드이므로 출력하는 PID값은 동일하다.
하지만 프로세스 ID는 각 스레드가 다르므로 모두 다르다.
각기 다른 작업을 하는 멀티 스레드 생성하기
import threading
import os
def foo():
print('This is foo')
print('thread id', threading.get_native_id()) #프로세스 ID 출력
def bar():
print('This is bar')
print('thread id', threading.get_native_id()) #프로세스 ID 출력
def baz():
print('This is baz')
print('thread id', threading.get_native_id()) #프로세스 ID 출력
if __name__ == '__main__':
thread1 = threading.Thread(target=foo).start() #스레드 생성
thread2 = threading.Thread(target=bar).start() #스레드 생성
thread3 = threading.Thread(target=baz).start() #스레드 생성
위 코드는 스레드1은 foo(), 스레드 2는 bar(), 스레드 3은 baz()함수를 호출한다.
from multiprocessing import Process
import os
def foo():
print('child process', os.getpid()) #자식 PID 출력
print('my parent is', os.getppid()) #부모 PID 출력
if __name__ == '__main__':
print('parent process', os.getpid()) #부모 PID 출력
child = Process(target=foo).start()
위 코드는 부모 프로세스가 자식 프로세스를 생성하고, 자식 프로세스는 foo() 함수를 호출하여 자신의 PID와 부모의 PID(PPID)를 출력한다.
부모가 자식을 생성했으므로, 부모의 getpid() 리턴값과, 자식의 getppid() 리턴값은 같다.
부모 프로세스의 PID는 10940이고, 자식 프로세스의 PID는 16492라고 출력된다.
자식 프로세스 여러 개 생성하기
자식 프로세스는 여러 개 만들 수 있다.
from multiprocessing import Process
import os
def foo():
print('child process', os.getpid()) #자식 PID 출력
if __name__ == '__main__':
child1 = Process(target=foo).start() #자식1 생성
child2 = Process(target=foo).start() #자식2 생성
child3 = Process(target=foo).start() #자식3 생성
각기 다른 작업하는 자식 프로세스 생성하기
자식 프로세스는 각기 다른 작업을 수행할 수도 있다.
from multiprocessing import Process
import os
def foo():
print('This is foo')
print('process id', os.getpid()) #PID 출력
def bar():
print('This is bar')
print('process id', os.getpid()) #PID 출력
def baz():
print('This is baz')
print('process id', os.getpid()) #PID 출력
if __name__ == '__main__':
child1 = Process(target=foo).start()
child2 = Process(target=bar).start()
child3 = Process(target=baz).start()