[문제] 여러 숫자를 인수값으로 받아서 합과 평균을 출력하는 aggF함수를 생성하세요.
# 가변변수

def aggF(*num):
    
    sum = 0

    for i in num:
        sum += i
    
    avg = sum / len(num)
    
    print('합 :',sum)
    print('평균 :',avg)
# 가변변수가 아닐경우

def aggF(num):
    
    sum = 0

    for i in num:
        sum += i
    
    avg = sum / len(num)
    
    print('합 :',sum)
    print('평균 :',avg)
<호출>
aggF(1,2,3,4,5,6,7,8,9,10)
또는
aggF(*(1,2,3,4,5,6,7,8,9,10))
<호출>
aggF(1,2,3,4,5,6,7,8,9,10)      # 오류
aggF([1,2,3,4,5,6,7,8,9,10])
aggF((1,2,3,4,5,6,7,8,9,10))

 

**kwargs(keyword arguments)
 : key - value 형태로 인수값을 받을 때 사용, 딕셔너리형 수행할 때 사용

def dic_f(**args):
    for k, v in args.items():
        print('{} : {}'.format(k,v))
<호출>
dic_f(first_name='길동',last_name='홍')    # 
dic_f(first_name:'길동',last_name:'홍')    # 오류, 여기서는 (:)콜론 사용안됨
dic_f(first_name='길동',last_name='홍',email='aaa@itwill.com')

# 딕셔너리 형태로 입력 시
info = {'first_name':'길동','last_name':'홍','email':'aaa@itwill.com'}
dic_f(**info)

 

def f1(arg1, arg2):
    return arg1 + arg2    # 함수안에서 return문을 만나는 순간 종료된다.
    return arg1 * arg2    # 오류가 안나도 미작동
f1(10, 20)        # 30

 

def f2(arg1, arg2):
    return arg1 + arg2, arg1 * arg2        # 리턴 2개 이상
f2(10, 20)        # (30, 200)    = divmod(10,2)

 

def f3(arg1, arg2):
    if arg2 == 0:
        return      # 값이 없는 리턴 = 종료
    else:
        return arg1/arg2
f3(10, 2)        # 5.0
f3(10, 0)        # 10/0 = 0이 들어오면 그냥 종료

 

def f4(arg1, arg2, arg3='M'):     # 기본값 설정
    print('이름 :',arg1)
    print('나이 :',arg2)
    if arg3 == 'M':
        print('성별 :',arg3)
    else:
        print('성별 :',arg3)
f4('홍길동',20)        # 실제매개변수는 형식매개변수에 위치적으로 대응되게 입력된다.
f4('홍제인',20,'F')
f4(arg1='홍제인',arg3='F',arg2= 25)    # 이름지정방식, 순서무관
f4('홍제인',arg3='F',arg2= 25)         # 위치지정 + 이름지정 가능
f4(arg1='홍제인',25,'F')               # 오류, 이름지정 + 위치지정 불가






전역변수(Global Variable) : 프로그램 종료될때까지 어디서든지 사용할 수 있는 변수

지역변수(Local Variable) : 함수안에서만 사용되는 변수

g_x = 10         # 전역변수

def f5(arg):
    print('형식매개변수값 :',arg)
    print('전역변수값 :',g_x)

f5(20)

형식매개변수값 : 20
전역변수값 : 10
g_x = 10        # 전역변수

def f6(arg):
    g_x = 100   # 지역변수 : 전역변수와 이름이 동일하면 로컬 우선
    print('형식매개변수값 :',arg)
    print('지역변수값 :',g_x)

f6(30)

형식매개변수값 : 30
지역변수값 : 100
g_x = 10        # 전역변수

def f7(arg):
    l_x = 100
    print('형식매개변수값 :',arg)
    print('지역변수값 :',l_x)


g_x
l_x          # 오류 : 함수 내 선언되어있는 지역변수는 함수 바깥쪽에서 사용할 수 없다.
f7(30)

형식매개변수값 : 30
지역변수값 : 100
g_x = 10        # 전역변수

def f8(arg):
    global g_x      #함수안에서 전역변수를 사용한다고 지정하면 함수내에서 값 수정 가능
    print('형식매개변수값 :',arg)
    print('수정전 전역변수값 :',g_x)
    g_x = 200
    print('수정후 전역변수값 :',g_x)

f8(500)

형식매개변수값 : 500
수정전 전역변수값 : 10
수정후 전역변수값 : 200

 

def add(arg):
    total = 0
    total += arg
    return total
g_total = 0

def add(arg):
    global g_total
    g_total += arg
    return g_total
add(2)      # 2
add(8)      # 8 : 누적이 안됨
add(2)      # 2
add(8)      # 10

 


 

[문제] 함수 생성하세요.
합 = 관측값의 합
평균 = 관측값의 합 / 관측값의 수
편차 = 관측값 - 평균
편차제곱합 = 편차**2 + 편차**2
분산 = 편차제곱합 / 관측값의 수 - 1 (자유도)
표준편차 = math.sqrt(분산)
import math                         # 표준편차 함수 사용으로 선언

def sum(*arg):                      # 합계 
    total = 0
    for i in arg:
        total += i
    return total

def mean(*arg):                     # 평균
    return sum(*arg) / len(arg)

def variance(*arg):                # 분산
    total = 0
    avg = mean(*arg)
    for i in arg:
        total += (i - avg)**2       # 편차제곱합
    return total / (len(arg) - 1)

def stddev(*arg):                   # 표준편차
    return math.sqrt(variance(*arg))


# 사용설명서 역할. 모듈에 포함하지만 import로 사용 시 실행안하게 함
if __name__ == '__main__':
    sum(1,2,3,4,5)      # 합
    mean(1,2,3,4,5)     # 평균
    variance(1,2,3,4,5) # 분산
    stddev(1,2,3,4,5)   # 표준편차

↓ 연결

■ 모듈 사용
관련성있는 함수, 변수를 모아둔 곳 = 패키지
메모장 - 파일로 저장 - ***.py

C:\\mypython\\stats.py              # 파일명 = 모듈명
import sys

sys.path                            # 패치목록

sys.path.append('C:\\mypython')     # 패치추가

sys.path.remove('C:\\mypython')     # 오등록 삭제

sys.path

import stats
또는
from stats import *

stats.mean(1,2,3)

dir()
del stats

 




■ 날짜

import datetime

datetime.date.today()   # datetime.date(2023, 11, 16)
                        # date

datetime.datetime.now() # datetime.datetime(2023, 11, 16, 14, 45, 53, 875680)
                        # timestamp

datetime.date.today().year  # 2023

x = datetime.date.today()
x.year
x.month
x.day

y = datetime.datetime.now()
y.year
y.month
y.day
y.hour
y.minute
y.second
y.microsecond   # 속성
y.date()        # 메소드
y.time()

y.weekday()     # 0 월요일 ~ 6 일요일
'월화수목금토일'[y.weekday()] + '요일'   # 문자인덱싱

def toweekday():
    import datetime
    return '월화수목금토일'[datetime.datetime.now().weekday()] + '요일'
toweekday()

 

strftime : 날짜를 문자로 추출하는 함수
date -> char

d = datetime.datetime.now()        # 대소문자 구분
d.strftime('%x')    # 월/일/년
d.strftime('%X')    # 시:분:초
d.strftime('%y')    # 연도 2자리
d.strftime('%Y')    # 연도 4자리
d.strftime('%m')    # 월
d.strftime('%d')    # 일
d.strftime('%B')    # 월 영문자
d.strftime('%b')    # 월 영문자 약어
d.strftime('%H')    # 시
d.strftime('%M')    # 분
d.strftime('%S')    # 초
d.strftime('%I')    # 시간을 12시간으로 환산
d.strftime('%p')    # AM, PM
d.strftime('%A')    # 요일 영문자
d.strftime('%a')    # 요일 영문자 약어
d.strftime('%w')    # 0 월요일 ~ 6 일요일
d.strftime('%c')    # 'Thu Nov 16 14:54:54 2023'
d.strftime('%j')    # 누적날짜
d.strftime('%U')    # 누적주(일요일시작)
d.strftime('%W')    # 누적주(월요일시작)

# 분기
def month_to_quarter(month):
    if month in [1,2,3]:
        return 'Q1'
    elif month in [4,5,6]:
        return 'Q2'
    elif month in [7,8,9]:
        return 'Q3'
    elif month in [10,11,12]:
        return 'Q4'
    else:
        return
month_to_quarter(datetime.datetime.now().month)

 

strptime : 문자로된 날짜를 날짜로 변환하는 함수
char -> date

datetime.datetime.strptime('2023-10-05 09:30:30','%Y-%m-%d %H:%M:%S')

datetime.datetime(2023,10,5,9,30,30)

d = datetime.date(2023,10,5)
t = datetime.time(9,30,30)
datetime.datetime.combine(d, t)

datetime.datetime.combine(d,t).strftime('%c')


# 날짜 - 날짜 = 일수
datetime.date(2023,11,16) - datetime.date(2023,10,5)    # days=42
(datetime.date(2023,11,16) - datetime.date(2023,10,5)).days     #42


# 날짜 + 일수 = 날짜
datetime.date(2023,11,16) + datetime.timedelta(days=100)    # 2024, 2, 24


# 날짜 - 일수 = 날짜
datetime.date(2023,11,16) - datetime.timedelta(days=100)    # 2023, 8, 8
datetime.date(2023,11,16) + datetime.timedelta(days=-100)


# 날짜 시간 + 시간 = 날짜 시간
datetime.datetime(2023,11,16,15,30,30) + datetime.timedelta(hours=3)


# 날짜 시간 + 분 = 날짜 시간
datetime.datetime(2023,11,16,15,30,30) + datetime.timedelta(minutes=3)


# 날짜 시간 + 초 = 날짜 시간
datetime.datetime(2023,11,16,15,30,30) + datetime.timedelta(seconds=300)


# 날짜 시간 + 시,분,초 = 날짜 시간
datetime.datetime(2023,11,16,15,30,30) + datetime.timedelta(hours=2,minutes=120,seconds=300)


