Python 지역/전역변수,std_module

정원·2022년 7월 4일

Python

목록 보기
4/7

22.07.04 지역/전역변수,std_module

<script>

</script>

자바스크립트 공부 사이트

https://ko.javascript.info/
강사님이 추천해주신 사이트.
자바스크립트 공부 할 때 사용하기 ~

local_variable

<script>
'''
* 지역 변수(local variable)

- 지역 변수란 함수 내부에 선언된 변수를 말합니다.
- 지역 변수는 함수 내부에서만 사용할 수 있므녀
함수의 호출이 종료되는 순간 메모리에서 자동 소멸합니다.
- 지역 변수의 사용을 함수 내부로 제한하는 이유는
변수 이름 충돌을 피하고, 메모리를 절약하기 위합입니다.
'''
def info():
    name = '안녕'
    print(name)

# print(name) 에러. name 변수를 찾을 수 없음
</script>

global_variable

<script>
'''
* 전역 변수(global variable)

- 지역 변수가 함수 내부에서만 사용하는 변수라면
전역 변수는 프로그램 전체에서 사용하는 공용 변수입니다.
- 파이썬에서는 들여쓰기 없이 선언된 변수를 전역변수로 취급하며,
 전역변수는 함수 내부, 제어문 내부 등
프로그램 어디에서나 사용이 가능합니다.
'''

sale_rate = 0.2 # 전역변수

def calc_price(price):
    print(f'오늘의 할인율: {sale_rate * 100}%')

    today_price = price - (price * sale_rate) # 지역변수
    print(f'오늘의 가격: {today_price:0.0f}원')

calc_price(2000)
# print(today_price) 에러.
</script>

reference_variable

<script>
a = 3
b = a
print(a, b) # 3 3

a = 5
print(a, b) # 5 3

list1 = [1, 2, 3]
list2 = list1
print('list1:', list1) # [1, 2, 3]
print('lsit2:', list2) # [1, 2, 3]

# list는 객체라서 변수에 값이 아니라 주소값이 들어가기 때문에 값을 변경하면 
# list1, list2 같이 변경된다.
list1[0] = 6
list2[1] = 9
print('list1:', list1) # [6, 9, 3] 
print('lsit2:', list2) # [6, 9, 3]

print('list1의 주소값:', id(list1)) # 1261729238080
print('list2의 주소값:', id(list2)) # 1261729238080


list1 = [1, 2, 3]
list2 = []
list2 = list1.copy() # 리스트 내부 요소들을 복사하여 전달.

list1[0] = 6
list2[1] = 9
print('list1:', list1) # [6, 2, 3] 
print('lsit2:', list2) # [1, 9, 3]

print('list1의 주소값:', id(list1)) # 1537516106752
print('list2의 주소값:', id(list2)) # 1537516063808
</script>

module_basic01

<script>
'''
* 모듈 임포트

- 모듈은 파이썬 코드를 작성해 놓은 스크립트 파일이며
모듈 안에는 변수, 함수, 클래스 등이 정의되어 있습니다.
- 파이썬에서는 주요 기능들을 표준 모듈로 구성하여
표준 라이브러리로 제공하고 있습니다.
- 표준 모듈이나 외부 모듈을 현재 모듈로 불러와서 사용할 때는 
import라는 키워드를 사용합니다.
'''
import math

# pi = 3.14 
print(5 * 5 * math.pi) # pi
print(math.sqrt(3)) # 루트
print(math.factorial(6)) # 6! -> 6x5x4x3x2x1
</script>

module_basic02

<script>
# 묘듈 내에 존재하는 변수, 함수, 클래스 등을 직접 임포트 하는 방법
# 묘듈의 모든 기능말고 사용할 기능만 임포트

from math import factorial, gcd

# math 자체를 import하는 것이 아니라 factorial만 사용할때. 여러개 가능
# print(math.factorial(6))
print(factorial(6))

print(gcd(12, 18)) # 최대 공약수 구하는 함수

# 임포트할 모듈에 별칭을 지정하여 사용하기
import statistics as st # 통계 별칭 지정

li = [34, 55, 12, 24, 55, 66, 99]
print('평균:', st.mean(li))
print('분산:', st.variance(li))
print('표준편차:', st.stdev(li))

# 위의 두 가지 개념을 합쳐서도 사용이 가능
from math import factorial as fac

print(fac(8))
</script>

module_basic03

<script>
'''
* 사용자 정의 모듈

- 하나의 모듈 파일에 너무 많은 코드가 들어있다면
편집이 힘들어지고, 코드를 유지, 보수하는 데 어려움이 발생합니다.
- 관리 편의상 비슷한 기능들을 가진 코드를 여러 개의 모듈에 나누어서
작성하는 것이 좋습니다.
'''

import calculator as cal

