Day10. 파이썬 중급 (2~4)_(1)

Junghwan Park·2023년 4월 17일
0

스터디노트

목록 보기
11/54
post-thumbnail

지역변수와 전역변수

  • 전역 변수
    함수 밖에 선언된 변수로 어디에서나 사용은 가능하지만 함수 안에서 수정할 수는 없다.
num_out = 10
def printNumbers():
     print(f'num_out: {num_out}')

printNumbers()
print(f'num_out: {num_out}')


# 함수 안의 num_out과 함수 밖의 num_out은 동명이인처럼 다르다!
num_out = 10
 def printNumbers():
     num_out = 20
     print(f'num_out: {num_out}')

printNumbers()
print(f'num_out: {num_out}')
  • 지역변수
    함수 안에 선언된 변수로 함수 안에서만 사용이 가능하다.
def printNumbers():
     num_in = 20 # 함수 안에서 선언 되었으므로 지역 변수 !
     print(f'num_out: {num_in}')

printNumbers()

def printNumbers():
     num_in = 20 # 함수 안에서 선언 되었으므로 지역 변수 !
     print(f'num_out: {num_in}')

print(f'num_out: {num_in}') # 선언 된 num_in이 없으므로 에러!
  • global 키워드
    global을 사용하면 함수 안에서도 전역변수의 값을 수정할 수 있다.
num_out = 10
def printNumbers():
     global num_out  # 전역함수의 의미를 부여해 준 것이다!
     num_out = 20
     print(f'num_out: {num_out}')

printNumbers()
print(f'num_out: {num_out}')
  • 실습1
    사용자가 가로, 세로 길이름 입력하면 삼각형과 사각형의 넓이를 출력하는 함수를 만들어 보자.
def printArea():
     triangleArea = width * height / 2
     squareArea = width * height

     print(f'삼각형 넓이: {triangleArea}')
     print(f'사각형 넓이: {squareArea}')

width = int(input('가로 길이 입력: '))
height = int(input('세로 길이 입력: '))
printArea()
  • 실습2
    방문객 수를 카운트하는 함수를 만들어보자.
totalVisit = 0  # 전역변수

def countTotalVisit():
    global totalVisit   # 전역변수를 함수 내에서 수정 가능하다

    totalVisit += 1
    print(f'누적 방문객: {totalVisit}')

countTotalVisit()
countTotalVisit()
countTotalVisit()
countTotalVisit()
countTotalVisit()

중첩함수

  • 중첩함수
    함수안에 또 다른 함수가 있는 형태이다.
def out_function():
    print('out_function called!!')

    def in_function():      # 함수안에 있는 또 다른 함수 중첩함수!
        print('in_function called!!')

    in_function()

out_function()
# in_function()      # 함수안에서는 호출 가능하지만 밖에서는 호출 할 수 없다.
  • 실습
    calculator()함수를 선언하고 calculator() 안에 덧셈, 뺄셈, 곱셈, 나눗셈 함수를 선언하자.
def calculator(n1, n2, operator):

    def addCal():   #중첩함수!
        print(f'덧셈 연산: {n1 + n2}')

    def subCal():
        print(f'뺄셈 연산: {n1 - n2}')

    def mulCal():
        print(f'곱셈 연산: {n1 * n2}')

    def divCal():
        print(f'나눗셈 연산: {n1 / n2}')

    if operator == 1:
        addCal()
    elif operator == 2:
        subCal()
    elif operator == 3:
        mulCal()
    elif operator == 4:
        divCal()

while True:
    num1 = float(input('실수(n1) 입력: '))
    num2 = float(input('실수(n2) 입력: '))
    operatorNum = int(input('1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈, 5.종료'))

    if operatorNum == 5:
        print('Bye')
        break

    calculator(num1, num2, operatorNum)

lambda 함수

  • lambda
    lambda 키워드를 이용하면 함수 선언을 보다 간단하게 할 수 있다.
def calculator(n1, n2):                 # 기존 함수 선언
    return n1 + n2

