티스토리 뷰
[python] iterable, generator, 함수의 매개변수(keyword, default, asterisk)
brave_sol 2024. 6. 13. 10:14[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)
'AI > Python' 카테고리의 다른 글
[프로그래머스 기초] Day 20,21,22,23,24 함수, 딕셔너리, 리스트, 문자열 (0) | 2024.06.14 |
---|---|
[프로그래머스 기초] Day 16,17,18,19 문자열, 리스트 (2) | 2024.06.13 |
[python] Pythonic code(split, join, list comprehension, enumerate, zip), 레거시(lambda, map, reduce) (2) | 2024.06.12 |
[python] 모듈(collections) (2) | 2024.06.09 |
[Python] 자료구조(스택,큐,튜플,집합,딕셔너리) (2) | 2024.06.08 |
- Total
- Today
- Yesterday
- Ai
- opic
- 프로그래머스
- 실기
- 운동
- 영어회화
- 미라클모닝
- SQL
- 루틴
- IH
- 오블완
- 다이어트
- 오픽
- 뉴스
- Python
- 경제
- llm
- C언어
- 티스토리챌린지
- ChatGPT
- 갓생
- 30분
- 아침운동
- 기초
- 아침
- 습관
- 줄넘기
- 고득점 Kit
- 빅데이터 분석기사
- 스크랩
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |