ch 04. 반복문

17204 단어 pythonpython

04-1 리스트와 반복문

리스트란? 목록

#여러가지 자료를 저장할 수 있는 자료
#리스트 선언하고 요소에 접근하기
#리스트를 생성하는 방법은 대괄호에 자료를 쉼표로 구분해서 입력
#대괄호 내부에 넣는 자료 : 요소
#각각의 요소는 다음과 같은 형태로 저장 -> 일반적으로 현실에서는 숫자를 1부터 세지만
#문자열 때처럼 파이썬은 0부터 셈

리스트 기호인 (대괄호 [ ] ) 안에 들어간 숫자 : 인덱스
리스트의 특정 요소는 변경할 수도 있음

  • 대괄호 안에 음수 넣어 뒤에서부터 요소 선택 가능
    #음수를 넣어서 뒤에서부터 선택 가능
    list_a = [2733,32,103,"문자열",True, False]
    list_a[-1]

  • 리스트 접근 연산자를 다음과 같이 이중으로 사용할 수 있음
    #list_a [3]을 지정하면 "문자열" list_a[3][0] 지정하면 "문자열"에서 다시 0번째 가져오기
    list_a = [2733,32,103,"문자열",True, False]
    list_a[3]
    list_a[3][0]

  • 리스트 안에 리스트 사용 가능
    list_a = [[1,2,3],[4,5,6], [7,8,9]]
    list_a[1]
    list_a[1][1]

(1). 리스트 연산자 : 연결(+), 반복(*), len()

#문자열과 리스트는 굉장히 비슷한 자료형, 사용할 수 있는 연산자와 함수 비슷

- 리스트 연산자
# 리스트 선언
list_a = [1,2,3]
list_b = [4,5,6]

# 선언된 리스트 출력
print("#리스트")
print("list_a =", list_a)
print("list_b=", list_b)
print()

# 기본연산자
# 문자열 연결 연산자 : +
print("# 리스트 기본 연산자")
print("list_a + list_b =",list_a + list_b )
# 문자열 반복 연산자 : *
print("list_a * 3 =", list_a * 3)
print()

# 함수
print("# 길이 구하기")
# len() 함수 : 문자열의 글자 수(=길이) 세어 줌, 
# 리스트 변수를 넣으면 요소의 개수 세어줌
print("len(list_a) =", len(list_a))

(2). 리스트에 요소 추가하기 : append, insert

#append() : 리스트 뒤에 요소 추가
#list명.append(요소)
#insert() : 리스트 중간에 요소 추가
#list명.insert(위치, 요소)

한번에 여러 요소 추가하고 싶을 때 : extend()

-> append() 함수를 세 번 반복 실행한 효과

list_a = [1,2,3]
list_a.extend([4,5,6])
print(list_a)
>>
[1,2,3,4,5,6]
  • extend() 함수를 사용하면 list_a에 직접적으로 영향을 줌
  • 원본에 어떠한 영향도 주지 않는 것을 비파괴적
  • append() , insert(), extend() 함수와 같이 리스트에 직접적인 영향을 주는 함수 또는 연산 : 파괴적
list_a = [1,2,3]
list_b = [4,5,6]
list_a.extend(list_b)
list_a
#list_b

(3). 리스트에 요소 제거하기

  • 인덱스로 제거하기, 값으로 제거하기
    -인덱스로 제거 : del(), pop()
    요소의 위치를 기반으로 요소 제거하는 것
    -del 리스트명[인덱스] - 리스트의 특정 인덱스에 있는 요소 제거
    -리스트명.pop(인덱스) - 제거할 위치에 있는 요소 제거,
    매개변수를 입력하지 않으면 마지막 요소 제거
# 리스트 연결 연산자와 요소 추가의 차이
list_a = [0,1,2,3,4,5]
print("# 리스트의 요소 하나 제거하기")

# 제거 방법 [1] - del
del list_a[1]
print("del list_a[1]:", list_a)

# 제거 방법[2] - pop
list_a.pop(2)
print("pop(2):", list_a)

