[Python] CHAP. 06

Yezz9·2022년 5월 3일
0

객체의 종류

a = () : <class 'tuple'>
b = []: <class 'list'>
c = {}: <class 'dict'>

1. 튜플

- 정수 3개 저장하고 불러오기

>>> a = (1, 2, 3)
>>> a
(1, 2, 3)
>>> a[0]	# index
1
>>> a[1]	# index 범위는 0, 1, 2
2
>>> a[2]
3
>>> a[3]
IndexError: tuple index out of range	# index 범위를 벗어나면 에러 

- 저장한 변수를 불러오는 방법

: slice 슬라이싱 한다고 한다

>>> a = (1, 2, 3, 4, 5)
>>> a[1:3]	# 앞의 index 부터 뒤의 index 앞까지의 index
(2, 3)
>>> a[0:5]
(1, 2, 3, 4, 5)
>>> a[:]	# 모든 index
(1, 2, 3, 4, 5)
>>> a[:3]	# 처음 index 부터 뒤의 index 앞까지의 index
(1, 2, 3)
>>> a[2:]	# 앞의 index 부터 끝까지
(3, 4, 5)
>>> a[0]
1
>>> a[-1]
5
>>> a[-2]
4
>>> a[:-1]
(1, 2, 3, 4)

- 튜플의 특징

  1. 튜플은 값을 바꿀 수 없다.
  2. 정수 뿐만 아니라 문자열, 실수도 담을 수 있다. (종류가 달라도 가능)
  3. 또 다른 튜플도 담을 수 있다.
  4. 값을 한 개만 넣으면 튜플이 될 수 없다.

- 튜플 덧셈

>>> a = (1, 2, 3)
>>> b = (4, 5)
>>> c = a + b
>>> c
(1, 2, 3, 4, 5)

- 문자열도 튜플이다

  • 문자열 함수
    : 문자열 객체의 함수를 호출하면, 그 자리에 문자열 객체를 남긴다
>>> a = 'hello, world'
>>> len(a)	# 문자열의 길이를 알려주는 함수
12
>>> a.find('wo')	# 문자의 위치를 알려주는 함수
7
>>> a,split(',')	# () 안의 문자를 기준으로 문자열을 쪼개주는 함수
['hello', 'world']
>>> ''.join(['hello', 'world'])	# . 앞의 내용을 두 문자열 사이에 입력해 하나의 문자열로 만드는 함수
'helloworld'
>>> a = 'hello, world'
>>> a.strip()	# 공백을 제거하는 함수
'hello, world'
>>> a.upper()	# 소문자를 대문자로 만들어준다
'HELLO, WORLD'
>>> b = a.strip()
>>> b = b.upper()
'HELLO, WORLD'
>>> b = a.strip().upper()

- 튜플에 적용할 수 있는 연산자

>>> a = (1, 2, 3)
>>> b = (3, 4)
>>> a>b	# 사전 순서로 따진다
False
>>> a==b
False
>>> a!=b
True

- 튜플에 적용할 수 있는 파이썬 명령

: [ ], { }에도 사용

>>> a = (1, 2, 3)
>>> len(a)	# 길이
3
>>> sum(a)	# 합
6
>>> max(a)	# 최대값
3
>>> min(a)	# 최소값
1
>>> a = (3, 2, 8, 9, 4, 5)
>>> min(a)
2
>>> max(a)
9
>> sorted(a)	# 순서대로 나열
[2, 3, 4, 5, 8, 9]	# 결과는 '리스트'
>>> a
(3, 2, 8, 9, 4, 5)	# a 자체가 바뀌는 것은 아니다

- 튜플 for

  1. 인덱스를 사용하는 경우
a = (1, 2, 3)
for i in range(len(a)):
	print(a[i])
  1. 튜플을 사용하는 경우
a = (1, 2, 3)
for item in a:
	print(item)
[결과]
1
2
3
  1. 인덱스와 튜플 두 가지 다 사용해야 하는 경우
a = (1, 2, 3)
for i, item in enumerate(a):
	print(i, item)
[결과]
0 1
1 2
2 3
  • for의 재해석
    : 내부에는 a에 iter()을 적용하여 iterator 객체를 가지고 온 후 이 iterator 객체에 next()를 적용하여 얻은 값을 i에 대입한 것. stopiteration 예외가 발생활 때까지 반복
>>> a = (1, 2, 3)
>>> for i in a:
...		print(i)
1
2
3

- in 또한 논리 연산자다

>>> a = (1, 2, 3)
>>> for i in a:
...		print(i)
1
2
3
>>> 1 in a
True
>>> 4 in a
False

- is와 ==의 차이

== : 가리키는 값이 같은지 확인하고 싶을 때 사용
is : 같은 객체를 참조하고 있는지 확인하고 싶을 때

>>> a = (1, 2, 3)
>>> b = (1, 2, 3)
>>> a == b
True
>>> a is b
False

- 튜플을 만드는 방법

: iterator 객체는 tuple로 변환할 수 있다

>>> a = (1, 2, 3)
>>> b = [4, 5, 6]	# 리스트
>>> c = tuple(b)
>>> c
(4, 5, 6)
>>> a = range(3)
>>> type(a)
<class 'range'>
>>> b = tuple(a)
>>>type(b)
<class 'tuple'>

- 실습) 튜플 전화번호부

  • 이름을 입력하면 전화번호를 알려준다
class PhoneBook:
	def __init__(self):
    	self.names = ('KIM', 'LEE', 'PARK')
    	self.phones = ('111-1111', '222-2222', '888-8888')

    def search(self, name):
        if name in names:
          idx = names.index(name)
          return idx
        else:
            return None

    def print_one(self, idx):
        name = names[idx]
        print("{0}{1}'s phone number is {2}".format(name[0], name[1:].lower(), phones[idx]))	# 첫글자만 대문자로 출력

    def print_all(self):
        n = len(names)
        for i in range(n):
            print_one(i)
        
name = input('Input your name : ')
name = name.strip().upper()	# 공백을 벗겨내고, 대문자로 바꾼다

phoneBook = PhoneBook()

idx = search(name)

if idx != None:
	phoneBook.print_one(idx)
else:
    print('Not registered name')
    
phoneBook.print_all()

2. 리스트

- 정수 3개 저장하고 불러오기

>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a[0]	# index
1
>>> a[1]	# index 범위는 0, 1, 2
2
>>> a[2]
3
>>> a[3]
IndexError: tuple index out of range	# index 범위를 벗어나면 에러 

- 2차원인 경우의 인덱싱

>>> a = [[1, 2, 3], [4, 5, 6]]
>>> len(a)
2			# 0번 axis에 값이 2개
>>> len(a[0])
3			# 1번 axis에 값이 3개
>>> a[0]
[1, 2, 3]
>>> a[1]
[4, 5, 6]
>>> a[1][2]
6
>>> a[0]
[1, 2, 3]
>>> a[0][1]		# [1, 2, 3][1]
2
>>> a[:]
[[1, 2, 3],[4, 5, 6]]
>>> a[:][0]		# a[:] <-> a <-> [[1, 2, 3], [4, 5, 6]]
[1, 2, 3]
>>>a[0][1:]		# a[0] <-> [1, 2, 3]
[2, 3]

- 리스트 생성하기

>>> a = list()		# a = []
>>> type(a)			# 객체생성-객체이름 뒤에()
<class 'list'>
>>> a = (1, 2, 3)
>>> b = list(a)		# 튜플(Iterator객체)을 리스트로
[1, 2, 3]
>>> b = list(range(3))
[0, 1, 2]

- 값을 바꿀 수 있다

>>> a = [1, 2, 3]
>>> a[0] = 100
[100, 2, 3]
>>> a[0] = [10, 20, 30]
[[10, 20, 30], 3]
>>> del a [0]	# 삭제도 바꾸는 것의 일종
[2, 3]
>>> del a

# 추가하기
>>> a = [2, 3]
>>> a.append(1)
[2, 3, 1]
>>> a = [2, 3]
>>> a.insert(0, 1)
[1, 2, 3]

# 또 다른 추가 방법
>>>  a = []
>>> a[0] = 1
IndexError : list assignment index out of range

>>> a = '1' + '1' + '1'
'111'
>>> a = '1' * 3		# 곱하기는 더하기 반복
'111'
>>> a = [-1] * 3	# 미리 칸을 만들어둔다 : append보다 효율적
[-1, -1, -1]		# 넣을 수 있는 값의 종류는 한가지로 지정
>>> a[0] = 1

- 꺼내고 지우기; 기본적으로 맨 뒤에 것

>>> a = [1, 2, 3, 4, 5]
>>> a.pop()	# 맨 뒤에 것 꺼내고 삭제
5
>>> a
[1, 2, 3, 4]
>>> a.pop(3)
4
>>> a.pop(-1)
3
>>> a
[1, 2]

- 찾아서 지우기

>>> a = [1, 2, 3, 4, 5]
>>> a.remove(3)	# 값 3을 찾아서 지운다
[1, 2, 4, 5]
>>> a.remove(9)	# 없는 값을 지우라고 하면 에러
ValueError : list.remove(x) : x not in list
>>> a.index(9)	# 없는 값 index 요구하면 에러
ValueError : list.remove(x) : x not in list
>>> 9 in a
False

- 정렬

>>> a = [3, 1, 5, 4, 3]
>>> a.sort()	# a 자체가 바뀜
>>> a
[1, 3, 3, 4, 5]
>>> a.reverse()
[5, 4, 3, 3, 1]
>>> sorted(a)	# a 자체는 안바뀜; 동작 결과로 정렬된 리스트를 남김
[1, 3, 3, 4, 5]
>>> a.clear()
[]

- 확장

>>> a = [1, 2, 3]
>>> b = [4, 5]
>>> a.extended(b)
[1, 2, 3, 4, 5]

>>> a = [1, 2, 3]
>>> a = a + b
[1, 2, 3, 4, 5]

- 참조

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

>>> a[0] = 10
print(b)
[10, 2, 3]

# 같은 객체를 가리키게 됨

- 복사

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

>>> a[0] = 10
print(b)
[1, 2, 3]

# 같은 값만 가짐(같은 객체가 아님)

- 리스트와 함수

  • 함수 안에서 리스트 값은 바뀐다
def show(b):
	b[0] = 10
    print(b, 'in show')
a = [1, 2, 3]
show(a)
print(a)
[결과]
[10, 2, 3] in show
[10, 2, 3]
  • 함수 안에서 바뀌지 않는 경우
def show(a)
	b = a.copy()
    b[0] = 10
    print(b, 'in show')
a = [1, 2, 3]
show(a)
print(a)
[결과]
[10, 2, 3] in show
[1, 2, 3]

- 실습

1) 리스트 전화번호부

  • 구조적 프로그래밍
def isEmpty():
    n = len(Names)
    if n==0:
        return True
    else:
        return False

def listAll():
    print('LIST')
    print('--------------')
    bEmpty = isEmpty()

    if bEmpty == True:
        print('Phone Book is empty')
        return     # 함수를 끝내는 용도로 사용
    for i, name in enumerate(Names):
        phone = Phones[i]
        print("{0} {1}{2} {3}".format(i+1, name[0], name[1:].lower(),phone))

    print('Total : {} items'.format(len(Names)))

def search():
    print('SEARCH')
    name = input('Input the name: ')
    name = name.strip().upper()

    if name in Names:
        idx = Names.index(name)
        phone = Phones[idx]
        print("{0}{1}'s phone number is {2}".format(name[0], name[1:].lower(), phone))
        return idx
    else:
        print("Not Found")
        return None

def insert():
    print('INSERT')
    name = input('Input new name: ')
    name = name.strip().upper()
    phone = input('input the phone number: ')
    phone = phone.strip().upper()
    Names.append(name)
    Phones.append(phone)
    print("Updated")

def update():
    print('UPDATE')
    idx = search()
    
    if idx == None:
        return
    else:
        name = input('Input a name: ')
        name = name.strip().upper()
        phone = input('input the phone number: ')
        phone = phone.strip().upper()
        Names[idx] = name
        Phones[idx] = phone
        print("Updated")

