야간 투잡 할 때도 이 정도로 오래 자진 않았는데.. 요즘 겁나 꿀잠 자네. 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)}')
# 사용자
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
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 나옴
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))
# 연산자, 데이터 즉 숫자
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")
오늘 과제 : 개인 프로젝트 만들기!