calculator = lambda n1, n2 : n1 + n2    # lambda를 사용한 함수 선언

returnValue = calculator(10, 20)
print(f'returnValue: {returnValue}')
  • 실습
    삼각형, 사각형, 원의 넓이를 반환하는 lambda함수를 만들어보자.
# lambda함수 선언부
getTriangleArea = lambda n1, n2: (n1 * n2) / 2
getSquareArea = lambda n1, n2: (n1 * n2)
getCircleArea = lambda r: r * r * 3.14

width = int(input('가로 길이 입력: '))
height = int(input('세로 길이 입력: '))
radius = int(input('반지름 길이 입력: '))

# 함수 호출부
triangleValue = getTriangleArea(width, height)
squareValue = getSquareArea(width, height)
circleValue = getCircleArea(radius)

print(f'삼각형 넓이: {triangleValue}')
print(f'사각형 넓이: {squareValue}')
print(f'원 넓이: {circleValue}')

모듈

  • 모듈
    모듈이란, 이미 만들어진 훌륭한 기능으로 사용자는 쉽게 사용할 수 있다.
    자동차의 핸들고 = 부품 = 모듈 A자동차에도 설치가 가능하고, B자동차에도 설치가 가능하다!
    계산모듈, 난수모듈, 날짜/시간모듈 등
  • 파이썬 모듈은 내부 모듈, 외부 모듈 그리고 사용자 모듈로 구분할 수 있다.
    ㆍ내부 모듈 → 파이썬 설치 시 기본적으로 사용할 수 있는 모듈
    ㆍ외부 모듈 → 별도 설치 후 사용할 수 있는 모듈
    ㆍ사용자 모듈 → 사용자가 직접 만든 모듈

-실습1
random 모듈을 이용해서 1부터 10까지의 정수 중 난수 1개를 발생시켜 보자.

import random

rNum = random.randint(1, 10)
print(f'rNum : {rNum}')
  • 실습2
    random 모듈을 이용해서 0부터 100까지의 정수 중 난수 10개를 발생시켜 보자.
import random

rNums = random.sample(range(0, 101), 10)
print(f'rNums: {rNums}')

모듈 제작

  • 모듈 만들기
    모듈은 특정 기능을 가지고 있는 파이썬 파일을 말한다.
# calculator 모듈
def add(n1, n2):
    print(f'덧셈 결과: {n1 + n2}')

def sub(n1, n2):
    print(f'뺄셈 결과: {n1 - n2}')

def mul(n1, n2):
    print(f'곱셈 결과: {n1 * n2}')

def div(n1, n2):
    print(f'나눗셈 결과: {n1 / n2}')
import calculator

calculator.add(10, 20)
calculator.sub(10, 20)
calculator.mul(10, 20)
calculator.div(10, 20)
  • 실습1
    로또 번호(6개)를 출력하는 모듈을 만들어 보자.
import lottoMachine

result = lottoMachine.getLottoNumbers()
print(f'lotto numbers: {result}')
print(f'lotto numbers: {lottoMachine.getLottoNumbers()}')


## lottoMachine 모듈 ##

import random

def getLottoNumbers():
    result = random.sample(range(1, 45), 6)

    return result
  • 실습2
    문자열을 거꾸로 반환하는 모듈을 만들어보자.
import reverseStr

userInputStr = input('문자열 입력: ')
reversedString = reverseStr.reverseStr(userInputStr)
print(f'reversedString: {reversedString}')


## reverseStr 모듈 ##

def reverseStr(str):
    reversedString = ''
    for c in str:
        reversedString = c + reversedString

    return reversedString

거꾸로 바꾸는 for문 한번 더 보고 복습하기


모듈 사용

  • 모듈 사용
    import 키워드를 이용해서 모듈을 임포트 한다.
    as 키워드를 이용해서 모듈 이름을 단축 시킬 수 있다.
    from ~ as 키워드를 이용해서 모듈의 특정 기능만 사용할 수 있다.

as 예시

import calculator as cal    # calculator를 cal로 부를 수 있다

