3주 - 4장 반복문
반복문
리스트와 반복문
리스트란?
리스트는 여러가지 자료(정보)들을 저장할 수 있는 자료형입니다.
지금까지는 독립적인 문자, 숫자 , 수식들을 자료로 사용했다면
리스트를 활용하면 [ “냥냥냥”, 123, True,Flase ] 이렇게 묶음으로 사용할 수 있게 됩니다.
리스트 사용법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
list_a = [123,"abc",True,False] #리스트 이름 = [요소,요소,요소]
list_a[0] #123
list_a[1] #abc
list_a[2] #True (숫자 별로 호출하여 사용가능)
#특정 요소만 변경 가능
list_a[0] = "변경"
list_a #['변경','abc',True,Flase]
#대괄호 음수를 넣어 뒤에서 부터 선택 가능
list_a[-1] #False
list_a[-2] #True
list_a[-3] #abc
#접근 연산자를 이중으로 사용가능
list_a[0][0] #변
list_a[0][1] #경
#리스트 안에 리스트를 사용가능
list_b = [[1,2,3,],[4,5,6],[7,8,9]]
list_b[0] #[1,2,3]
#list index error 주의
#길이에 맞게 접근하지 않으면 에러가 나옴
list_a[4] #값이 없으므로 에러나옴
리스트 연산하기
리스트 기본 연산 및 길이 구하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#리스트 선언
list_a=[1,2,3]
list_b=[4,5,6]
#리스트 기본 연산
print("#기본 연산")
print("list_a",list_a)
print("list_b",list_b)
print("list_a + list_b ",list_a+list_b) #[1,2,3,4,5,6]
print("list_a *3",list_a *3) # [1,2,3,1,2,3,1,2,3]
#합의 경우 문자열 연결 연산자를 사용하게 되고
#곱의 경우 문자열 반복 연산자를 사용하게 됩니다.
#길이 구하기
print("#길이 구하기")
print("len(list_a)",len(list_a)) #3
#len의 경우 리스트 안에 있는 요소의 갯수를 구하게 됩니다.
리스트에 요소 추가하기 append(),insert()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#리스트 선언
list_a=[1,2,3]
print("# 리스트 뒤로 요소 추가하기")
list_a.append(4) #[1,2,3,4]
list_a.append(5) #[1,2,3,4,5]
list_a #[1,2,3,4,5]
print("# 리스트 중간에 요소 추가하기")
list_a.insert(0,10) # 0번에 10을 추가하라
list_a #[10,1,2,3,4,5]
print("#한번에 여러요소 추가하기")
list_a.extend([4,5,6])
list_a #[1,2,3,4,5,4,5,6],1,2,3,4,5]
리스트 연결연산자와 요소추가의 차이
합 연산 : 비파괴적 함수 , 데이터에 직접적인 영향을 주지 않음
append,insert,extend :파괴적 함수 , 데이터에 직접적인 영향을 줌
합연산 실험
1
2
3
4
5
6
list_a = [1,2,3]
list_b = [4,5,6]
print("list_a = list_a + list_b ")
list_a = list_a+list_b #[1,2,3,4,5,6]
print(list_a)
합연산 후 결과를 다시 리스트에 저장하면 데이터가 영원히 바뀜
다만 저자분께서 써놓았듯이 직접적으로 데이터를 추가하거나 영향을 주면 용량이 매우 커질 수도 있기에 피하는게 좋다고 봄
리스트에 요소 제거하기 del ,pop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
list_a = [0,1,2,3,4,5]
print("# 특정 요소 하나 제거하기")
print("#제거 방법 1 del")
del list_a[0]
print("del list_a[0]", list_a) # [1,2,3,4,5]
print("#제거 방법 2 pop")
list_a.pop(2)
print("list_a.pop(2)", list_a) # [1,2,4,5]
print("#범위제거 방법")
del list_a[0:2]
print("del list_a[0:2]", list_a) # [4,5] 2번째 숫자 앞까지 지워짐 0과 1번이 지워짐
리스트 슬라이싱 [:]
[:]연산자로 범위로 지정하여 여러 요소를 선택하는걸 슬라이싱이라함
리스트[시작 인덱스 : 끝 인덱스: 단계]
1
2
3
4
5
#리스트 슬라이싱
list_a = [0,1,2,3,4,5,6,7,8,9]
print("#리스트 슬라이싱")
print("list_a[0:5:2]",list_a[0:5:2]) #0번 부터 5번 이전까지 2단계씩 건너 뛰면서 출력 [0,2,4]
print("list_a[::-1]",list_a[::-1]) #반대로 출력 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
값으로 제거하기 remove() , 모두 제거하기 clear()
1
2
3
4
5
6
7
8
9
#remove 요소 제거
list_c=[1,2,1,2]
list_c.remove(2)
print("list_c.remove(2)",list_c) # [1,1,2] #중복값 추가 제거는 반복문 사용
#모두 제거하기 clear
list_d = [1,2,3,4]
list_d.clear()
print("list_d",list_d) #[]
리스트 정렬하기 sort()
1
2
3
4
5
6
#리스트 정렬하기sort()
list_e = [52,273,103,32,275,1,7]
list_e.sort() # 오름차순
print("list_e.sort()",list_e) #[1, 7, 32, 52, 103, 273, 275]
list_e.sort(reverse=True) # 내림차순
print("list_e.sort()",list_e) #[275, 273, 103, 52, 32, 7, 1]
리스트 내부에 있는지 확인하기 : in/not in 연산자
1
2
3
4
5
6
7
#리스트 내부 확인 in / not in
list_a = [273, 103, 52, 32, 7]
print("273 in list_a", 273 in list_a) #True
print("73 in list_a", 73 in list_a) #False
print("23 not in list_a", 23 not in list_a) #True
print("103 not in list_a", 103 not in list_a) #False
for반복문
1
2
3
4
5
6
7
8
9
10
11
#반복문 출력
for i in range(4):
print("냐옹") #냐옹 4번!
# 리스트를 선언합니다.
array = [273, 32, 103, 57, 52]
# 리스트에 반복문을 적용합니다.
for element in array: #엘레먼트에 요소하나하나가 들어가며 반복됨
# 출력합니다.
print(element) #273, 32 ,103, 57
중첩리스트와 중첩 반복문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#중첩 반복문과 중첩 리스트
list_of_list = [
[1, 2, 3],
[4, 5, 6, 7],
[8, 9]
]
for items in list_of_list:
print(items)
# [1, 2, 3],
# [4, 5, 6, 7],
# [8, 9]
list_of_list = [
[1, 2, 3],
[4, 5, 6, 7],
[8, 9]
]
for items in list_of_list:
for item in items:
print(items)
#[1, 2, 3]
#[1, 2, 3]
#[1, 2, 3]
#[4, 5, 6, 7]
#[4, 5, 6, 7]
#[4, 5, 6, 7]
#[4, 5, 6, 7]
#[8, 9]
#[8, 9]
##
딕셔너리와 반복문
리스트가 인덱스를 기반으로 값을 저장했다면
딕셔너리는 {키: 값} 을 기반으로 값을 저장하게 됩니다.
값에 리스트나 딕셔너리를 넣을 수 있습니다.
딕셔너리 선언하기 및 요소에 접근하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#딕셔너리 선언
dict_a = {
"키" : "값",
"name" : "어벤저스 엔드게임",
"type" : "히어로 무비"
}
#요소 접근하기 직접적으로 접근
dict_a["name"] # 어벤저스 엔드세임
dict_a["type"] # 히어로 무비
#딕셔너리를 선언
dictionary = {
"name": "냐옹냐옹",
"type": "혼공단",
"ingredient": ["파이썬", "자바", "자바스크립트", "C언어"],
"origin": "한빛"
}
print("name:", dictionary["name"]) #냐옹냐옹
print("type:", dictionary["type"]) #혼공단
print("ingredient:", dictionary["ingredient"]) #['파이썬', '자바', '자바스크립트', 'C언어']
print("origin:", dictionary["origin"]) #한빛
print()
#값을 변경
dictionary["name"] = "냥냥냥"
print("name:", dictionary["name"]) #냥냥냥
주의 딕셔너리의 키에 따옴표 없이 식별자를 입력하면 변수로 인식함
딕셔너리에 값 추가 / 제거하기
dictionary [“키”] = “값” 으로 추가함
리스트와 마찬가지로 del로 제거함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#딕셔너리 요소 추가하기 및 제거하기
#딕셔너리를 선언
dictionary = {}
print("요소 추가 이전:", dictionary) #{}
# 딕셔너리에 요소를 추가
dictionary["name"] = "새로운 이름"
dictionary["head"] = "새로운 정신"
dictionary["body"] = "새로운 몸"
print("요소 추가 이후:", dictionary) # {'name': '새로운 이름', 'head': '새로운 정신', 'body': '새로운 몸'}
# 딕셔너리의 요소를 제거합니다.
del dictionary["name"]
del dictionary["head"]
print("요소 제거 이후:", dictionary) # {'body': '새로운 몸'}
키 에러
딕셔너리 내부에 키가 없음에도 접근한다면 key error 발생
딕셔너리 내부에 키가 있는지 확인하기 in, get, for
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# in 키워드
dictionary = {
"name": "냐옹냐옹",
"type": "혼공단",
"ingredient": ["파이썬", "자바", "자바스크립트", "C언어"],
"origin": "한빛"
}
# 사용자 입력
key = input("접근하고자 하는 키: ")
# 키 값 출력
if key in dictionary:
print(dictionary[key])
else:
print("존재하지 않는 키에 접근하고 있습니다.")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#get 함수
dictionary = {
"name": "냐옹냐옹",
"type": "혼공단",
"ingredient": ["파이썬", "자바", "자바스크립트", "C언어"],
"origin": "한빛"
}
# 존재하지 않는 키에 접근
value = dictionary.get("이름")
print("값:", value)
# None 확인 방법
if value == None:
print("존재하지 않는 키에 접근했었습니다.")
for 반복문 : 딕셔너리 같이 사용해보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dictionary = {
"name": "냐옹냐옹",
"type": "혼공단",
"ingredient": ["파이썬", "자바", "자바스크립트", "C언어"],
"origin": "한빛"
}
# for 반복문을 사용합니다.
for key in dictionary:
# 출력합니다.
print(key, ":", dictionary[key])
# name : 냐옹냐옹
# type : 혼공단
# ingredient : ['파이썬', '자바', '자바스크립트', 'C언어']
# origin : 한빛
범위 자료형과 while 반복문
범위
범위 자료형 – range() 함수 사용
매개변수에 숫자 한개만 사용 - range(A) : 0부터 A-1까지 범위를 사용
매개변수에 숫자 두개 사용 - range(A,B) : A부터 B-1까지 범위를 사용
매개변수에 숫자 세 개만 사용 - range(A) : A부터 B-1까지 범위를 C만큼 건너뛰면서 사용
1
2
3
4
5
6
7
8
9
10
11
for i in range(5):
print(str(i) + "= 반복 변수") #0부터 4까지 반복
print()
for i in range(5, 10):
print(str(i) + "= 반복 변수") #5부터 10까지 반복
print()
for i in range(0, 10, 3):
print(str(i) + "= 반복 변수") #0부터 10까지 반복하되 3의 배수만큼 뛰어넘음
print()
for 반복문 리스트와 범위 조합하기
1
2
3
4
array = [273, 32, 103, 57, 52]
for i in range(len(array)):
print("{}번째 반복: {}".format(i, array[i])) #이떄 i는 몇번째 반복인지 확인의 의미가 큼
for 반복문 반대로 반복하기
1
2
3
4
5
for i in range(4, 0 - 1, -1): # 0-1의 경우 의도적으로 강조할때 사용 그냥 -1로 해도 무
print("현재 반복 변수: {}".format(i))
#또는
for i in reversed(range(5)): #reversed 사용하여 반대로 진행
print("현재 반복 변수: {}".format(i))
중첩 반복문으로 피라미드 만들기
1
2
3
4
5
6
7
8
9
10
output = ""
for i in range(1, 15):
for j in range(14, i, -1):
output += ' '
for k in range(0, 2 * i - 1):
output += '*'
output += '\n'
print(output)
while 반복문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while 불 표현식 : #while true라면 --> 문장 실행
문장
# for문 처럼 사용해보
i = 0
while i < 10:
print("{}번째 반복입니다.".format(i))
i += 1
# 조건문 기반으로 while
list_test = [1, 2, 1, 2]
value = 2
# list_test 내부에 남값이 있다면 반복
while value in list_test:
list_test.remove(value)
# 출력합니다.
print(list_test)
시간 기반으로 반복문 사용하기
1
2
3
4
5
6
7
8
9
10
import time
number = 0
# 5초 동안 반복
target_tick = time.time() + 5
while time.time() < target_tick:
number += 1
print("5초 동안 {}번 반복했습니다.".format(number))
while반복문의 키워드 break , continue
break : 무한 반복중 벗어날때 많이 쓰임
1
2
3
4
5
6
7
8
9
10
i = 0
# 무한 반복
while True:
print("{}번째 반복문입니다.".format(i))
i = i + 1
input_text = input("> 종료하시겠습니까?(y): ")# y를 누르면 break문으로 종료
if input_text in ["y", "Y"]:
print("반복을 종료합니다.")
break
continue : 현재 반복은 넘어가고 다음 반복을 진행할떄 쓰이는 키워드
1
2
3
4
5
6
numbers = [5, 15, 6, 20, 7, 25]
for number in numbers:
if number < 10:
continue #number가 10보다 작으면 다음 반복으로 넘어감
print(number)
문자열 리스트 딕셔너리 기본 함수들
리스트에 적용할 수 있는 기본 함수
min() : 리스트 내부의 최솟값 찾음
max() : 리스트 내부의 최댓값 찾음
sum() : 리스트 내부의 합계를 구함
reversed() : 리스트 뒤집기 (거꾸로 사용)
enumerate(): 리스트의 요소가 인덱스가 몇번인지 알려줌
딕셔너리 함수
items () : 함수와 함께하면 키와 값을 조합해서 반복문 사용가능
1
2
3
4
5
6
7
8
9
10
11
12
example_dictionary = {
"키A": "값A",
"키B": "값B",
"키C": "값C",
}
print("#딕셔너리의 items() 함수")
print("items():", example_dictionary.items())
print()
for key, element in example_dictionary.items():
print("dictionary[{}] = {}".format(key, element))
리스트 내포하기
1
2
3
4
5
6
7
8
9
10
11
12
#리스트 이름 = [표현식 for 반복자 in 반복할 것]
array = [i * i for i in range(0, 20, 2)]
print(array) # [0, 4, 16, 36, 64, 100, 144, 196, 256, 324]
#조건문을 포함해서 반복
array = ["사과", "자두", "초콜릿", "바나나", "체리"]
output = [fruit for fruit in array if fruit != "초콜릿"]
#array 를 반복자 fruit라고 하고 초콜릿이 아닌 요소만을 fruit로 재조합
# 출력합니다.
print(output) #['사과', '자두', '바나나', '체리']
여러줄 합치기
보기 싫거나 어려운 문장을 통합하는 방법
1
2
3
4
5
6
7
8
9
10
#1 괄호로 연결하기 "" "" "" 로 그냥 써도 문장이 연결된다
test = (
"이렇게 입력해도 "
"하나의 문자열로 연결되어 "
"생성됩니다."
)
#2 문자열 join함수 사용
msg = "\n".join([
"이렇게 입력 하면 ",
"컴마(,)마다 줄바뀜이 되면서 연결됩니다."])
이터레이터
리버스된 리스트의 경우 리버스 이터레이터가 되면서 반복문의 매개변수가 전달할 수 있게 되면서 next로 하나하나 꺼내 쓸 수있게 되는겁니다.
1
2
3
4
5
6
7
8
9
numbers = [1, 2, 3, 4, 5, 6]
r_num = reversed(numbers)
print("reversed_numbers :", r_num)
print(next(r_num)) # 1
print(next(r_num)) # 2
print(next(r_num)) # 3
print(next(r_num)) # 4
print(next(r_num)) # 5
그러면 그냥 리스트는 불가능 할까요?
1
2
3
4
5
6
7
8
9
10
11
12
13
numbers = [1, 2, 3, 4, 5, 6]
print(next(numbers))
print(next(numbers))
print(next(numbers))
print(next(numbers))
print(next(numbers))
Traceback (most recent call last):
File "/home/han/project/4장.py", line 307, in <module>
print(next(numbers))
^^^^^^^^^^^^^
TypeError: 'list' object is not an iterator
??? 타입 에러가 납니다 이터레이터가 아니라는데용?
재도 반복문에 쓸 수 있는거 아닌감? 할테지만 조금 다르답니다.
이는 다음 페이지에서 좀더 자세하게 적어보겠습니다.