1/8 파이썬 9일차

빨강·2024년 1월 8일
0

기록 - Python

목록 보기
13/14
post-thumbnail
  • 야간 투잡 할 때도 이 정도로 오래 자진 않았는데.. 요즘 겁나 꿀잠 자네. 6to24가 빡세긴 하다. 주말이라고 좀 늦게잤다가 지각할 뻔..

  • 09:00

ex_func_class.py

# ----------------------------------------------------------
# 함수와 클래스
# ----------------------------------------------------------

# 변수에 어떤 데이터를 저장하고 있는 지 확인 함수 => type(변수명)
data=1
print(f'data Type => {type(data)}')

data='Good'
print(f'data Type => {type(data)}')

# 함수명 의 타입
print(f'id().Type => {type(id)}') #id().Type => <class 'builtin_function_or_method'>

# 함수 - 내장함수
#     ㄴ 사용자 정의 함수

# 사용자 정의 함수 생성 ----------------------------------------------------------
# 함수 기능 : 2개 정수 더한 후 결과 출력 기능
# 함수 이름: addTwo
# 매개 변수 : n1, n2
# 반환 결과 : 없음
# ----------------------------------------------------------
def addTwo(n1, n2):
    print( n1 + n2 )

# addTwo(3,4)

# 함수의 타입 출력 ===> type() 내장함수 사용 => class function
print( type ( addTwo))      # <class 'function'>
# addTwo. 가능

# ----------------------------------------------------------
# 함수와 변수
# - 함수명은 코드의 시작 주소를 저장하고 있음
# - 함수명을 변수에 대입 가능
# ----------------------------------------------------------
test = addTwo
print(f'test => {id(test)}, {type(test)}')       # test => 4372930912, <class 'function'>
print(f'addTwo => {id(addTwo)}, {type(addTwo)}') # addTwo => 4372930912, <class 'function'>

test(10,20)
addTwo(5,1)

# ----------------------------------------------------------
# [활용예]
# - 1~10 범위에서 임의의 정수 5개를 저장
# - 중복된 정수 저장 가능
# ----------------------------------------------------------
import random
ranList = []
for i in range(1,6):
    ranNum = random.randint(1,10)
    ranList.append(ranNum)
print(ranList)
# 내가 한 것
# ----------------------------------------------------------
# 선생님 버전
import random
nums=[]
for count in range(5):
    nums.append(random.randint(1,10))
# ----------------------------------------------------------
# 5개의 정수에서 최대값, 최소값, 내림차순 정렬된 값 출력
print(f'최댓값 : {max(nums)}')
print(f'최솟값 : {min(nums)}')
print(f'정 렬 : {sorted(nums, reverse=True)}')
print(f'합 계 : {sum(nums)}')
print(f'갯 수 : {len(nums)}')

# 여러 개의 함수 이름을 변수에 저장 => 리스트 사용함
funs = [max, min, sorted, sum, len]
for f in funs:
    if f==sorted:
        print(f(nums, reverse=True))
    else:
        print(f(nums))

# data = []
# datas = ["3", 'abc', 'Good', "72"]
# for d in datas:
#     if d.isdecimal():
#         data.append(d)
# print(data)                                   # 이것과 같은 방식 함수라고 다를 것 없음

funDict = { '최댓값': max, '최솟값' : min, '정 렬': sorted, '합 계': sum, '갯 수': len}
for k, v in funDict.items():                    # 언패킹해서 만드는 건 아직 머리에 떠오르지조차 않는다.ㅠㅠ
    if v==sorted:
        print(f'{k} : {v(nums, reverse=True)}')
    else:
        print(f'{k} : {v(nums)}')

# 사용자
  • 10:10

ex_glob_local_01.py

