여태까지 파이썬으로 이것저것 짜 보면서 왠만한건 다 만들수 있었고, 어느정도 익숙해졌다고 생각했는데
여태 파이썬을 제대로 못쓴것같다. c에 익숙하다가 파이썬으로 넘어와서 그런지 파이썬다운(?) 코드를
잘 못 짜는것 같다.(사실 c는 보안과는 다른 이유로 지금도 자주 쓰고있긴 하다.) 네이버에서 자료를 찾다가 한 질답을 보았는데 코드를 보고 신선한 충격을 받았다.
(역시 고수의 코드를 살피기만 해도 도움이 된다.)
별거 아닌데 나같은경우 zip이나 dict같은건 그냥 개념만 알고 있어서 이러한 코드를 짤때 저런 방식으로 써서 효율적으로 짤수 있다는걸 깨달았다. 아래는 내가 요약한 코드이다.
# -*- encoding: cp949 -*- f = """20150001,홍길동,80,85,70 20150002,김길동,80,70,70 20150003,이길동,70,80,85 20150004,박길동,75,80,90 20150005,최길동,85,70,85 20150006,구길동,80,80,70 20150007,강길동,70,70,85 20150008,조길동,75,80,85 20150009,유길동,90,90,95 20150010,진길동,75,80,80""" keys = ['id', 'name', 'ko', 'ma', 'en'] record = [] for line in f.split('\n'): print zip(keys,line.split(',')) print dict(zip(keys,line.split(','))),'\n' record.append(dict(zip(keys,line.split(',')))) for d in record: d['sum'] = int(d['ko']) + int(d['ma']) + int(d['en']) d['avg'] = d['sum'] / 3 sorted_by_sum = sorted(record, key=lambda x: x['sum']) sorted_by_avg = sorted(record, key=lambda x: x['avg'], reverse=True) for i in sorted_by_sum: print i
만약 내가 위와 같은 코드를 짠다고 생각했으면 각 줄마다 ,로 나눈 후 [2:]범위의 값을들 더해서 합과 평균을 계산해서~ 하는 식으로 조금은 c식으로 짰을것 같다. 일단 나중에라도 참고를 위해 코드를 올려두고,
또다른 신선한 코드가 있으면 올려야지.
지식인을 뒤져본결과 하나 더 찾았다.
인데 알아볼수 있도록 변경.
# -*- encoding: cp949 -*- def choice(a, b): if any([isinstance(i, str) for i in a]): return "문자열이 있습니다." if b >= len(a): return 0 return [x ** b for x in a[:b]] print choice(['a',2,3,4],3) print choice([1,2,3,4,5],8) print choice([1,2,3,4],2),'\n\n'
여기서는 any라는 연산자와 isinstance에 대해서 배웠다. 아마도 작성자는 인자로 리스트 a와 정수 b를 입력받아서 리스트 a내부에 문자열이 있으면 문자열이 있다고 반환, b가 a의 길이보다 크면 0 반환, b가 a의 길이보다 작으면 b만큼 제곱한 값을 원한것 같다.
isinstance()는 타입검사를 해준다. print isinstance(1,str) #false를 반환.
any라는 연산자도 여기서 처음 봤는데 http://saelly.tistory.com/568 이런 기능을 가진 연산자라고 한다.
교훈 : 고수들의 코드를 찾아보고 살펴보자, 파이썬의 기초적인 연산자나 함수를 잘 활용하자.
연습. 3 6 9 게임이다. 3 6 9 가 나오면 짝을 출력하자. 아래의 채워넣어야 할 부분을 채워넣어보자.
한줄로 만들어보자. 답은 아래에.
# -*- encoding: cp949 -*- for c in [str(x) for x in range(1,100)]: #여기에 코드 작성. if count: print c,'짝' else: print c
답 : count = True if any((i in ['3','6','9']) for i in c) else False
추가 예정.
'Python > 2.7 information' 카테고리의 다른 글
(나중 참고용) 캡쳐 프로그램, 후킹모듈 기본 (0) | 2015.06.06 |
---|---|
python websocket 기초 참고용.(그냥 소켓 아님.) (0) | 2015.04.26 |
파이썬 출력 format관련. (0) | 2015.04.16 |
wargame.kr pyc_decompile (0) | 2015.03.29 |
분수 관련 fraction과 struct모듈 (0) | 2015.03.28 |