프로그래밍/파이썬 공부하기

Python 공부 - 1 (자료형)

_OlZl 2024. 1. 21. 01:41

2024.01.21 - [프로그래밍/파이썬 공부하기] - 파이썬 공부하기 - 0 (시작)

 

파이썬 공부하기 - 0 (시작)

학교에서 1년 동안 C를 배웠습니다. C를 배우며 컴퓨터 언어의 기본적인 요소에 대해서도 잘 알게 됐고, C도 잘 다룰 수 있게 되었으나 대회나 여러 행사 등에서는 파이썬을 쓸 일이 더욱 많았습

olzl07.tistory.com

저번에는 파이썬을 공부하기로 계획해보았고, 지금부터 파이썬 공부를 본격적으로 시작해볼겁니다.

사실 파이썬을 시작하면 가장 기본적으로 여러 자료형이나, 변수, 연산자, if문 이런 것부터 하는 게 정석이지만 사실 전 이미 이런 간단한 건 거의 다 꿰고 있습니다. (코드업을 풀면 파이썬 실력이 많이 늡니다. 여러분 코드업 하세요.) 그래서 그냥 이런 간단한 건 제가 잘 이해하지 못했던 부분이나 딱히 쓸 일이 없어서 잘 알아두지 않았던 것들만 조금 정리해보려 합니다. (함수를 중점으로 진행할 듯 합니다.)


자료형

가장 먼저 자료형입니다. 사실 파이썬에선 변수를 선언할 때 자료형을 딱히 선언하지 않습니다. 이것 땜에 C를 쓰다 처음 파이썬을 쓸 때 굉장히 놀라웠던 기억이 있네요. 암튼 파이썬에서 자료형에는 크게 다음과 같은 종류들이 있습니다.

수치 자료형 불 자료형 군집 자료형

 

수치 자료형은 말 그대로 int, float 등 일반적인 숫자 자료형입니다. 여기에 관해선 따로 언급하지 않겠습니다. 이 정도는 다 알죠?

불 자료형은 boolean 값을 저장하는 건데, 이것도 크게 언급하지는 않겠습니다. 대충 True랑 False가 있다고 알면 됩니다.

마지막으로 군집 자료형이 좀 중요하기도 하고 어렵기도 합니다. 군집 자료형에는 문자열(str), 리스트(list), 튜플(tuple), 딕셔너리(dictionary) 등이 있습니다. 이 중 리스트, 튜플, 딕셔너리는 이후에 따로 공부해볼 것이기 때문에 여기서 다루지 않고 문자열(str)만 다뤄보겠습니다.


문자열(str)

str은 문자열, 즉 글자를 위한 자료형입니다. C에서는 배열에 char형들을 저장함으로써 문자열을 구현했다면, 여기서는 그냥 " "를 이용해 문자열을 만들 수 있습니다. 문자열의 덧셈, 곱셈 등에 대한 건 생략하겠습니다. 

여러 줄을 가지는 문자열을 만들 때는 ''' ''', """ """등 큰 따옴표나 작은 따옴표 3개씩을 이용해 구현할 수 있습니다.

str1 = """
_OlZl
tistory
"""

str2 = '''
_OlZl
tistory
'''

 

문자열에는 인덱스라는 게 존재합니다만 자세한 설명은 생략하겠습니다. (이 정도는 구글링.. 할 수 있잖아요..?) 암튼 이 인덱스를 활용해 문자열 슬라이싱이란 것이 가능합니다. 대충 문자열 내의 몇번째 요소부터 몇별째 요소까지 잘라내는 거다~ 정도로 이해하면 될 것 같습니다.

변수[a:b]
실행시 문자열의 a 인덱스부터 b-1 인덱스까지(b 전 인덱스까지)를 잘라냅니다.
str = 'abcd efgh'
print(str[0])
print(str[1:5])
print(str[:])
print(str[3:])
print(str[:3])
a
bcd
abcd efgh
d efgh
abc

시작 인덱스 자리에 아무것도 넣지 않으면 맨 처음부터, 종료 인덱스 자리에 아무것도 넣지 않으면 맨 끝까지로 판단합니다.


문자열 관련 함수

문자열과 관련해 쓸 수 있는 함수가 여러 가지 있는데 그 중 몇 가지를 정리해보았습니다.

여기부터는 무수한 함수들의 나열이므로 대충 대충 읽진..... 말고 잘 읽어보세요. 이 글 중 제일 중요한 부분입니다.

  • 문자열.find(찾을 값, 시작 인덱스, 종료 인덱스) : 시작 ~ 종료 인덱스 사이에서 찾을 값이 가장 먼저 나오는 인덱스를 반환
  • 문자열.index(찾을 값, 시작 인덱스, 종료 인덱스) : 시작 ~ 종료 인덱스 사이에서 찾을 값이 가장 먼저 나오는 인덱스를 반환
  • 차이점 : find = 찾을 값이 범위 내에 없으면 -1 반환, index = 찾을 값이 범위 내에 없으면 Error 발생
