Programming/Python

[혼공챌린지]python 자료형

Hayley Shim 2021. 7. 19. 01:02

3주차 과제

기본미션 : 리스트, 딕셔너리, 범위 자료형에 대해 이해한 내용을 바탕으로 포스팅하기



리스트 : 리스트 안에는 어떠한 자료형도 포함시킬 수 있다

 

number = int(input("정수 입력> "))

if number % 2 == 0:
    print("""입력한 문자열은 {}입니다.
{}는(은) 짝수입니다.""".format(number, number))

else:
    print("""입력한 문자열은 {}입니다.
{}는(은) 홀수입니다.""".format(number, number))

 

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

 

#리스트를 선언
list_a = [1,2,3]
list_b = [4,5,6]

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

#기본연산자
print("list_a + list_b =", list_a + list_b)
print("list_a * 3 =", list_a*3)

#함수
print("# 길이 구하기")
print("len(list_a) =", len(list_a))

>>>실행결과
#리스트
list_a = [1,2,3]
list_b = [4,5,6]

#리스트 기본 연산자
list_a + list_b = [1,2,3,4,5,6]
list_a *3 = [1,2,3,1,2,3,1,2,3]

#길이 구하기
len(list_a) = 3

 

리스트 관련 함수

 

extend() : extend(x)에서 x에는 리스트만 올 수 있으며 원래의 a 리스트에 x 리스트를 더하게 됨

 

a = [1,2,3]
a.extend([4,5])
>>>[1,2,3,4,5]
b=[6,7]
a.extend(b)
>>>[1,2,3,4,5,6,7]

 

append() : append(x)는 리스트의 맨 마지막에 x를 추가하는 함수

 

a = [1, 2, 3]
a.append(4)
print(a)
>>>[1, 2, 3, 4]

 

sort() : 리스트의 요소를 순서대로 정렬

 

a=[1,4,3,2] 
a.sort() 
print(a) 
>>>[1,2,3,4]

 

index() : 리스트에 x 값이 있으면 x의 위치 값을 돌려줌

 

a = [1,2,3]
a.index(3)
>>>2

 

insert() : insert(a, b)는 리스트의 a번째 위치에 b를 삽입하는 함수

 

a = [1,2,3]
a.insert(0,4)
print(a)
>>>[4,1,2,3]

 

remove() : remove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수

 

a = [1,2,3,1,2,3]
a.remove(3)
print(a)
>>>[1,2,1,2,3]

 

pop()pop(x)는 리스트의 x번째 요소를 돌려주고 그 요소는 삭제

 

a = [1,2,3]
a.pop(1)
>>>2
print(a)
>>>[1,3]

 

del() : 리스트의 특정 인덱스에 있는 요소를 제거할 때

 

list_a = [0,1,2,3,4,5]
del list_a[1]
print("del list_a[1]:", list_a)
>>>[0,2,3,4,5]

 

clear() : 리스트 내부의 요소를 모두 제거할 때

 

list_d = [0,1,2,3,4,5]
list_d.clear()
list_d
>>>[]

 

▶리스트 연산자와 같이 원본에 영향을 주지 않는 것을 비파괴적이라하고, append(), insert(), extend() 함수와 같이 리스트에 직접적인 영향을 주는 함수 또는 연산을 파괴적이라고 표현함. 프로그래밍 언어 입장에서 용량이 얼마나 큰지도 모르는 것을 '원본과 결과'라는 두 가지로 생성하는 것은 위험할 수 있다. 따라서 파이썬 프로그래밍 언어는 원본을 직접적으로 조작하는 기능을 제공해서 이러한 위험을 피하는 것이다.

 

[비슷한 개념 참고]

Destructive Functions on Linked Listshttp://www.cs.ecu.edu/karl/3300/spr16/Notes/DataStructure/List/linkedlist3.html

What Is A Destructive Method

: https://www.youtube.com/watch?v=QlUFzhWiD4I 