# 가정의 화장실에 비유하자면
# 전역변수 : 누구나 쓰는 거실 화장실
# 지역변수 : 안방 거주자만 쓰는 안방 화장실
# ----------------------------------------------------------
# 전역 변수(Global Variable)와 지역 변수(Local Variable)
# # 전역 변수(Global Variable)------------
# - 파이썬(py) 파일에 존재하는 변수
# - 파일 내부 모든 곳에서 사용 가능한 변수
# - 파일 실행을 종료하면 메모리에서 사라짐.
# # 지역 변수(Local Variable)-------------
# - 함수에 존재하는 변수
# - 함수에서만 사용 가능한 변수
# - 함수가 종료되면 변수들은 메모리에서 사라짐
# ----------------------------------------------------------
# 사용자 정의 함수 -------------------------------------------
def currentDate(year, month, day):
    # year, month, day => 지역 변수
    print(f'Today : {year}/{month:0>2}/{day:0>2}')

def currentDate2(month, day):
    # month, day => 지역 변수
    # year => 전역 변수
    print(f'Today : {year}/{month:0>2}/{day:0>2}')

def currentDate3(month, day, week):
    # month, day, week => 지역 변수
    # year => 전역 변수
    print(f'Today : {year}/{month:0>2}/{day:0>2}/{week}')

# 전역 변수 ---------------------------------------------------
year, month, day = 2024, 1, 8

# 함수 사용 즉 함수 호출 -----------------------------------------
currentDate3(month, day, "Friday")

# 변수값 확인 출력
print(f'year : {year}, month : {month}, day : {day}')

# 함수의 변수인 지역 변수는 함수 밖에서 사용 불가
# print(f'week : {week}')    # currentDate3의 지역 변수라 사용할 수 없음

ex_glob_local_02.py

# ----------------------------------------------------------
# 전역 변수(Global Variable)와 지역 변수(Local Variable)
# - 함수 내에서 전역 변수 값 변경하고자 하는 경우는 추가 코드 필요
# - 추가 코드 : global 전역 변수명
# -> 주의 : 전역 변수 값이 언제 든지 함수로 변경이 될 수 있는 상황
#          사용 시에 주의 필요함
# ----------------------------------------------------------
# 사용자 정의 함수 -------------------------------------------
def currentDate(year, month, day):
    # year, month, day => 지역 변수
    print(f'Today : {year}/{month:0>2}/{day:0>2}')

def currentDate2(month, day):
    # month, day => 지역 변수
    # year => 전역 변수
    # year = year + 10     # '너 이거 바꾸면 전역 변수에서 에러 생겨! 자동으로 안 해줄 거야' 알림
    # 함수 내에서 전역변수 값을 변경하고자 하는 경우는 global 전역변수명 알려주기
    global year
    year = year + 10       # '전역변수 바꾸는 구나? ㅇㅋ 해줄게'
    print(f'Today : {year}/{month:0>2}/{day:0>2}')

def currentDate3(month, day, week):
    # month, day, week => 지역 변수
    # year => 전역 변수
    print(f'Today : {year}/{month:0>2}/{day:0>2}/{week}')

# 전역 변수 ---------------------------------------------------
year, month, day = 2024, 1, 8

# 함수 사용 즉 함수 호출 -----------------------------------------
print(f'year : {year}, month : {month}, day : {day}')

currentDate2(month, day)

# 변수값 확인 출력
print(f'year : {year}, month : {month}, day : {day}')

ex_glob_local_03.py

  • 13:00

ex_variable_memory.py

# ----------------------------------------------------------
# 참조형 변수 => 데이터의 주소 저장
# ----------------------------------------------------------
# 저장된 데이터 & 변수 타입 관계-----------------------------------

num = 12 # num에는 12가 아닌 12의 주소값이 저장됨
print(f'num => {id(num), type(num)}')

num = 3
print(f'num => {id(num), type(num)}')

num ="Good"
print(f'num => {id(num), type(num)}')

num1 = []
print(f'num1 => {id(num1), type(num1)}')

num2 = [11, 22.1]
print(f'num2 => {id(num2), type(num2)}')
print(f'num[0] => {id(num2[0]), type(num2[0])}')
print(f'num[1] => {id(num2[1]), type(num2[1])}')

