본문 바로가기

1. Python

3/6(월) IT K-DT (3일차) / 3.변수~6.리스트

 

 

3. 변수

변수(variable)는 값을 저장하는 데 사용되는 식별자(identifier)임.
파이썬에서 변수는 값을 저장하기 전에 먼저 선언할 필요가 없으며, 값을 할당함으로써 자동으로 생성됨.

변수는 값을 저장하거나 조작하는 데 사용됨.

문자, 숫자, 리스트, 튜플, 딕셔너리, 객체 등 다양한 데이터 유형을 저장할 수 있음.

변수는 ' = ' 연산자를 사용하여 값을 할당하고, 변수 이름을 사용하여 해당 값을 참조할 수 있음.

 

실제 값이 저장되어있는 것이 아닌, '실제 값을 가리키는 주소'가 저장이 되어있는 것이 원리임.

(변수 → 처리할 데이터를 저장시키는 기억장소.)
값만 있는 것이 아니라, 값이 갖고 있는 기능들까지 모두 갖고 있음. ('객체'라고 함)

 

3-1. 변수의 이름 작성

데이터를 표현할 수 있는 이름으로 지어야 함.

(name = '루시', age = 13과 같이 바로 이해하기 쉽게 직관적으로 지어야 함.)
첫번째로 문자부터 시작해야 함.
대소문자를 구별함. (NUM =/= num =/= Num)
언더바(_)로 시작할 수 있음.
미리 예약된 키워드는 사용할 수 없음 (예: if, for 등은 변수로 쓸 수 없음.)

 


num1 = 10
num2 = 3

print('%d / %d = %4.2f' %(num1, num2, num1/num2))     # 변수가 2개 이상이므로 소괄호()의 사용이 필요

-------------------------------------------------------------------------------------------

10 / 3 = 3.33

 

3-2. 변수의 데이터 타입

데이터 타입(자료형) : 자료가 저장되는 형태를 의미
문자 : str / 정수 : int / 실수 : float / 참거짓 : bool


name = '김사과'
age = 20
weight = 50.5
isLover = False

print(type(name))
print(type(age))
print(type(weight))
print(type(isLover))

-------------------------------------------------------------------------------------------

<class 'str'>
<class 'int'>
<class 'float'>
<class 'bool'>


 

3-3. 변수의 삭제

del : 객체를 삭제하는데 사용. (파이썬은 데이터를 저장할 수 있는 모든 것이 객체)


del isLover

print(isLover) 

-------------------------------------------------------------------------------------------

NameError: name 'isLover' is not defined
(del을 이용하여 객체를 삭제한 이후 다시 출력을 시도했으므로)

 

4. 파이썬의 입력

 

4-1. input()

사용자에게 데이터를 '문자형'으로 입력받는 함수.


name = input('이름을 입력하세요')

print('%s님 안녕하세요!' %name)


-------------------------------------------------------------------------------------------

이름을 입력하세요 >>> 김사과

김사과님 안녕하세요!


 

4-2. split()

매개변수를 기준으로 데이터를 나눠서 저장하는 함수.


name, age, weight = input('이름, 나이, 몸무게를 차례대로 입력하세요 : ').split(' ') 
# 맨 뒤의 split(' ')은 각 내용을 입력할 때 공백을 설정해서 구별해주도록 하겠다는 의미. 
꼭 공백이 아니더라도 슬래시(/), 콤마(,)를 사용할 수도 있음.

-------------------------------------------------------------------------------------------

print(name, age, weight)

emoji1, emoji2, emoji3 = '😊 😂 🤣'.split(' ')
print(emoji1, emoji2, emoji3)




 


int() : 문자열을 숫자(정수)타입으로 변환

num1 = input('첫번째 숫자를 입력하세요 : ')
num2 = input('두번째 숫자를 입력하세요 : ')
print('결과 : ', num1 + num2) 

#int를 사용하지 않고, 이대로 출력을 한다면 문자로 인식되어서 계산이 아니라 num1num2와 같이 결합이 되어버림.
print('결과 : ', int(num1) + int(num2))


첫번째 숫자를 입력하세요 : 1
두번째 숫자를 입력하세요 : 2
결과 :  12
결과 :  3

 

문제) 국어 점수, 영어 점수, 수학 점수를 입력받아 총점, 평균을 구하는 프로그램을 작성해보자.

kor, eng, math = input('국어 점수, 영어 점수, 수학 점수를 차례대로 입력하세요 : ').split(',')
print('총점 :', int(kor)+int(eng)+int(math))

# int(kor + eng +math)는 문자로 결합이 되어버린 이후에 숫자로 변환하는 내용이라 틀림
print('평균 :', (int(kor)+int(eng)+int(math))/3)


국어 점수, 영어 점수, 수학 점수를 차례대로 입력하세요 : 50,60,70
총점 : 180
평균 : 60.0

 


5. 문자열 다루기

 

str1 = '오늘은 파이썬 3일차 수업입니다.'
print(str1)

str2 = "오늘은 파이썬 3일차 수업입니다."  # 따옴표('), 쌍따옴표(") 모두 사용이 가능. 
print(str2)

str3 = "오늘은 '파이썬' 3일차 수업입니다." 
# 따옴표나 쌍따옴표를 문자 안에 넣어야 할 때, 구분해서 사용하기 위한 목적으로 둘 다 사용을 가능하게 함.
print(str3)

str4 =
'''
오늘은 파이썬 3일차 수업입니다
'''
print(str4) # 주석을 변수로 담는 것도 가능함

 

오늘은 파이썬 3일차 수업입니다.
오늘은 파이썬 3일차 수업입니다.
오늘은 '파이썬' 3일차 수업입니다.
오늘은 파이썬 3일차 수업입니다

 

5-1. 문자열 인덱싱


문자열에 번호를 매겨 특정 문자를 찾을 수 있는 기능 (Index)

str = '문자열에 번호를 매겨 특정 문자를 찾을 수 있는 기능'
print(str[0]) # 앞에서 첫 번째 글자가 출력
print(str[1])
print(str[-1]) # 끝에서 첫 번째 글자가 출력
print(str[-2])





 

5-2. 문자열 슬라이싱

문자열에서 원하는 범위를 추출하는 기능 (Slice)

str = '문자열에서 원하는 범위를 추출하는 기능'
print(str[0:5]) # 0의 위치(첫번째 단어)에서 5의 앞위치(네번째 단어)까지의 범위를 출력
print(str[7:13])
print(str[:13]) # 처음부터 13의 앞위치(열두번째 단어)까지의 범위를 출력
print(str[6:]) # 6의 위치(일곱번째 단어) 에서 끝까지의 범위를 출력


문자열에서
하는 범위를
문자열에서 원하는 범위를
원하는 범위를 추출하는 기능

 

 

5-3. 문자열 함수

문자열 기능이 있는 객체가 만들어져야 사용할 수 있는 함수이다.

 


count() : 문자열에서 매개변수로 전달된 문자열의 출현 횟수를 반환

 

str = '문자열 함수는 문자열과 관련한 여러가지 기능들을 담고 있다.' 
print(str.count('문')) # str에서 '문'이 2개가 출현했다는 의미
print(str.count('문자')) # str에서 '문자'가 2개가 출현했다는 의미


2
2

 


find(): 매개변수로 전달된 문자열이 처음 나오는 위치를 인덱스로 반환

 

str = '문자열 함수는 문자열과 관련한 여러가지 기능들을 담고 있다.' 
print(str.find('문')) #'문'이라는 글자가 처음 나오는 위치가 0의 위치(첫번째 단어)라는 의미
print(str.rfind('문')) #'문'이라는 글자가 마지막에 나오는 위치가 8의 위치(일곱번째 단어)라는 의미
print(str.find('뷁')) # 글자가 str 내에 없다면, '-1'로 반환이 된다는 의미


0
8
-1

 

