여니의 Side Project/인프런 - 리프 (파이썬 고급)

[인프런 리프 대학생 2기] 2주차 미션활동

여니's 2021. 3. 18. 12:43

 

 

오늘의 강의 키워드는 Python Underscore, 접근지정자!

 

 

제가 인프런 리프 카테고리에 포스팅하는 게시글들은

강의 내용을 그대로 옮기는 것이 아니라,

강의를 들으며 추가적으로 조사한 내용들,

몰랐던 내용들,

강의를 들으며 중요하다고 생각하는 부분들을 위주로

정리해서 올리고 있습니다 :)

 

<오늘의 추가 조사 목록>

1. Packing 

2. Unpacking

3. Naming mangling

4. 파이써닉

5. property

6. 접근지정자

7. 인스턴스화


1. Packing

:  여러 개의 변수를 하나의 객체로 묶어주는 역할을 한다.

 

print함수는 여러 개의 변수를 가변적으로 받을 수 있다.

print('hello')
print('hello','world')

위와 같이 인자의 개수를 유연하게 지정해주기 위해

파이썬에서는 packing을 지원하는 것이다.

 

def func(*args):
  print(args) # (1,2,3,4,5,'a','b')
  print(type(arge)) # <class 'tuple'>
    
func(1,2,3,4,5,'a','b')

 

위치 인자 패킹은 * 한개를 매개변수 앞에 붙여서 사용한다.

* (애스터리스크)를 붙여주면,

위치인자로 보낸 모든 객체들을 하나의 객체로 묶어준다.

 

packing을 하게 되면,

튜플 형식의 값으로 받게 된다.

 

패킹을 통해 받은 인자들로 연산도 가능하다.

 

>>그래서 패킹을 사용하는 이유가 뭐냐구!!

패킹을 사용하지 않으면,

우리가 함수를 선언할 때 정해놓은 매개변수의 수대로만

입력해야 한다.

 

그러나

패킹을 사용하게 되면,

매개변수를 몇 개를 넣던지 상관이 없어지고,

상황에 따라 유연하게 코드를 작성할 수 있게 된다.

 

# packing
def my_family(father,mother,*siblings):
    print('아버지 : {}'.format(father))
    print('어머니 : {}'.format(mother))
    count=0
    for sibling in siblings:
        count+=1
        print('형제자매{} : {}'.format(count,sibling))
my_family('홍길동','심사임당','김태희','윤아')

'''
아버지 : 홍길동
어머니 : 심사임당
형제자매1 : 김태희
형제자매2 : 윤아
'''

 


- 키워드 인자위치인자가 뭐지..?

함수를 호출할 때 함수로 전달되는 값에는

두 종류의 인자(argument)가 있다.

 

1. 키워드 인자 (keyword argument) **

: 함수 호출 시 식별자가 앞에 붙은 인자를 의미한다.

ex) func(name='hong',age=3)

ex) func(**{'name':'hong','age':3})

hong과 3이 여기서는 키워드 인자에 속한다.

 

2. 위치 인자 (positional argument) *

: 키워드 인자가 아닌 인자로,

인자 목록의 처음에 나오거나 

이터러블의 앞에 *를 붙여 전달할 수 있다.

ex) func(3,5)

ex) func(*(3,5))


2. Unpacking

: packing과 반대되는 개념으로,

여러개의 객체를 포함하고 있는 하나의 객체를

다시 개별로 풀어주는 과정이다.

이때는 매개변수가 아니라 인자 앞에 *를 붙인다.

(위치인자는 *, 키워드 인자는 **)

 

(1) 위치 인자

#unpacking
def my_family_unpacking(father,mother,I):
    print(father+","+mother+","+I)
family=['hong','kim','park']
my_family_unpacking(*family)
#hong,kim,park

리스트로 묶여있는 값들을 unpacking을 통해서

각각의 객체로 풀어준다.

(리스트, 튜플, 딕셔너리 등 컨테이너 객체라면 다 가능)

 

(2) 키워드 인자

#unpacking2
def cal(first,op,second):
    if op=='+':
        return first+second
    if op=='-':
        return first-second
    if op=='/':
        return first/second
    if op=='*':
        return first*second

prob={
    'first':12,
    'op':'*',
    'second':10
}
print(cal(**prob))

키워드인자로 unpacking 할 땐

딕셔너리 형태여야 한다.

딕셔너리가

key와 인자로 구성되어 있기에!


3. Naming mangling 

Naming mangling은 많은 모던 프로그래밍 언어에서

프로그래밍 객체를 위한 고유한 네임을 해결해야 하는

필요성에 의해 일어나는 다양한 문제를 해결하기 위한 기술이다.

 

맹글링은 클래스의 속성값을 외부에서 접근하지 못하도록 하고 싶을 때,

하위클래스가 상위 클래스의 속성을 오버라이팅 하지 못하게 할 때 사용한다.

 

# name : public
# _name : protected
# __name : private

 

 


4. 파이써닉 (Pythonic)

: 파이썬의 고유한 기능과 관용구를 따르는 코드를 의미한다.

다른 언어들과 구별되는 파이썬 특유의 문법을 활용해 코드를 표현한다.

 

파이써닉 코드를 알아야 하는 이유는,

다른 사람이 작성한 코드를 이해하기 위함,

코드 작성시 효율성을 높이기 위함이다.

 

1. 명쾌한 코드

마지막 줄 (return)을 읽는 것만으로 

어떤 기능을 하는 함수인지 구분이 갈 정도로 명쾌한 코드

 

2. 한 줄에 한 구문

 

3. 함수 인자

- 위치 인자는 필수고, 디폴트 값을 가지면 안된다.

 

- 키워드 인자는 필수는 아니지만 디폴트값을 가진다.

>> send(message, to, cc=None, bcc=None) 

만약 함수가 같은 속성을 가진 인자의 리스트를 받는다면,

위 방법보다는

send(message,recipients)로 정의하는 게 낫다.

 

- 인자가 몇 개가 들어올 지 알수는 없으나 이름이 붙어있다면

kwargs 생성자를 사용할 수 있다

> 대신 꼭 필요한 경우에만 써야함.

 

4. 우리는 모두 책임감 있는 사용자

 

5. 이디엄

- 언패킹

: 리스트 또는 튜플의 길이를 알고 있다면,

언패킹을 하면서 각 엘리먼트마다  이름을 붙여줄 수 있음

for index, count in enumerate(some_lits):

>> enumerate

: 리스트가 있는 경우 순서와 리스트의 값을 전달하는 기능

열거하다라는 뜻이다.

순서가 있는 자료형을 입력받아서, 

enumerate 객체를 리턴한다.

 

#enumerate
data=enumerate((1,2,3))
print(data,type(data))
#enumerate
fruits=['apple','banana','strawberry']
for idx,fruit in enumerate(fruits):
    print('{} : {}'.format(idx,fruit))


# enumerate을 이용하면, len을 쓰지 않아도 인덱스를 가져올 수 있다.

# 인덱스와 원소를 동시에 접근하며 루프를 돌릴 수 있게 해준다.
# enumerate(arr,start=number)로 시작 번호도 정할 수 있다.

 

for문 동작 원리

파이썬에서의 for문은 in 뒤에 있는 목록을 대상으로

next()함수를 호출하고 있다.

일반 리스트를 iter() 함수에 넘겨서 반복자로 만든 후에

next()함수를 호출해보면 차례로 얻어지는 것을 알 수 있다.

 

enumerate 동작 원리

인덱스와 원소의 쌍이 튜플의형태로 차례대로 얻어진다.

인자로 넘어온 목록을 기준으로 인덱스와 원소를 차례대로 접근해주는

반복자(iterator) 객체를 반환해준다.

 

- iterator (이터레이터 = 반복자)

여러 개의 요소를 가지는 컨테이너에서

각 요소를 하나씩 꺼내 어떤 처리를 수행하는 간편한 방법을 제공하는 객체

 

#iterator (반복자)
name='kim'
it_name=iter(name)
print(next(it_name))
print(next(it_name))
print(next(it_name))
print(next(it_name)) #StopIteration

-  generator (제너레이터)

이터레이터를 만드는 간단하고 강력한 도구이다.