print("==================== 값 변경 ====================")
num = "Happy"
print(f'num => {id(num), type(num)}')

num2[0]=100
print(f'num2 => {id(num2), type(num2)}') # num2[0]가 바뀌어도 num의 리스트라는 바구니는 바뀌지 않기 때문에 id(num2) 주소값 유지됨
print(f'num2[0] => {id(num2[0]), type(num2[0])}')

num2 = num1
print(f'num2 => {num2, id(num2), type(num2)}')
print(f'num1 => {num1, id(num1), type(num1)}')
# 위의 num1 주소값을 num2에 입힌것

ex_variable_memory_02.py

# ----------------------------------------------------------
# 참조형 변수 => 데이터의 주소 저장
# ----------------------------------------------------------
# 저장된 데이터 & 변수 타입 관계-----------------------------------

num = 12 # num에는 12가 아닌 12의 주소값이 저장됨
print(f'num => {id(num), type(num)}')

num = 3
print(f'num => {id(num), type(num)}')

num ="Good"
print(f'num => {id(num), type(num)}')

num1 = []
print(f'num1 => {id(num1), type(num1)}')

num2 = [11, 22.1]
print(f'num2 => {num2, id(num2), type(num2)}')
print(f'num2[0] => {num2[0], id(num2[0]), type(num2[0])}')
print(f'num2[1] => {num2[1], id(num2[1]), type(num2[1])}')

print("==================== 값 변경 ====================")
num = "Happy"
print(f'num => {id(num), type(num)}')

num2[0]=100
print(f'num2 => {id(num2), type(num2)}') # num2[0]가 바뀌어도 num의 리스트라는 바구니는 바뀌지 않기 때문에 id(num2) 주소값 유지됨
print(f'num2[0] => {id(num2[0]), type(num2[0])}')

# -------------------------앞장과 달라진 부분-----------------------

# 리스트를 다른 리스트로 변경
num1 = num2
print(f'num1 => {num1, id(num1), type(num1)}')
print(f'num2 => {num2, id(num2), type(num2)}')

num1[0]=77          # 리스트의 원소값을 바꿔도 리스트의 주소값은 유지
print(f'num1 => {num1, id(num1), type(num1)}')
print(f'num2 => {num2, id(num2), type(num2)}')
# 만약 리스트가 아닌 튜플이어도 같음

ex_glob_local_04.py

  • 오전시간의 반복 내용
  • 지역변수가 [전역변수 리스트] 내의 값을 바꾸더라도 전역변수는 리스트의 주소만 갖고 있기 때문에 [전역변수 리스트] 내의 값이 바뀐 것이 그대로 반영된다는 것을 계속 강조

ex_01.py - 교재 33장 33..1 내용

# ----------------------------------------------------------
# 지역변수 & 전역변수
# ----------------------------------------------------------

def foo():
    x=20
    print(x)  # 전역변수 아님, 이름 같더라도  지역변수 20 사용

# 전역변수 ---------------------------------------------------------
x = 10

# 함수 호출 --------------------------------------------------------
foo()
print(x) # 전역변수 x=10 사용
#---------------------------------------------------------

ex_02.py

# ----------------------------------------------------------
# 지역변수 & 전역변수
# ----------------------------------------------------------

def foo():
    x= 10
    print(x)  # 전역변수 아님, 이름 같더라도  지역변수 20 사용

# 전역변수 없음---------------------------------------------------------
# x = 10

# 함수 호출 --------------------------------------------------------
foo()
print(x) # 전역변수가 없음, 지역변수 x=10 사용불가
# #---------------------------------------------------------

ex_03.py

# ----------------------------------------------------------
# 지역변수 & 전역변수
# ----------------------------------------------------------

def foo():
    global x
    x=20
    print(x)  # 전역변수 사용하되 x=20으로 바꿈

