파이썬의 자료형 (1) 숫자형과 문자열자료형

honeyricecake·2022년 6월 24일
0

파이썬

목록 보기
1/26

1. 숫자형

1) 숫자형이란?

숫자 형태로 이루어진 자료형으로, 정수, 실수, 8진수 , 16진수등을 말한다.

2) 숫자형은 어떻게 만들고 사용할까?

정수형이란? 정수를 뜻하는 자료형

실수형이란? 실수를 뜻하는 자료형으로 여기서는 소수점이 포함된 숫자를 말한다.

a = - 1.2
a = - 3.45

위 방식은 우리가 일반적으로 볼 수 있는 실수형의 소수점 표현 방식이다.

a = 4.24E10
a = 4.24e-10

위 방식은 컴퓨터식 지수 표현 방식으로 파이썬에서는 4.24e10 또는 4.24E10처럼 표현한다.

e와 E 중 둘 중 어느 것을 사용해도 무방하며 여기서 4.24E10은 (4.24 10^10), 4.24e-10은 (4.24 10^(-10))을 의미한다.

8진수와 16진수

8진수를 만들기 위해서는 숫자가 0o 또는 0O로 시작하면된다.
(숫자 0과 알파벳 대문자 또는 소문자 o)

a = 0o177

16진수(Hexadecimal)을 만들기 위해서는 0x로 시작하면 된다.

a = 0x8ff
b = 0xABC

3) 숫자형을 활용하기 위한 연산자

사칙연산 및 모듈러 연산은 C언어와 동일

x의 y제곱을 나타내는 ** 연산자!
C언어에서는 제곱은 pow 함수를 쓰거나 직접 재귀적으로 구현했어야 하나 파이썬에서는 연산자로서 자체적으로 지원한다.

a = 3
b = 4
a ** b

그리고 C 언어는 나눗셈 연산을 하면 자동으로 몫을 반환하지만 파이썬은 그렇지 않다.

7/4

는 1.75를 반환

따라서 몫을 반환하기 위해 // 연산자를 사용한다.

7//4

는 1을 반환

2. 문자열 자료형

1) 문자열이란?

문자열(String)이란 문자, 단어 등으로 구성된 문자들의 집합을 의미한다. 예를 들어 다음과 같은 것들이 문자열이다.

"Life is too short, You need Python."
"a"
"123"

위 문자열 예문을 보면 모두 큰따옴표로 둘러싸여 있다.
"123" 같은 경우도 큰따옴표로 둘러싸여 문자열이라고 보면 된다.

2) 문자열은 어떻게 만들고 사용할까?

  1. "Hello World"

  2. 'Python is fun'
    이렇게 작은 따옴표로 양쪽을 둘러싸도 문자열이다.

  3. """Life is too short, You need Python"""
    이렇게 큰 따옴표 3개를 연속으로 써서 양쪽을 둘러싸도 된다.

마찬가지로 작은 따옴표 3개를 연속으로 써도 문자열이 된다.

그런데 단순함이 자랑인 파이썬이 문자열을 만드는 방법은 왜 4가지나 될까? 그 이유에 대해 알아보자.

3) 문자열 안에 작은 따옴표나 큰 따옴표를 포함시키고 싶을 때

문자열을 만들어 주는 주인공은 작은 따옴표와 큰 따옴표이다. 그런데 문자열 안에도 작은 따옴표와 큰 따옴표가 들어 있어야 할 경우가 있다. 이 때는 좀 더 특별한 기술이 필요하다.

  1. 문자열에 작은 따옴표 포함시키기

Python's favorite food is pearl

위와 같은 문자열을 food변수에 저장하고 싶다고 가정하자
문자열 중 작은 따옴표가 포함되어 있는데

이럴 때는 다음과 같이 문자열을 큰 따옴표로 둘러싸야 한다.
큰 따옴표 안에 들어있는 작은 따옴표는 문자열을 나타내기 위한 기호로 인식하지 않는다.

food = "Python's favorite food is pearl"

이 때 작은 문자열로 둘러싸면?

'Python's favorite food is pearl

에서 Python을 한개의 문자열로 인식하고 s favorite food is pearl' 이 남게 되어 오류가 발생하게 된다.

  1. 문자열에 큰 따옴표 포함시키기

이는 작은 따옴표로 둘러싸면 된다.