def delete():
    print('DELETE')
    idx = search()

    if idx == None:
        return
    else:
        name = Names[idx]
        del Names[idx]
        del Phones[idx]
        print("{0}{1} deleted".format(name[0], name[1:].lower()))

Names = ['KIM']
Phones = ['111-1111']
menuList = ['S', 'N', 'U', 'D', 'A', 'Q']
bFinish = False

while not bFinish:
    print('\n---------------')
    print('[S] Search')
    print('[N] Insert')
    print('[U] Update')
    print('[D] Delete')
    print('[A] List All')
    print('[Q] Quit')
    print('[--------------]')

    menu = ''

    while True:
        munu = input('Menu')
        menu = menu.strip().upper()
        print()
        
        if menu in menuList:
            break

    if menu=='S':
        search()
    elif menu=='N':
        insert()
    elif menu=='U':
        update()
    elif menu=='D':
        delete()
    elif menu=='A':
        listAll()
    elif menu=='Q':
        bFinish = True
  • 객체지향 프로그래밍
menuList = ['S', 'N', 'U', 'D', 'A', 'Q']
bFinish = False

class PhoneBook:
    def __init__(self):
        self.Names = ['KIM']
        self.Phones = ['111-1111']

    def isEmpty(self):
        n = len(self.Names)
        if n == 0:
            return True
        else:
            return False
    
    def search(self):
        print('SEARCH')

        name = input('Input the name: ').strip().upper()

        if name in self.Names:
            idx = self.Names.index(name)
            phone = self.Phones[idx]
            print("{0}{1}'s phone number is {2}".format(name[0], name[1:].lower(), phone))
            return idx
        else:
            print('NOT Found')
            return None

    def insert(self):
        print('INSERT')

        name = input('Input the name: ').strip().upper()
        phone = input('Input the phone number: ').strip().upper()

        self.Names.append(name)
        self.Phones.append(phone)
        print('Inserted')

    def update(self):
        print('UPDATE')
        
        idx = self.search

        if idx == None:
            return
        else:
            name = input('Input the name: ').strip().upper()
            phone = input('Input the phone number: ').strip().upper()

            self.Names[idx] = name
            self.Phones[idx] = phone

            print('Updated')

    def delete(self):
        print('DELETE')

        idx = self.search()
        
        if idx == None:
            return
        else:
            name = self.Names[idx]

            del self.Names[idx]
            del self.Phones[idx]

            print("{0}{1} deleted".format(name[0], name[1:].lower()))

    def listAll(self):
        print('List')
        
        bEmpty = self.isEmpty()

        if bEmpty == True:
            print('Phone Book is Empty')
        else:
            for i, name in enumerate(self.Names):
                phone = self.Phones[i]
                print("{0}{1} : {2}".format(name[0],name[1:].lower(),phone))


while not bFinish:
    print('\n---------------')
    print('[S] Search')
    print('[N] Insert')
    print('[U] Update')
    print('[D] Delete')
    print('[A] List All')
    print('[Q] Quit')
    print('[--------------]')

    menu = ''

    while True:
        menu = input('Menu: ').strip().upper()
        print()
        
        if menu in menuList:
            break

    if menu=='S':
        PhoneBook.search()
    elif menu=='N':
        PhoneBook.insert()
    elif menu=='U':
        PhoneBook.update()
    elif menu=='D':
        PhoneBook.delete()
    elif menu=='A':
        PhoneBook.listAll()
    elif menu=='Q':
        bFinish = True

2) 행렬전치

  • 구조적 프로그래밍
a = [[1, 1, 1], [2, 2, 2]]
b = [[3, 3, 3], [4, 4, 4]]

def print_mat(m, name):
    rows = len(m)
    cols = len(m[0])
    print(name,'=')
    for j in range(rows):
        for i in range(cols):
            print('{:3d}'.format(m[j][i]), end='')
        print()

print_mat(a, 'a')
print_mat(b, 'b')

def add_mat(a, b):
    rows = len(a)
    cols = len(a[0])
    print('add')
    c = []
    for j in range(rows):
        c.append([])
        for i in range(cols):
            c[j].append(a[j][i]+b[j][i])
    return c