# 날짜 시간 + 주 = 날짜 시간
datetime.datetime(2023,11,16,15,30,30) + datetime.timedelta(weeks=5)



import time
1970-01-01 0:0:0 기준으로 지난 시간을 초단위로 리턴해주는 기능

time.time()

time.localtime()
time.localtime().tm_wday    # 0 월요일 ~ 6 일요일
time.localtime().tm_yday    # 누적일
time.localtime().tm_isdst   # 서머타임이면 1, 아니다 0, 모른다 -1
...


time -> char
time.strftime('%y-%m-%d %h:%M:%S',time.localtime())

char -> time
time.strptime('2023-11-16 16:00:00','%Y-%m-%d %H:%M:%S')

 

# 작업이 걸리는 시간
start = time.time()

for i in range(10):
    print(i)
    time.sleep(1)       # 대기시간 초단위

end = time.time()

print('time slapsed :',end - start)

 

import calendar

calendar.calendar(2024)
print(calendar.calendar(2024))
calendar.prcal(2024)
calendar.prmonth(2024,8)        # (년도,월)
calendar.weekday(2023,11,16)    # 0 월요일 ~ 6 일요일
calendar.monthrange(2023,11)    # (2, 30) 시작요일,월 마지막일자
calendar.monthrange(2023,11)[1] # 30 , 튜플에서 종료일만 추출




■ 파일 읽고 쓰기

file = open('C:\\data\\test.txt','w')
또는
file = open('C:/data/test.txt','w')
...작업...
file.close()


# w : 쓰기모드로 파일을 연다.
# 기존에 파일이 있으면 덮어쓰기로 파일을 연다. 

file = open('C:/data/test.txt', 'w')

for i in range(1,11):
    txt = '{} 오늘 하루도 열심히 공부하자!!\n'.format(i)
    file.write(txt)     # 파일에 덮어쓰기

file.close()

 

# a : append 모드로 파일을 연다.
# 기존 파일이 있으면 제일 뒤에 추가

file = open('C:\\data\\test.txt', 'a')

for i in range(21,31):
    txt = '{} 오늘 하루도 열심히 공부하자!!\n'.format(i)
    file.write(txt)     # 파일에 쓰기

file.close()

 

r : 읽기모드

file = open('C:\\data\\test.txt', 'r')

file.readline()     # 한줄씩 읽기
file.close()
file = open('C:\\data\\test.txt', 'r')

while True:        # 얼마나 있는지 모르니 무제한 반복으로 사용
    data = file.readline()
    if not data:
        break       # 데이터가 없으면(끝나면) 나가기
    print(data)     # \n 포함되어있을 경우 공백줄이 생김
file.close()
file = open('C:\\data\\test.txt', 'r')

while True:
    data = file.readline()
    if not data:
        break
    print(data, end='')        # \n 공백 제거
file.close()
new = []        # 리스트에 넣기
file = open('C:\\data\\test.txt', 'r')

while True:
    data = file.readline()
    if not data:                # 데이터에 값이 없으면 종료
        break
    new.append(data.rstrip())   # 오른쪽 끝에 \n 공백 제거
file.close()


new
file = open('C:\\data\\test.txt','r')

data = file.readlines()         # 모든행을 한번에 읽기

file.close()

new = []
for i in data:
    new.append(i.rstrip())      # 오른쪽 끝에 \n 공백 제거
    
new
file = open('C:\\data\\test.txt','r')

data = file.read()              # 모든행을 하나의 문자열로 읽기 = 가로 연속으로 출력

file.close()

len(data)                       # 420글자
data.replace('\n',"")           # 오른쪽 끝에 \n 공백 제거

 




**kwargs(keyword arguments) 딕셔너리형 : (**arg)

return arg1 + arg2, arg1 * arg2        # 리턴 2개 이상 -> 튜플타입

 

전역변수(Global Variable) : 프로그램 종료될때까지 어디서든지 사용할 수 있는 변수
지역변수(Local Variable) : 함수안에서만 사용되는 변수

global x      #함수안에서 전역변수를 사용한다고 지정하면 함수내에서 값 수정 가능

 

# 사용설명서 역할. 모듈에 포함하지만 import로 사용 시 실행안하게 함
if __name__ == '__main__':

모듈 : 관련성있는 함수, 변수를 모아둔 곳 = 패키지

 

import datetime 날짜시
strftime : 날짜를 문자로 추출하는 함수
strptime : 문자로된 날짜를 날짜로 변환하는 함수

y.weekday()     # 0 월요일 ~ 6 일요일
strftime('%w')
...

import time : 1970-01-01 0:0:0 기준으로 지난 시간을 초단위로 리턴해주는 기능
time.strftime
time.strptime

sleep(1)       # 대기시간 초단위

import calendar : 달력

 

file = open()
file.close()

w : 덮어쓰기
a :  append 모드, 맨 뒤에 추가
r : 읽기모드

file.write(txt)     # 파일에 덮어쓰기

readline()     # 한줄씩 읽기
readlines()         # 모든행을 한번에 읽기
read()              # 모든행을 하나의 문자열로 읽기 = 가로 연속으로 출력