딕셔너리 : 리스트가 인덱스를 기반으로 값을 저장하는 것이라면 딕셔너리는 키를 기반으로 값을 저장하는 것

딕셔너리 선언 : {}로 선언하며, '키:값' 형태를 쉼표(,)로 연결해서 만든다

 

dict_a = {
	"name" : "어벤저스 엔드게임",
    	"type" : "히어로 무비"
    }

 

딕셔너리 요소 접근

- 리스트처럼 딕셔너리 뒤에 대괄호[]를 입력하고 내부에 인덱스처럼 키를 입력한다. 딕셔너리를 선언할 때는 중괄호{}를 사용하지만 딕셔너리의 요소에 접근할 때는 리스트처럼 딕셔너리 뒤에 대괄호[]를 입력하고 내부에 인덱스처럼 키를 입력한다.

 

>>>dict_a["name"]
어벤져스 엔드게임'
>>>dict_a["type"]
히어로 무비

 

- 딕셔너리 내부의 값에 문자열, 숫자, 불 등의 다양한 자료를 넣을 수도 있다. 리스트와 딕셔너리도 하나의 자료이므로 리스트와 딕셔너리를 값으로 넣을 수도 있다

 

>>>dict_b = {
		"director":["안소니 루소", "조 루소"],
      	 	 "cast": ["아이언맨", "타노스", "토르", "닥터스트레인지", "헐크"]
        }

 

딕셔너리 요소 접근 예

 

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

print("name:", dictionary["name"])
print("name:", dictionary["type"])
print("ingredient:", dictionary["ingredient"])
print("origin:", dictionary["origin"])
print()

dictionary["name"] = "8D 건조 망고"
print("name:", dictionary["name"])

실행결과

딕셔너리의 문자열 키와 관련된 실수 : 일반적으로 키와 문자열로 사용할 때는 반드시 따옴표(" ")를 붙여준다

 

딕셔너리에 값 추가/제거하기

딕셔너리[새로운 키] = 새로운 값

del 딕셔너리[기존 키]

 

dictionary["price"] = 5000
# 마지막 위치에 "price" 키 추가됨

dictionary["name"] = "9D 건조 망고"
# 이미 존재하고 있는 키를 지정하고 값을 넣으면 기존의 값을 새로운 값으로 대치함

del dictionary["ingredient"]
# 해당 키의 요소가 제거됨

 

KeyError 예외 : 리스트의 길이가 넘는 인덱스에 접근하면 IndexError가 발생했다. 딕셔너리도 존재하지 않는 키에 접근하면 마찬가지로 KeyError가 발생한다.

 

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

- in 키워드 : 리스트에서 처럼 딕셔너리 내부에 키가 있는지 없는지 확인할 때도 in 키워드를 사용한다

 

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

key = input("> 접근하고자 하는 키 :")

if key in dictionary:
    print(dictionary[key])
else:
    print("존재하지 않는 키에 접근하고 있습니다")

 

- get() 함수 

 

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

value = dictionary.get("존재하지 않는 키")
print("값:", value)

if value == None:
    print("존재하지 않는 키에 접근했습니다")

 

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

 

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

for key in dictionary:
    print(key, ":", dictionary[key])

범위자료형(range) : 리스트, 딕셔너리 외에 for 반복문과 함께 많이 사용되는 자료형

1. 매개변수에 숫자를 한 개 넣는 방법 : 0부터 A-1까지의 정수로 범위를 만든다

range(A) -> A는 숫자

 

2. 매개변수에 숫자를 두 개 넣는 방법 : A부터 B-1까지의 정수로 범위를 만든다

range(A, B) -> A와 B는 숫자

 

3. 매개변수에 숫자를 세 개 넣는 방법 : A부터 B-1까지의 정수로 범위를 만드는데 앞뒤의 숫자가 C만큼의 차이를 가진다

range(A,B,C) -> A,B,C는 숫자

 

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()

 

for 반복문 : 리스트와 범위 조합하기

 

array = [273, 32, 103, 57, 52]