ex.

say = '"Python is very Easy." he says.'

  1. 백슬래시(역슬래시 '\')를 사용해서 작은 따옴표와 큰 따옴표를 문자열에 포함시키기

작은 따옴표나 큰 따옴표 앞에 백슬래시를 삽입하면 백슬래시 뒤의 작은 따옴표나 큰 따옴표는 문자열을 둘러싸는 기호의 의미가 아니라 문자 그 자체를 뜻하게 된다.

ex.

food = 'Python\'s favorite food is pearl.'
say = "\"Python is very easy.\" he says."

여러 줄인 문자열을 변수에 대입하고 싶을 때

  1. 개행문자 (\n) 삽입 : C언어에 익숙한 사람들에게 매우 익숙한 방법이다. 다만 가독성이 떨어지고 줄이 길어지는 단점이 있다.

  2. 연속된 작은 따옴표 3개 또는 큰 따옴표 3개 사용하기

위1번의 단점을 극복하기 위해 파이썬에서는 다음과 같이 작은 따옴표 3개 또는 큰 따옴표 3개를 사용한다.

ex.

multiline = '''
Life  is too short
You need Python
'''

또는

multiline = """
Life  is too short
You need Python
"""

이스케이프 코드란?

문자열 예제에서 여러 줄의 문장을 처리할 때 백슬래시ㅣ 문자와 소문자 n을 조합한 \n 이스케이프 코드를 사용했다.
이스케이프 코드란 프로그래밍할 때 사용할 수 있도록 미리 정의해둔 문자 조합이다.

주로 쓰이는 이스케이프 코드 몇개를 정리해보자.

\n : 줄바꿈
\t : 문자열 사이에 탭 간격을 줄 때 사용
\ : 문자 \ 을 그대로 표현할 때 사용
\' : 작은 따옴표를 그대로 표현할 때 사용
\" : 큰 따옴표를 그대로 표현할 때 사용

문자열 연산하기

파이썬에서는 문자열을 더하거나 곱할 수 있다.
다른 언어에서는 쉽게 찾아볼 수 없는 재미있는 기능으로 우리 생각을 그대로 반영해주는 파이썬 만의 장점이라고 할 수 있다.
문자열을 더하거나 곱하는 방법에 대해 알아보자.

head = "Python"
tail = " is fun!"
print(head + tail)

Python is fun! 이 출력된다.

문자열을 곱할 수도 있는데

a = "python"
print(a*2)

pythonpython 이 출력됨을 확인할 수 있다.

즉, * 는 문자열의 반복을 뜻하는 의미로 매우 직관적이다.

문자열 곱하기 응용

문자열 곱하기를 좀 더 응용해보자.

파이썬의 print함수는 end를 지정하지 않으면 자동으로 줄바꿈된다.

->

print(sep = "", end = "") 에 대하여

파이썬의 출력문은 print를 사용하며 두 개의 옵션을 사용할 수 있다.

  1. sep=""

이 옵션을 이용하게 되면 print문의 출력문들 사이에 해당하는 내용을 넣을 수 있다.

기본 값으로는 공백이 들어가 있으며 이를 사용해 원하는 문자를 입력할 수 있다.

  1. end=""

이 옵션의 경우 print 문을 이용해 출력을 완료한 뒤의 내용을 수정할 수 있다. 기본 값으로는 개행(\n)이 들어가 있으며 이를 사용해 개행을 없애거나 원하는 문자를 입력할 수 있다.

(1) 기존의 print()만 사용하여 출력을 할 경우

print("1-1칸", "1-2칸", "1-3칸")
print("2-1칸", "2-2칸", "2-3칸")

실행 결과

print안에 여러 개의 값을 출력할 경우 기본으로 공백이 들어가며
print문이 끝나게 될 경우 개행(\n)이 되는 것을 확인할 수 있다.

즉, sep는 해당 print문 안에서 여러개의 ""을 넣었을 때 그 사이에 뭘 삽입할지
end는 해당 print문이 끝났을 때 무엇을 삽입할지 정하는 것이다.

따라서 공백과 개행문자를 다음과 같이 없앨 수 있다.

print("1-1칸", "1-2칸", "1-3칸", sep = "", end = "")
print("2-1칸", "2-2칸", "2-3칸", sep = "", end = "")

print("Hello", "World", sep = ",", end = "\n\n");
print("Hello", "Python", sep = "!!", end = "\n");

해당 print문 내의 문자열들 사이에 sep에 집어넣은 문자열이 삽입됨을 알 수 있고
마지막에 end에 집어넣은 문자열의 출력됨을 알 수 있다.

이는 print함수안에 정의된 매개변수 sep, end를 덮어쓰는 과정이다.

따라서 함수 밖에서 sep, end를 선언하는 것은 print함수에 전혀 영향을 주지 못하고, end = "", sep ="" 이런 식으로 순서를 바꾸는 것은 전혀 상관이 없다.

단, 파이썬의 철학 상 end, sep 같은 것은 뒤로 두는 것이 가독성이 좋기 때문에
애매한 코딩을 배제하기 위해

a = "Hello"
b = "World"
print(end=",", a, sep="!!", b)

이런 것은 되지 않게 만들어 놓았다.

문자열 길이 구하기

문자열 길이는 다음과 같이 len 함수를 사용하면 구할 수 있다.
len 함수는 print함수처럼 파이썬의 기본 내장 함수로 별다른 설정 없이 사용할 수 있다.

a = "Life is too short"
len(a)

이렇게 하면 17이 출력된다.

문자열 인덱싱과 슬라이싱

인덱싱 (indexing) 이란 무엇을 가리킨다는 의미이고
슬라이싱 (slicing) 이란 무엇인가를 잘라낸다는 의미이다.

문자열 인덱싱이란?

"Life is too short" 이를 C언어 처럼 char 배열에 들어갔다고 가정하면
쉽게 문자열 인덱싱을 이해할 수 있다.

ex.

a = "Life is too short, You need Python"
print(a[3])

C언어에서 char배열로 문자열을 만들 때와 같이 출력이 된다.

여기서 a[특정 번호]는 문자열 안의 특정한 값을 뽑아내는 역할을 하는데 이러한 작업을 인덱싱이라 한다.
(특정한 값을 뽑아내는 것)

응용 ->

a = "Life is too short, You need Python"
print(a[-2])

이는 무엇이 출력돨까?

뒤에서부터 2번째 문자인 'o'가 출력된다.

왜 -2 이므로 뒤에서부터 세번째가 출력돼야 할 것 같은데 그렇지 않을까?

-0 = 0 이므로 -1부터 뒤에서부터 첫번째라고 정의했기 때문이다.

문자열 슬라이싱이란?

Q. a = "Life is too short, You need Python" 에서 You 같은 단어를 뽑아내는 방법은 없을까?

A1.

answer = a[19] + a[20] + a[21]

하지만 파이썬은 더 간단한 방법을 제공한다.

A2.

answer = a[19 : 22]

a[19 : 22] 는
for(i = 19; i < 22; i++)
char배열[i - 19] = a[i]; 정도로 생각할 수 있다.

for(i = 19; i < 22; i++) 부분만 직관적으로 받아들이면 좋다.

그리고 a[시작번호 : 끝번호] 에서 시작번호를 생략하면 index 0 부터 끝번호-1까지 출력

끝번호를 생략하면 시작번호부터 마지막 문자까지 출력한다.

a[19 : -7]

이 경우도 a[19]에서 a[-8]까지를 의미한다.

슬라이싱으로 문자열 나누기

다음은 자주 사용하게 되는 슬라이싱 기법 중 하나이다.

a = "20010331Rainy"
date = a[:8]
weather = a[8:]

위 예는 문자열 a를 두 부분으로 나누는 기법이다.

"Pithon"이라는 문자열을 Python으로 바꾸려면?

a = "Python"
a[1] = 'y'

C언어는 char배열이므로 되지만 파이썬은 자바와 같이 문자열이 immutable한 자료형이므로 문자열의 요솟값을 바꿀 수 없다.

따라서

a = "Pithon"
b = a[:1] + 'y' + a[2:]
print(b)

를 하면

이렇게 출력되는 것을 볼 수 있다.

문자열 포매팅

  1. 숫자 바로 대입
"I eat %d apples" % 3

%d에 3이 대입된다. C와의 차이점은 , 대신 %가 사용된다는 것

  1. 문자열 바로 대입
I eat %s apples. % five

I eat five apples 가 출력된다.

  1. 숫자 값을 나타내는 변수로 대입
number = 3
"I eat %d apples" % number

I eat 3 apples 가 출력된다.

  1. 2개 이상의 값 넣기
number = 10
day = "three"
print("I ate %d apples, so I was sick for %s days." % (number, day))

가 출력된다.
(C언어와의 차이, 대입할 변수들을 괄호로 묶어준다!!)

  1. 문자열 포맷 코드

%s, 문자열
$c, 문자 1개
%d, 정수
%f, 부동소수
%o, 8진수
%x, 16진수
%%, Literal % (문자 % 그 자체)

%% 사용 예제

ex.

print("Error is %d%%" % 98)

Error is 98%가 출력된다.

포맷 코드와 숫자 함께 사용하기

위에서 보았듯이 %d, %s 등의 포맷 코드는 문자열 안에 어떤 값을 삽입하기 위해 사용된다. 하지만 포맷 코드를 숫자와 함께 사용하면 더 유용하게 사용할 수 있다.

  1. 정렬과 공백

"%10s" % "hi"
전체 길이가 10개인 문자열 공간세서 대입되는 값을 오른쪽으로 정렬하고 그 앞의 나머지는 공백으로 남겨두라는 의미이다.

반대쪽인 왼쪽 정렬은?

"%-10sjane." % 'hi'

hi를 왼쪽으로 정렬하고 나머지 8칸은 공백으로 채워진다.

  1. 소수점 표현하기

%0.4f -> 소수점 네번째 자리까지만 소수를 나타냄
%10.4f ->소수점은 네자리만! 총 자리수를 10자리로 맞춤 (C언어도 마찬가지)

format함수를 이용한 포매팅

I eat {0} apples.format(3) -> I eat 3 apples

I ear {0} apples.format("five") -> I eat five apples

number = 3
"I eat {0} apples".format(number)

-> I eat 3 apples

2개 이상의 값은 {0}뿐만 아니라 {1}, {2}를 넣어주면 된다.

"I ate {number} apples. so I was sick for {day} days.".format(number = 10, day = 3)

위 예에서도 볼 수 있듯이 인덱스 항목 대신 더 편리한 {name} 형태를 사용하는 방법도 있다.

이 경우 format 함수에는 반드시 name = value 와 같은 형태의 입력값이 있어야만 한다.

인덱스와 name은 혼용 가능하다.

{ 또는 } 문자 표현하기

format 함수를 사용해 문자열 포메팅을 할 경우 {} 와 같은 중관호 문자를 포메팅 문자가 아닌 문자 그대로 사용하고 싶은 경우에는

"{{ and }}".format() 과 같이 '{' 나 '}' 를 두개 연속 사용하면 된다.

f 문자열 포매팅

파이썬 3.6버전 부터는 f 문자열 포매팅 기능을 사용할 수 있다. 파있너 3.6 미만 버전에서는 사용할 수 없는 기능이므로 주의해야 한다.

다음과 같이 문자열 앞에 f 접두사를 붙이면 f문자열 포매팅 기능을 사용할 수 잇다.

name = '홍길동'
age = 30
f'나의 이름은 {name}입니다. 나이는 {age}입니다.'

f문자열 포매팅은 위와 같이 name, age 와 같은 변수값을 생성한 후에 그 값을 참조할 수 있다. 또한 f문자열 포매팅은 표현식을 지원하기 때문에 다음과 같은 것도 가능하다.

(표현식이란 문자열 안에서 변수와 +,- 와 같은 수식을 함께 사용하는 것을 말한다.)

age = 30
f'나는 내년이면 {age + 1}살이 된다.'

(이는 포맷함수를 이용한 포매팅에서도 가능하다)

ex.

x = 10
y = 20
s = "I want to eat {0} apples and {1} pineapples".format(x - 9, y - 18)
print(s)

결과

딕셔너리는 f문자열 포매팅에서 다음과 같이 사용할 수 있다.

(딕셔너리는 key 와 value라는 것을 한 쌍으로 갖는 자료형이다. )

d = {'name' : '홍길동' , 'age' : 30}  # 키 값은 name value는 홍길동
s = f'나의 이름은 {d["name"]}입니다. 나의 나이는 {d["age"]}입니다'
print(s)

실행 결과

정렬은 다음과 같이 할 수 있다.

print(f'{"hi":<10}')  # 10 칸 왼쪽 정렬
print(f'{"hi":>10}')  # 10 칸 오른쪽 정렬
print(f'{"hi":^10}')  # 10칸 가운데 정렬

결과

공백 채우기는 다음과 같이 할 수 있다.

print(f'{"hi":=^10}')  # 10칸 가운데 정렬 후 나머지는 =으로 채우기
print(f'{"hi":&>10}')  # 10칸 오른쪽 정렬 후 공백은 &로 채우기
# 공백을 채우는 것은 안에 문자열을 집어넣을 수 없음

소수점은 다음과 같이 표현할 수 있다.

y = 3.1415926535
print(f'{y:0.4f}')  # :은 f포맥문자열에서 문자열 정렬을 수행한다는 의미구나
# :> 은 정렬, :0.4f등은 소수점 출력
print(f'{y:10.4f}')  # 소수점 네자리까지 출력하고 '총'자릿수를 10자리로 맞춤

실행 결과

f문자열에서도 {, } 를 표현하려면 {{, }}로 표기하면 된다.

파이썬 문자열 관련 함수들

문자열 자료형은 자체적으로 함수를 가지고 있다.
이들 함수를 다른 말로 문자열 내장 함수라 한다. 이 내장 함수를 사용하려면 문자열 변수 이름 뒤에 '.'를 붙인 다음에 함수 이름을 써주면 된다.

  1. 문자 개수 세기 count
a = "hobby"
print(a.count('b'))

2 가 출력된다

  1. 위치 알려주기1 (find)
a = "Python is the best choice"
print(a.find('b'))

문자열 중 문자가 처음으로 나온 위치를 반환한다. 만약 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환한다.

문자열을 찾는 경우, 그 문자열의 첫글자의 인덱스를 리턴한다.

  1. 위치 알려주기2 (index)
a= "Life is too short"
a.index('t')

문자열 중 문자 t가 맨처음으로 나온 위치를 반환한다. 만약 찾는 문자나 문자열이 존재하지 않는다면 오류를 발생시킨다.

  1. 문자열 삽입 (join)

print(",".join("abcd"))

a,b,c,d가 출력된다.
문자열의 각 문자 사이에 ','를 삽입하는 함수이다.

, 대신 xxx를 입력하는경우 axxxbxxxcxxxd가 출력

join함수는 문자열뿐만 아니라 앞으로 배울 리스트나 튜플도 입력으로 사용할 수 있다.

x = ['a', 'b', 'c', 'd']
print(",".join(x))

출력 : a,b,c,d

왜 x.join(',') 이 아니라 ','.join(x) 일까?

  1. 문자열에 정의된 함수이므로
  2. ','가 x에 조인되는 것이므로

소문자를 대문자로 바꾸기 (upper)

x = "abcdefg"
print(x.upper())

ABCDEFG가 출력된다.

대문자를 소문자로 바꾸는 lower함수도 있다.

왼쪽 공백 지우기 (lstrip)

문자열 중 가장 왼쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지운다.
lstrip에서 l이란 left를 의미한다.

오른쪽 공백을 지우는 rstrip이라는 함수 역시 존재한다.

x = "     hi"
print(x.lstrip())

hi가 출력됨을 볼 수 있다.

양쪽 공백은 strip() 메소드를 통해 없앨 수 있다.

문자열 바꾸기 (replace)

a = "Life is too short"
a.replace("Life", "Your leg")

replace(바뀌게 될 문자열, 바꿀 문자열) 처럼 사용해서 문자열 안의 특정한 값을 다른 값으로 치환해 준다.

문자열 나누기 (split)

x = "Life is too short"
print(x.split())

괄호에 아무것도 넣어주지 않으면

이렇게 공백을 기준으로 나누어진 문자열 리스트를 리턴한다.

특정값을 넣을 경우 특정 값을 기준으로 문자열을 나눠준다.

x = "a::b::c::d"
print(x.split("::"))

[연습문제]

문자열 x의 공백을 모두 지우는 프로그램을 짜라

x = "  a    b     c    d      e  f  g h     i    "
y = ""
length = len(x)
for i in range(0, length - 1):
    if x[i] != ' ' : y += x[i]
print(y)
x = "  a    b     c    d      e  f  g h     i    "
print(x.replace(" ", ""))

0개의 댓글