ynzify 2023. 5. 1. 02:29

함수(Function)와 메서드(Method)

 

함수

  • 어떤 작업을 수행하기 위해 독립적으로 설계된 코드의 집합
  • 어떤 입력값을 받아 처리과정을 거쳐 출력을 하거나 반환 하는 기능을 수행
>>> func someFunction{
>>> //some code
>>> }

 

매서드(Method)

  • 객체의 소속되어 있는 함수
  • 밑에 예시처럼 어떤 객체 안에서만 실행되는 함수
>>> class someClass{
>>>     func someMethod{
>>>     //some code    
>>>     }

>>> }

 

컬렉션 자료형 (Collection Data Type)

  • 다수의 데이터를 그룹화한 자료형이다
  • 여러가지 객체를 하나로 묶어서 사용하는 데이터 타입
  • ex) list, set, dict, tuple

 

자료형의 특징

  • Sequence 자료형
    • 안에 요소들이 연속적으로 이어져 있다
    • 순서가 있다 (순번이 있다)
    • 순번을 index라 칭한다
  • Mutable 자료형
    • 수정 가능한 객체
    • list, set, dict
  • Immutable 자료형
    • 수정이 불가능한 객체
    • int, float, str, bool, tuple

 

List

  • sequence 자료형
  • mutable 자료형
  • [ ]을 이용해서 만든다

 

>>> lst = [1,2,3,"four",None,7.0,True]
>>> lst
[1, 2, 3, 'four', None, 7.0, True]

 

 

빈출 내장함수

>>> lst = [11,88,43,40,63]
>>> len(lst) # 리스트 내부의 아이템 갯수 반환
>>> sorted(lst) # reverse=True 줄 경우 내림차순으로 반환
>>> max(lst) # 최대값 반환
>>> min(lst) # 최소값 반환
>>> sum(lst)
>>> round(3.56,1) # 반올림
>>> abs(-2.71828) # 절대값
>>> sum(lst) / len(lst) # 평균

len () 함수는 빈출이니까 꼭 알아두자아~

 

 

Sequence 다루기

양수 인덱스: 0부터 시작하여 1씩 증가

음수 인덱스: -1부터 시작하여 1씩 감소

 

# 다음의 리스트에서 3번째로 높은 값을 추출하고 싶다면?
>>> scores = [60,35,53,70,80,100,81]
>>> tmp = sorted(scores,reverse=True)
>>> tmp[2] # 0부터 시작하니까 2 대입
80

 

 

 

 슬라이싱 (Slicing)

  • 인덱스를 사용해서 범위를 지정해 요소들을 가져오는 기법이다
  • 시퀀스 자료형에서 특정 범위의 요소들을 선택해서 가져온다
  • [start:end:step] 순서:
    • start ~ (end-1)
    • step만큼 건너 뛰면서 선택해서 가져옴
    • step 생략시 기본값 1이 주어진다
    • step 부분은 양수(정방향), 음수(역방향)를 이용해서 방향 설정이 가능하다

 

>>> lst = [
>>>     [1,2,3],
>>>     [4,5,6],
>>>     [7,8,9]
>>> ]
>>> lst
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> lst[::2]
[[1, 2, 3], [7, 8, 9]]

>>> lst[1][2]
6

>>> lst[0][1:]
[2, 3]

 

 

 

lst = [1,2,3,4,5,6,7,8,9,10]
lst[1] = 1000
lst

 

패킹(Packing)과 언패킹(Unpacking)

>>> lst = [1,2,3,4,5,6,7,8,9,10]
>>> lst[1] = 1000
>>> lst
[1, 1000, 3, 4, 5, 6, 7, 8, 9, 10]

 

 

>>> lst[:1] = [2000] #end 값이 1니까 맨 처음값만 변경
>>> lst
[2000, 1000, 3, 4, 5, 6, 7, 8, 9, 10]

 

 

lst[:1] = 100
lst
-> TypeError: can only assign an iterable

lst[:1] = [100]
# 괄호 꼭 넣어주기!

 

 

얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)

 

>>> a = [1,2,3]
>>> b = a

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

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

 

 

 

>>> a = [1,2,3]

>>> b = a[:] # b = a.copy()도 가능
>>> b.append(4)
>>> print(a)
[1, 2, 3]

>>> print(b)
[1, 2, 3, 4]

 

 

 

>>> a = [ 1, 2, [3,4] ]
>>> b = a[:] # b = a.copy()

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

>>> print(b)
[1, 2, [3, 5]]

 

 

>>> import copy
>>> a = [ 1, 2, [3,4] ]
>>> b = copy.deepcopy(a)

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

>>> print(b)
[1, 2, [3, 4, 5]]

 

 

List Method

append

  • 리스트의 제일 뒤에 값을 추가함
>>> lst = [1,2,3,4]
>>> lst.append(0) # 0의 값을 추가한다
>>> lst
[1, 2, 3, 4, 0]

 

 

sort

  • 기복적으로 오름차순으로 정렬한다
  • reverse = True 설정은 내림차순 정렬이다
>>> lst = [5,1,3,4]
>>> sorted(lst)
[1, 3, 4, 5]

>>> lst.sort(reverse = True)
[5, 4, 3, 1]

 

 

 

pop

  • 제일 뒤에 있는 요소를 반환하면서 삭제한다
  • 인덱스 값을 줄 경우 해당 인덱스 값을 반환하면서 삭제
>>> lst = [1,2,3,4]

>>> print(lst.pop())
4

>>> print(lst.pop())
3

>>> print(lst.pop())
2

>>> print(lst.pop())
1

 

 

# 앞에서 부터 반환하면서 삭제
>>> lst = [1,2,3,4]

>>> print(lst.pop(0))
1

>>> print(lst.pop(0))
2

>>> print(lst.pop(0))
3

>>> print(lst.pop(0))
4

>>> lst
[]

 

 

extend

  • 리스트와 리스트를 합친다 (그냥 연장한다 느낌)
>>> lst = [1,2,3]
>>> lst.extend([4,5,6])
>>> lst
[1, 2, 3, 4, 5, 6]

 

 

# extend 와 append 의 차이
>>> lst = [1,2,3]
>>> lst.append([4,5,6])
>>> lst
[1, 2, 3, [4, 5, 6]]

 

 

insert

  • 첫번째 인수는 인덱스 값
  • 두번째 인수는 넣을 값
  • 인덱스 위체에 값을 추가한다
lst = [1,2,3]
lst.insert(1,9)
lst

[1, 9, 2, 3]

 

remove

  • 리스트에 값을 찾아 삭제
lst = [1,2,3,5,3]
lst.remove(3) # 해당 값을 찾자마자 삭제하고 끝난다.
lst

[1, 2, 5, 3]

 

index

  • 리스트에 인수로 받은 값의 인덱스를 반환한다
lst = [1,2,3,3,2]
lst.index(2)

1

 

count

  • 값을 넣으면 해당 값이 몇개 있는지를 반환한다
lst = [1,2,3,3,2]
lst.count(2)

2

lst = ["python" ,"python" ,"hello"]
lst.count("python")

2

 

del

  • 특정 인덱스 값을 삭제
del lst[0] # 맨 처음 값 삭제
lst

['python', 'hello']

 

 

List의 연산

>>> lst1 = [1,2,3]
>>> lst2 = [4,5,6]

>>> lst1 + lst2 # extend 와 결과 같음
[1, 2, 3, 4, 5, 6]

>>> lst1 + [1] # append 와 결과가 같음
[1, 2, 3, 1]

>>> lst1 * 3 # 각 인수에 세배를 곱하는게 아니라 세번 출력
[1, 2, 3, 1, 2, 3, 1, 2, 3]

 

 

tuple

  • sequence 자료형
  • immutable 자료형
  • ()를 활용해서 만듬 (생략 가능함)

 

tuples = ("h","e","l","l","o")
tuples

('h', 'e', 'l', 'l', 'o')

 

tuples = "h","e","l","l","o"
tuples[0] = "h" # 수정 불가능한 객체이기 때문에 에러발생!
-> TypeError: 'tuple' object does not support item assignment

 

count

  • 값을 넣으면 값이 몇개인지 반환해줌
tuples.count('l')

2

 

index

  • 값이 몇 번째 인덱스에 위치해 있는지 반환해준다
tuples.index('e')

1

 

set

  • non-sequence 자료형 (데이터 저장 순서 보장 x)
  • mutable 자료형
  • 중요한 특징으로 중복 데이터를 허용하지 않는다
  • {}이용
sets = {1001,1001,1001,1001,1001,10,10,10,3,4,6,653,3,23,3,42,34,34}
sets

{3, 4, 6, 10, 23, 34, 42, 653, 1001}

 

sets[0] # 순번이 없기 때문에 인덱스로 접근하면 에러가 난다.
-> TypeError: 'set' object is not subscriptable

 

 

 

 

in과 not in 연산자도 사용 가능

 

sets = {1001,1001,1001,1001,1001,10,10,10,3,4,6,653,3,23,3,42,34,34}
3 in sets
1001 not in sets

True

False

 

 

메소드 몇개 이용해보기

 

>>> A = {1,2,3}
>>> B = {2,3,4}

>>> A, B
({1, 2, 3}, {2, 3, 4})

>>> A.intersection(B)
{2, 3}

>>> A.union(B)
{1, 2, 3, 4}

>>> A.difference(B)
{1}

 

 

a = {1,2,3}
a.add(4) # 값을 추가하는데 중복값일 경우 추가하지 않는다.
a

{1, 2, 3, 4}

 

a.update([1,2,3,4,5,6]) # 여러 요소를 중복을 제외하고 추가한다.
a

{1, 2, 3, 4, 5, 6}

 

a.remove(2)
a

{1, 3, 4, 5, 6}

 

 

Dictionary

dict

  • non-sequence 자료형
  • mutable 자료형
  • key:value 구조의 자료형
    • key 값은 문자열 숫자열 둘 다 가능
    • key는 중복을 허용하지 않음
    • value는 중복을 허용

 

# 이런 형식 {}이 괄호 사용
{
    key:value,
    key:value
    ...
}

 

# 사람이름을 key로, 나이를 value로 해서 dict를 만들어보자.
>>> age = {
>>>     "관수": 43,
>>>     "철수": 30,
>>>     "길동": None
>>> }
>>> age
>>> {'관수': 43, '철수': 30, '길동': None}

>>> age["관수"]
43

 

 

 

# 없는 키에 접근하려 한다면?? 에러 발생
age["민수"]
-> NameError: name 'age' is not defined

 

get method 이용

 

# 없는 키에 접근해도 에러가 발생하지 않는다.
print(age.get("민수"))
age.get("민수","없는사람이야")

None

'없는사람이야'

 

 

key와 value를 추가/변경 하기

>>> age = {
>>>     "관수": 43,
>>>     "철수": 30,
>>>     "길동": None
>>> }
>>> age["민수"] = 20 # 해당 키가 없을 경우 키와 벨류를 새로 생성
>>> age
{'관수': 43, '철수': 30, '길동': None, '민수': 20}

 

 

 

>>> age["민수"] = 19  # 해당 키가 있을 경우 벨류를 변경
>>> age
{'관수': 43, '철수': 30, '길동': None, '민수': 19}

 

 

 

>>> add_age = {"철수": 35, "영숙": 25}
>>> age.update(add_age)
>>> age
{'관수': 43, '철수': 35, '길동': None, '민수': 19, '영숙': 25}

 

 

 

key 삭제하기

>>> del age["영숙"]
>>> age
{'관수': 43, '철수': 35, '길동': None, '민수': 19}

 

 

 

>>> v = age.pop("민수") # 해당 key의 value를 반환하며 삭제
>>> print(v) # 민수 사라짐
19

>>> print(age)
{'관수': 43, '철수': 35, '길동': None}

 

 

>>> age.keys() # key 값들만 반환
dict_keys(['관수', '철수', '길동'])

>>> age.values() # value 값들만 반환
dict_values([43, 35, None])

>>> age.items() # key와 value가 튜플에 담겨 리스트에 들어가며 반환
dict_items([('관수', 43), ('철수', 35), ('길동', None)])

 

 

>>> sum(age.values())
128

>>> len(age.values())
3

>>> "관수" in age.keys()
True

 

컬랙션 끼리의 Type Casting

 

괄호의 차이를 보아라!

# list -> tuple
lst = [1,2,3]
tuple(lst)

(1, 2, 3)

 

# tuple -> list
tup = 1,2,3
list(tup)

[1, 2, 3]

 

# list -> set
set(lst)

{1, 2, 3}

 

>>> age = {
>>>     "관수": 43,
>>>     "민수":30,
>>>     "길동":None
>>> }

>>> list(age)
['관수', '민수', '길동']

>>> list(age.keys())
['관수', '민수', '길동']

>>> list(age.values())
[43, 30, None]

 

 

 

>>> list(age.items())
>>> tmp
[('관수', 43), ('민수', 30), ('길동', None)]

>>> dict(tmp)
{'관수': 43, '민수': 30, '길동': None}