- del
list_b = [0,1,2,3,4,5,6]
# 마지막 요소를 포함하지 않는다
del list_b[3:6]
list_b

# 범위의 한쪽을 입력하지 않으면 지정한 위치를 기준으로 
한쪽을 전부 제거해버릴 수도 있습니다.
# [:3]을 지정하면 3 기준으로(3번째 불포함) 왼쪽 모두 제거
list_c = [0,1,2,3,4,5,6]
del list_c[:3]
list_c
  • 값으로 제거하기(remove)
    리스트 내부에 있는 2를 제거해주세요 처럼 값을 지정해서 제거하는 것을 말한다. 이때는 remove( ) 함수를 사용한다.
    #리스트.remove(값)
# remove() 함수 사용
#지정한 값이 리스트 내부에 여러개가 있어도 가장 먼저 발견되는
하나만 제거한다.
list_c = [1,2,1,2] # 리스트 선언
list_c.remove(2) # 리스트 요소를 값으로 제거하기
list_c

모두 제거하기 : clear

#리스트 내부의 요소를 모두 제거할 때는 clear( ) 함수 사용

- 리스트.clear()
list_d = [0,1,2,3,4,5]
list_d.clear()
list_d

(4). 리스트 내부에 있는지 확인하기: in/not in 연산자

  • 리스트 내부에 있는지 확인하기
    파이썬은 특정 값이 리스트 내부에 있는지
    확인하는 방법 제공
    in연산자 활용
[값 in 리스트]

list_a = [273, 32, 103, 57, 52]
273 in list_a
99 in list_a

# 내부에 값이 있으면 True, 없으면 False 출력
  • not in 연산자
# 리스트 내부에 해당 값이 없는지 확인하는 연산자
list_a = [273, 32, 103, 57, 52]
# 273 notin list_a
99 not in list_a

(5). for 반복문

# 컴퓨터에 반복을 지시하는 방법
for i in range(100): #반복에 사용할 수 있는 자료
    print("출력")
# range () : for반복문과 함께 많이 사용되는 범위 자료형

(6). for반복문 : 리스트와 함께 사용하기

# for 반복문 : 리스트와 함께 사용하기
# for 반복자 in 반복할 수 있는 것:
#    코드

# 리스트 선언합니다.
array = [273, 32, 103, 57, 52]

# 리스트에 반복문을 적용합니다.
for element in array:
    # 출력합니다.
    print(element)
    # for문은 문자열을 함께 사용할 수 도 있습니다.

<마무리>

1.
# 100이상의 숫자만 출력하게 만들기
numbers = [273, 103, 5, 32, 65, 9, 72, 800, 99]

for number in numbers :
    if number >= 100 :
        print("- 100 이상의 수:", number)
numbers = [273, 103, 5, 32, 65, 9, 72, 800, 99]

for number in numbers:
    if number % 2 ==0:
        print(number, "는 짝수입니다.")
    else :
        print(number, "는 홀수입니다.")
# 자릿수 구하기 : len()
numbers = [273, 103, 5, 32, 65, 9, 72, 800, 99]

for number in numbers : 
        print(number, "는", len(str(number)), "자릿수입니다.")
list_of_list =[
    [1,2,3],
    [4,5,6,7],
    [8,9],
]
# 실행결과를 세로로 하나하나 모두 출력
for line in list_of_list: # list_of_list을 line을 만듬
    for item in line: 
    # line으로 만든(선) 의 하나의 아이템들을 하나씩 출력
        print(item)
numbers = [1,2,3,4,5,6,7,8,9]
output = [[],[],[]]

for number in numbers :
    output[(number+2)%3].append(number)
print(output)

04-2. 딕셔너리와 반복문

list : 인덱스 기반으로 값 저장하는 것

#인덱스 : 변수 =[]
#딕셔너리 : 키 기반으로 값을 저장하는 것
#인덱스 : 변수 ={}

#딕셔너리 선언하기
#중괄호로 선언, 키:값 형태를 쉽표로 연결해서 만듬
#키는 문자열, 숫자, 불 등으로 선언
#문자열 사용하는 경우가 많음

(1).딕셔너리 선언하기