index() : 매개변수로 전달된 문자열이 처음나오는 위치를 인덱스로 반환

 

str = '문자열 함수는 문자열과 관련한 여러가지 기능들을 담고 있다.' 
print(str.index('문')) # index의 번호가 0이라는 의미
print(str.index('뷁')) 
# 없는 글자를 입력했을 때 -1이 반환되지 않고 에러가 발생한다는 점에서 find와 차이가 있음.

 

(ValueError: substring not found)

 

0

ValueError: substring not found

 


replace() : 특정 문자열을 치환

 

str = '문자열 함수는 문자열과 관련한 여러가지 기능들을 담고 있다.' 
print(str.replace('기능', '함수')) 
# str안의 단어인 '기능'을 '함수'로 치환한다는 의미


문자열 함수는 문자열과 관련한 여러가지 함수들을 담고 있다.

 


upper() : 문자열을 모두 대문자로 변환
lower() : 문자열을 모두 소문자로 변환

str = 'APPLE apple Apple'
print(str.upper())
print(str.lower())


APPLE APPLE APPLE
apple apple apple

 


strip() : 문자열의 양쪽 공백을 제거
lstrip() : 문자열의 왼쪽 공백을 제거
rstrip() : 문자열의 오른쪽 공백을 제거

 

str =  '      Hello     Python         '
print(str.strip())
print(str.lstrip())
print(str.rstrip())
print(str.replace(' ', '')) # 공백을 모두 없애버리고 싶으면, replace()를 이용


Hello     Python
Hello     Python         
      Hello     Python
HelloPython

 


join() : 문자열에 특정 문자열을 삽입

str = 'Hello'
print('😀'.join(str)) # str의 글자 사이사이에 이모지를 하나씩 삽입


H😀e😀l😀l😀o

 

6. 리스트

 

6-1. 자료구조(Data Structure)

코드상에서 데이터를 효율적으로 처리하기 위해 데이터 특징에 따라 체계적으로 구조화하여 저장하는 방법. 

한 마디로 데이터의 용이한 관리를 목적으로 저장하는 방법.

 

6-2. 리스트(List)

여러가지 데이터 및 데이터타입을 콤마(,)로 구분하여 대괄호( [ ] )로 감싼 자료구조.

 

a = 10 # 1개의 데이터만을 저장하고 있는 자료구조 = 스칼라(Scalar) 
print(a)

 

li1 = [1,3,5,7,9] # index로 접근이 가능함. 예) index 0 = 1, index 1 = 3, index 2 = 5...
print(li1)
print(type(li1)) # list의 타입은 list이다.

 

[1, 3, 5, 7, 9]
<class 'list'>

li2 = list([1,3,5,7,9])
print(li2)


# li2 = list(1,3,5,7,9) 와 같이 소괄호만 적용하면 Error가 발생하므로 대괄호까지 모두 적용해 주어야 함.

  TypeError: list expected at most 1 argument, got 5


[1, 3, 5, 7, 9]

li3 = ['김사과', '반하나', '오렌지', '이메론'] # 문자열의 리스트도 가능
print(li3)

 

li4 = [1, 50.5, '김사과', True] # 각자 다른 타입의 데이터도 저장이 가능
print(li4)

 

li5 = [1, 2, '파이썬', ['김사과', '오렌지']] # 이차원리스트 (리스트 안에 리스트가 있는 경우)
print(li5) #index의 세번째 데이터는 ['김사과', '오렌지] 이다.

 

6-3. 리스트 인덱싱

 

li1 = [1,3,5,7,9]
print(li1)
print(li1[0])
print(li1[-1])
print(li1[0]+li1[-1])


[1, 3, 5, 7, 9]
1
9
10
[16]

 

li2 = ['김사과', '오렌지', '반하나', ['🍕','🍔','🥓','🥨']]
print(li2[0])
print(li2[-1])
print(li2[-1][-2]) # index -1의 위치에 있는 작은 리스트 안에서 -2의 위치에 있는 베이컨을 의미


