본문 바로가기

[일상봇 만들기] 나의 하루하루를 도와줄 친구!

level_03_part_2

 

Level

03

03_[함수] 변수의 계급

 

 

 1_갑자기 분위기 계급?

 

 

네, 계급이 있습니다.

파이썬은 사실 신분사회인 것이죠.

 

'관계자 외 출입금지' 라는 말이 있는데,

해당 지역에는 관계자만 출입할 수 있다는 의미이죠?

 

손님 신분으로 식당에 간다면, 관계자가 아니기 때문에 주방같은 곳에 출입하지 않지만

사장님 신분이라면 식당의 어디에나 출입할 수 있을 겁니다.

 

사장님 이라면 영업시간이 아닐 때에도 매장에 들어갈 수 있지만

손님이라면 도둑이 아닌 다음에야 영업시간이 아닐 때 매장에 들어갈 수 없죠.

 

 

이렇게 신분에 따라 특정 시간과 특정 장소에 있을 수 있는 자격이 달라지게 됩니다.

 

 

그렇다면 파이썬에서는 이 '신분' 이라는 것을 어떻게 이해할 수 있을까?

간단한 방법과 조금씩 어려워지는 방법으로 접근해 볼 수 있습니다.

 

 

1) 가장 간단한 방법  ->  함수 안에서 일어난 일은, 함수가 끝나면 없던 일이 된다.

 

이 챕터의 이름이 '계급' 인 이유는

함수 안에서 태어난 변수는 함수 밖을 보지 못하고... 사라지기 때문이랍니다~

 

예)   multiply() 함수를 예로 들어볼게요.

def multiply(a, b):   # a 와 b 를 입력값으로 받는 multiply 라는 이름의 함수를 만든다.

    c = a * b          # a 와 b 를 서로 곱하고, c 라는 변수에 넣는다.

    print(c)             # c 라는 변수에 들어있는 값을 화면에 출력한다.



# 처음 3 줄로 함수를 정의하였습니다.

# (만들어 놓기만 하고, 아직 사용하지 않았습니다.)



c = 10                  # 함수 밖에 c 라는 이름으로 변수를 만들고, 여기에 10 이라는 값을 넣는다.

print(c)                 # c 라는 변수에 들어있는 값을 화면에 출력한다.

multiply(4, 5)          # 함수를 실행한다. 함수 안에서 print(c) 가 있기 때문에, c 변수에 들어있는 값이 나온다. 

print(c)                 # c 라는 변수에 들어있는 값을 화면에 출력한다.





실행결과:

10                       # 함수 밖에서 c 라는 변수에 처음으로 들어간 값인 10 이 출력됩니다.

20                       # 함수 안에서 c 라는 변수에 들어간 값인 20 이 출력됩니다.

10                       # 함수 안에서 c 안에 20이 들어간 일이 없었던 일이 되기 때문에

                          # 변수에 원래 들어있었던 10이 출력됩니다.

 

함수 안에서 일어났던 일은, 함수가 끝나면 없던 일이 되기 때문에

함수 안에서 했던 일인 '20 을 c 에 넣는다' 가 없던 일이 되어서

원래 c 에 들어있던 10 으로 되돌아간 것입니다.

 

 

함수 밖에 이미 c 가 있었을 때 함수 안에서 c 를 바꾼 경우에 대해 알아보았습니다.

그렇다면, 함수 밖에 존재하지 않는 변수를 함수 안에서 만든 경우에는 어떻게 될까요?

 

위에서 만든 multiply 함수를 그대로 가져와서 2 가지만 바꿔보겠습니다.

 

1) 변수의 이름을 c 에서 지금껏 한 번도 사용하지 않았던 이름인 result로 바꿉니다.

2) result 변수를 함수 밖이 아닌, 함수의 안에서만 정의합니다.

def multiply(a, b):         # a 와 b 를 입력값으로 받는 multiply 라는 이름의 함수를 만든다.

    result = a * b          # a 와 b 를 서로 곱하고, result 라는 변수에 넣는다.

    print(result)             # result 라는 변수에 들어있는 값을 화면에 출력한다.



