*Udacity - Intro to Computer Science 를 따라가고 있습니다.
https://classroom.udacity.com/courses/cs101
자, 이제 몇 다음 강의에서 업그레이드된 웹 크롤러(크롤링된 페이지까지 크롤링해오는!)를 만들 예정이다 이를 위해서 우리는 몇 가지 추가로 배워야 할 것들이 있다. 바로 loop가 되는 명령어 while, for, in, pop 같은 것을 리스트에서 활용해보는 것이다.
1. 리스트에서도 동일한 while
while <test>:
<Block>
이미 이것은 이전에 해본 적이 있다. 리스트에서도 이것은 동일하게 적용된다.
2. for 루프를 만들어보자
for <name> in <list> :
<Block>
for을 이용한 루프다. 아래와 같이 코드를 짜면 p라는 리스트에 있는 모든 e(엘리먼트, 요소)들을 한 번씩 검사해주는 착한 루프다. 따로 조건을 걸지 않아도 리스트를 한 번씩 훑어준다!
def print_all_elements(p):
for e in p:
print e
e는 p안에 있는 값들이라는 뜻이고, p라는 리스트에 값을 순서대로 프린트하라는 것이다. sum_list([1,7,4])를 하면 모두 더한 값 12가 되도록 하는 프로시저를 for을 사용해서 만들어보자
def sum_list(p):
result = 0
for e in p:
result = result + e
return result
3. 배운 것을 바탕으로 특정 활자를 검출해보자.
혹은, 특정 글자가 맨 앞에 오면 것이 몇 개나 있는지 확인해보는 자.
4. 입력된 값이 리스트 어디에 있는지 확인하는 방법
앞의 문제는 미리 정해진 고정된 활자 U가 리스트에 몇 번째에 있는지 확인하였다면, 이번에는 정해진 리스트 안에 자유로이 검색어를 넣어 그 검색어가 있는지 확인하는 코드를 짜 볼 것이다. 내가 풀어본 답은 다음과 같다.
나는 for을 배웠으니까 당연히 for로 풀 줄 알았는데 선생님이 먼저 while로 한 번 풀어주셨다.
for 루프와 while 루프의 대표적인 차이점은 for 루프는 리스트 끝까지 검색하고 나면 자동으로 빠져나온다는 것인데, while은 그 기능이 없이 조건만 참이면 끝없이 돌기 때문에 리스트를 다 보았으면 빠져나와 (i=0, while i<len(p) 같은 조건을 꼭 달아줘야 한다는 점이다. 그런 점에서 리스트를 사용할 때는 따로 조건을 안 달아줘도 리스트를 처음부터 끝까지 알아서 훑어주는 for이 참 편하다. 아래는 for을 사용한 선생님의 풀이다.
확실히 선생님 코드가 간결하고 깔끔하다. 이렇게 선생님 코드를 보고 다시 내 코드를 보면 어떤 불필요한 요소가 들어가 있었는지 반성도 하게 되고 다시 한번 확인해 가며 고쳐볼 수 있다.
5. index가 있으면 간편해진다 - <list>.index(<value>)
인덱스는 특정 값이 몇 번째 나오는지 알려주는 코드이다. 이를테면, 2가 어디서 나타나나? 하고 아래와 같이 검색해 볼 수 있다.
p = [0,1,2]
print p.index(2)
>>>2
p= [0,1,2,2,2]
print p.index(2)
>>>2
첫 번째로 나오면 멈추기 때문에 여전히 2다. 인덱스는 치졸하게 없으면 -1을 뱉지 않는다. 없으면 없다고 당당하게 이야기한다.
p=[0,1,2]
print p.index(3)
>> 3 is not in list
멋있는 녀석이다!
6. 몇 번째인지 안 궁금해! 있는지 없는지만 알려줘! in - <value> in <list>
in의 작용은 간단하다. (뿅)이 리스트 안에 있습니까? 를 묻는다. 있으면 True / 없으면 False라고 쿨하게 대답해준다.
p=[0,1,2]
print 3 in p //3 있니?
>>False
자매품으로 not in 도 있다. 해석하자면 그 값없지?라는 뜻이다. 같은 말로 not 값 그 안에 없지도 있다. (하나만 해라 자꾸 헷갈리게 누가 in 만든 거야?)
<value> not in <list> == not <value> in <list>
둘은 같은 말이다.
7. 이걸 index를 사용해서 찾아보자
인덱스를 사용해서 해당 글자가 몇 번째에 등장하는지 찾아보자.
코드가 훨씬 짧아졌다. 역시 배울수록 코드는 간단하고 깔끔해진다.
8. 두 집합을 합쳐보자
for e in q와 if e not in q: 를 통해 많은 것들을 할 수 있다. 이를테면 유니온 코드를 짜서 중복 없이 두 리스트를 합치는 것을 만들어보자.
def union(p,q):
for e in q:
if e not in p:
p.append(e)
9. Pop 오퍼레이션 - <list>.pop() ->element
pop 은 리스트의 마지막 값을 뺏어오는 것이다.
a= [1,2,3]
b = a//자 b와 a는 같은 [1,2,3]을 공유한다
x = a.pop() // a리스트의 마지막에 있는 3을 x가 가져갔다.
일련의 과정을 거치고 나면 아래와 같은 결과가 나온다.
>>> a = [1,2]
>>> b = [1,2]
>>> x = [3]
이렇게 되는 것이다!
10. 자 다시 업그레이드된 크롤러로
방금 만든 union 함수와 pop 기능을 사용해 다음 수업에서 크롤러를 업그레이드할 예정이다. 모두들 기대하시라 개봉박두!