Language/Python

231116 Python 위치지정방식, 이름지정방식, 전역변수, 지역변수, 모듈, 외부 파일

잇꼬 2023. 11. 20. 19:04
728x90
반응형
SMALL

# **kwargs(keyword argument) : 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="홍", email="gilldong@itwill.com")


# 문자열은 문자열 표현식으로 작성

info = {"first_name":"길동", "last_name":"홍", "email":"gilldong@itwill.com"}
info

dic_f(info) # 오류발생
dic_f(**info) # 딕션러리 자료형으로 표현하기


# 사칙연산

def f1(arg1, arg2):
    return arg1 + arg2 # 함수안에서 return 문을 만나는 순간 종료된다
    return arg1 * arg2 # 무의미한 return문

f1(10,20)

def f1(arg1, arg2):
    return arg1 + arg2, arg1 * arg2  # 튜플 형태로 계산 가능

f1(10,20)

divmod(13,2)

def f2(arg1, arg2):
    return arg1 // arg2, arg1 % arg2

f2(13,2)

def f3(arg1, arg2):
    if arg2 == 0:
        # ps/sql return 문 종료 
        return # 값이 없는 return문은 함수를 종료하는 의미이다.
    else:
        return arg1 / arg2



# 나눗셈 에서 0 을 계산은 불가

10/0

f3(10, 2)
f3(10, 0)



# 위치지정방식, 이름지정방식 표현

def f4(arg1, arg2, arg3="M"): # arg3="M" 으로 기본값 표현
    print("이름 : ",arg1)
    print("나이 : ",arg2)
    if arg3 == "M":
        print("성별 : 남자")
    else:
        print("성별 : 여자")
    
f4("홍길동", 20) # 실제매개변수 : 형식매개변수에 위치적으로 대응되게 입력된다
f4("홍제인", 25, "F") # PS/SQL 위치지정방식 
f4(arg2=25, arg3="F", arg1="홍제인") # 이름지정방식, 위치무방하다
f4("홍제인", arg2=25, arg3="F") # 위치지정, 이름지정방식



# 이름지정방식 뒤에는 무조건 이름지정방식만 사용 

f4(arg1="홍제인", 25, "F") # 오류방식, PL/SQL 과 동일한 오류



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

g_x = 10

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

f5(20)

g_x = 10 # 전역변수

def f6(arg):
    g_x = 100 # 지역변수, 우선순위
    print("형식매개변수값 : ",arg)
    print("지역변수값 : ",g_x)

g_x
f6(30)

g_x = 10 # 전역변수

def f7(arg):
    l_x = 100 # 지역변수, 우선순위
    print("형식매개변수값 : ",arg)
    print("지역변수값 : ",l_x)

g_x


# 오류발생

l_x # 함수내에 선언되어 이쓴 지역변수는 함수 바깥쪽에서 사용할 수 없다.

f7(30)


# 함수내에서 전역변수를 수정하고 싶을때, 함수내에서 'global 변수명' 지정

g_x = 10 # 전역변수(global 변수)

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

f8(500)
print(g_x)


# 이전의 값을 누적하고 싶을때

def add(arg): # 누적합
    total = 0
    total += arg
    return total

add(2)
add(8)


# 이전의 값을 갖고 누적합 구하기

g_total = 0 # 글로벌변수 선언

def add(arg): 
    global g_total
    g_total += arg
    return g_total

add(2)
add(8)


# 사용설명서 같음, 수행하지 말아야 할 곳

if __name__ == "_main_": # "_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)


# stats.py 파일 생성후
■ 모듈 사용 (관리의 편리성)
# PL/SLQ 에서는 package 
c:\\mypython\\stats.py #모듈명

# list 자료형

import sys
sys.path

sys.path.append("C:\\mypython")
sys.path
sys.path.remove("C:\\mypython")

import stats

stats.sum(1,2,3,4,5)
stats.mean(1,2,3,4,5)
stats.variance(1,2,3,4,5)
stats.stddev(1,2,3,4,5)

dir()


# del stats

dir()

from stats import *
dir()

sum(1,2,3,4,5)
mean(1,2,3,4,5)
variance(1,2,3,4,5)
stddev(1,2,3,4,5)


■ 날짜

import datetime


# 현재 년월일, date

datetime.date.today()


# PL/SQL timestamp 형식

datetime.datetime.now()

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

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

y = datetime.datetime.now()
y
y.year
y.month
y.day
y.hour
y.minute
y.second
y.microsecond # 속성
y.date() # method
y.time()
y.weekday() # 0 = 월요일 ~ 6=일요일


# 숫자 -> 문자형, indexing

'월화수목금토일'[y.weekday()]+'요일'


# 특정한 날의 요일

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

 

# PL/SQL -> to_char(sysdate, day)

toweekday()


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

import datetime