# 전역변수 ---------------------------------------------------------
x = 10

# 함수 호출 --------------------------------------------------------
foo()
print(x) # 전역변수 x=10에서 x=20으로 바뀐 내용 사용

ex_04.py

내장함수 locals(), globals()를 통해 네임스페이스를 딕셔너리 형태로 출력 가능

# ----------------------------------------------------------
# 지역변수 & 전역변수
# ----------------------------------------------------------

def foo():
    # global x
    x=20
    print(x)  # 전역변수 사용하되 x=20으로 바꿈
    print(f'LOCALS : {locals()}') # LOCALS : {'x': 20}

# 전역변수 ---------------------------------------------------------
x = 10

# 함수 호출 --------------------------------------------------------
foo()
print(x) # 전역변수 x=10에서 x=20으로 바뀐 내용 사용

print(f'GLOBAL :{globals()}')
# 맨 뒤에 'foo': <function foo at 0x100d52160>, 'x': 20 나옴
  • 14:10

ex_func_func_01.py

색깔별로 nonlocal 단계 확인

바로 파란박스의 윗단계(빨간박스)에 nonlocal에 해당하는 x 값 없으면 그 윗단계(녹색박스)에서 찾음

# ------------------------------------------------------------
# 함수 안에 함수 정의 및 호출
# ------------------------------------------------------------
def print_hello():
    hello = "hello~!"

    def print_message():
        msg = hello + " ^^ "
        print(msg)

    print_message()
    # print(msg) 지역변수 사용 불가

# 함수 호출 ------------------------------------------------------------
print_hello()
# print_message() 접근이 안됨

def ff():
    x= 100
    def a():
        x=10                # 함수 a의 지역변수 x
        def b():
            nonlocal x
            x=20            # 함수 b의 지역변수 x

        b()
        print(x)

    a()
ff()

def foo():
    x = 10
    def test():       # test의 값으로 ( (값 10의 주소를 가진)지역변수 x의 주소)를 저장
        return x
    return test       # foo의 값으로 (test의 값인 ((값 10의 주소를 가진)지역변수 x)의 주소)를 반환

x = foo()
print(x())      # 지역변수 값을 보겠다

# 클로저를 사용하는 이유 : 지역변수에서 계속 사용하고 싶으나 전역변수로 노출하면 변경가능성이 있기 때문에 사용

ex_lambda_01.py

# ------------------------------------------------------------
# 람다 표현식 또는 람다 함수
# - 익명 함수라고도 함!
# - 짧은 코드의 함수 또는 반복에서 재사용이 많지 않은 코드의 경우 표현
# - 문법 : lambda 매개변수1, ..., 매개변수n : 표현식
# - 결과 : 매개변수를 활용한 표현식 결과 값이 lambda 그 위치에 반환됨
# ------------------------------------------------------------
def add(a, b):
    return a+b

def minus(a, b):
    return a-b

print((lambda a, b : a+b)(4,5))
print((lambda a, b : a-b)(4,5 ))

my_add = lambda a,b : a+b
my_minus = lambda a,b : a-b

print(my_add(4,5))
print(my_minus(4,5))

ex_lambda_02.py

# 리스트 안에 모든 원소를 더한 합계 출력
datas = ['1', '4', '9']
for idx, d in enumerate(datas):
    datas[idx] = int(d)

print(datas)

# => 내장함수 map()
print(list(map(int, datas)))
print(list(map(float, datas)))

# => 원소에 *100한 값을 리스트에 저장하기
def multiValue(x):
    return x*100

print(list(map(multiValue, datas)))

datas = list(map(lambda x : x*100, datas))
print(datas)

def greeting():
    print("반갑습니다.~")
greeting()

print( ( lambda: "반갑습니다.")())

ex_lambda_03.py

# ----------------------------------------------------------
# filter(함수명, 반복가능객체)
# - 조건에 맞는 데이터만 반환
# ----------------------------------------------------------
# 예) 5초과 10미만 데이터만 추출
a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]