#생성
# 변수 = {
#         키:값,
#         키:값,
#         키:값
#}
dict_a ={
    "name": "어벤저스 엔드게임",
    "type":"히어로 무비"
}
print(dict_a)

(2). 딕셔너리 요소에 접근하기

# 특정 키 값만 따로 출력할 수도 있다.
# 딕셔너리를 선언할 때는 중괄호{} 사용, 딕셔너리의 요소에 
접근할 때는 리스트처럼 딕셔너리 뒤에 대괄호[]를 입력하고
내부에 인덱스처럼 키를 입력한다.
dict_a["name"]
dict_a["type"]
dict_b ={
    "director":["안소니 루소","조 루소"],
    "cast":["아이언맨","타노스","토르","닥터스트레인지","헐크"]
}
print(dict_b)
dict_b["director"]

리스트 : list_a = [ ] // ex) list_a[1]
딕셔너리 : dict_a = { } // ex) list_a["name"]

# 딕셔너리의 요소에 접근하기

# 딕셔너리 선언
dictionary = {
    "name": "7D 건조 망고",
    "type": "당절임",
    "ingredient" : ["망고", "설탕","메타중아황산나트륨","치자황색소"],
    "origin" : "필리핀"
}

# 출력합니다.
print("name:" , dictionary["name"])
print("type:" , dictionary["type"])
print("ingredient:" , dictionary["ingredient"])
print("origin:" , dictionary["origin"])
print()

# 값 변경
dictionary ["name"] = "8D 건조 망고"
print("name:", dictionary["name"])
# ingredient : 리스트
# 특정 값 출력 가능
dictionary["ingredient"]
dictionary["ingredient"][1]
>> '설탕'

(3). 딕셔너리에 값 추가하기 /제거하기

# 추가 : 키를 기반으로 값 입력
# 딕셔너리[새로운 키] = 새로운 값

# 추가
dictionary["price"] = 5000 
dictionary

dictionary["name"] = "8D 건조 파인애플"
dictionary

# 제거 - del()함수 사용
# 특정 키 제거
del dictionary["ingredient"]
dictionary

# 딕셔너리에 요소 추가
# 딕셔너리 추가
dictionary = {}

# 요소 추가 전에 내용 출력
print("요소 추가 이전:", dictionary)

# 딕셔너리에 요소 추가
dictionary["name"] = "새로운 이름"
dictionary["head"] = "새로운 정신"
dictionary["body"] = "새로운 몸"

# 출력합니다.
print("요소 추가 이후:", dictionary)

# 딕셔너리에 요소 제거하기
# 딕셔너리 선언
dictionary ={
    "name": "7D 건조 망고",
    "type": "당절임"
}
# 요소 제거 전에 내용을 출력해봅시다.
print("요소 제거 이전:", dictionary)

# 딕셔너리 요소 제거
del dictionary["name"]
del dictionary["type"]

# 요소 제거 후에 내용 출력
print("요소 제거 후:", dictionary)

(4). 딕셔너리 내부에 키가 있는지 확인하기

# in 키워드

#키가 존재하는지 확인하고 값에 접근하기
# 딕셔너리 선언
dictionary  = {
    "name" : "7D 건조 망고",
    "type" : "당절임",
    "ingredient" : ["망고", "설탕", " 메타중아황산나트륨","치자황색소"],
    "origin" : "필리핀"
}

# 사용자로부터 입력을 받는다.
key = input(">접근하고자 하는 키 :")

# 출력합니다.
if key in dictionary:
    print(dictionary[key])
else:
    print("존재하지 않는 키에 접근하고 있습니다.")
  • get() 함수
    -존재하지 않는 키에 접근하는 상황에 대한
    두 번째 대처 방법
    -존재하지 않는 키에 접근하면 None을 출력
# 키가 존재하지 않을 때 None을 출력하는지 확인하기
# 딕셔너리 선언
dictionary = {
    "name" : "7D 건조 망고",
    "type" : "당절임",
    "ingredient":["망고","설탕","메타중아황산나트륨","치자황색소"],
    "origin": "필리핀"
}
# 존재하지 않는 키에 접근해 봅시다
value = dictionary.get("존재하지 않는 키")
print("값:", value)
# None 확인방법
if value == None:  # None과 같은지 확인하면 됨
    print("존재하지 않는 키에 접근했었습니다.")