c = add_mat(a, b)
print_mat(c, 'c')

def trans_mat(a):
    rows = len(a)
    cols = len(a[0])
    c = []
    for i in range(cols):
        c.append([])
        for j in range(rows):
            c[i].append(a[j][i])
    return c

print_mat(a, 'a')
c = trans_mat(a)
print_mat(c, 'c')
  • 객체지향 프로그래밍

3) 숫자전광판

  • 구조적 프로그래밍
  • 객체지향 프로그래밍

3. 딕셔너리

- 딕셔너리, 집합

: 데이터 쌍; Key -> Value를 다룬다

>>> a = dict()
>>> a = {}
>>> = {'kim' : '111-1111', 'lee' : '222-2222', 'park' : '333-3333'}
>>> a['kim']	# index로 Key를 사용
'111-1111'	# 대응되는 Value를 남긴다
>>> a[1]	# 없는 Key를 넣으면 에러
KeyErrot : 1
>>> a.Keys()	# 어떤 Key를 가지고 있는지 알려줌
dict_ket(['kim', 'lee', 'park'])

- 어떤 Key가 있나

>>> a.keys()
dict_key(['kim', 'lee', 'park'])	# 어떤 키가 있는지 알려준다.
>>> for key in a.keys():
...		print(key, end=' ')
kim lee park
>>> a.keys().__iter__().__next()	# next(iter(a.keys()))
'kim'
>>> keys = list(a.keys())	# 리스트로 변환해볼 수 있다
['kim', 'lee', 'park']

- 어떤 Value가 있나

>>> a.values()
dict_values(['111-1111', '222-2222', '333-3333'])
>>> for val in a.values():
...		print(val, end=' ')
111-1111 222-2222 333-3333

>>> values = list(a.values())	# 리스트로 변환해볼 수 있다
['111-1111', '222-2222', '333-3333']

- Key-Value 조합인 Item

>>> a.items()
dict_items([('kim', '111-1111'), ('lee', '222-2222'), ('park', '333-3333')])
>>> for item in a.items():
...		print(item)
('kim', '111-1111')
('lee', '222-2222')
('park', '333-3333')
>>> k, v = ('kim', '111-1111')
>>> k
'kim'
>>> v
'111-1111'
>>> for key, value in a.items():
...		print(key, value)
kim 111-1111
lee 222-2222
park 333-3333

- 동일한 키가 들어잇는 경우

>>> a = {1:100, 3:300, 5:500, 3:400}
{1:100, 3:400, 5:500}
  • 맨 마지막 것만 남긴다
  • key는 유일 해야 한다

- 수정, 추가, 삭제

>>> a = {1:100, 3:300, 5:500}
>>> a[1] = 150	# 있는 키 넣으면 수정
{1:150, 3:300, 5:500}
>>> a[4] = 400	# 없는 키 넣으면 추가
>>> a[2] = 200
{1:150, 3: 300, 5:500, 4:400, 2:200}
>>> del a[4]	# Key4를 찾아서 있으면 삭제한다
{1:150, 3:300, 5:500, 2:200}
>>> del a[4]
KeyError: 4		# key4가 없으면 에러 발생

- 꺼내고 지우기; pop, popitem

>>> a = {'1':100, '3': 300, '5': 500}
>>> a.pop()
TypeError : pop expected at least 1 arguments, got 0	# Key를 넣어야한다
>>> a.pop('2')	# 없는 Key를 넣으면 에러 발생
KeyError '2'
>>> a.pop('3')
300
>>> a
{'1':100, '5':500}	# 꺼내고 지운다

# list에서 pop은 맨 마지막 것을 꺼내 왔는데?
>>> a.popitem()
('5':500)	# 맨 긑의 아이템을 꺼내고 지운다

- Key가 있는지 검사

>>> a= {'1':100, '3':300m '5':500}
>>> '1' in a.keys()
True
>>> '1' in a	# 그냥 딕셔너리를 사용할 수 있다.
True
>>> '2' in a
False

- Key 있는지 검사하지 않고 그냥 꺼내오기; get

- 실습) 딕셔너리 전화번호부

profile
감자에옹

0개의 댓글

관련 채용 정보