김사과
['🍕', '🍔', '🥓', '🥨']
🥓
[19]
0초

 

li3 = [1, 2, 3, ['김사과', '오렌지', '반하나', ['🍕','🍔','🥓','🥨']]]
print(li3[2])
print(li3[-2])
print(li3[-1])
print(li3[-1][-2])
print(li3[-1][-1][-1])


3
3
['김사과', '오렌지', '반하나', ['🍕', '🍔', '🥓', '🥨']]
반하나
🥨

 

4. 리스트 슬라이싱

 

li4 = [10, 20, 30, 40, 50]
print(li4)
print(li4[0:3]) # index 0에서 2의 위치까지를 모두 반환


[10, 20, 30, 40, 50]
[10, 20, 30]
[24]

 

li5 = li4 # li4를 li5에 대입하라는 의미
print(li5)

li5[0] = 100 # li5의 index 0의 위치를 100으로 바꾸겠다는 의미

print(li5)
print(li4) # li5 뿐만 아니라 li4도 100으로 바뀜 ★중요


[10, 20, 30, 40, 50]
[100, 20, 30, 40, 50]
[100, 20, 30, 40, 50]

li6 = [10, 20, 30, ['김사과', '오렌지', '반하나'], 40, ['🍕', '🍔']]
print(li6[2:6])
print(li6[5][:1])


[30, ['김사과', '오렌지', '반하나'], 40, ['🍕', '🍔']]
['🍕']

 

5. 리스트 연산자

 

li7 = [10, 20, 30]
li8 = [40, 50, 60]

print(li7 + li8) # 리스트 연결연산
print(li8 + li7) # 리스트 연결연산
print(li7 * 3) # 리스트의 반복연산


[10, 20, 30, 40, 50, 60]
[40, 50, 60, 10, 20, 30]
[10, 20, 30, 10, 20, 30, 10, 20, 30]

li9[1] = '😎'
print(li9[0] + li9[1])

 

# li9의 index 0은 정수(int)고, index 1은 문자열(str)이므로 연산오류가 발생.

   TypeError: unsupported operand type(s) for +: 'int' and 'str'

 

 

6. 리스트의 수정 및 삭제

 

li10 = [10, 20, 30]
li10[1] = 100
print(li10) # index 1의 자리를 20에서 100으로 변환


[10, 100, 30]

 

li10 = [10, 20, 30]
li10[1:2] = ['😎', '😍', '😂'] # 슬라이싱을 이용하여 리스트 데이터를 추가한 경우 리스트에 '데이터만' 포함.
print(li10)


[10, '😎', '😍', '😂', 30]

li10 = [10, 20, 30]
li10[1] = ['😎', '😍', '😂'] # 인덱싱을 이용하여 리스트 데이터를 추가한 경우 리스트에 '리스트까지' 포함. 
# 슬라이싱을 이용하여 리스트 데이터를 추가하는 경우와의 차이점
print(li10)


[10, ['😎', '😍', '😂'], 30]

 

li10 = [10, 20, 30]
li10[1:3] = [] # 빈 리스트로 변환하면 요소가 삭제됨. 인덱스 1, 2의 위치 삭제
print(li10)


[10]

li10 = [10, 20, 30]
del li10[0] # 인덱스 0번 요소의 삭제
print(li10)


[20, 30]

 

7. 리스트 함수


append() : 리스트의 요소 맨 마지막 자리에 데이터를 추가

li11 = [10, 20, 30]
print(li11)

li11.append(100)
print(li11) # 마지막 자리에 100을 추가

li11.append([200, 300])
print(li11)

# li11.append(200, 300)로 진행 시 에러 발생. 두개 이상을 추가할 때 대괄호의 사용이 필요. 

★ 리스트 자체의 차원이 추가되는 점이 extend와의 차이점


[10, 20, 30]
[10, 20, 30, 100]
[10, 20, 30, 100, [200, 300]]


extend() : 리스트에 요소를 추가

li11 = [10, 20, 30]
print(li11)

li11.extend([50])
print(li11) # li11.extend(50)로 진행 시 에러 발생. 항상 대괄호의 사용이 필요.

li11.extend([1000, 2000])
print(li11) # 두개 이상의 데이터 추가도 가능.


[10, 20, 30]
[10, 20, 30, 50]
[10, 20, 30, 50, 1000, 2000]

 


in-place 연산 (연결 및 재저장)

li11 = [10, 20, 30]
li11 = li11 + [40, 50] # li11 += [40, 50]
print(li11)


[10, 20, 30, 40, 50]

 

pop() : 리스트의 맨 마지막에 저장된 데이터를 반환하고 해당 데이터를 삭제

li12 = [10, 20, 30, 40, 50]
print(li12)

li12.pop() # li12의 맨 마지막 50이라는 데이터를 반환하고 50을 삭제
print(li12)

li12 = [10, 20, 30, 40, 50]
temp = li12.pop()
print(temp) # pop으로 반환되는 데이터. 50이 temp에 들어있음


[10, 20, 30, 40, 50]
[10, 20, 30, 40]
50


remove() : 매개변수로 전달된 데이터를 제거. 같은 데이터가 여러 개 있는 경우 처음 출현하는 데이터만 제거

li13 = [10, 20, 30, 40, 50, 20, 40]
print(li13)

li13.remove(20) # li13의 20이라는 데이터의 처음 출현하는 부분만 제거
print(li13)

# 더 이상 지우려는 데이터가 없다면, 출력을 요청할 때 에러가 발생. 
# ValueError: list.remove(x): x not in list


[10, 20, 30, 40, 50, 20, 40]
[10, 30, 40, 50, 20, 40]

 


insert() : 리스트의 특정 위치(인덱스)에 데이터를 삽입

li14 = [10, 20, 30]
print(li14)

li14.insert(1, 100) # 인덱스 1번 자리에 100을 삽입한 후, 나머지는 뒤로 미룸
print(li14)


[10, 20, 30]
[10, 100, 20, 30]

 

index() : 리스트에 저장된 데이터가 있을 경우 위치를 인덱스로 반환시키고, 없으면 에러를 출력

 

li14 = [10, 20, 30]

print(li14)
print(li14.index(20)) # li14에 20이라는 데이터가 인덱스 1번의 위치에 있음
print(li14.index(40)) # 없는 데이터는 에러가 출력. ValueError: 40 is not in list

 

reverse() : 리스트에 저장된 데이터를 반대 순서로 반환

 

li15 = [100, 50, 70, 60, 20]
print(li15)

li15.reverse()
print(li15)

li16 = ['김사과', '오렌지', '반하나', '이메론'] # 문자열도 reverse()함수의 사용이 가능
print(li16)

li16.reverse()
print(li16)

 

[100, 50, 70, 60, 20]
[20, 60, 70, 50, 100]
['김사과', '오렌지', '반하나', '이메론']
['이메론', '반하나', '오렌지', '김사과']

 

sort() : 리스트에 저장된 데이터를 오름차순 또는 내림차순으로 정렬

 

# in-place 연산을 수행. 원본을 정렬(None이 리턴됨)
li17 = [10, 40, 30, 100, 90, 50]
print(li17)

li17.sort() # 기본적으로 오름차순으로 정렬
print(li17)

li17.sort(reverse=True) # 내림차순은 sort안에 reverse=True를 입력
print(li17)

li18 = ['APPLE', 'apple', 'orange', 'banana', 'melon']
print(li18)

li18.sort() 
# 아스키코드(대문자가 65, 소문자가 97)에 따라 영문 문자열의 오름차순은 대문자가 먼저 출력됨. 이후 알파벳순
print(li18)

li18.sort(reverse=True) 
print(li18)

li19 = ['김사과', '오렌지', '반하나', '이메론', '배애리']
print(li19)

li19.sort() # 유니코드에 따라 한글 문자열은 가나다순으로 출력
print(li19)