cal.add(10, 20)
cal.sub(10, 20)
cal.mul(10, 20)
cal.div(10, 20)

from ~ as 예시

from calculator import add  # calculator의 add기능만 불러온다!
from calculator import sub  # calculator의 sub기능만 불러온다!
from calculator import add, sub  # calculator의 기능을 ,로 구분하여 여러개 불러 올 수 있다!

from calculator import *  # calculator의 모든 기능을 불러온다!

add(10, 20)
sub(10, 20)
# mul(10, 20)     # calculator의 mul기능은 불러오지 않았으므로 오류가 난다!


## calculator 모듈 ##

def add(n1, n2):
    print(f'덧셈 결과: {n1 + n2}')

def sub(n1, n2):
    print(f'뺄셈 결과: {n1 - n2}')

def mul(n1, n2):
    print(f'곱셈 결과: {n1 * n2}')

def div(n1, n2):
    print(f'나눗셈 결과: {n1 / n2}')
  • 실습
import scores as sc

korScore = int(input('국어 점수 입력: '))
engScore = int(input('영어 점수 입력: '))
matScore = int(input('수학 점수 입력: '))

sc.addScores(korScore)
sc.addScores(engScore)
sc.addScores(matScore)

print(sc.getScores())
print(sc.getTotalScore())
print(sc.getAvgScore())


## scores 모듈 ##

scores = []

def addScores(s):
    scores.append(s)

def getScores():
    return scores

def getTotalScore():
    total = 0
    for s in scores:
        total += s

    return total

def getAvgScore():
    avg = getTotalScore() / len(scores)

    return avg

실행(메인) 파일 (01)

  • name 전역변수
    name에는 모듈 이름이 저장되거나 'main'이 저장된다.
    전역변수 name을 이용하여 main(실행파일)을 찾아간다!

module 호출

import addModule
import subModule
import mulModule
import divModule

print(addModule.add(10,20))
print(subModule.sub(10,20))
print(mulModule.mul(10,20))
print(divModule.div(10,20))

addModule 호출

def add(n1, n2):
    return n1 + n2

if __name__ == '__main__':
    print(f'__name__: {__name__}')

subModule 호출

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

if __name__ == '__main__':
    print(f'__name__: {__name__}')

mulModule 호출

def mul(n1, n2):
    return n1 * n2

if __name__ == '__main__':
    print(f'__name__: {__name__}')

divModule 호출

def div(n1, n2):
    return n1 / n2

if __name__ == '__main__':
    print(f'__name__: {__name__}')

실행(메인) 파일 (02)

  • 전역변수 name을 이용한 실행파일 지정
  • 실습
    단위 환산 모듈을 만들고 cm를 mm, inch, m, ft로 변환해보자
import unitConversion as uc

# 실행 파일인 경우만 실행된다.
if __name__ == '__main__':
    inputNumber = int(input('길이(cm) 입력 : '))

    returnValue = uc.cmToMm(inputNumber)
    print(f'returnValue: {returnValue}mm')

    returnValue = uc.cmToInch(inputNumber)
    print(f'returnValue: {returnValue}inch')

    returnValue = uc.cmToM(inputNumber)
    print(f'returnValue: {returnValue}m')

    returnValue = uc.cmToFt(inputNumber)
    print(f'returnValue: {returnValue}ft')


## unitConversion 모듈 ##

def cmToMm(n):
    return round(n * 10, 3)

def cmToInch(n):
    return round(n * 0.393, 3)

def cmToM(n):
    return round(n * 0.01, 3)

def cmToFt(n):
    return round(n * 0.032, 3)

if __name__ == '__main__':           # 실행 파일인 경우만 실행된다.
    print(f'10cm : {cmToMm(10)}mm')
    print(f'10cm : {cmToInch(10)}inch')
    print(f'10cm : {cmToM(10)}m')
    print(f'10cm : {cmToFt(10)}ft')

이 글은 제로베이스 데이터 취업 스쿨의 강의자료 일부를 발췌하여 작성되었습니다.

profile
안녕하세요 반갑습니다^^

0개의 댓글