알쏭달쏭 공부한거 쓰기

7-10 본문

파이썬 -23여름학기(ㄱㅎㅈ)

7-10

elec_cy 2023. 7. 10. 16:10
python_day11 (1).pdf
1.66MB

 
 
 
 
#GUI 복습
enter누르면 바로 결과가 나오도록 만들기

from tkinter import*

def clicked():
    r.config(text=f'10년 후 {int(e.get())+10} 입니다.')
def input_return(event):#매개변수가 반드시 있어야한다.
    r.config(text=f'10년 후 {int(e.get())+10} 입니다.')

window=Tk()
Label(window, text='나이:').grid(row=0, column=0)
e=Entry(window, width=30)
e.grid(row=0, column=1)
#엔트리에서 엔터를 입력할 때 결과가 출력되게 하자!
#콜백함수를 bind() 메소드를 통해 연결하자!
#e.bind(이벤트, 콜백함수명)
e.bind('<Return>',input_return)

bt=Button(window, text='완료',bg='blue',fg='white',command=clicked)
bt.grid(row=1, column=0,columnspan=2,sticky=E+W+N+S)

r=Label(window, text='')
r.grid(row=2,column=1)



window.mainloop()    

#완료 버튼을 누르는게 불편하다 enter만 치면 그냥 바로 결과가 나왔으면 좋게싿.
#callback을 entry에 연결해야 한다.

 
 

버튼이 열이 살짝 안맞는데 이걸 표현하는 방법
버튼을 프레임에다 붙여서 프레임을 넣기.

from tkinter import *

def to_cel1(event): 
    fah = float(entry1.get())
    entry2.delete(0, END)
    entry2.insert(0, (fah-32)*5/9)
    
def to_cel(): 
    fah = float(entry1.get())
    entry2.delete(0, END)
    entry2.insert(0, (fah-32)*5/9)
def to_fah1(event): 
    cel = float(entry2.get())
    entry1.delete(0, END)
    entry1.insert(0, cel*9/5+32)
def to_fah(): 
    cel = float(entry2.get())
    entry1.delete(0, END)
    entry1.insert(0, cel*9/5+32)
    
window = Tk()

label1 = Label(window, text = '화씨')
label2 = Label(window, text = '섭씨')
label1.grid(row = 0, column = 0)
label2.grid(row = 1, column = 0)

entry1 = Entry(window)
entry2 = Entry(window)
entry1.grid(row = 0, column = 1)
entry2.grid(row = 1, column = 1)
entry1.bind('<Return>',to_cel1)
entry2.bind('<Return>',to_fah1)

#앤트리에서 엔터로 결과를 받아오려면 바인드해야함. return은 엔터로 엔터를 누르면 뒤에 함수를 실행하겠다.

#버튼이 2개 포함된 프레임을 넣겠다.> 열이 살짝 안맞게 배치 할때
frame = Frame(window)

to_fah_btn = Button(frame, text = '화씨->섭씨', command = to_cel)
to_cel_btn = Button(frame, text = '섭씨->화씨', command = to_fah)

to_fah_btn.pack(side = LEFT)
to_cel_btn.pack(side = LEFT)
#팩은 위에서 아래도 붙여지니까 \
#to_fah_btn.grid(row=0, column=0)>도 가능
frame.grid(row = 2, column = 0, columnspan = 2)

window.mainloop()


#그리드랑 팩이 혼용이 안되는데 프레임 안에서는 팩이지만 윈도우 전체적으로 봤을때는 그리도 되어 있으므로 가능하다.

1)entry에 callback함수 연결하기
2)frame으로 붙이기+ grid와 pack이 같이 이용되는 경우 설명
 
시험칠 때는 pack이나 그리드 둘 중 하나만 써도 되도록하게 해줌.!
 
 
 
#datetime모듈, time 모듈
-date time모듈 >datetime 클래스,  timedelta 클래스  2개 공부
-날짜와 시간 모듈 datetime
• 날짜와 시간에 관한 기능을 제공하고 조작할 수 있는 모듈
 
import datetime as dt
dt.datetime.now()
현재 시간을 알려줌
속성에 접근 가능.
년도 a.year
월 a.month
일 a.day
시간 a.hour/a.minute
now을 이용해서 특정날 저장도 가능 (시간을 지정을 안해서 0시 0분 0초)

>>> import datetime as dt
>>> dt.datetime.now()
datetime.datetime(2023, 7, 10, 13, 45, 53, 814473)
>>> a=dt.datetime.now()
>>> a
datetime.datetime(2023, 7, 10, 13, 46, 4, 447930)
>>> a.year
2023
>>> a.hour
13
>>> a.minute
46
>>> type(a)
<class 'datetime.datetime'>
>>> first_day=dt.datetime(2023,6,23)
>>> first_day.year
2023

>>> first_time.hour
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'first_time' is not defined
#없으면 오류

개별적 접근 가능
변경하고 싶으면 replace메소드 이용하면 된다. 