multiply(4, 5)          # 함수를 실행한다. 함수 안에서 print(result) 가 있기 때문에, result 변수에 들어있는 값이 나온다. 

print(result)            # result 라는 변수에 들어있는 값을 화면에 출력한다.





실행결과:

20                       # 함수 안에서 c 라는 변수에 들어간 값인 20 이 출력됩니다.

NameError:            # result 라는 이름을 가진 변수가 없다는 에러가 나올 것입니다.

 

함수 안에서 일어났던 일은 함수가 끝나면 없던 일이 된다고 하였죠?

이번에는 result 라는 변수가 처음 만들어질 때 함수 안에서 만들어졌기 때문에,

함수가 끝나면 result 라는 변수가 존재하지 않게 됩니다.

 

존재하지 않는 변수를 print() 하려고 했기 때문에 그런 이름을 가진 변수가 없다는 에러가 나온 것이지요.

 

 

2) 문법 용어를 사용하여 알아보기.

 

'글로벌 변수'

'로컬 변수'

 

위 2 가지 용어를 도입하여 복잡한 개념을 단순하게 표현해 보겠습니다.

 

글로벌 변수는 여기, 저기, 어디에나 있을 수 있는 변수입니다.    # 글로벌 지구촌 세상!

로컬 변수는 특정 공간에서만 존재하는 변수입니다.                 # '로컬 음식 탐방' 은 지역 음식을 먹는 것이죠.

 

함수 part_1 에서 우리는, 함수 밖에 있는 변수를 함수 안으로 가져올 수 있다고 다루었습니다.

지금 part_2 에서는, 함수 안에서 만들어진 변수를 함수 밖으로 뺄 수 없다는 것을 보았죠.

 

우리가 방금 다루었던, 함수 안에서 만들어진 변수는

함수 안에서만 존재하기 때문에

[로컬 변수] 입니다.

 

함수 밖에 있는 변수는,

함수 안 / 밖 어디에서나 가져다 쓸 수 있기 때문에

[글로벌 변수] 입니다.

 

 

 

 

 

 

 

 

 

[예제문제1]

함수로 묶어보기 

   기존의 sunrise 예제를 함수로 바꿔보세요.

 

[예제문제2]

복잡한 구조의 웹 자료를 손쉽게 다루기(bs4) 

   XML의 태그만 알면 됩니다.

   기존의 RSS 뉴스와 날씨 예제를 bs4를 사용해 개선해보세요

 

[도전문제]

bs4로 미세먼지 정보를 손쉽게 다루는 함수를 만들어보세요

서초구를 함수의 input 기본값으로, return 값으로는 미세먼지 정보를 출력하세요

예제코드:

import requests

from bs4 import BeautifulSoup

def dust_hunter(r_name = "서초구"):

    base = 'http://openapi.airkorea.or.kr/openapi/services/rest'

    service = '/ArpltnInforInqireSvc/getCtprvnMesureSidoLIst'

    key = '?serviceKey=%2FvNQLW62FZQHdzvFTGDTGRNSyckmTODOYb98%2B0jVNVHk0iimUZV%2B5Gik%2FA7QkgsCKFs6l%2BBjWh2IfQyiQLp4TA%3D%3D'

    rows = '&numOfRows=25'

    page = '&pageNo=1'

    sido = '&sidoName=서울'

    freq = '&searchCondition=DAILY'

    xml = base + service + key + rows + page + sido + freq

    req = requests.get(xml).text

    bs1 = BeautifulSoup(req, "html.parser")

    '''

    여기를 채워주세요

    '''

    return return_text

 

'[일상봇 만들기] 나의 하루하루를 도와줄 친구!' 카테고리의 다른 글

level_04_part_2  (0) 2019.07.09
level_04_part_1  (0) 2019.07.05
level_03_part_1  (0) 2019.07.02
level_02_part_2  (0) 2019.06.24
level_02_part_1  (0) 2019.06.20