for i in range(len(array)):
    print("{}번째 반복: {}".format(i, array[i]))

 

for 반복문 : 반대로 반복하기

 

for i in range(4, 0 - 1, -1):
    
    print("현재 반복 변수: {}".format(i))
for i in reversed(range(5)):

    print("현재 반복 변수 : {}".format(i))

 

while 반복문

 

# . 을 무한히 출력
while True:
    print(".", end="")

 

while반복문 : for 반복문처럼 사용하기

 

i = 0
while i<10:
    print("{}번째 반복입니다.".format(i))
    i += 1

 

 

while반복문 : 상태를 기반으로 반복하기

 

list_test = [1,2,1,2]
value =2

while value in list_test:
    list_test.remove(value)

print(list_test)

 

while반복문 : 시간을 기반으로 반복하기

 

import time

number = 0

target_tick = time.time() + 5
while time.time() < target_tick:
    number += 1

print("5초 동안 {}번 반복했습니다".format(number))

 

while 반복문 : break 키워드/continue 키워드

 

#break 예제
i = 0

while True:
    print("{}번째 반복문입니다.".format(i))
    i = i + 1

    input_text = input("> 종료하시겠습니까?(y/n): ")
    if input_text in ["y", "Y"]:
        print("반복을 종료합니다.")
        break
#continue 예제

numbers = [5, 15, 6, 20, 7, 25]

for number in numbers:

    if number < 10:
        continue

    print(number)

문자열, 리스트, 딕셔너리 관련 기본 함수

리스트에 적용할 수 있는 기본 함수 : min(), max(), sum()

reversed() 함수로 리스트 뒤집기

 

list_a = [1,2,3,4,5]
list_reversed = reversed(list_a)

print("# reversed() 함수")
print("reversed([1,2,3,4,5]):", list_reversed)
print("list(reversed([1,2,3,4,5])):", list(list_reversed))
print()

print("# reversed() 함수와 반복문")
print("for i in reversed([1,2,3,4,5]):")
for i in reversed(list_a):
    print("-", i)

 

enumerate() 함수와 반복문 조합

 

example_list = ['요소A', '요소B','요소C']

print("단순 출력")
print(example_list)
print()

print("#enumerate() 함수 적용 출력")
print(enumerate(example_list))
print()

print("#list() 함수로 강제 변환 출력")
print(list(enumerate(example_list)))

print("#반복문과 조합하기")
for i, value in enumerate(example_list):
    print("{}번째 요소는 {}입니다.".format(i, value))

 

딕셔너리의 items() 함수와 반복문 조합

 

example_dictionary = {
    "키A" : "값A",
    "키B" : "값B",
    "키C" : "값C"
}    

print("#딕셔너리의 items()함수")
print("items():", example_dictionary.items())
print()

print("#딕셔너리의 items() 함수와 반복문 조합하기")

for key, element in example_dictionary.items():
    print("dictionary[{}] = {}".format(key, element))

 

 

리스트 내포(comprehensions)

- 반복문을 사용한 리스트 생성

 

array = []

for i in range(0, 20, 2):
    array.append(i*i)

print(array)

 

 

- 리스트 안에 for문 사용하기

 

array = [i*i for i in range(0,20,2)]

print(array)

 

- 조건을 활용한 리스트 comprehensions

 

array = ['사과', '자두', '초콜릿', '바나나', '체리']
output = [fruit for fruit in array if fruit !='초콜릿'] 

print(output)

*구분 내부에 여러 줄 문자열을 사용했을 때의 문제점 : 예상치 못한 들여쓰기가 들어간다

예제1)

 

number = int(input("정수 입력> "))

if number % 2 == 0:
    print("""\
        입력한 문자열은 {}입니다.
        {}는(은) 짝수입니다.""".format(number, number))

else:
    print("""\
        입력한 문자열은 {}입니다.
        {}는(은) 홀수입니다.""".format(number, number))

출력화면