>>> first_day
datetime.datetime(2023, 6, 23, 0, 0)
>>> first_day.replace(month=7)
datetime.datetime(2023, 7, 23, 0, 0)
>>> first_day
datetime.datetime(2023, 6, 23, 0, 0)
#여전이 그대로음 바꾸고 싶으면 다시 대입을 해서 저장을 해야한다.
>>> first_day=first_day.replace(month=7)
>>> first_day
datetime.datetime(2023, 7, 23, 0, 0)

print(이름)>__str__호출
 
이름>__repre __호출..이거 뭐였지ㅣ>> re학숩,,하숑

>>> print(first_day)
2023-07-23 00:00:00
>>> first_day
datetime.datetime(2023, 7, 23, 0, 0)

from datetime import dateime
datetime 모듈 중에서 datetime 클래스를 가지고 오겠다.
 

간격이기에 속성에 s가 붙는다. 

import datetime as dt
def x_mas():
    #25년 크리스마스 생성
    x_mas=dt.datetime(2025,12,25) 
    now=dt.datetime.now() #현재 생성
    print(now)
    gap=x_mas-now #날짜 간의 차이는 timedelta 시간 간격의 자료형으로 들어간다. 
    print(gap)
    print(gap.days,'주',gap.days//7,gap.seconds,gap.seconds//3600)
    print(f'{x_mas.year}년 크리스마스 까지는 {gap.days}일 {gap.seconds//3600}시간 남았습니다.')
    #//3600하면 왜 9시간 밖에 안되지,,,,, 응,,, 9시간 뒤에 크리스마스..?
    
#지금으로부터 5주 후 날짜
def after_5weeks():
    today=dt.datetime.now() #today는 datetime자료형
    after_5w=today+dt.timedelta(weeks=5)#5주의 간격을 의미한다 #간격인자로 쓰일때는 weeks사용 가능
    #after_5w의 자료형은 datetime 자료형이다. >years가 아니라 그냥 단수로 작성
    print(f'{today}로부터 5주 후는 {after_5w.year}년 {after_5w.month}월 {after_5w.day}일입니다.')
after_5weeks()

https://colab.research.google.com/drive/1nsVKRWkgmDhnJaFnAwGFIFcB0q4BGWlo?usp=sharing

Day_11.ipynb

Colaboratory notebook

colab.research.google.com

import datetime as dt
def new_y():
    today=dt.datetime(2019,8,29)
    n=dt.datetime(2036,1,1)
    gap=n-today
    print(f'{n.year}년 새해 까지는 {gap.days}일 {gap.seconds//3600}시간 남았습니다.')
new_y()
#2036년 새해 까지는 5969일 0시간 남았습니다.

def birth():
    today=dt.datetime.now()
    b=dt.datetime(2024,1,6)
    gap=b-today
    print(f'{b.year}년 생일 까지는 {gap.days}일 {gap.seconds//3600}남았습니다.')
birth()
#2024년 생일 까지는 179일 9남았습니다.


#gt가 구현되어 있어서 대소관계 비교를 할 수 있다.
def after_test():
    today=dt.datetime.now()
    children_day=dt.datetime(2023,5,5)
    
    if today>children_day:
        print('올해 어린이날은 지났습니다.')
    elif today==children_day:
        print('오늘이 어린이날입니다.')
    else:
        print('올해 어린이날이 다가옵니다.')
        
    #if today-children_day>0 이건 자료형이 달라서 비교가 안된다. 왼쪽은:timedelta  오른쪽 int>> 그럼 int(today-children_day)는 안되지만. int((today-children_day).days)는 된다.     
    #today=dt.datetime.now()
    #dat_7/10=dt.datetime(2023,7,10)
    
    #오늘이 7/10일인데 둘이 비교하면 초시간 때문에 오늘이 지난 걸로 되낟.
    #> 오늘걸  만들고 년도, 월,일만 따서 다시 만들어서 비교하거나 , replace를 통해 0시 0초로 만들기, 다시말해, 시간 부분은 다 없애주는 작업이 필요한다. 
    
after_test()
# 올해 어린이날은 지났습니다.

def f_m():
    fyear,fmonth,fday=[int(x) for x in input('처음 사귄 연도와 월, 일을 입력하시오:').split()]
    
    first=dt.datetime(fyear,fmonth,fday)
    meet100=first+dt.timedelta(days=99) #오늘 포함 100일 이니까 #날짜에다가 간격 더하기
    
    print(f'100일 기념일은: {meet100.year}년 {meet100.month}월 {meet100.day}일입니다.')


def to_xmas():
    fyear,fmonth,fday=[int(x) for x in input('오늘 날짜:').split()]
    print(f'오늘은{fyear}년 {fmonth}월 {fday}일입니다.')
    today=dt.datetime(fyear,fmonth,fday)
    x_mas=dt.datetime(fyear,12,25)
    '''
    if today<x_mas:
        gap=x_mas-today
        print(f'다음 크리스마스까지 {gap.days}일 남았습니다.')
    elif today==x_mas:
        print('오늘입니다.')
    else:
        x_mas=dt.datetime(fyear+1,12,25)
        #x_mas=x_mas.replace(year=fyear+1)
        gap=x_mas-today
        print(f'다음 크리스마스까지 {gap.days}일 남았습니다.')
    '''
    if x_mas<today:
        x_mas=x_mas.replace(year=fyear+1)
    gap=x_mas-today
    print(f'다음 크리스마스까지 {gap.days}일 남았습니다.')

 
#람다함수, iterator, generator
 

python_day12.pdf
0.78MB

 
 
 
https://colab.research.google.com/drive/1Jzdka6KRChHZOut2bapC3nFYa48-3DyB?usp=sharing 

Day_12.ipynb

Colaboratory notebook

colab.research.google.com

1)리스트 축약list comprehension
[ {표현식} for {변수} in {iterator/iterable} if {조건 표현식} ],{}>set,()>tupel,{[key:value]}>dict(set과 차이 알기)
if 조건은 생략 가능
iterable: 리스트, 튜플, 딕셔너리, 집합, 파일, 문자열, range, .. 리스트 뿐 아니라 모든 iterable 축약 가능
 
 
2)람다함수lambda function
 