일반적인 함수처럼 작성되지만,

return 문장 대신 yield 문장을 사용한다.

 

return과 yield의 차이가 무엇일까..

return은 반환될 때마다 내부 지역변수들이 사라지지만,

yield는 내부 값들이 보존된다.

따라서 제너레이터는 next() 메서드가 호출될 때마다

중단된 지점부터 다시 시작할 수 있다.

(왜냐면 모든 데이터값과 마지막에 실행된 명령문들을 기억하고 있기 때문이다.)

generator를 동시에 두개 생성하게 되면, 

서로가 다른 객체이기 때문에 각기 따로 동작한다.

 

참고로 우리가 알고 있는 리스트, set, 딕셔너리의 표현식의 내부도

사실은 generator이다.

 

def three_generator():
    a=[1,2,3]
    yield from a # iterable한 객체를 yield 할땐 yield from iterable로 값 전달 가능
gen=three_generator()
print(list(gen))

5. property

: 데코레이터 함수이다.

 

- 데코레이터 (decorator)

: 함수나 메소드 이름 위에 쓰는 골뱅이가 붙은 표시!

어떤 함수를 새 함수로 만들어주는 기능을 한다.

기존의 함수 내용을 건드리지 않고,

어떤 기능만 따로 추가할 때 유용하게 쓰인다.

자세한 내용은 아래글 참고하기

eboong.tistory.com/249

 

[인프런 리프 대학생 2기] 2주차 미션활동 | Context Manager Annotation

2주차 미션활동은 section2를 공부하고 포스팅을 하는 거에요! 하루에 강의 1개 분량이 약 20분정도니까, 하루면 금방 끝나겠네! 했는데,, 강의 듣고나서 모르는 부분들에 대해 추가 조사를 하다보

eboong.tistory.com

 

 


6. 접근제어자

(자바 기준으로 설명)

 

(1) private

: 외부에 공개되지 않고, 외부에서 직접 접근도 못 함.

자바 프로그램은 private 멤버에 직접 접근이 불가하고,

해당 겍체의 public 메소드를 통해서만 접근할 수 있다.

private 멤버는 클래스 내부의 세부적인 동작 구현에 사용된다.

= 같은 클래스만 접근 허용함

 

(2) public

클래스 멤버는 외부로 공개되고, 

프로그램 어디에서나 직접 접근이 가능하다.

publi 메소드는 private 멤버와 프로그램 사이의 인터페이스 역할을 함

= 누구자 접근 허용

 

(3) default

접근 제어자가 지정되지 않을 경우의 기본값이다.

= 같은 클래스, 같은 패키지에 속하는 멤버에서만 접근 가능

 

 

(4) protected

부모 클래스에 대해서는 public 멤버처럼 취급되고,

외부에서는 private 멤버처럼 취급된다.

 

= 같은 패키지, 다른 패키지에 속하는 자식 클래스도 접근 허용

 

 


7. 인스턴스화

 

 

 

 

 


<인프런>

강의 명 : 

모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포

 

강의 링크 

www.inflearn.com/course/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B3%A0%EA%B8%89/dashboard

 

모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original) - 인프런 | 강

폭넓은 파이썬 개발 경험, 온오프라인 수업 경험을 바탕으로 파이썬 메타프로그래밍, 깊이있는 문법을 다루기 위한 과정입니다. 더 나아가 파이썬 취준생 면접 및 경력자분들의 기술면접에도

www.inflearn.com


추가 조사 출처

 

epython-guide-kr.readthedocs.io/ko/latest/writing/style.html

 

Code Style — The Hitchhiker's Guide to Python

 

docs.python-guide.org

www.daleseo.com/python-enumerate/

 

[파이썬] enumerate 내장 함수로 for 루프 돌리기

Engineering Blog by Dale Seo

www.daleseo.com

blog.naver.com/codeitofficial/221673642106

 

[코드잇] 파이썬에서 데코레이터(Decorator)란??

안녕하세요, 온라인 코딩 스쿨 코드잇입니다.​오늘은 파이썬에서 사용하는 데코레이터(decorator)를 알아...

blog.naver.com