(5). for반복문: 딕셔너리와 함께 사용하기

  • 딕셔너리 내부에 있는 키가 변수에 들어간다.
    for 키 변수 in 딕셔너리
    코드
# 딕셔너리 선언
dictionary={
   "name": "7D 건조 망고",
   "type": "당절임",
   "ingredient":["망고","설탕","메타중아황산나트륨","치자황색소"],
   "origin": "필리핀"
}

# for 반복문 사용
for key in dictionary:
   
# 출력합니다.
print(key,":", dictionary[key])
  • 확인문제
2. # 딕셔너리와 히스트 선언
pets = [
    {"name":"구름","age":5},
    {"name":"초코","age":3},
    {"name":"아지","age":1},
    {"name":"호랑이","age":1}
]
print("# 우리 동네 애완 동물들")
# 숫자와 문자열 사이에 빈칸이 없게 출력하세요
for pet in pets:
    print(pet["name"], str(pet["age"])+"살")

>> # 우리 동네 애완 동물들
구름 5살
초코 3살
아지 1살
호랑이 1살
3. # numbers 내부에 들어 있는 숫자가 몇 번 등장하는지를 출력하는 코드 작성
# 숫자는 무작위로 입력해도 상관 없습니다.
numbers =[1,2,6,8,4,3,2,1,9,5,4,9,7,2,1,3,5,4,8,9,7,2,3]
counter = {}

for number in numbers:
    if number in counter:
        counter[number] = counter[number]+1
    else:
        counter[number] =1

# 최종 출력
print(counter)
# 특정 값이 어떤 자료형인가?
# type("문자열") is str # 문자열인가?
# type([]) is list  # 리스트인가?
# type({}) is dict  # 딕셔너리인가?

#딕셔너리 선언
character = {
    "name": "기사",
    "level":12,
    "item" : {
        "sword":"불꽃의 검",
        "armor":"풀플레이트"
    },
    "skill": ["베기","세게 베기","아주 세게 베기"]
}

# for 반복문 사용
for key in character:
    if type(character[key]) is dict:
        for small_key in character[key]:
            print(small_key,":", character[key][small_key])
    elif type(character[key]) is list:
        for item in character[key]:
            print(key,":", item)
    else:
        print(key,":", character[key])
>>
name : 기사
level : 12
sword : 불꽃의 검
armor : 풀플레이트
skill : 베기
skill : 세게 베기
skill : 아주 세게 베기

04-3 반복문과 while반복문

  • for문과 함께 많이 사용되는 자료형 : 범위 (range)
    특정한 횟수만큼 반복해서 돌리고 싶을 때는 for문과 범위를 조합해서 사용

(1).범위

  • 매개변수에 숫자를 한 개 넣는 방법
    0 ~ A-1 까지 정수로 범위 만듬
    range(A) A: 숫자
  • 매개변수에 숫자를 두 개 넣는 방법
    A ~ B-1 까지 정수로 범위 만듬
    range(A,B)
  • 매개변수에 숫자 세 개 넣는 방법
    A부터 B-1까지의 정수로 범위를 만드는대 앞뒤의 숫자가 C만큼의 차이를 가진다.
    range(A,B,C)
# 숫자 한개
a = range(5)
a
# list() 함수를 이용해 범위를 리스트로 변경하면 범위 내부에 
어떤 값들이 들어 있는지 확인할 수 있다.
list(range(10))

# 숫자 2개
list(range(0,5))  # 0 ~ (5-1)의 범위
list(range(5,10))  # 5 ~ (10-1)의 범위

# 숫자 3개
list(range(0, 10, 2))  
# 0부터 2씩 증가하면서 (10-1)까지의 정수로 범위 만듬
list(range(0, 10, 3))  
# 0부터 3씩 증가하면서 (10-1)까지의 정수로 범위 만듬

