알쏭달쏭 공부한거 쓰기

7/11 12장 본문

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

7/11 12장

elec_cy 2023. 7. 11. 16:30

람다함수 이용해서 sorted() max/min 구하기

#강아지 클래스
#속성: _age, _name
class Dog:
    def __init__(self,  name='쭈니',age=1):
        self._name=name
        self._age=age
    def __repr__(self): #list안에서 호출하기 때문에 이 메소드가 필요핟, str으로 부족하다.list=repr
        return f'이름: {self._name} 나이:{self._age}'
    '''
    def __gt__(self, other):
        return self._age>other._age
    '''
    
    def get_age(self):
        return self._age
        

def dog_test():
    dogs=[Dog('개똥이',5),Dog('흰둥이',7),Dog('뽀삐',2)]
    print(dogs)
    #나이를 기준으로 오름차순 정렬하시오.
    #lst=list(sorted(dogs))
    #print(lst)
    print(sorted(dogs, key= lambda x:x.get_age()))
    #max와 min도 동일하다. 
    print(max(dogs,key= lambda x:x.get_age()))
    #람다함수 새로운 기준을 만들수 있다. filter나 map기능을 한다. 
    '''
    [이름: 개똥이 나이:5, 이름: 흰둥이 나이:7, 이름: 뽀삐 나이:2]
    [이름: 뽀삐 나이:2, 이름: 개똥이 나이:5, 이름: 흰둥이 나이:7]
    이름: 흰둥이 나이:7
    '''
dog_test()   
def sorted_lambda_test():
    lst=['java','c programming','python']
    #print(lst.sort())
    print(sorted(lst))#사전식으로 정렬(아스키코드 값 기준 오름차순)
    #문자열의 길이를 기준으로 오름차순 정렬
    print(sorted(lst, key=len)) #각 요소를 4,13,6으로 인식하고 정렬해준다. 
    
    #마지막 문자를 기준으로 오름차순>직접 만들어주어야한 한다
    print(sorted(lst,key=lambda x:x[-1])) #a g n
    

sorted_lambda_test()

python_day13.pdf
1.83MB

 

#예외 처리

try-except 문 try-except-else try-except-finally with 문

 

예외 처리

• 사용자들은 잘못된 데이터를 입력할 수도 있고, 우리가 오픈하고자 하는 파일이 컴퓨터에 존재하지 않을 수도 있으며 인터넷이 다운될 수도 있다.

• 오류가 발생했을 때 오류를 사용자에게 알려주고 모든 데이터를 저장하게 한 후에 사용자가 우아하게(gracefully) 프로그램을 종료할 수 있도록 하는 것이 바람직

 

예외처리)

위의 것보다는 아래 내용들이 잘 만들어진 프로그램 

또는 제대로 입력할 때까지 반복해서 물어보도록 하는 프로그램

 

사실.. if 문이랑 while쓰면 되지만,, 연습용으로 해보자

 

try:

        {오류 가능성이 있는 코드}

except:

         {오류 처리}

 

def division_ab():
    '''
    if b==0:   
        print('0으로는 나눌 수 없어요 b를 0이 아닌 수로 입력해주세요.')
    else:

        print(a/b)
    '''
    while True:
        try :
            print('a/b를 출력합니다. a,b,를 입력해주세여')
            a=int(input('a:'))
            b=int(input('b:'))
            print(a/b)
            #break
        except ValueError:
            print('아라비아 숫자로만 입력해주세요')
        except:#ZeroDivisionError: 
            #except 뒤에 경우 지정하지 않으면 제로 디비젼 값 에러,모든 에러에 대해 처리
            print('0으로는 나눌 수 없습니다.')
        else: #위 예외가 발생하지 않았다면
            break
division_ab()

일반적을 예외는 하나씩 다 작성하는게 좋지만

베타 테스트로 작동여부만 쓸 경우에는 예외 통합해서 except만 이용한다. >어떤 예외인지는 알기 어렵다. 

