티스토리 뷰

마지막 페이지~~가독성이 넘 구려서 페이지를 나눈건데 나눠도 구리다. 어쩔 수 없지 머,,ㅎ

iterable object

sequence형 자료형에서 데이터를 순서대로 추출하는 object

cities = ["Seoul", "Busan", "Jeju"]
for i in cities:
	print(i)

자주 쓰는 이거 이름이 iterable object 였다.

 

내부적으로 __iter__와 __next__가 사용된다.( 초면이다..안녕하세요..)

cities = ["Seoul", "Busan", "Jeju"]
iter_obj = iter(cities)
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))

for문을 뜯어보면 이렇게  생겼다는건데, 위의 for문을 돌렸을 때와 마찬가지로 출력된다(서울 부산 제주 순)

여기서 iter_obj는 메모리 주소를 가지고있다. next는 하나의 element를 반환하고 다음 주소를 가리킨다. 

그러니까 메모리 주소를 가지고 있다가 print문을 만날 때 마다 element하나를 출력해주고 다음 주소를 가리키는거다.

참..새롭다..너...

 

generator

(offbyone.tistory.com/83bluese05.tistory.com/56 블로그를 참고하며 글쓴다.)

iteator를 만드는 도구, iterable object를 특수한 형태로 사용해주는 함수라고한다.

이 함수들로 비교를 해보자.

왼쪽은 일반적인 함수이다. return으로 값을 반환한다. 하지만 제너레이터는 다르다. yield 문장을 사용한다.

왼쪽의 경우에는 반환하고 나면 내부 지역 변수는 모두 사라지지만 yield를 사용하면 주소값이 사라지지 않기 때문에 매번 next()메서드가 호출될 때 마다 중단된 시점부터 다시 시작할 수 있다!

 

왼쪽 함수는 호출될 때 result리스트까지 싹 만드니까 그렇다치고, 오른쪽 함수를 불렀을 때 어떻게 작동하는지 살펴보자.

👇부르는 방법은 아래와 같다.

for a in geneartor_list(50):
    print(a)

왜? element가 사용되지 않으면 단지 주소값만 가지고 있기 때문에 print문으로 사용해주는거다.

(geneartor_list(50)을 그대로 출력해버리면 제너레이터라고만 뜬다. )

  1. 첫번째로 a에 할당되는 값은 0의 주소다. return이 아니라 yield이기 때문!
  2. 주소값만 가지고있다가 print(a)를 하기 위해 실제로 메모리에 값을 올린다.
  3. 0이 출력된다.
  4. 여전히 함수 내 for문에 있기 때문에 다시 한번 yield line이 실행된다. (return과 다르게 중단된 시점부터 다시 시작하기 때문에)
  5. a는 1의 주소를 가진다.
  6. print문에 element를 부르면 그제야 값을 메모리에 반환한다.

👆결론적으로, geneartor은 실제로 사용하기 전까지는 주소값만 가지고 있기 때문에 메모리 측면에서 극강의 효율성을 보인다.

위의 사이즈 비교를 보면 체감할 수 있다.

 

결국 이해했다 뿌듯

 

++피어세션내용 추가))))

result를 리스트로 만들어서 두번 출력해보면 두번째 list는 빈 리스트인걸 확인할 수 있다.

제너레이터의 특성을 너무나 잘 보여주는 상황이라고 생각되어서 적어두려한다.

list(result)를 하기 위해 제너레이터가 실행되고 for문을 50번 돌고 끝난 상태 일거다.

그 상태로 list(result)를 한번 더 하면 이미 yield가 끝난 위치를 기억하고 있기 때문에 (for문이 한번 다 돈걸 알고 있기 때문에) for문이 돌지 못하고 빈 리스트를 출력하게 된다!

 

function passing arguments

  • keyword arguments
  • default arguments
  • variable-length arguments

