Problem Solving Through Python

|  파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

조회 수 151 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부



안녕하세요?


제가 COS Pro 시험에 응시한지 벌써 3주가 지났는데요.


더 시간이 경과되어 기억이 사라지기 전에 시험에 출제된 파이썬 문법과 관련된 팁을 남기려고 합니다.


이는 본 강좌의 이론편에서 실습편으로 넘어가기 전에 이론을 최종적으로 정리하는 의미도 지닙니다.



저작권법에 저촉될 여지가 있어서 출제된 문제 자체에 대하여 직접적인 언급을 할 수 없지만, 이전의 강좌에서 다뤄지지 않았지만 출제된 문제를 해결하는 데 있어 필요한 문법적 지식에 대해 설명을 드리고자 합니다.


COS Pro는 문제은행 방식으로 출제되기 때문에 유사한 문제가 다시 출제될 가능성이 높다고 생각합니다.


참고로 이 글에 서술된 7개의 항목 중에서 저는 시험장에서 4개를 사용하였고, 그 중 적어도 3개는 명시적으로 이를 활용하여 문제를 해결하는 방향으로 출제된 것으로 생각됩니다.




1. 문자열의 대소비교


프로그래밍을 하다보면 문자열에서 글자 하나씩 대소를 비교해야 할 경우가 있습니다.

(예컨대 A < B, x < y 이런 방식으로 비교하는 것을 설명드리는 것입니다.)


예컨대 A~F 학점 데이터가 주어졌을 때 B 학점 이상이면 장학금을 지급하는 경우를 처리할 때 편리하겠죠 ^^


문자열의 대소비교에서 ord() 함수를 이용하여 글자를 아스키코드로 변경한 후 이를 비교하는 방법은 아마도 모든 프로그래밍 언어에서 허용될 것입니다.


그런데 파이썬에서는 아스키코드로 변경하지 않고서도 비교연산자를 사용하여 글자 간의 대소를 직접적으로 비교하는 것을 허용하고 있습니다.

(물론 대소를 비교하는 방법은 아스키코드로 변경을 한 것과 동일합니다.)


다음은 각 과목의 점수가 리스트로 주어진 경우에 B 학점 이상인 과목의 수를 출력하는 스크립트입니다.


score = ['A', 'A', 'D', 'B', 'B', 'C', 'A']
temp = ''
for s in score:
   if s <= 'B':
       temp += s
print(len(temp))

=> 5


이 때 주의해야 할 점은 알파벳 대문자는 아스키코드 65부터 시작하고, 소문자는 97부터 시작하기 때문에, 후자가 더 크다는 것입니다.




2. Set 자료형


Set(집합) 자료형은 파이썬 2.3부터 지원하기 시작했는데, 굉장히 강력한 자료형임에도 이용빈도가 낮은 것 같습니다.


Set 자료형은 (1) 중복을 허용하지 않고, (2) 순서가 없어서(unordered) 인덱싱으로 접근할 수 없다는 특징을 가집니다.


Set 자료형은 강점은 수학에서의 집합과 관련된 다양한 연산을 바로 적용할 수 있다는 점입니다.


예컨대 제주도 연돈에 방문하여 '대기한 날짜'과 '실제로 먹은 날짜'가 리스트로 주어진 경우, 대기했지만 결국 먹지 못한 날을 구하려고 할 때 set을 활용하여 간단하게 '차집합' 계산을 할 수 있습니다.


went = set([1, 10, 17, 25])
ate = set([10, 25])
fail = went - ate
print(fail)

=> {1, 17}


리스트에서는 뺄셈 연산이 되지 않는다는 점과 큰 차이가 있습니다!


만약 리스트만을 사용해야 한다면 이중 for 문을 돌려야 하는데, 이는 상당히 번거로운 작업이 아닐 수 없습니다.


참고로 '교집합'은 s1 & s2 또는 s1.intersection(s2) 이런 방식으로 구할 수 있습니다.



한편 Set 자료형은 리스트 내에 중복된 원소가 있는 경우에, 중복을 배제하고 어떤 항목이 있는지 파악해야할 경우에도 유용합니다.


a = [1, 2, 2, 3, 3, 3]
print(set(a))

=> {1, 2, 3}


참고로 이는 문자열에서 글자의 중복을 배제해야 하는 경우에도 적용 가능합니다.




3. 3항연산자


파이썬의 3항연산자는 C, Java 등과 상이한 점이 있어서 혼동하기 쉽습니다.


다른 언어에서의 ’?’가 ‘and’에 해당하고, ’:‘가 ‘or’에 해당한다고 이해하시면 됩니다.