str = 'abcdefg'
print(str.find('c'))
print(str.find('cde'))
print(str.find('c', 3, 5))

str = 'abcdefg'
print(str.index('c'))
print(str.index('cde'))
print(str.index('c', 3, 5))
2
2
-1

2
2
#error

 

  • 문자열.split(구분자) : 문자열을 구분자를 기준으로 하여 나눔 (이후 리스트로 출력)
  • 구분자.join(문자열 or 리스트) : 문자열 or 리스트의 모든 요소 사이에 구분자를 추가함
str = 'ab,c d,e fgh'
print(str)
print(str.split())
print(str.split(' '))
print(str.split(','))
print(str.split('d'))

str = 'ab cde'
print(' '.join(str))
print("/".join(str))
str = ['a', 'b', 'c', 'd', 'e']
print(",".join(str))
ab,c d,e fgh
['ab,c', 'd,e', 'fgh']
['ab,c', 'd,e', 'fgh']
['ab', 'c d', 'e fgh']
['ab,c ', ',e fgh']

a b   c d e
a/b/ /c/d/e
a,b,c,d,e

 

  • 문자열.replace(기존 값, 변경할 값, 변경횟수) : 변경횟수 만큼 기존 값을 변경할 값으로 대체함
  • 문자열.upper() : 알파벳 소문자를 대문자로 변환하여 반환함
  • 문자열.lower() : 알파벳 대문자를 소문자로 변환하여 반환함
  • 문자열.capitalize() : 첫 글자만 대문자로 (첫 글자가 알파벳이 아니면 변화 없음)
  • 문자열.title() : 알파벳 이외의 문자로 구분 → 그 중 첫 글자들만 대문자로
str = 'a,b,c,d,e'
print(str)
print(str.replace(',', '/'))
print(str.replace(',', '/', 2))

str = 'a,b,C,D,ef'
print(str.upper())
print(str.lower())
print(str.capitalize())
print(str.title())
a,b,c,d,e
a/b/c/d/e
a/b/c,d,e

A,B,C,D,EF
a,b,c,d,ef
A,b,c,d,ef
A,B,C,D,Ef

 

  • a.isdigit() : 모두 숫자인지 확인 - boolean 반환
  • a.isalpha() : 모두 알파벳인지 확인 - boolean 반환
  • a.isupper() : 알파벳이 모두 대문자인지 확인 (특수문자, 공백, 숫자 등 섞여도 됨) - boolean 반환
  • a.islower() : 알파벳이 모두 소문자인지 확인 (특수문자, 공백, 숫자 등 섞여도 됨) - boolean 반환
str = '12345'
print(str.isdigit())

str = 'abcDe'
print(str.isalpha())
print(str.isupper())

str = str.lower()
print(str.islower())
True

True
False

True

 

  • 문자열.strip(제거할 값) : 양쪽 끝에서 특정 값을 제거함
  • 문자열.lstirp(제거할 값) : 왼쪽 끝에서 특정 값을 제거함
  • 문자열.rstirp(제거할 값) : 오른쪽 끝에서 특정 값을 제거함
str = '     abc     '
print(str.strip())
print(str.lstrip())
print(str.rstrip())

str = '**** abc ***'
print(str.strip('*'))
print(str.lstrip('*'))
print(str.rstrip('*'))

str = '12321ab123c111'
print(str.strip('123'))
print(str.lstrip('123'))
print(str.rstrip('123'))
abc
abc     
     abc
     
 abc 
 abc ***
**** abc 

ab123c
ab123c111
12321ab123c

처음 딱 보면 이게 뭐지 싶을 수도 있지만 (전 그랬습니다) 좀만 생각해보면 은근 쉽습니다. 그냥 왼쪽 끝이든 오른쪽 끝이든 괄호에 나온 값 중 하나가 아닐 때까지 제거하는 겁니다. 

괄호 안에 있는 123이 하나가 아니라 1,2,3이 합쳐진 거라고 생각하면 됩니다.

그래서 ab와 c 사이에 껴있는 123가 살아있는 것이겠죠.

 

  • 문자열.zfill(정수) : 문자열의 길이가 지정된 정수가 될 때까지 문자열 왼쪽에 0을 채움
  • 문자열.rjust(정수, 원하는 값) : 문자열의 길이가 지정된 정수가 될 때까지 문자열 왼쪽에 원하는 값을 채움
  • 문자열.ljust(정수, 원하는 값) : 문자열의 길이가 지정된 정수가 될 때까지 문자열 오른쪽에 원하는 값을 채움
    • (왜 얘네는 r이 왼쪽이고 l이 오른쪽인걸까요.... 살짝 킹받는다)
