- 0
- 이니스프리
- 조회 수 1157
안녕하세요?
제가 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. 리스트 표현식과 람다 함수
(이는 리스트 및 함수와 관련된 별도의 챕터에서 다룰 예정입니다.)