# filter()

# def check(data):
#     return data>5 and data<10   # 연산의 결과는 True / False
#
# a = list(filter(check, a))      # filter는 True일 때만 출력
# print(a)

# import random                           # random.py 파일의 모든 변수, 함수, 클래스 가져오기
# from random import randint, random     # random.py 파일에서 randint,random 함수만 가져오기
#
# print(randint(1,10))
# print`(random())
from functools import reduce

def f(x,y):
    return x+y

print(reduce(f,a))

print(reduce(lambda x, y: x+y, a))
  • 15:30?
    • 재귀함수 - 교재로만 봄
# 연산자, 데이터 즉 숫자
 

ex_program_01.py

# ---------------------------------------------------------------
# 나의 프로그램 - 계산기
# [ 계산기 ]
# 1. 입력
# 2. 덧셈
# 3. 뺄셈
# 4. 곱셈
# 5. 나눗셈
# 6. 기록
# 7. 검색
# 8. 삭제
# 9. 종료
# ---------------------------------------------------------------
# 사용자 정의 함수 --------------------------------------------------
# 함수 기능 : 연산결과 리스트에서 검색어에 해당하는 데이터만 출력
# 함수 이름 : searchResult
# 매개 변수 : search
# 함수 결과 : none
# ---------------------------------------------------------------
def searchResult(search):
    count = 0
    for calc in calcList:
        if search in calc:   # search in calcList 가 되면 모든 문자가 일치할 때만 출력됨
            print(calc)
            count += 1
    print(f"{count}의 검색 결과가 있습니다." if count else "검색결과가 없습니다.")

calcList = []

while True :
    print("[나의 계산기]")
    print(" 1. 입   력")
    print(" 2. 덧   셈")
    print(" 3. 뺄   셈")
    print(" 4. 곱   셈")
    print(" 5. 나 눗 셈")
    print(" 6. 기록보기")
    print(" 7. 검    색")
    print(" 8. 삭    제")
    print(" 9. 종    료")

    choice = input("메뉴 선택 : ")

    if choice.isdecimal():
        if choice == '1':
            data = input("2개의 정수를 입력해주세요(예: 10 20) : ")
            n1, n2 = list(map(int, data.split(" ")))
        elif choice == '2':
            calcList.append(f'======== 덧셈 결과 : {n1}+{n2}={n1+n2} =========\n')
            print(f'{calcList[-1]}\n')
        elif choice == '3':
            calcList.append(f'======== 뺄셈 결과 : {n1}-{n2}={n1-n2} =========\n')
            print(f'{calcList[-1]}\n')
        elif choice == '4':
            calcList.append(f'======== 곱셈 결과 : {n1}*{n2}={n1*n2} =========\n')
            print(f'{calcList[-1]}\n')
        elif choice == '5':
            calcList.append(f'======== 나눗셈 결과 : {n1}/{n2}={n1/n2 if n2 else "0으로 나눌수 없음"} =========\n')
            print(f'{calcList[-1]}\n')
        elif choice == '6':
            print("계산기록 보기")
            calcList.sort(reverse=True)
            for calc in calcList:
                print(calcList)
        elif choice == '7':
            search=input("검    색 : ")
            searchResult(search)
            print("=========================\n")

        elif choice == '8':

            calcList.clear()
            print("모든 계산 기록이 삭제되었습니다.")
        elif choice == '9':

            print("프로그램을 종료합니다.")
            break
        else:
            print("메뉴 1 ~ 9까지 선택 가능합니다.")

    else:
        print("없는 메뉴 입니다.")

# ---------------------------------------------------------------
a = ["======== 뺄셈 결과 : 10-20=-10 ========="]

print( "덧셈" in a)
print( "덧셈" in "덧셈 : 1+3 = 12")

오늘 과제 : 개인 프로젝트 만들기!

profile
갈림길인 줄 알았는데 알고보니 직진

0개의 댓글