print(f'1인치: {cal.inch}cm')
print('1부터 10까지의 누적합:', cal.calc_sum(10))

n1, n2 = map(int, input('정수 2개 입력:').split())
print(f'{n1} + {n2} = {cal.add(n1, n2)}')
</script>

calculator

<script>
def add(n1 ,n2):
    return n1 + n2

def sub(n1, n2):
    return n1 - n2

def calc_sum(end):
    sum = 0
    for n in range(end+1):
        sum += n
    return sum

def info():
    print('모듈 임포트 연습!')

inch = 2.54
yard = 0.91
lb = 0.45


'''
- 배포의 목적으로 만든 모듈이라면
테스트 코드를 작성해서 다른 사용자들에게
모듈 사용법을 간단히 공개 해 주면 좋다.
- 아무 문법 없이 작성하면, import한 모듈에서 
테스트 코드가 노출되는 문제가 발생합니다.
- 처음부터 import를 목적으로 설계된 모듈의 테스트 코드 작성 시에는
다음과 같은 문법 하에서 테스트를 진행합니다.

ex) if __name__ == '__main__':
        test code...

__name__ 이라는 숨겨진 변수(내장 변수)에는 
현재 실행중인 모듈의 이름이 들어가게 되는데,
현재 모듈에서 실행할 때는 이름이 main으로 저장됩니다.
다른 모듈에서 실행할 때는 이름이 모듈 이름으로 저장됩니다.
'''
if __name__ == '__main__': # 현재 모듈에서는 main, 다른 모듈에서는 calculator
    print('__name__의 값:', __name__) # __main__
    # module_basic03에서 실행하면 __name__ : calculator

    # 배포용으로 작성된 모듈은 test code를 작성해야한다.
    # test code...
    print('1~100까지의 누적합:', calc_sum(100))
    info()
    print(sub(100, 15))
    print('이런 식으로 사용하시면 됩니다~')
</script>

std_module_random

<script>
'''
* 표준 모듈 random

- 프로그램이 무작위 동작을 하게 하려면 난수값(랜덤값)이 필요합니다.
- 랜덤값을 난수라고 부르며, 난수를 쉽게 발생시킬 수 있는
함수를 제공하는 모듈이 random 모듈입니다.
- random 모듈의 random()함수는 0.0이상 1.0미만의
실수 난수값을 발생시킵니다.
'''
import random as r

rn = r.random()
# print('랜덤값:', rn)

'''
- 정수 난수는 randint() 함수를 사용합니다.
- randint()는 인수로 시작범위와 끝 범위를 지정하는데,
끝 범위도 난수값에 포함되는 특징이 있습니다.(미만이 아님에 주의!!)
'''
pets = ['멍멍이', '야옹이', '짹짹이', '호랑이', '코끼리']
idx = r.randint(0, 4) # 미만이 아니에요!!
print('애완동물을 뭘 키울까??:', pets[idx])

# choice() 함수는 리스트 내부의 임의의 요소를 랜덤으로
# 선택하여 리턴합니다.
print('애완동물을 뭘 키울까??:', r.choice(pets))

# shuffle() 함수는 리스트의 요소를 무작위로 섞습니다.
print(pets)
r.shuffle(pets)
print(pets)

# sample() 함수는 리스트의 항목 중 n개를 무작위로 추출하여
# 새로운 리스트로 만들어서 리턴합니다.
# 중복값은 자동으로 배제시키며, 원본 리스트는 변하지 않는다.
s_list = r.sample(pets, 2) # list, 개수
print(s_list) # ['야옹이', '코끼리']

# sample 함수를 활용한 로또번호 6뽑기(중복은 제거)
lotto_nums = list(range(1, 46))
lotto = r.sample(lotto_nums, 6)
lotto.sort()
print(lotto)
</script>

std_module_time

<script>
'''
* 표준 모듈 time

- time 모듈은 시간 관련 기능들을 제공합니다.
- 대표적인 함수는 time()인데, 이 함수는 현재 시간을
197011일 자정을 기준으로 현재까지 경과한
시간을 초단위로 표현한 유닉스 시간을 반환합니다.
'''
import time
print(time.time())

# time 함수를 이용한 프로그램 속도 측정 테스트
start = time.time()

sum = 0
for n in range(50000):
    sum += n

end = time.time()

print(f'프로그램 실행 속도: {end-start:0.4f}초')


'''
- time 모듈의 sleep() 함수는 cpu를 지정한 시간만큼
잠재워 아무것도 하지 않고 시간을 끌게 합니다.
'''
print("재밌는 문제를 준비했어용~~")
time.sleep(3)
print("대학생이 힘이 센 이유는??")
time.sleep(15)
print("개강하니까~~") //ㅋㅋㅋㅋㅋㅋ
time.sleep(3)
</script>

exception_basic