함수에 입력되는 arguments는 위와 같은 다양한 형태로 존재할 수 있다.

 

keyword arguments

말그대로 키워드를 사용한다.

def print_somthing(my_name, your_name):
    print(f"Hello {your_name}, My name is {my_name}")
    
print_somthing("goni", "jy")
print_somthing(your_name="jy", my_name="goni")

Hello jy, My name is goni
Hello jy, My name is goni

 

키워드를 사용하면 순서가 뒤바뀌어도 된다!

default arguments

파라미터에 디폴트 값이 존재한다.

def print_somthing(my_name, your_name="jy"):
    print(f"Hello {your_name}, My name is {my_name}")

print_somthing("goni", "blah")
print_somthing("goni")

Hello blah, My name is goni
Hello jy, My name is goni

출력문은 위와 같다.

이렇게 your_name에 해당하는 파라미터를 넘기지 않아도 디폴트로 jy가 들어가주니 오류도 안나고 좋다!

variable-length asterisk

함수의 parameter 갯수가 항상 정해져있을 수는 없을거다. 이럴 때 쓰는거다 가변 파롸미퉈~

asterisk(*) 기호를 이용한다

입력된 값은 튜플타입으로만 사용되니까 주의!

그리고 이 가변인자는 딱 한개만! 오로지 파라미터의 맨 마지막 위치로만 가능하다는 점!

 

def asterisk_test(a, b, *args):
    return a+b+sum(args)
print(asterisk_test(1, 2, 3, 4, 5))

 

👆출력값은 15이다

뒤의 3,4,5은

args=(3, 4, 5) 형태로 들어가는 것이다.

 

keyword variable-length도 있다.

*을 2개 사용하여 표시하는건데, dict type으로 들어간다. 

def kwargs_test(**kwargs):
    print(kwargs)

kwargs_test(a=1,b=2,c=3,k=9)

👆출력은? {'a': 1, 'b': 2, 'c': 3, 'k': 9} 요로코롬~

정말 딕셔너리 형태로 받는걸 볼 수 있다.

 

 

번외 asterisk에 대하여

*************************************** <- 이 별들이다

단순 곱셈, 제곱 연산, 가변 인자 활용 등 다양하게 사용된다. 

 

unpacking a container

별의 새로운 쓸모는 바로 이것이다.

👆별거 없다. 이렇게 풀리게 해준다!

 

👆이거 같은 경우는 dict을 풀어주는거다. *이 하나면 key로 풀어주고 *이 두개면 value로 풀어준다.

근데 저기 함수 선언할 때 파라미터 뒤에 쉼표 붙이면서 끝내는 이유 분명 배웟는데 기억이안난다

 

 

👆이 경우는 *로 인해서 [1,2]  [3,4]  [5,6] 각각 풀렸으니 zip이 제대로 작동한 것을 볼 수 있다.

 

드디어 끝났다 학습정리......진짜 길었다....

 

 

 

마지막으로 피어세션에서 했던 일을 잠시 정리하고 끝내자면, 

과제 코드 리뷰하고, 각자 궁금한 점을 나눴다. 간단명료.

새로 알게된 사실이 하나 있다. 

항상 python 쓸 때 마다 편하지만 왜 편한진 굳이 알아보지 않았던 정보.

int를 쓸 때 오버플로우가 발생하지 않는다는 점!

ahracho.github.io/posts/python/2017-05-09-python-integer-overflow/

 

[기초 파이썬] 파이썬 3에는 오버플로우가 없다?

오버플로우(Overflow)란? 지난 포스팅에서도 설명하였듯이 C언어에서 변수 혹은 상수의 값은 메모리에 직접 저장이 된다. 예를 들어, 아래와 같이 int 변수 a에 5라는 값을 대입하면, 컴퓨터는 알아

ahracho.github.io

명쾌한 해설로 잘 이해하고 넘어간다.

 

이제 진짜 끝!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
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
글 보관함