카테고리 없음

스파르타 AI-8기 TIL(11/16) -> 처음부터 다시

kimjunki-8 2024. 11. 16. 23:12

 

hello = 'hillo'
hello[1] = 'e'
print(hello)

진짜 자신의 부족함을 너무나 절신히 느낀 나머지 전부 복습

정수형
말 그대로 정수를 뜻하는 자료형 양의, 음의 숫자 0을 적을 수 있다.
a = 10
a = -10
a = 0

 


실수형
실수형(floating-point), 즉 소수점이 포함된 자료형
a = 1.5
a = 10.9655

여기서 컴퓨터식 지수 표현 방식 -> 예시: e5 or e-5

print(4.24e10)
print(4.42e-4)

출력:
42400000000.0
0.000442

말 그대로
e10 -> 10^10
e-4 -> 10^-4


사칙 연산
사칙 연산을 하는 연산자들
a = 5
b = 2
print(a + b) # 더하기
print(a - b) # 빼기
print(a * b) # 곱하기
print(a / b) # 나누기
print(a ** b) # 제곱
print(a % b) # 나머지 출력
print(a // b) #  몫 출력

출력:
7
3
10
2.5
25
1
2

복합 연산자
복합 연산자는 앞서 살펴본 +, - 와 같은 산술 연산자와 대입 연산자(=)를 합쳐 놓은 것입니다.
a += 1은 a = a + 1과 같습니다
EX.
a = 3
a += 4
print(a)

출력:
7
+=, -=, *=, /=, //=, %=, **=도 똑같습니다

문자열(string)
문자열(string)이란 연속된 문자들의 나열을 말합니다.
string = 'Hi'

파이썬에서 문자열을 만드는 방법은 총 4가지입니다
1. 큰따옴표로 양쪽 둘러싸기
"Hi"
2. 작은따옴표로 양쪽 둘러싸기
'Hi'
3. 큰따옴표 3개를 연속으로 써서 양쪽 둘러싸기
"""Hi"""
4. 작은따옴표 3개를 연속으로 써서 양쪽 둘러싸기
'''Hi'''

문자열 안에 작은따옴표나 큰따옴표를 포함시키고 싶을 때
문자열 안에도 작은따옴표와 큰따옴표가 들어 있어야 할 경우가 있습니다. 이때는 좀 더 특별한 기술이 필요합니다.
1. 문자열에 작은따옴표 포함하기
food = "Python's favorite food is perl"

2. 큰따옴표가 포함된 문자열이라면, 문자열을 작은따옴표로 둘러싸면 됩니다.
 say = '"Python is very easy." he says.'

 

역슬래시를 사용해서 작은따옴표와 큰따옴표를 문자열에 포함하기
작은따옴표나 큰따옴표를 문자열에 포함시키는 또 다른 방법은 역슬래시(\)를 사용하는 것입니다.
food = 'Python\'s favorite food is perl'
say = "\"Python is very easy.\" he says."

출력:
Python's favorite food is perl
"Python is very easy." he says.

줄을 바꾸기 위한 이스케이프 코드 \n 삽입하기
문자열이 항상 한 줄짜리만 있는 것은 아니며, 같은 여러 줄의 문자열을 변수에 대입하려면 \n을 쓰면 됩니다.
life = 'life is too short\nyou need to rest'
print(life)

출력:
life is too short
you need to rest

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

life = """life is too short
you need to rest"""
life1 = '''life is too short
you need to rest'''

print(life)
print(life1)

출력:
life is too short
you need to rest

life is too short
you need to rest

이스케이프 코드란?
이스케이프(escape) 코드란 프로그래밍할 때 사용할 수 있도록 미리 정의해 둔 ‘문자 조합’을 말하며, 주로 출력물을 보기 좋게 정렬하는 용도로 사용합니다.
제일 많이 쓰는 것들만 보겠습니다

\n 문자열 안에서 줄을 바꿀 때 사용
\t 문자열 사이에 탭 간격을 줄 떄 사용
\\ \을 그대로 표현
\' '을 그대로 표현
\" "을 그대로 표현

문자열 연산
일반 연산인데, 문자열에 씁니다.
hello = 'hello'
there = 'there'

print(hello + there)
print('=' * 30)
print(hello * 2)
print('=' * 30)

출력:
hellothere
==============================
hellohello
==============================

문자열 길이 구하기
문자열의 길이는 len 함수를 사용하면 구할 수 있다.
hello = 'hello'

print(len(hello))

출력:
5

문자열 인덱싱과 슬라이싱
인덱싱(indexing)이란 무엇인가를 ‘가리킨다’, 슬라이싱(slicing)은 무엇인가를 ‘잘라 낸다’라는 의미입니다 .
hello = 'hello'
print(hello[1])

출력:
e

파이썬은 0부터 숫자를 셉니다. h[0], e[1], l[2], l[3], o[4]으로 되어 있습니다


-도 넣을 수 있습니다.

hello = 'hello'
print(hello[-1])

출력:
o

여기서 문자열을 뒤에서부터 읽기 위해 -(빼기) 기호를 붙인 것입니다. (참고로 -0도 가능합니다..결과는 0이랑 같지만.)



슬라이싱(slicing) 기법

hello = 'hello'
print(hello[0:2]) 
#이건 hello[:2]이랑 같습니다. 0부터 시작하면 앞 숫자를 빼도 됩니다.
#hello[2:]도 가능합니다. 이건 llo가 출력이 됩니다.

출력:
he

참고로 숫자 2는 포함되지 않아 결국 [0], [1]부분만 출력이 됩니다.

hello = 'hello'
print(hello[2:-1]) 

출력:
ll

이렇게 자유롭게 쓸 수 있습니다.

참고로 문자열을 반대로 돌리고 싶으면 [::-1]을 쓰면 됩니다.

hello = 'hello'
print(hello[::-1])
출력:
olleh

 


이렇게 슬라이싱을 알면 특정 문자열을 바꿀 수 있습니다.
그런데 

hello = 'hillo'
hello[1] = 'e'
print(hello)

이렇게 하면 바꿀 수 있다고 생각하겠지만, 불가능합니다. 문자열의 요솟값은 바꿀 수 있는 값이 아니기 때문입니다. 이것을 변경 불가능한(immutable) 자료형이라고 합니다.

그렇기에

hello = 'hillo'
print(hello[0] + 'e' + hello[2:])

출력:
hello

이렇게 하면 정상적으로 hello가 뜹니다.


문자열 포매팅
문자열 안의 특정한 값을 바꿔야 할 경우가 있을 때 이것을 가능하게 해 주는 것이 바로 문자열 포매팅입니다.
print("I eat %d apples." % 3) #참고로 %다음 오는것은 넣을 값의 유형입니다(%s - string, %d - int)
출력:
I eat 3 apples.

print("I eat %s apples." %'five')
출력:
I eat five apples.

참고로 변수도 가능합니다
num = 'five'
print("I eat %s apples." %num)
출력:
I eat five apples.

변수 2개 이상도 가능합니다.
s = 'five'
s1 = 'apples'
print("I eat %s %s." %(s, s1))
출력:
I eat five apples.

참고로 % 다음에 추가로 더 넣을 수 있습니다.
s = 'five'
s1 = 'apples'
print("I eat %s %stoday." %(s, s1))
출력:
I eat five applestoday.
이렇게 해도 에러는 안 납니다.

 숫자를 넣기 위해서는 %d, 문자열을 넣기 위해서는 %s를 써야합니다

%s 문자열(String)
%c 문자 1개(character)(예: 'f', 'a', 'k')
%d 정수(Integer)
%f 부동소수(floating-point)
%% Literal % (문자 % 자체)

참고로 %d나 다른 연산자 뒤에 %을 쓸려면 %%을 써야합니다.

s = 'five'
s1 = 'apples'
print("I eat %s %s%%." %(s, s1))
출력:
I eat five apples%.

 


포맷 코드와 숫자 함께 사용하기
%d, %s 등과 같은 포맷 코드는 문자열 안에 어떤 값을 삽입할 때 사용한다. 하지만 포맷 코드를 숫자와 함께 사용하면 더 유용하다.
hello = 'hello'
print('%10s' %hello)
출력:
     hello

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


반대쪽인 왼쪽 정렬은 %-10s가 됩니다.

hello = 'hello'
print('%-10sJames' %hello)
출력:
hello     James

소수점 표현하기

a = 3.2321312341
print('%0.3f' %a)
출력:
3.232

0.3f는 소수점 세 번째 자리까지만 나타내고 싶을 때 쓴다. 여기서 ‘.’는 소수점 포인트, 그 뒤의 숫자 3는 소수점 뒤에 나올 숫자의 개수를 말한다. 소수점 포인트 앞의 숫자는 문자열의 전체 길이를 의미하는데, %0.3f에서 사용한 숫자 0은 길이에 상관하지 않겠다는 의미이다.

a = 3.2321312341
print('%10.3f' %a)
출력:
     3.232

이렇게 소수점 세 번째 자리까지만 표시하고 전체 길이가 10개인 문자열 공간에서 오른쪽으로 정렬합니다.


 


format 함수를 사용한 포매팅

 

format 함수를 사용하면 좀 더 발전된 스타일로 문자열 포맷을 지정할 수 있습니다.

 

숫자 바로 대입하기

print('I take {0} bananas'.format(3))
출력:
I take 3 bananas


"I take {0} bananas" 문자열 중 {0} 부분이 숫자 3으로 바뀌었다.


문자열 바로 대입하기

print('I take {0} bananas'.format('three'))
출력:
I take three bananas

문자열의 {0} 항목이 ‘three’라는 문자열로 바뀌었습니다.


숫자 값을 가진 변수로 대입하기

three = 3
print('I take {0} bananas'.format(three))
출력:
I take 3 bananas

문자열의 {0} 항목이 number 변수의 값인 3으로 바뀌었습니다.


2개 이상의 값 넣기

a = 2
b = 'five'
print('Today, I ate {0} apples, and I will take {1} bananas tomorrow.'.format(a, b))
출력:
Today, I ate 2 apples, and I will take five bananas tomorrow.

2개 이상의 값을 넣을 경우, 문자열의 {0}, {1}과 같은 인덱스 항목이 format 함수의 입력값으로 순서에 맞게 바뀝니다. 위 예에서 {0}은 format 함수의 첫 번째 입력값인 a, {1}은 format 함수의 두 번째 입력값인 b로 바뀝니다.


이름으로 넣기

print('I love to eat {a} bananas and three {b}'.format(a = 3, b = 'apples'))
출력:
I love to eat 3 bananas and three apples


{0}, {1}과 같은 인덱스 항목 대신 더 편리한 {name} 형태를 사용하는 방법도 있으며, {name} 형태를 사용할 경우, format 함수에는 반드시 name=value와 같은 형태의 입력값이 있어야 합니다.

참고로 혼용도 가능합니다.

print('I love to eat {0} bananas and three {b}'.format(3, b = 'pineapples'))
출력:
I love to eat 3 bananas and three pineapple

{0}과 {name}의 형태로 만들었습니다. 그럼에도 잘 작동합니다.


왼쪽 정렬

print('{0:<10}'.format('hi'))
출력
'hi        '

:<10 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞출 수 있습니다.

오른쪽 정렬

print('{0:>10}'.format('hi'))
출력:
        hi

오른쪽 정렬은 :< 대신 :>을 사용하면 됩니다.

가운데 정렬

print('{0:^10}'.format('hi'))
출력:
'    hi    '


공백채우기

print('{0:=<10}'.format('hi'))
출력:
hi========

공백 문자 대신 지정한 문자 값으로 채워 넣을 수도 있으며, 채워 넣을 문자 값은 정렬 문자 <, >, ^ 바로 앞에 넣어야 합니다.

소수점 표현하기

print('{0:0.3f}'.format(3.445543))
출력:
3.446

앞에서 봤던 0.3f 그대로 사용했습니다.


{ 또는 } 문자 표현하기
format 함수를 사용해 문자열을 포매팅할 경우, {}와 같은 중괄호 문자를 포매팅 문자가 아닌 문자 그대로 사용하고 싶은 경우에는 {{}}처럼 2개를 연속해서 사용하면 됩니다.
print('{{0}}'.format())
출력:
{0}​

f 문자열 포매팅

문자열 앞에 f 접두사를 붙이면 f 문자열 포매팅 기능을 사용할 수 있습니다.
s = 'hi'
print(f'{s}, kevin')
출력:
hi, kevin​

f 문자열 포매팅은 변숫값을 생성한 후에 그 값을 참조할 수 있습니다.
여러가지 방법으로도 쓸 수 있습니다.
a = 'Hello'
b = 21
f = 2
c = {'age' : 21, 'name' : 'Kevin'}
print(f'''{a}, my name is {c['name']}, and I\'m {c['age']} years old. 
but I will be {b + 2 if f == 2 else 0} on next year.''')

먼저, 딕셔너리를 이용해서 가져올 수 있고, 또 {}안에 값을 더하거나 뺄 수도 있습니다.

위에서 배운 정렬로는

print(f'{'hi':<10}')
print(f'{'hi':>10}')
print(f'{'hi':^10}')
print(f'{'hi':=<10}')
print(f'{'hi':=^10}')
print(f'{'hi':!>10}')

출력:
hi        
        hi
    hi    
hi========
====hi====
!!!!!!!!hi

소수점
a = 9.323123231
print(f'{a:10.2f}')
     9.32

문자열 관련 함수들
a = ' hellO world '
문자 개수 세기 - count
print(a.count('o'))
출력:
1

위치 알려 주기 1 - find
print(a.find('o')) # 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환합니다.
출력:
8

위치 알려 주기 2 - index
print(a.index('e')) # 찾는 문자나 문자열이 존재하지 않는다면 오류가 뜹니다.
출력:
2

문자열 삽입 - join
print(','.join(a)) # 각각의 문자 사이에 ‘,’를 삽입했다.
출력:
' ,h,e,l,l,O, ,w,o,r,l,d, '

소문자를 대문자로 바꾸기 - upper
print(a.upper())
출력:
' HELLO WORLD '

대문자를 소문자로 바꾸기 - lower
print(a.lower())
출력:
' hello world '

왼쪽 공백 지우기 - lstrip
print(a.lstrip())
출력:
'hellO world '

오른쪽 공백 지우기 - rstrip
print(a.rstrip())
출력:
' hellO world'

양쪽 공백 지우기 - strip
print(a.strip())
출력:
'hellO world'

문자열 바꾸기 - replace
print(a.replace('world', 'Earth'))
출력:
' hellO Earth ' # world를 Earth로 대체 replace('원래 문자열', '대체 할 문자열')


알아야 할 점이, 함수를 실행했다고 해서 a에 저장이 되어있는 것은 아니다.

a = ' hellO world '
a = a.replace('world', 'Earth')
print(a)
출력:
' hellO Earth '

이렇게 해야 a에 값이 저장이 된다.


리스트 자료형
숫자나 문자열의 모음
a = [1,2,3,4,5] #기본 리스트 형태, 리스트명 = [요소1, 요소2, 요소3, ...]
#참고로 비어 있는 리스트는 a = list()로 생성할 수 있다

리스트의 인덱싱과 슬라이싱
a = [1,2,3,4,5] 
print(a[1]) #0부터 시작해서 두번째인 값인 2이 나온다
출력:
2

#더하기도 가능하다
print(a[1] + a[2])
출력:
5

#-가 붙으면 뒤에서 부터 값이 나온다.
print(a[-2])
출력:
4

#리스트 안에 다른 리스트가 들어갈 수 있다.
a = [1,2,3,4,[1,2,3]]
print(a[4])
출력:
[1, 2, 3]

print(a[-1])
출력:
[1, 2, 3]

#만약 리스트 안에 있는 값을 들고오고 싶으면 똑같이 슬라이싱을 하면 된다.
print(a[-1][2]) #마지막 리스트를 가지고 오고 또 값을 가져온면 된다.
출력:
3

a = [1, 2, ['a', 'b', ['Life', 'is']]] #삼중 리스트
print(a[2][2][0]) #Life 문자열만 가져오기
출력:
Life

리스트의 슬라이싱
a = [1,2,3,4,5] 
print(a[:2]) # 마지막 숫자는 포함되지 않는다는 것을 기억하자.
print(a[2:4]) # 마지막 숫자는 포함되지 않는다는 것을 기억하자.
출력:
[1, 2]
[3, 4]

# 중첩된 리스트에서 슬라이싱하기
a = [1, 2, 3, ['a', 'b', 'c'], 4, 5]
print(a[3][1:])
출력:
['b', 'c']

# 리스트 연산하기
a = [1,2,3]
b = [4,5,6]
출력:

#리스트 더하기(+)
print(a + b)
출력:
[1, 2, 3, 4, 5, 6]

#리스트 반복하기(*)
print(a * 2)
출력:
[1, 2, 3, 1, 2, 3]

#리스트 길이 구하기 len() 함수
print(len(a))
출력:
3

#참고로 따로 더할 때 서로간의 타입을 잘 고려해야 한다.
a = [1,2,3]
print(str(a[1]) + 'hi') #str로 값을 같은 타입으로 변경
출력:
2hi

리스트의 값 수정하기
#값 수정
a = [4,1,3]
a[1] = 5
print(a)
출력:
[4, 5, 3]

#del 함수를 사용해 리스트 요소 삭제하기
del a[1] #del a[x]는 x번째 요솟값을 삭제합니다.
print(a)
출력:
[4, 3]

#리스트 관련 함수(리스트 변수 이름 뒤에 ‘.’를 붙여 여러 가지 리스트 관련 함수를 사용할 수 있습니다.)
#리스트에 요소 추가하기 - append
a.append(4) #a.append([5, 6])이런 식으로도 추가 가능
a.append([5, 6])
print(a)
출력:
[4, 3, 4, [5, 6]]

#리스트 정렬 - sort - sort 함수는 리스트의 요소를 순서대로 정렬해
a = [3,1,2]
a.sort()
print(a) #문자 역시 알파벳 순서로 정렬할 수 있습니다.
출력:
[1, 2, 3]

#리스트 뒤집기 - reverse
a.reverse() #이미 정렬된 상태에서 리버즈
print(a)
출력:
[3, 2, 1]

#인덱스 반환 - index
print(a.index(3)) # 3, 2, 1인 상태에서 첫번째인 3의 위치인 0이 반환이 된다.
출력:
0

#리스트에 요소 삽입 - insert - insert(a, b)는 리스트의 a번째 위치에 b를 삽입하는 함수입니다.
a.insert(2, 10) # 두 번째 자리에 10을 추가
print(a)
출력:
[3, 2, 10, 1]

#리스트 요소 제거 - remove - remove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수
a.remove(10) # 10이 추가 된 상태에서 다시 삭제 
#(참고로 안에 값이 두개 있을 경우, 첫 번째 값이 삭제)
print(a)
출력:
[3, 2, 1]

#리스트 요소 끄집어 내기 - pop-pop()은 리스트의 맨 마지막 요소를 리턴하고 그 요소는 삭제합니다.
a.pop() #현재 3,2,1이 있는데 마지막 요소인 1을 끄집어 내서 값을 나타냈다
print(a) #그래서 a를 print하면 3,2만 남겨져있다.
출력:
[3, 2]

#여기서 ()안에 어떤 값을 끄집어 낼 지 선택할 수 있다
a.pop(0)
print(a) #여기서 0번째인 3을 끄집어 내면 2만 남아있는 것을 알 수 있다.
출력:
[2]

#리스트 확장 - extend - 그냥 리스트에 값 추가 a += []랑 똑같습니다
b = [1,2,3]
a.extend(b)
print(a)
출력:
[2, 1, 2, 3]

튜플
튜플(tuple)은 몇 가지 점을 제외하곤 리스트와 거의 비슷하며 리스트와 다른 점은 다음과 같습니다.
리스트는 [], 튜플은 ()으로 둘러싼다.
리스트는 요솟값의 생성, 삭제, 수정이 가능하지만, 튜플은 요솟값을 바꿀 수 없다.
그런데 지켜야 할 규칙이 있습니다.
1. 1개의 요소만을 가질 때는 요소 뒤에 쉼표(,)를 반드시 붙여야 한다는 것
a = (1,)
print(a)
출력:
(1,)​

2. 소괄호를 생략해도 괜찮습니다.
a = 1, 2, 3
print(a)
출력:
(1, 2, 3)​

프로그래밍을 할 때 튜플과 리스트는 구별해서 사용하는 것이 유리하며, 튜플과 리스트의 가장 큰 차이는 요솟값을 변화시킬 수 있는지의 여부입니다.

즉, 지울수 있는 del, 혹은 추가(append), 값을 변경하려고 해도 에러가 뜹니다.
나머지 인덱싱 방법은 다 동일합니다. 
하지만 튜플과의 더하기는 가능합니다.

a = 1, 2, 3
b = 4, 5
#튜플 더하기
print(a + b)
출력:
(1, 2, 3, 4, 5)

#튜플 곱하기
print(a * 2)
출력:
(1, 2, 3, 1, 2, 3)

#튜플 길이 구하기
print(len(a))
출력:
3