p10
-map(적용시킬_함수, 반복가능 객체) 매핑시키는 애
 
date=[int(x) for x in input('오늘 날짜:').split()] 리스트 축약을 이용해서 정수로 만들었음
>map을 이용해 보자
 
map(매핑함수, 리스트)
date=list(map(int,input('처음 사귄 날짜:').split()))
리스트의 각 성분을 int로 바꾼다. 
 
p9 filter 만족하는 애를 필터링시켜주는애 
 
람다 함수
• 이름 없는 함수, 익명 함수anonymous function
• 1회용의 간단한 함수
>단독으로 쓰이기 보다는 built-in ft. map(), filter(), sorted()의 인자로 많이 사용한다. 

def lam_test():
    #두수의 합을 반환하는 람다 함수
    #lambda 매개변수: 반환값
    print((lambda x,y: x+y)(3,4))#인자
    #7
    #람다와 인자 사이에 , 넣으면 안된다. 


lam_test()
def pow_(a):
    return a**2
def day12_2():
    #map(함수명, 인자)
    rslt=list(map(pow_,range(10)))
    print(rslt)
day12_2()



def day12_2():
    #map(함수명, 인자)
    rslt=list(map(lambda x:x**2,range(10)))
    print(rslt)
day12_2()

-filter()  filter(적용시킬_함수, 반복가능 객체, …)

ages의 원소를  adult_func에 넣어서 True인결과를 내는 원소만 모아준다.
근데 이게  길어서 짧게 만들어줌

map과 filter의 차이점:
map은 원래 원소의 갯수를 소실하지 않지만 fliter은 조건에 맞는 애만 추출하니까 소실가능성이 있다.
 
day12-5

def day12_5():
    #음수만 추출: filter()
    lst = [-30,45,-5,-90,20,53,77,-36]
    rlst=filter(lambda x:x<0,lst)
    print(rlst)
    #<filter object at 0x00000266341359F0>
    #lst원소가 함수에서 True를 내는 애를 모은다.
    rlst=list(filter(lambda x:x<0,lst))
    print(rlst)
    #[-30, -5, -90, -36]
    rlst=list(map(lambda x:x<0,lst))
    print(rlst)
    #lst원소를 함수에 넣어서 결과값으로 맵핑시켜라
    #[True, False, True, True, False, False, False, True]
day12_5()

day12 3~6,lab10-5(2). lab10-6(2)

def day12_3():
    print(list(filter(lambda x:x%2==0 ,range(10))))
day12_3()
def day12_4():
    tmp=(filter(lambda x:x%2!=0 ,range(10)))
    rslt=list(map(lambda x:x**2,tmp))
    print(rslt)
day12_4()
def day12_5():
    lst = [-30,45,-5,-90,20,53,77,-36]
    rslt= list(filter(lambda x:x<0,lst))
    print(rslt)
day12_5()

def day12_6():
    ages = [34,39,20,18,13,54]
    rslt=list(filter(lambda x:x>=19,ages))
    print(rslt)
day12_6()

def day12_7():
    A = [1, 2, 3]
    B = [2, 4, 6]
    rslt=list(map(lambda x,y: x*y, A,B))
    print(rslt)
day12_7()

def day12_ex2():
    user=input('정수들:').split(',')
    #a=list(map(lambda x:int(x),user))
    a=list(map(int,user))
    print(max(a))
    
    #user에 input 바로 넣는 거 해보기



def day12_lab10_5_2():
    a = ['welcome', 'to', 'the', 'python', 'world']
    rslt=list(map(lambda x:x[0],a))
    print(rslt)
day12_lab10_5_2()

def day12_lab10_6_2():
    st = 'Hello 1234 Python'
    rslt=list(filter(lambda x:x.isdigit(),st))
    print(rslt)
day12_lab10_6_2()

'파이썬 -23여름학기(ㄱㅎㅈ)' 카테고리의 다른 글

test5-GUI & datetime test  (0) 2023.07.11
HW10  (0) 2023.07.11
HW8,HW9  (0) 2023.07.09
hw7  (0) 2023.07.09
HW8 정리  (0) 2023.07.09