def int_ab():
    while True:
        try:
            n=int(input('정수:'))
            print('정수 입력 성공')
        except ValueError:
            print('정수를 입력해주세요')
        else:
            break
int_ab()

try 실행 후 예외 발생시 들렀다 finally실행

 

python_day12.pdf
0.78MB

 

 

#Iterable and Iterator

 

Iterable-리스트-임의로 값에 순서 상관없이 접근 가능

• iterable: for-in 문에서 in 뒤에 작성했던 자료 구조들.

iter(lterable 객체)하면 이터레이터가 된다.

 

반복자iterator

• 하나 이상의 항목이 포함되어 있는 자료구조에서 데이터를 순차적으로 꺼내어 이용할 수 있는 객체

 

>>> lst=[1,23,4,5,6,7,8]
>>> it=iter(lst)
>>> next(it)
1
>>> next(it)
23
#임의로 접근할 수 없다
>>> it[4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list_iterator' object is not subscriptable
>>>

#next함수를 이용해서 이터레이터의 원소에 접근할 수 있다.

#for문을 통해 접근할 수 있다.
for x in it:
	print(x)
    >차례로 하나씩 접근할 수 있다. 
    
>>> for x in it:
...     print(x)
...
4
5
6
7
8
#이미 접근한 원소는 출력하지 않는다
#다시 쓸려면  it=iter(lst)재입력

zip, filter가 여기에 해당한다. 

 

>>> it
<list_iterator object at 0x0000022EDEDDAE60>
>>> it=iter(lst)
>>> a=list(it)
>>> a
[1, 23, 4, 5, 6, 7, 8]

마지막에 stoplteration을 반환한다.

built in f--next(객체명)은 사실 특수 메소드 __next__()를 호출하여 사용한 것-이터레이터에만 연결된다.

이터레이터 클래스 작성시에 next 스페셜 메소드 반드시 작성해야한다. 

 

 

def for_iter_test():
    lst=[1,3,4,9]
    it=iter(lst)
    
    while True:#무한 반복
        try:
            print(next(it),end='')
            #언제 탈출..?
        except StopIteration:
            break
    #1349
    
    for x in lst:
        print(x,end='')
        #1349
       
        
for_iter_test()

리스트를 for로 출력했을때 vs리스트를 iter화 한 후 출력하는 방법 with while+예외 처리-StopIteration

 

이터레이터 안에 __iter__라는 스페셜 메소드도 가진다. 

iter 자기 자신 반환

>>> lst=[1,2,3]
>>> it=iter(lst)
>>> id(it)
2379095322208
>>> a=iter(it)
>>> id(a)
2379095322208

주소가 동일함을 통해 같은 애라는 것을 알 수 있다.

 

https://www.youtube.com/results?search_query=%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0+%ED%81%B4%EB%9E%98%EC%8A%A4+%EB%A7%8C%EB%93%A4%EA%B8%B0 

 

https://www.youtube.com/results?search_query=%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0+%ED%81%B4%EB%9E%98%EC%8A%A4+%EB%A7%8C%EB%93%A4%EA%B8%B0

 

www.youtube.com

#홀수반환하는 이터레이터

#홀수 값을 반환하는 iterator클래스
class Oddcounter: 
    #생성자
    def __init__(self,start=1):
        self._n=start
    #__next__ 반드시 있어야 iterator클래스가 된다. 중요!신경 써야함 
    def __next__(self):
        tmp=self._n
        if tmp<100:
            self._n+=2
            return tmp
        else:
            #더이상 값을 반환하지 않게 작성
            raise StopIteration #StopIteration예외를 발생기키겠다.
        #self._n+=2>> return위의 문장은 이미 함수가 종료해서 실행이 안된다.
    #__iter__->이터레이터로 바꿔주는 메소드
    def __iter__(self): #본인이 이터레이터인데 이터레이터로 반환하려면 자기 자신 주면 된다
        return self
        
def oc_test():
    oc=Oddcounter()
    print(next(oc))
    print(next(oc))
    print(next(oc))
    print(next(oc))
    print(next(oc))
    print(next(oc))
    print(next(oc))
    print(next(oc))
'''
1
1
1
1
1
1
1
왜냐하면 1을 갱신하지 않았으므로
'''
'''
1
3
5
7
9
11
13
15
'''

#100이하의 홀수 값을 반환하는 iterator클래스
def oc_test1():    
    oc=Oddcounter()
    for x in oc:
        print(x,end=' ') #>next에서 범위 제한 안시키면 끝없이 출력된다. 
        
oc_test1()

def even_test1():
    oc=Oddcounter(2)
    for x in oc:
        print(x,end=' ')
even_test1()

for문을 쓰면 __next__가 실행된다.

 

 

 

예, 맞습니다. 파이썬에서 for 루프를 사용하여 iterator를 반복할 때, 자동으로 __next__ 메소드가 호출됩니다. __next__ 메소드는 iterator 객체의 다음 값을 반환하거나, 더 이상 값을 반환할 수 없을 때 StopIteration 예외를 발생시킵니다

 

 

 

 

아예 새 class 만들어서 구현함> 구현해보기

 

#generator() 

사용법은 이터레이터랑 동일하지만 작성법이 클래스가 아닌 함수로 만든다.

def oc_generator():
    #return1 일반 함수
    yield 1 #yield 키워드를 사용하면 generator
    yield 3
    yield 5
def gen_test():
        oc=oc_generator() #함수를 호출하듯이 적어도 값을 주는게 아니라 generator를 생서하는 것이다
        print(next(oc))#next에 넣어야 값을 준다. 
        print(next(oc))
        print(next(oc))
        print(next(oc))
gen_test()        
'''
1
3
5
Traceback (most recent call last):
  File "C:\Users\PC00\Downloads\event_처리\practice.py", line 76, in <module>
    gen_test()
    ^^^^^^^^^^
  File "C:\Users\PC00\Downloads\event_처리\practice.py", line 75, in gen_test
    print(next(oc))
          ^^^^^^^^
StopIteration
'''

def oc_generator():
    print(1+3)
    print('hi')
    print('실행되나?')
    #return1 일반 함수
    yield 1 #yield 키워드를 사용하면 generator
    yield 3
    print('실행되나?')
    yield 5
def gen_test():
        oc=oc_generator() #함수를 호출하듯이 적어도 값을 주는게 아니라 generator를 생서하는 것이다
        print(next(oc))#next에 넣어야 값을 준다. 
        print(next(oc))
        print(next(oc))
       
gen_test()   
'''
4 
hi
실행되나?
1 >38코드
3 >39코드
실행되나?
5  >40코드
'''
def oc_generator():
    x=1
    while True:
        yield x
        x+=2
    '''
    print(1+3)
    print('hi')
    print('실행되나?')
    #return1 일반 함수
    yield 1 #yield 키워드를 사용하면 generator
    yield 3
    print('실행되나?')
    yield 5
    '''
def gen_test():
        oc=oc_generator() #함수를 호출하듯이 적어도 값을 주는게 아니라 generator를 생서하는 것이다
        print(next(oc))#next에 넣어야 값을 준다. 
        print(next(oc))
        print(next(oc))
       
gen_test()     
'''
1
3
5

'''

#built-in fts

• all(): 모든 항목이 참이면 True • any(): 한 개의 항목 이라도 참인 경우 True

0-False에 해당함

 

def a():
    invitations=['Kim','Lee','Park','Choi'] #참석자 그룹
    persons=[1,3,0,6] #동반자 포함 참석자 수
    
    #1)총 참석 인원
    print(sum(persons))
    #2)파티에 한 사람이라도 오는가?
    print(any(persons))
    #3) 초대한 그룹이 모두 오는가?
    print(all(persons))
    #4) 가장 많이 오는 그룹의 인원수
    print(max(persons))
 
a()

실습문제는 수업시간에 안 다루고 따로 공부하기

 

13일 강의 자료-

#파일

파일 열기와 모드(닫기랑 쌍으로 이루어짐)

파일 쓰기- write(), print()

파일 읽기- readline(), for 문 사용, read(), readlines()

파일 닫기- close(), with 문 사용

그 외 -csv, os 모듈 사용: csv 파일 사용, os 모듈 사용하여 디렉토리 접근

 

입력이나 GUI로 입력을 얻어왔지만 이 단원은 파일에서 얻어오자

 

• 텍스트 파일 vs. 바이너리 파일(음악, 이미지)

- 문자열 형태로 저장 vs. 데이터 형태 보존하여 저장

이 방법 잘 쓰지는 않는다

with을 이용하자

rt, wt,at,r+t/rb,wb,ab,r+b로 구별한다. t의 경우에는 생략 가능

CMD가 아닌 탐색기로 문서폴더 열어서 확인

 

 

def write_test():
    # hello.txt에 안녕 파이썬! 출력하기
    #파일 열기
    hello=open('hello.txt','w')
    #파일 사용
    #print()
    #print('안녕 파이썬!') #이건 콘솔에 출력된다.
    #print('안녕 파이썬!',file=hello)> 자동 개행을 해준다.
    #write()메소드 사용>개행이 안된다.
    hello.write('안녕 파이썬\n')
    hello.write('안녕 파이썬')
    #파일 닫기
    hello.close()
    print('파일을 확인해보세요.')
    

def read_test():
    #열고 #닫기
    with open('read test.py',encoding='utf8') as read_file: #모드 생략시 자동 읽기 모드로 처리 압축푸는 기준이 달라서 오류생김을 막아줌.
        #이 파일을 read_file로 하고 끝나면 자동으로 닫겠다 안전함!! 위에는 오류 발생시close가 작동하지 않을 수 있지만  with 구문 이용시 끝나거나 오류가 생기면 닫아버린다.
        '''
        #파일 내용 읽어 모니터에 출력하기
        print(read_file.readline().rstrip()) #한 라인만 읽기 #리드라인 개행 한번, print()개행 한번 2번 넘어감
        print(read_file.readline().rstrip())
        print(read_file.readline().rstrip())
        print(read_file.readline().rstrip())
        print(read_file.readline().rstrip())
        print(read_file.readline().rstrip())
        print(read_file.readline().rstrip())
        print('=========================')
       
        #읽기
        for line in read_file: #한 라인씩 간다. 전문을 가져오는거면 for문이 편한다.
            print(line.strip())
        print('=============================')   
        '''
        rslt=read_file.readlines() #리드라인으로 각 라인은 리스트에 넣어서 반환
        print(type(rslt)) 
        read_file.seek(0)#파일 포인터 위치를 0로 돌린다. 파일 읽을때 마다 위치가 올겨진다
        print(type(read_file.read())) #read(인자) 인자만큼읽고 없으면 전문을 읽는다, 문자열로 반환
read_test()

readline- 1줄만 읽는다. 문자열로 

readlines-리스트 1개에 1줄을 리스트 한 원소로 넣음

read- 전문을 읽고 인자를 넣으면 인자갯수만큼 읽는다.

 

Day13-1

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

 

Day_13.ipynb

Colaboratory notebook

colab.research.google.com

1번

def read_test():
    with open('we_will_rock.txt',encoding='utf8') as read_file:
        rslt=read_file.readlines()
        for x in rslt:
            print(x.upper().rstrip()) #strip개행 포함해서 공백을 제거한다
    
    print('==========')
    with open('we_will_rock.txt',encoding='utf8') as read_file:
        print(read_file.read().upper())
    print('==========')
    with open('we_will_rock.txt',encoding='utf8') as read_file:
        for x in read_file:
            print(x.upper().strip())
        print(type(x))#문자열 
    #read_file.seek(0)쓰면 돌릴 수 있다.    
read_test()

 

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

이터레이터 추가 학습 in Youtube  (0) 2023.07.11
HW11-파일 처리, map,filter  (0) 2023.07.11
test5-GUI & datetime test  (0) 2023.07.11
HW10  (0) 2023.07.11
7-10  (0) 2023.07.10