li19.sort(reverse=True)
print(li19)


[10, 40, 30, 100, 90, 50]
[10, 30, 40, 50, 90, 100]
[100, 90, 50, 40, 30, 10]
['APPLE', 'apple', 'orange', 'banana', 'melon']
['APPLE', 'apple', 'banana', 'melon', 'orange']
['orange', 'melon', 'banana', 'apple', 'APPLE']
['김사과', '오렌지', '반하나', '이메론', '배애리']
['김사과', '반하나', '배애리', '오렌지', '이메론']
['이메론', '오렌지', '배애리', '반하나', '김사과']

 


참고) sorted() : iterable 객체(순서가 정해져있는 객체)로부터 정렬된 리스트를 생성함. 리스트 함수 X

  ★ sort()와 sorted()의 차이점을 비교해두는 것이 중요 ★

sort 함수 : 리스트명.sort( )형식.

   "리스트형의 메소드"​​이며 리스트 원본값을 직접 수정. in-place연산을 수행.
   sort() : a1: [6, 3, 9] --정렬 후-- a1: [3, 6, 9] a2: None
sorted 함수 : sorted(리스트명)형식.

   "파이썬 표준함수"이며 리스트 원본 값은 그대로이고 정렬 값을 반환. in-place연산을 수행하지 않음.
   sorted() : a1: [6, 3, 9] --정렬 후-- a1: [6, 3, 9] a2: [3, 6, 9]


 

li17 = [10, 40, 30, 100, 90, 50]
print(sorted(li17)) # 오름차순으로 정렬
print(sorted(li17,reverse=True)) # 내림차순으로 정렬

li18 = ['APPLE', 'apple', 'orange', 'banana', 'melon']
print(li18)
print(sorted(li18)) 

# 아스키코드(대문자가 65, 소문자가 97)에 따라 영문 문자열의 오름차순은 대문자가 먼저 출력됨.
# 이후 알파벳순.
print(sorted(li18, reverse=True))


[10, 30, 40, 50, 90, 100]
[100, 90, 50, 40, 30, 10]
['APPLE', 'apple', 'orange', 'banana', 'melon']
['APPLE', 'apple', 'banana', 'melon', 'orange']
['orange', 'melon', 'banana', 'apple', 'APPLE']

 

count() : 리스트에 포함된 특정 데이터의 갯수를 반환

li18 = [10, 20, 30, 50, 20, 40, 30, 20]
print(li18.count(20)) # 20이 3개 들어있음
print(li18.count(16)) # 16은 없음


3
0

 


len() : 요소의 갯수를 반환. 리스트 함수 X
   count()와 len()의 차이점을 숙지하자. len()은 파이썬 표준함수.

li18 = [10, 20, 30, 50, 20, 40, 30, 20]
print(len(li18))



8



TIP

 

Python 교육용 참고 사이트

 

 

점프 투 파이썬

이 책은 파이썬이란 언어를 처음 접해보는 독자들과 프로그래밍을 한 번도 해 본적이 없는 사람들을 대상으로 한다. 프로그래밍을 할 때 사용되는 전문적인 용어들을 알기 쉽게 풀어서 …

wikidocs.net

 

W3Schools Free Online Web Tutorials

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

프로그램에서 이퀄(=)은 '같다'는 의미가 아니라, '대입했다'라는 의미로 보아야 한다.

예) A=B는 'A와 B는 같다'가 아니라, 'B를 A에 대입했다, A가 B를 가리킨다'라는 의미로 보아야 한다.


Google Colab 등의 Jupyter Notebook류의 에디터는 print()를 사용하지 않아도 값의 출력이 바로 가능하다.


Error가 출력될 때, Error를 많이 확인하여 어떤 종류의 Error인지 파악하는 연습을 하는 것이 필요

 

개발자는 영어를 잘하면 강점이 많음 → 영문 사이트를 보는 습관을 기르는 것을 추천

AI쪽은 논문을 많이 보는 습관을 들이는 것도 추천.