# ***파이썬의 모든 기능들은 범위를 지정할 때 뒤에 입력한 숫자를 
포함하지 않는다.

# 범위 만들때 매개변수 내부에 수식 사용
# 10을 반드시 포함 -> 강조
a = range(0, 10+1)
list(a)

# n = 10
# a = range(0, n/2)
# 매개변수에는 무조건 정수만 넣어야 함
a = range(0, int(n/2))
list(a)

a = range(0, n//2) # 정수 나누기 연산자 사용
list(a)

(2). for 반복문 : 범위와 함께 사용하기

# for문 : 범위와 함께 사용하기
# for 숫자 변수 in 범위:
#      코드

# for문과의 범위
# for문과 범위를 함께 조합하여 사용
for i in range(5):
    print(str(i)+" = 반복 변수")
print()

for i in range(5, 10):
    print(str(i) + "= 반복 변수")
print()

for i in range(0, 10, 3):
    print(str(i)+"= 반복 변수")
print()    

(3). for 반복문: 리스트와 범위 조합하기

  • 몇 번째 반복일까?
#리스트 선언
array = [273, 32,103, 57, 52]
#리스트에 반복문 적용
for element in array : 
    # 출력합니다.
    print(element)
#현재 무엇을 출력하고 있는지 보다, 몇번째 출력인지 
알아야 하는 경우가 있다.

# 리스트와 범위 조합하여 사용하기
# 리스트 선언
array = [273, 32, 103, 57, 52]

# 리스트에 반복문 적용 - len() 함수 사용
# 리스트 array 반복(길이 얼만큼?)
for i in range(len(array)): 
    # 출력합니다.
    print("{}번째 반복 : {}".format(i, array[i]))

(4). for 반복문 : 반대로 반복하기

# 반대로 반복
# 작은 숫자 -> 큰 숫자
# 역반복문도 적용해야하는데 
# 첫번째 방법은 range() 함수 사용

# 역반복문
# for i in range(4, 0, -1): # 0은 안나옴
for i in range(4, 0-1, -1): # 0까지 나옴
    # 0까지 반복하고 싶어서 이 코드를 사용했어 ( 강조 )
    
# 출력합니다.
    print("현재 반복 변수 : {}". format(i))
>> 현재 반복 변수 : 4
   현재 반복 변수 : 3
   현재 반복 변수 : 2
   현재 반복 변수 : 1
   현재 반복 변수 : 0 
 
# reversed()
# 역반복문
for i in reversed(range(5)):

    # 출력합니다.
    print("현재 반복 변수 :{}".format(i))
    
# [0,1,2,3,4] 라는 형태의 범위가 반대로 뒤집어짐
# 9~0 까지 반대로 반복문을 돌릴 수 있음
# 리스트에도 적용 가능
# 매개변수에 리스트 넣는 경우, 딕셔너리 넣는 경우, 
범위 넣는 겨우로 구분하여 생각해보기

(5). while 반복문

# 리스트 또는 딕셔너리 내부의 요소를 모두 순회하는 경우 
# 특정 횟수만큼 반복하는 경우 : for문 사용
# while 불 표현식:
#   문장
# 불 표현식이 참인 동안 문장 계속 반복

# while 반복
while True:
    # "." 출력
    # 기본적으로 end가 \n 이라 줄바꿈 일어남
    # 빈 문자열 ""로 바꿔서 줄바꿈이 일어나지 않게 함
    print(".", end="")
1. for 반목문처럼 사용하기
# 반복 변수 기반으로 반복
i = 0
while i <10:
    print("{}번째 반복입니다.".format(i))
    i += 1
-----------------------------  

2. 상태를 기반으로 반복하기 
# for 문 : 무한반복 x
# while : '조건', 조건활용 -> 반복 (o)
# while 반복문 : 상태 기반으로 반복
# remove() : 리스트 내부에서 해당하는 값 하나만 제거 가능
# while을 사용하면 여러 개 제거 가능

# 변수선언
list_test = [1,2,1,2]
value = 2
# list_test 내부에 value가 있다면 반복
while value in list_test:
    list_test.remove(value)
# 출력합니다.
print(list_test)
-----------------------------

3.시간을 기반으로 반복하기
# 시간
import time
time.time()
# 유닉스 타임과 while 반복문과 조합하면 특정 시간 동안 프로그램 정지시킬 수 있음

# 5초동안 반복
# 시간과 관련된 기능 가져오기
import time

# 변수 선언
number = 0

# 5초 동안 반복
target_tick = time.time()+5
while time.time() < target_tick:
    number += 1
# 출력합니다.
print("5초동안 {}번 반복했습니다.".format(number))
-----------------------------

4. while 반복문 : break 키워드 / continue 키워드
# 반복문 내부에서만 사용할 수 있는 break와 
continue라는 특수한 키워드가 있다.
# break키워드 : 반복문 벗어날 때 사용

# break 키워드
# 변수 선언
i = 0

# 무한 반복
while True:
    # 몇 번째 반복인지 출력
    print("{}번째 반복분입니다.".format(i))
    i = i+1
    # 반복을 종료합니다.
    input_text = input("> 종료하시겠습니까?(y): ")
    if input_text in ["y","Y"]:
        print("반복을 종료합니다.")
        break
-----------------------------

5. continue 키워드
# 변수 선언
numbers = [5, 15, 6, 20, 7, 25]

# 반복을 돌립니다.
for number in numbers :
    # number가 10보다 작으면 다음 반복으로 넘어갑니다.
    if number <10:
        continue  # 현재 반복 중지 다음 반복으로 넘어감
    # 출력합니다.
    print(number)
# 처음부터 반복에 조건을 걸고 사용하고 싶을 때 continue 키워드를 
사용하면 이후 처리의 들여쓰기를 하나 줄일 수 있습니다.
# continue 키워드 사용x
for number in numbers:
    # 반복 대상 한정합니다.
    if number >= 10:
        # 문장
        # 문장
        # 문장
        # 문장
        
# continue 키워드를 사용한 경우
# 반족을 돌린다.
for number in numbers :
    # 반복 대상에서 제외해버립니다.
    if number < 10:
        continue
    # 문장
    # 문장
    # 문장
    # 문장    
# 확인문제
# 1. 하나의 딕셔너리 만들기
key_list = ["name","hp","mp","level"]
value_list = ["기사", 200, 30, 5]
character = {}
for i in range (0, len(key_list)): # 길이
    character[key_list[i]] = value_list[i]
# 최종 출력
print(character)
>>> {'name': '기사', 'hp': 200, 'mp': 30, 'level': 5}

# 2. 1부터 하나씩 증가시키면서 더하는 경우 생각해보기
# 몇을 더할 때 1000을 넘는가?
# 그때의 값?
# 1000이 넘는 경우를 구한 예
limit = 10000
i = 1
sum_value = 0
while sum_value < limit:
    sum_value += i
    i += 1
print("{}를 더할 때 {}을 넘으며 그때의 값은  
{}입니다.".format(i, limit, sum_value))
>>> 142를 더할 때 10000을 넘으며 그때의 값은  10011입니다.

# 몇을 더해야 1000이 넘을까?
limit = 1000
i = 1
sum_value = 0
while sum_value < limit :
    sum_value += i
    i += 1
print("{}를 더할 때 {}을 넘으며 그때의 값은 {}입니다.".format(i-1,limit, sum_value))
>>> 45를 더할 때 1000을 넘으며 그때의 값은 1035입니다.

# 3. 1~ 100까지의 숫자가 있다고 하자
# 최대가 되는 경우는 어떤 숫자를 곱했을 때인지 찾아주세요
# 반복문을 사용해서 모든 경우를 찾는 방법으로 풀어보기
max_value = 0
a = 0
b = 0

for i in range(1, 100//2 + 1):
    j = 100-i

# 최댓값 구하기
    current = i * j
    if max_value < current:
        a = i
        b = j
        max_value = current
# 출력하기
print("최대가 되는 경우: {} * {} = {}".format(a,b,max_value))

좋은 웹페이지 즐겨찾기