알쏭달쏭 공부한거 쓰기
7/11 12장 본문
람다함수 이용해서 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()
#예외 처리
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실행
#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
주소가 동일함을 통해 같은 애라는 것을 알 수 있다.
#홀수반환하는 이터레이터
#홀수 값을 반환하는 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
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 |