a = 100
b = 500
result = a == b and a-b or a+b 

=> 600


한편 파이썬 2.5 이상에서는 if, else를 활용하여 보다 간명한 3항연산자의 사용이 가능합니다.


a = 100
b = 500
result = (a-b) if a == b else (a+b)

=> 600


3항연산자는 변수에 대입할 때에도 사용할 수 있고, 함수의 return 처리부분에도 활용할 수 있습니다.




4. 한 줄 if 문


Java, PHP 등 타 언어 커뮤니티에 들어가보면 파이썬의 조건문 및 반복문에서의 들여쓰기 문법에 이질감을 느끼시는 분들이 많이 계신 것 같습니다.


사실 파이썬에서 모든 경우에 들여쓰기가 강요되는 것은 아닙니다.


들여쓰기를 요하는 여러 줄의 if 문을 단 한 줄의 if 문으로 표현하여 들여쓰기를 하지 않을 수 있습니다 ^^


위의 6줄 짜리 if~elif~else 문을 아래의 한 줄로 표현할 수 있습니다.


# 통상의 if 문
a = 10

if a > 10:
   b = 999
elif a == 7:
   b = 99
else:
   b = 9

# 한 줄 if 문
b = 999 if a > 10 else (b == 99 if a == 7 else 9)




5. 인덱스 슬라이싱에서 3번째 인자의 활용


리스트를 비롯한 iterable한 변수의 인덱스에서 [start:end:step] 형식으로 인덱스 슬라이딩을 할 때 3번째 인자를 잘 활용하면 유용합니다.


예컨대 스포어 자유게시판을 작성시간상 과거인 25번째 페이지부터 현재인 첫번째 페이지까지 순서대로 크롤링한다면 다음과 같이 구현할 수 있습니다.


import requests

# (중간 생략)
url = 'https://studyforus.com/index.php?mid=freeboard&page='
for i in range(25, 1, -1):
    s.get(url + str(i))



이전 강좌에서도 간략하게 다뤘지만, 문자열의 경우에는 .reverse() 메서드를 지원하지 않는데, 이러한 문자열을 뒤집는 데에도 3번째 인자를 사용할 수 있습니다.


s = 'studyforus'
print(s[::-1])

=> surofyduts




6, 7. 리스트 표현식과 람다 함수


(이는 리스트 및 함수와 관련된 별도의 챕터에서 다룰 예정입니다.)



Problem Solving Through Python

파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

List of Articles
번호 제목 글쓴이 날짜 조회 수
22 22. [OpenPyXL] 엑셀 문서 저장하기 / 시트 추가하기 / 셀에 입력하기 14 file 이니스프리 2020.02.02 240
21 21. [OpenPyXL] 엑셀 문서를 열고 시트에서 셀의 값을 얻기 2 file 이니스프리 2020.02.01 109
20 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() 2 file 이니스프리 2020.01.16 191
19 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 file 이니스프리 2020.01.12 153
18 [Requests] Selenium을 이용한 Cloudflare의 우회 3 file 이니스프리 2020.01.08 193
» 9. 파이썬 문법 팁 정리 file 이니스프리 2020.01.04 151
16 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 file 이니스프리 2019.12.25 252
15 4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 file 이니스프리 2019.12.12 162
14 6. 리스트와 관련된 기본함수 및 메서드 7 file 이니스프리 2019.12.10 200
13 3. 문자열 처리 (1) - 문자열 접근 및 검색방법 4 file 이니스프리 2019.12.09 755
12 [Selenium] Requests의 session을 Selenium으로 보내기 file 이니스프리 2019.12.07 257
11 1. 반복문 (1) - while 문 5 file 이니스프리 2019.12.06 137
10 (序) Python 강좌를 시작하며... 2 file 이니스프리 2019.12.05 107
9 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 file 이니스프리 2019.08.04 608
8 [번외편 - 법률] 나무위키의 서술 중 법률용어의 사용에 있어 바로잡아야 할 부분 file 이니스프리 2019.07.17 179
7 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 1 file 이니스프리 2019.07.16 428
6 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 2019.07.04 337
5 [번외편 - 아미나] Basic Youtube Title Widget 1.0에서 처음에 엑박으로 뜨는 경우의 해결책 3 file 이니스프리 2018.12.15 453
4 [번외편 - 아미나] 아미나의 회원 이미지와 관련하여 x2 3 file 이니스프리 2018.12.10 427
3 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 2018.12.07 737
목록
Board Pagination Prev 1 ... 2 Next
/ 2
서버에 요청 중입니다. 잠시만 기다려 주십시오...