brunch

You can make anything
by writing

C.S.Lewis

by 아무나 Jul 25. 2019

Python - 9. loop의 변주

*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 기능을 사용해 다음 수업에서 크롤러를 업그레이드할 예정이다. 모두들 기대하시라 개봉박두!

매거진의 이전글 Python - 8. Data structure
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari