티스토리 뷰

[1] iterable data

- sequence형 자료형에서 데이터를 순서대로 추출하는 object(리스트, 튜플,  문자열)

- 내부적 구현으로 __iter__와 __next__ 가 사용됨

- iter()와 next() 함수로 iterable 객체를 iterator object로 사용

- 연결리스트처럼 값과 다음 메모리의 주소값으로 이루어짐

- 왜배우냐? generator를 이해하려고!

iter() : 주소값을 가져옴 next() : 값을 가져옴
A =[1,2]
memory_address_A = iter(A)
print(memory_address_A)

 # <list_iterator object at 0x000001E89149A4D0>
print(next(memory_address_A)) # 1
print(next(memory_address_A)) # 2
print(next(memory_address_A)) # StopIteration
ex. A가 100번지를 가리킴 → 100번지에감 : 1 있는 100번지를 가리킴, 101번지주소를 가짐 → 101번지의 값에는 2를 가리키는주소가 들어감

 

[2] generator

(1) generator란?

- iterable object를 특수한 형태로 사용해주는 함수

- element가 사용되는 시점에 값을 메모리에 반환(주소값만 가지고 있다가 달라고 할 때 yield가 꺼내줌)

 : 반목물을 돌릴떄마다 데이터를 메모리에 올림, yield(호출시 데이터 반환)를 사용해 한번에 하나의 element만 반환

=> 메모리를 절약 할 수 있음(next처럼)

 

(2) 언제 사용하는가?

- list 타입의 데이터를 반환해주는 함수는 generator로 만들어라! : 읽기 쉽고, 중간 과정에서 loop이 중단 될 수 있을때

- 큰 데이터를 처리할 때는 generator expression 고려! : 일반적인 경우 용량 차이 iterator > generator

- 파일 데이터를 처리할때도 generator 사용

- python의 많은 sequence데이터는 generator를 사용한다.

 

(3) 어떻게 사용?

일반 list generator사용
import sys

def general_list(value):
  result = []
  for i in range(value):
    result.append(i)
  return result
  
print(general_list(50)) # [0,1,2,,,,,,49]
print(sys.getsizeof(general_list(50)))  # 472
import sys

def generator_list(value):
  result = []
  for i in range(value):
    yield i
* yield는 값을 요청하는 시점에 result.append(i)하는 것

print(generator_list(50)) # 0x0000019F547483C0 주소값
print(sys.getsizeof(generator_list(50))) # 104 


* list 사용시 메모리에 값을 올려줌
print(list(generator_list(50))) # [0,1,2,,,,,49]
print(sys.getsizeof(list(generator_list(50)))) # 472

(4) generator comprehension(= generator expression)

- [ ] 대신( )를 사용하여 표현

generator comprehension 메모리 용량 사용 : iterator > generator
gen_ex = (n*n for n in range(50))

print(gen_ex) #  0x000001B0B88A83C0 주소값 반환
print(type(gen_ex)) # <class 'generator'>
# 튜플처럼 생겼지만 generator

for 문을 사용하거나 list를 사용하면 메모리에 올라옴
print(list(gen_ex)) # [0, 1, 4,,,,, 2401]
from sys import getsizeof

gen_ex = (n*n for n in range(50))
list_ex = [n*n for n in range(50)]

print(getsizeof(gen_ex)) # 104
print(getsizeof(list(gen_ex))) # 472
print(getsizeof(list_ex)) # 472

 

[3] function passing arguments :함수에서 arguments를 넘기는 방법

(1) 함수에 입력되는 arguments의 다양한 형태

형태 예시
Keyword arguments
: 함수에 입력되는 parameter에 변수명을 지정해줌
def print_something(my_name, your_name):
  print(f'Hello {your_name}! my name is {my_name}')

print_something(your_name='cal', my_name = 'sol') # Hello cal! my name is sol
 Default arguments
: parameter의 기본 값을 사용, 입력하지 않을 경우 기본값 출력
def print_something(my_name, your_name="cal"): * 첫번째 argument만 default는 X
  print(f'Hello {your_name}! my name is {my_name}')

print_something('sol','jack') # Hello jack! my name is sol
print_something('sol') # Hello cal! my name is sol
Variable-length arguments
:함수의 parameter가 정해지지 않은 경우

가변인자사용
asterisk(*)
- tuple type으로사용
- 오직 한개만 맨 마지막에 추가가능

키워드 가변인자
: parameter이름을 따로 지정하지 않고 입력,
asterisk(**)두개를 사용
-dict type으로 사용
-가변인자는 오직 한개만 기존 가변인자 다음에 사용
예) 다항 방정식 또는 마트 물건 계산 함수 등..

(1) asterist(*) : 변수 여러개 한번에 받기
def asterisk_test(a,b,*args):
  print(args)                                  # (3, 4, 5)
  return a+b+sum(args)

print(asterisk_test(1,2,3,4,5))       # 15


(2) asterst(**) : dict 받기
def kword_test(**kword):
  print(kword)                                # {'A': 1, 'B': 2, 'C': 3}
  print(type(kword))                       # <class 'dict'>

kword_test(A=1,B=2,C=3) 

(3) 동시에 사용할 경우
def arg_test(a,b,*c,**d): 
  print(a+b+sum(c))                     # 15
  print(c)                                      # (3, 4, 5)
  print(d)                                      # {'A': 1, 'B': 2, 'C': 3}

arg_test(1,2,3,4,5,A=1,B=2,C=3) # 입력할때는 순서대로 넣어야 한다

(4) unpacking container *
def asterisk_test(a, *args): # args는 여러개의 매개변수를 받을 수 있는 가변인자이다
  print(a,*args) # ③ unpacking 1 2 3 4 5 6
  print(a, args)  # ④ tuple로 묶어줌 1 (2, 3, 4, 5, 6)
  print(type(args)) # <class 'tuple'>

asterisk_test(1,*(2,3,4,5,6)) # ① *가 unpacking해서 2,3,4,5,6으로 들어가게 됨


print(*[1,2,3,4]) # 1 2 3 4

def test(A,B,C,D):
  print(A,B,C,D)

test(10,**{"B":1,"C":2,"D":3}) # 10 1 2 3

ex = ([1,2],[3,4],[5,6],[7,8])
for value in zip(*ex): # zip([1,2],[3,4],[5,6],[7,8])
  print(value)

# 출력결과
(1, 3, 5, 7)
(2, 4, 6, 8)

 

 

※ 출처 : 네이버 부스트코스 - 인공지능 기초 다지기(https://www.boostcourse.org/ai100)

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함