d = datetime.datetime.now()
d
d.strftime("%x") # 현 날짜 : 월/일/년
d.strftime("%X") # 현 시간 : 시:분:초
d.strftime("%Y") # 현재 년도 4자리
d.strftime("%y") # 현재 년도 2자리
d.strftime("%m") # 현재 월
d.strftime("%d") # 현재 일
d.strftime("%e")
d.strftime("%B") # 현재 영문자 월
d.strftime("%b") # 현재 영문자(약어) 월
d.strftime("%H") # 현재 시/24시간
d.strftime("%I") # 현재 시/12시간
d.strftime("%I %p") # AM PM 구분
d.strftime("%p")
d.strftime("%M") # 시간 분
d.strftime("%S") # 현재 초
d.strftime("%A") # 현재 요일(대문자)
d.strftime("%a") # 현재 요일(약어)
d.strftime("%c") 
d.strftime("%w") # 현재 숫자 요일, 0:일 ~ 6:토
d.strftime("%j") # 누적날짜
d.strftime("%U") # 누적주(일요일시작)
d.strftime("%W") # 누적주(월요일시작)
d.strftime("%z")

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

import datetime

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).strftime("%w")


# 날짜 - 날짜 = 일수

datetime.date(2023,11,16) - datetime.date(2023,10,5)
(datetime.date(2023,11,16) - datetime.date(2023,10,5)).days


# datetime.timedelta(days=일수) 
# 날짜 + 일수 = 날짜

datetime.date(2023,11,16) + datetime.timedelta(days=100)


# 날짜 - 일수 = 날짜

datetime.date(2023,11,16) + datetime.timedelta(days=-100)
datetime.date(2023,11,16) - datetime.timedelta(days=100)


# 날짜 시간 + 시간(h) = 날짜 시간 

datetime.datetime(2023,11,16,15,30,30) + datetime.timedelta(hours=3)


# 날짜 시간 + 분(m) = 날짜 시간 

datetime.datetime(2023,11,16,15,30,30) + datetime.timedelta(minutes=30)


# 날짜 시간 + 초(s) = 날짜 시간 

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)


# 날짜 시간 + 주(week) = 날짜 시간 

datetime.datetime(2023,11,16,15,30,30) + datetime.timedelta(weeks=5)


# 1970년 1월 1일 0시 0분 0초를 기준으로 지난 시간을 초단위로 리턴해주는 기능
# 데이터 처리하는 시간을 확인할 때 이용.

import time
time.time()

time.localtime()
time.localtime().tm_year
time.localtime().tm_mon
time.localtime().tm_mday
time.localtime().tm_hour
time.localtime().tm_min
time.localtime().tm_sec
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()


# time.sleep(시간) : 대기시간을 주고 싶을때

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



# 끝나는 시간

end = time.time()

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

import calendar

print(calendar.calendar(2023))
print(calendar.calendar(2024))
calendar.prcal(2024)
calendar.prmonth(2024, 3)

calendar.weekday(2023, 11, 16) # 요일, 0:월 ~ 6:일

calendar.prmonth(2023, 11)
calendar.monthrange(2023, 11) # 시작요일, 마지막 일자

calendar.prmonth(2023, 12)
calendar.monthrange(2023, 12)
calendar.monthrange(2023, 12)[0] # 시작요일
calendar.monthrange(2023, 12)[1] # 마지막 일자


■ 파일 읽고, 쓰기
# file 생성

file = open("C:/data/test.txt", "w") # "w" : 쓰기모드로 파일을 열겠습니다.


# 기존 파일이 있다면 덮어쓰기로 파일 열어주니, 주의하자

file
for i in range(1, 11):
    txt = "{} 오늘 하루도 열심히 공부하자!!\n".format(i)
    file.write(txt)
    
file.close()


# file 생성

file = open("C:/data/test.txt", "a")


# "a" : append 모드로 파일을 열겠습니다. 
# 기존 파일이 있으면 해당 내용을 제일 뒤에 추가

file
for i in range(21, 31):
    txt = "{} 오늘 하루도 열심히 공부하자!!\n".format(i)
    file.write(txt)
    
file.close()


# 읽기모드

file = open("C:/data/test.txt", "r") # "r" : 읽기모드로 파일을 열겠습니다. 
file.readline() # 한줄씩 읽어들인다.    
file.close()


# 읽기모드, 출력하기

file = open("C:/data/test.txt", "r") # "r" : 읽기모드로 파일을 열겠습니다. 
while True :
    data = file.readline()
    if not data:
        break
    print(data, end='')
file.close()


# 읽기모드, list 담아 출력하기

new =[]

file = open("C:/data/test.txt", "r") # "r" : 읽기모드로 파일을 열겠습니다. 
while True :
    data = file.readline()
    if not data:
        break
    new.append(data.rstrip())
file.close()

new


# readlines() 

file = open("C:/data/test.txt", "r") # "r" : 읽기모드로 파일을 열겠습니다. 
data = file.readlines() # 모든 행을 한번에 읽어 들인다.
file.close()

data

file = open("C:/data/test.txt", "r") # "r" : 읽기모드로 파일을 열겠습니다. 
data = file.readlines() # 모든 행을 한번에 읽어 들인다.
file.close()

data

new = []
for i in data:
    new.append(i.rstrip())
    
new

file = open("C:/data/test.txt", "r") 
data = file.read() # 모든 행을 하나의 문자열로 읽어들인다.
file.close()

len(data)
data.replace('\n', ' ')
728x90
반응형
LIST