str = 'abc'
print(str.zfill(10))

str = 'abc'
print(str.rjust(10, "7"))
print(str.ljust(10, "7"))
0000000abc

7777777abc
abc7777777

 

      • 문자열.count() :부분 문자열이 나타나는 횟수
      • max(문자열) : 입력된 컬렉션 또는 여러 인자 중 가장 큰 수
      • min(문자열) : 입력된 컬렉션 또는 여러 인자 중 가장 작은 수
      • ord(문자) : 입력된 문자의 유니코드 값
      • chr(숫자) : 입력된 수의 문자 값
url='judge.codingpanda.kr'
print(url.find('.kr'))
print(url.count('.'))
print(ord(max(url)))
print(ord(min(url)))
print(chr(46))
17
2
117
46
.

 

  • a.startswith(prefix) : a가 문자열 prefix로 시작하는지 확인 - boolean 반환
  • a.endswith(suffix) : a가 문자열 suffix로 끝나는지 확인 - boolean 반환
str = 'abcdefghijk'
print(str.startswith('abc'))
print(str.startswith('A'))

print(str.endswith('jk'))
print(str.endswith('j'))
True
False

True
False

문자열 포맷팅

문자열 중간에 변수 값을 넣고 싶을 때가 있습니다.

이때, 문자열 포맷팅이라는 것을 진행하고 이에는 여러가지 방법이 있는데요.

 

1) str()을 이용 : str 외의 자료형을 str로 바꿈

2) %을 이용 : 서식 문자로 자료형 지정 후 순서대로 변수 대입

3) format() 이용 : {0}, {1}, ... 쓰고 순서대로 변수 대입

4) f-string 문법 : 문자열 앞에 f 붙이고 변수 이름 바로 대입

 

이렇게 4가지 정도가 있습니다.

 

s1 = 123
s2 = '_OlZl'
s3 = 3.1415

print('s1 = '+str(s1)+', s2 = '+s2+', s3 = '+str(s3))
print('s1 = %d, s2 = %s, s3 = %f' %(s1, s2, s3))
print('s1 = {0}, s2 = {1}, s3 = {2}'.format(s1, s2, s3))
print(f's1 = {s1}, s2 = {s2}, s3 = {s3}')
s1 = 123, s2 = _OlZl, s3 = 3.1415
s1 = 123, s2 = _OlZl, s3 = 3.141500
s1 = 123, s2 = _OlZl, s3 = 3.1415
s1 = 123, s2 = _OlZl, s3 = 3.1415

 

첫번째에서 s2는 이미 str 자료형이기 때문에 굳이 str로 바꾸지 않아도 잘 작동하는 모습을 볼 수 있습니다.

서식문자의 종류는 다음과 같습니다.

%d 정수 %c 문자(char)
%f 실수 %s 문자열(string)
%e 공학표기(e) %o 8진법 표기
%E 공학표기(E) %x 16진법 표기 (소문자)
%g 혼용표기(e) %X 16진법 표기 (대문자)
%G 혼용표기(E) %% 문자 %

 

공학표기 : 큰 숫자를 10의 거듭제곱으로 표시

혼용표기 : 10^6 단위부터 공학표기, 그 이전은 그냥 표기

이런 차이가 있습니다.


문자열 출력 형태

%5d, %10d 같이 숫자를 앞에 붙여주면 그 수만큼의 칸을 차지한 채 출력됩니다.

(만약 문자열 길이가 숫자보다 크면 그대로 출력, 작으면 공백으로 칸을 채움 (양수 : 좌측, 음수 : 우측))

%와 숫자 사이에 0을 넣으면 공백이 아닌 0으로 칸을 채웁니다.

 

실수는 점을 찍어서 반올림을 표현할 수 있습니다. [ex) %.3f = 소수점 아래 셋째자리까지 출력]

칸 차지와 같이 쓰려면 %4.2f 같이 써주면 됩니다.

 

실수의 칸 채우기는 소수점 아래에 0을 채웁니다.

str = 123
print('%2d' %str)
print('%6d' %str)
print('%-6d' %str)
print('%06d' %str)
print('%-06d' %str)



str = 123.456
print('%.2f' %str)
print('%10f' %str)
print('%9.2f' %str)
print('%-9.2f' %str)
123
   123
123   
000123
123   

123.46
123.456000
   123.46
123.46

사실 부정적분 공식 외우기도 힘든 제가 이걸 다 외울 것 같지는 않지만.... 그래도 비교적 쓸 일이 있어보이는 함수들을 정리해봤습니다. 자료형이나 이런 간단한 건 다 건너뛰고 빨랑 넘어가고 싶었으나 생각보다 문자열 관련 함수가 많아서 분량이 길어졌네요. 더 이상 쓰기는 귀찮은 관계로 (현 시각 오전 1시 41분) 이번에는 자료형까지만 해보겠습니다.