예제2) 실행결과는 제대로 나오지만 코드가 이상한 구조를 가진다

 

number = int(input("정수 입력> "))

if number % 2 == 0:
    print("""입력한 문자열은 {}입니다.
{}는(은) 짝수입니다.""".format(number, number))

else:
    print("""입력한 문자열은 {}입니다.
{}는(은) 홀수입니다.""".format(number, number))

 

예제3) 실행결과는 제대로 나오지만 문자열을 한줄로 길게 적으면 코드가 복잡해진다

 

number = int(input("정수 입력> "))

if number % 2 == 0:
    print("입력한 문자열은 {}입니다. \n{}는(은) 짝수입니다.".format(number, number))

else:
    print("입력한 문자열은 {}입니다.\n{}는(은) 홀수입니다.".format(number, number))

 

해결방법1 : 괄호로 문자열 연결하기

 

number = int(input("정수 입력> "))

if number %2 == 0:
    print((
        "입력한 문자열은 {}입니다.\n"
        "{}는(은) 짝수입니다." 
    ).format(number, number))
else:
    print((
        "입력한 문자열은 {}입니다.\n"
        "{}는(은) 홀수입니다."
    ).format(number, number))

 

해결방법2 : join 함수 사용

 

number = int(input("정수 입력> "))

if number % 2 == 0:
    print(("\n".join([
        "입력한 문자열은 {}입니다.",
        "{}는(은) 짝수입니다." 
    ]).format(number, number))
else:
    print("\n".join([
        "입력한 문자열은 {}입니다.",
        "{}는(은) 홀수입니다."
    ]).format(number, number))

*이터레이터 : for 반복자 in 반복할 수 있는 것

- 반복할수 있는 것을 프로그래밍 용어로 이터러블(iterable)이라고 한다. 이터러블은 내부에 있는 요소들을 차례차례 꺼낼 수 있는 객체를 의미한다. 이터러블 중에서 next() 함수를 적용해 하나하나 꺼낼 수 있는 요소를 이터레이터(iterator)라고 한다.

 

numbers = [1,2,3,4,5,6]

r_num = reversed(numbers)

print("reversed_numbers :", r_num)
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))

출력화면

-> 리스트에 reversed() 함수를 사용할 때 <list_reverseiterator object at (주소)> 처럼 출력했듯 reversed() 함수의 리턴값이 'reverseiterator'로 '이터레이터'이다. 이와 같은 이터레이터는 반복문의 매개변수로 전달할 수 있으며 현재 코드처럼 next()함수로 내부의 요소를 하나하나 꺼낼 수 있다.

 

왜 reversed() 함수는 리스트를 바로 리턴해 주지 않고 이터레이터를 리턴해줄까?

-> 메모리의 효율성을 위해서. 1만 개의 요소가 들어있는 리스트를 복제한 뒤 뒤집어서 리턴하는 것보다 기존에 있는 리스트를 활용해서 작업하는 것이 훨씬 효율적이라고 판단하기 때문

 

 

교육도서 : 혼자 공부하는 파이썬 https://book.naver.com/bookdb/book_detail.nhn?bid=15028688

 

혼자 공부하는 파이썬

혼자 해도 충분하다! 1:1 과외하듯 배우는 파이썬 프로그래밍 자습서(파이썬 최신 버전 반영)27명의 베타리더 검증으로, ‘함께 만든’ 입문자 맞춤형 도서이 책은 독학으로 프로그래밍 언어를

book.naver.com

광고 수익은 기부 활동에 사용됩니다

정보를 얻으신 분들은 광고 클릭 부탁드려요 :)

 

'Programming > Python' 카테고리의 다른 글

[혼공챌린지]python scraping  (0) 2021.08.09
[혼공챌린지]python 오류(Error)  (0) 2021.08.02
[혼공챌린지]python 함수  (0) 2021.07.26
[혼공챌린지]python 조건문  (0) 2021.07.10
[혼공챌린지] Hello~Python :)  (0) 2021.07.10