<script>
'''
* 예외 처리

- 프로그램은 실행 중에 사용자와 끊임없는 상호 작용을 합니다.
(입력 | 출력, 선언 | 호출, 요청 | 응답.....)

- 프로그램의 사용자는 예측 불가의 행동을 할 수도 있으며
잘못된 사용으로 인해 에러를 유발할 수도 있습니다.

- 에러의 종류에는 심각한 에러(Serious Error)와 
덜 심각한 에러 (Mild Error)가 있습니다.

- 심각한 에러는 개발자가 해결할 수 없는 에러(천재지변, 시스템 상 문제)
등을 말합니다.
Mild Error는 문법 오류나 오타 등 해결이 가능한 에러들을 말하며
이를 예외(Exception)라고 칭합니다.

- 아무리 프로그램을 정교하게 구성해도, 예외 발생 시 프로그램의
비정상 종료를 막을 수가 없기 때문에 예외 처리 문법을 통해
프로그램의 비정상 종료를 막아야 합니다.

- 예외처리 키워드는 try와 except를 사용합니다.

- try에는 예외 발생 가능성이 있는 코드를 작성합니다.
except에는 try에서 예외가 발생했을 때 실행할 코드를 작성합니다.

- try 내부에서 예외가 발생했다면 즉시 try의 실행을 중지하고
except의 코드가 실행되면서 프로그램의 비정상 종료를 방지합니다.
'''
try:
    n1 = int(input('정수1:'))
    n2 = int(input('정수2:'))

    print(f'입력한 정수: {n1}, {n2}')
    result = n1/n2
    print(f'{n1} / {n2} = {result}')
     # 입력받은 정수가 0일때 에러(ZeroDivisionError)가 발생하기 때문에 예외처리.
except:
    print('0을 입력하지 마세요!')
print('프로그램 정상 종료')
</script>

exception_multi

<script>
'''
* 다중 예외 처리

- 하나의 try 블록에서 여러 상황의 예외를 예외별로 다르게
처리하고 싶다면 다중 예외처리를 사용합니다.

- 다중 예외처리를 할 때는 except 뒤에 발생하는 예외의
이름을 적어줍니다.

# 자주 발생하는 예외의 이름
1. NameError: 정의되지 않은 변수나 함수, 클래스를
사용할 때 발생합니다.

2. ValueError: 주로 형 변환시 발생하며, 내부 값의 형태가
잘못되었을 때 발생합니다.

3. ZeroDivisionError: 숫자를 0으로 나누었을 때 발생합니다.

4. IndexError, KeyError: 존재하지 않는 인덱스나 키를 사용하여
시퀀스, 딕셔너리를 조회했을 때 발생합니다.

5. TypeError: 연산 수행 시 피연산자의 데이터 타입이 올바르지
않을 경우 발생합니다.
'''
# NameError
print(apple) # name 'apple' is not defined 에러

# ValueError
int('3.14') # 에러

# Index, KeyError
s = 'hello'
print(s[6]) # string index out of range
d = {}
print(d['멍멍이']) # '멍멍이' key는 없다

# TypeError
print(10 ** '메롱') # 'int' and 'str'

try:
    s = input('정수:')

    point = int(s) # ValueError 가능성
    print(150 / point) # ZeroDivisionError 가능성
    print(s[point]) # IndexError 가능성
except ValueError:
    print('정수로만 입력하세요.')
except ZeroDivisionError:
    print('0으로 나눌 수 없습니다.')
except IndexError:
    print('인덱스 범위를 벗어났어요.')

'''
finally 키워드는 예외 발생 여부와 상관없이 
항상 실행해야 하는 코드가 있을 경우 사용하는 예외 처리입니다.
'''
pets = ['거북이', '강아지', '고양이']

for n in range(4):
    try:
        print(pets[n], '키우고 싶다~')    
    except:
        print('애완동물의 정보가 없습니다.')
    finally:
        print('아무튼 실행되는 문장입니다.')
</script>

exception_raise

<script>
'''
* 예외 일부러 발생시키기

- 프로그래밍을 진행하다 보면 일부러 예외를 발생시켜서 
코드의 흐름을 전환해야 하는 경우가 발생합니다.
- 파이썬은 raise라는 명령을 사용해서 오류를 강제로
발생시킬 수 있습니다.
- 자바의 throw
'''
def calc_sum(end):
    if end <= 0:
        raise ValueError # 예외 일부러 발생시키기

    total = 0
    for n in range(end+1):
        total += n
    return total

try:
    result = calc_sum(100)
    print(result)

    result2 = calc_sum(-120) # range(0, -119, 1) 동작 X
    # 예외 발생은 안하지만 코드가 동작하지 않기 때문에 raise이용해서 예외 발생 시키기.
    print(result2)
except:
    print('매개값을 양수로 좀 주세요.')
</script>

0개의 댓글