• [Python] 파이썬으로 웹 크롤링을 해보자 1

    2022. 1. 11.

    by. 모모

     

    저는 Python의 존재를 3학년 때 영상처리쪽을 공부하던 친구를 통해 알게 되었습니다.
    당시에는 너무나도 생소했고 제가 사용할 일은 없었습니다.
    제가 임베디드 전공이였기에 대학정규과정에도 없었습니다.

    최근에 머신러닝과 딥러닝 공부를 시작하면서 파이썬의 필요성을 깨닫기 시작했고 Python 공부 과정을 기록하고자 합니다.

     

    해당 게시글은 노마드코어의 파이썬 챌린지를 진행하며 작성되었습니다.


    해당 게시글은 C#을 할 수 있는 사람이 작성한 게시물로, Python과 C#의 미묘한 차이를 학습하기 위해 작성하였습니다.
    세세한 내용( 예 : 부등호, 논리함수 등 )은 다루지 않으므로 참고해주시기 바랍니다.

     

    1. 시작

     

    파이썬은 인기있는 언어 중 하나로 web, GUI, Scientific, 머신러닝, 데이터시각화 등 여러가지로 사용이 됩니다.

    대표적인 기업으로 구글이 사용하고 있고 파이썬 커뮤니티가 굉장히 잘 되어있다고 합니다.

     

    일단 파이썬으로 웹 크롤링을 하기 위해서는 파이썬이 무엇인지 알아야 합니다.

    파이썬으로 웹 크롤링을 진행해보고

    Django (데드라인이 있는 완벽주의자를 위한 web Framework) 를 사용해보도록 할 것입니다.

    인스타그램, 핀터레스트 등이 Django를 사용하고 있습니다.

     

    위와 같은 과정을 진행하기 위해서는 구글 크롬을 이용해야 합니다.

    Online compiler가 구글 크롬 안에서 동작하기 때문이죠.

     

    Python는 프로그래밍 언어입니다. Python code를 브라우저에서 작성할 수 있게 도와주는 repl.it을 사용할 것입니다.

     

    The collaborative browser based IDE

    Replit is a simple yet powerful online IDE, Editor, Compiler, Interpreter, and REPL. Code, compile, run, and host in 50+ programming languages.

    replit.com

     

    언어를 다운로드 하지 않아도 손쉽게 Python 언어를 사용할 수 있습니다.

    Python 언어로 생성을 해주면

    다음과 같이 코드를 입력하고 직접 실행할 수 있는 콘솔창이 나옵니다.

     


    2. variables(변수)

    변수는 데이터를 저장하는 곳입니다.

    Python에서 변수를 선언하는 방법은 다른 언어와 비슷합니다.

     

    2.1 숫자 (Number)

    a_number = 3

     

    2.2 문자 (String)

    variable에는 number 외에도 string를 넣을 수 있습니다.

    a_string = "like this"

    string는 반드시 따옴표( ' ) 나 쌍따옴표 ( " ) 에 둘러쌓여 있어야 하며 같은 종류의 따옴표로 열고 닫아야 합니다.

     

    2.3 참과 거짓 (Boolean)

    참과 거짓인 true와 false도 담을 수 있습니다.

    a_boolean = False // 거짓일 때
    a_boolean = True // 참일 때

    만약 True를 " 나 ' 로 감싸게 된다면 더는 참과 거짓이 아닌 단순한 String이 되어버립니다.

    또한 파이썬은 True와 False의 첫글자를 꼭 대문자로 입력해야 합니다. 이것을 boolean이라고 합니다.

    a_boolean = False

     

    2.4 int와 float (자료형)

    숫자는 형태에 따라 다른 타입을 사용합니다. int의 경우에는 정수고 float는 소수입니다.

    float도 숫자이지만 소숫점 자리의 숫자가 존재하는 것입니다.

    해당 숫자의 타입은 type 명령어로 확인할 수 있습니다.

    a_number = 3
    a_float = 3.12
    print(type(a_number))

     

    2.5 None

    None 은 '존재하지 않는다' 입니다. 데이터 자체가 존재하지 않는 것입니다.

    None은 파이썬에만 있는 타입입니다.

    a_none = None

     

    알아두면 좋은 정보
    sanke case 란?
    변수 이름과 변수 이름 사이를 '_'를 이용해서 연결하는 것인 Python 유저들끼리의 암묵적인 약속입니다.
    변수 이름을 아주 길게 지어야 할때 단어끼리 분리되게 하기 위해 사용합니다
    예) super_long_variable
    물론 canmel case방식을 사용해서 변수명을 작성해도 사용에는 전혀 문제가 발생하지 않습니다.

     


    3. sequence type ( 열거형 타입 )

    python의 열거형 타입은 두가지가 있습니다

    list와 tuple 입니다.

     

    3.1 list ( 수정이 가능한 sequence )

    days = "Mon,Tue,Wed,Thur,Fri"
    print(days)

    다음과 같은 변수가 있다고 합시다. 우리는 days에 월, 화, 수, 목, 금 이 들어있다는 것을 알 수 있습니다.

    하지만 이 변수는 특정번째의 데이터를 찾아올 수 없습니다.

    day_one = "Mon"
    day_two = "Tue"
    # ....

    특정 번째를 가져오지 못하기 때문에 변수에 데이터를 하나하나 넣어주는 방식으로도 구성할 수 있습니다.

    하지만 이렇게만 봐도 굉장히 비효율적인 방법이지요.

    또한 데이터를 추가하고 싶을때도 새로 변수를 선언해줘야하는 문제가 있습니다.

    해당 고민을 말끔하게 해결해주는것이 바로 list입니다.

    사용방법도 굉장히 간단합니다. [ ] 를 이용해서 묶어주고 , 를 이용해서 구분을 해주면 됩니다.

    days = ["Mon","Tue","Wed","Thur","Fri"]
    print(days)

     

    list를 이용해서 무엇을 할 수 있을까요?

    파이썬 표준 라이브러리에서 list의 문서로 간다면 다양한 사용방법을 확인할 수 있습니다.

     

    파이썬 표준 라이브러리 — Python 3.10.1 문서

    파이썬 표준 라이브러리 파이썬 언어 레퍼런스 는 파이썬 언어의 정확한 문법과 의미를 설명하고 있지만, 이 라이브러리 레퍼런스 설명서는 파이썬과 함께 배포되는 표준 라이브러리를 설명합

    docs.python.org

    가장 대중적인 세가지 방식을 사용해보도록 하겠습니다.

    commonx in s

    Mon은 days에 있는 데이터이므로 True라고 출력됩니다.

    만약 days에 없는 데이터를 요청할 경우에는 False가 출력 될 것입니다.

    days = ["Mon","Tue","Wed","Thur","Fri"]
    print("Mon" in days)

    days = ["Mon","Tue","Wed","Thur","Fri"]
    print("Yaho" in days)

    commons[i]

    s[i]는 i번째에 있는 데이터를 출력해달라는 의미입니다. 이때 숫자는 0부터 시작합니다.

    따라서 3번째에 있는 Thur가 출력되었습니다.

    days = ["Mon","Tue","Wed","Thur","Fri"]
    print(days[3])

     

    commonlen(s)

    list에 들어있는 데이터의 갯수를 출력해줍니다.

    days = ["Mon","Tue","Wed","Thur","Fri"]
    print(len(days))

    list는 sequence이지만 Mutable 입니다.

    Mutable : 값을 변경할 수 있음
    Immutable : 값을 변경할 수 없음

    즉, list에 들어있는 데이터 값을 변경할 수 있다는 것입니다.

    s.append

    list에 데이터 추가할 수 있습니다.

    days = ["Mon","Tue","Wed","Thur","Fri"]
    print(days)
    days.append("Sat")
    print(days)

    이때 python은 위에서 아래로 순차적으로 내려옴을 기억하세요.

    그외에도 다양한 함수를 list를 이용해 활용할 수 있습니다. 라이브러리를 직접 확인해보고 사용해보세요.

     

    3.2 tuple ( 수정이 불가능한 sequence )

    tuple은 list와 다르게 common sequence operation 만 사용할 수 있습니다.

    tuple 사용법도 굉장히 간단합니다. ( ) 로 감싸주면 tuple형이 됩니다.

    days = ("Mon","Tue","Wed","Thur","Fri")

    주로 아무도 변경할 수 없는 데이터를 가지고 싶을때 tuple을 사용합니다.

     

    3.3 dictionary 만들어 보기

    name = "모모"
    age = 28
    korean = True
    fav_food = ["떡볶이", "김치"]

    dictionary는 사전이라는 의미를 가지고 있습니다.

    key와 value를 가지고 dicitionary를 만들것입니다

    momo = {
      "name" : "모모",
      "age" : "28",
      "korean" : "True",
      "fav_food" : ["떡볶이", "김치"]
    }

    dictionary를 이용해 특정 key에 들어있는 value값을 호출해 올 수 있습니다.

    추가하는 방법 또한 간단합니다.

    momo["woman"] = True

    Console창을 보면 woman 의 key값에 True라는 value 추가되어 있음을 볼 수 있습니다.

    dictionary는 다양한 데이터의 방식을 저장할 수 있습니다.

    list과 tuple에도 다양한 type의 데이터를 저장할 수 있습니다.

     


    3. function ( 함수 )

    함수는 어떤 기능을 가지고 있는 것이고 그것을 계속해서 반복해서 사용할 수 있습니다.

    적용하고자 하는 기능을 넣어놓고 계속해서 불러와서 사용할 수 있는 것입니다.

    기능을 미리 작성하고 반복해서 재사용하면 코드를 좀 더 짧고 손쉽게 만들 수 있습니다.

     

    예를 들어 게임을 만든다고 합시다. 우리는 방향키에 각각의 이동을 위한 코드를 작성해야 합니다. 하지만 방향키를 누를때마다 해당 코드를 작성하는 것은 굉장히 번거롭고 귀찮은 일입니다.

    따라서 특정 방향키에 대한 기능(함수)를 작성해놓고 해당 키를 쓰는 상황에서만 함수를 소환하는 식으로 코드를 작성하는 것입니다.

    실습을 통해서 좀 더 이해를 하도록 합시다.

     

    print()
    type()

    해당 함수들은 python에서 기본으로 제공하는 함수입니다.

    print() 함수를 이용하면 다른 코드를 작성할 필요 없이 console창에 print내부에 들어있는 내용을 출력시켜줍니다.

    조금 이해가 되나요?

    Python에는 이 외에도 다양한 함수들을 기본적으로 제공하고 있습니다.

     

    그렇다면 function은 어떻게 만들 수 있을까요? 아니 function을 어떻게 정의할 수 있을까요?

    function을 define하기 위해서는 먼저 def ( definition 혹은 define의 약자 )를 사용해야 합니다.

    def say_hello():
      print("hello")

    hello를 출력시켜줄 간단한 say_hello function을 정의했습니다.

    이때 들여쓰기를 꼭 주의하세요. 생각보다 많은 python 초보자들이 들여쓰기로 인해 오류를 마주치게 됩니다.

    들여쓰기는 굉장히 중요합니다.
      - { } 를 이용해서 시작과 끝을 판단하지 않습니다. indentation(들여쓰기)로 function의 시작과 끝을 판단합니다.
      - 들여쓰기는 tab 이나 space를 이용해서 표시합니다.
    def say_hello():
      print("hello")
    print("bye")

    다음과 같이 say_hello 함수를 정의했다면 say_hello 함수를 호출 할 때마다 hello만 출력이 되고 bye는 출력이 되지 않습니다.

    print("bye")는 들여쓰기가 되지 않아 say_hello의 body가 아니기 때문이죠.

    def say_hello():
      print("hello")
      print("bye")
      
    say_hello()

    함수를 정의해놓으면 호출할때 굉장히 편리하며,

    def say_hello():
      print("hello")
      print("bye")
      
    say_hello()
    say_hello()
    say_hello()
    say_hello()
    say_hello()

    다음과 같이 원하는 만큼 함수를 호출해서 사용할 수 있습니다.

    function( ) 의 ( ) 는 무엇인가요?
    function을 실행시키겠다는 의미입니다. function만 있으면 실행이 되지 않습니다 function( ) 처럼 뒤에 ( ) 가 붙어있어야 실행시킵니다.

     


    4. Positional Arguments ( 인자 )

    Positional Arguments 인자인데 위치에 의존적인 인자입니다. 좀 더 자세히 알아볼까요.

    def say_hello():
      print("hello")
      
    say_hello()

    print("hello")를 보면 print function 안에 "hello"가 들어가 있음을 볼 수 있습니다.

    print function은 뭔가를 ( )안에 넣을 수 있게 허용하고 있습니다. 넣을 수 있는 무언가를 arguments(인자)라고 합니다.

    say_hello  function이 가질 수 있는 arguments에 who라는 이름을 지어줍시다.

    def say_hello(who):
      print("hello", who)
      
    say_hello("Momo")

    실행을 시키면 어떻게 출력이 될까요?

    해당 인자가 그대로 들어가서 출력되는것을 볼 수 있습니다.

    function을 실행할 때 뭔가를 넣어 줄 수 있고 function 의 body로 전달되어서 출력이 됩니다.

    만약 인자를 전달하지 않으면 에러가 발생하게 됩니다.

    인자에는 유효한 타입이라면 어떤 내용이든 들어가도 됩니다.

    인자를 활용하는 방법을 더 자세하게 이해하기 위해 계산기의 더하기와 뺄셈 기능을 만들어봅시다.

    def plus(a, b):
      print(a + b)
    
    def minus(a, b):
      print(a - b)
    
    plus(5, 2)
    minus(5, 2)

    여기서도 필요한 인자의 갯수만큼 정확히 전달해 줘야 합니다. 한 개의 인자만 전달할 경우에는 에러가 발생하게 됩니다.

    def plus(a, b):
      print(a + b)
    
    def minus(a, b):
      print(a - b)
    
    plus(5, 2)
    minus(5)

    만약 인자를 전달하지 않더라도 필요한 값을 직접 기본으로 준다면 에러가 발생하지 않습니다.

    def plus(a, b):
      print(a + b)
    
    def minus(a, b=0):
      print(a - b)
    
    plus(5, 2)
    minus(5)

    이것을 default value라고 합니다. 원한다면 모든 인자에 default value를 추가할 수 있습니다.

     

     최종적으로 정리하자면

    def say_hello(name="anonymous"):
      print("hello", name)
    
    say_hello()
    say_hello("Momo")

     

    function에는 argument를 넣을 수 있습니다. 또한 default value를 추가할 수도 있습니다.

    또한 function은 원하는 만큼 호출해서 사용할 수 있습니다.

    짤막 상식
    print function은 무한대의 인자를 가질 수 있습니다. print( )에 유효한 type이라면 무한대의 인자를 넣을 수 있고 실행시킬 수 있습니다.

     

    function안에서 어떤 일이 발생하는지와 function의 결과물에 대해 신경써야 합니다.

    print가 아니라 return을 사용하면 어떻게 될까요?

    def p_plus(a, b):
      print(a + b)
    
    def r_plus(a, b):
      return a + b
    
    p_result = p_plus(2, 3)
    r_result = r_plus(2, 3)
    
    print(p_result, r_result)

    Console창을 봅시다

    첫번째 줄에 출력된 5는

    def p_plus(a, b):
      print(a + b)
    
    p_result = p_plus(2, 3)

    p_result = p_plus(2, 3)에 의해 p_plus function이 호출이 되고 p_plus function의 print function이 실행된 모습입니다.

    하지만 r_result = r_plus(2, 3)에 의해 r_plus function이 호출이 되었지만 return의 경우에는 console창에 출력이 되지 않고 있지요.

    두번째 줄에 출력된 None과 5는

    def r_plus(a, b):
      return a + b
    
    r_result = r_plus(2, 3)

    p_result와 r_result 변수에 들어간 값을 출력시키고 있어요. 하지만 p_result의 경우에는 None을 출력하고 있습니다. 아무값도 아니라는 뜻입니다. 하지만 r_result는 5의 값을 출력시키고 있습니다.

    즉 return 키워드를 사용하면 function을 호출 할 때 그 function이 return된 값으로 치환되어져 해당 변수에 저장이 됩니다.

     

    return은 function을 종료시키는 역할도 합니다.

    def r_plus(a, b):
      return a + b
      print("실행이 될까요?")
    
    r_result = r_plus(2, 4)
    
    print(r_result)

    console창에 보이는 것처럼 return 밑에 있는 print function은 실행되지 않았습니다.

    return은 function을 종료시켜 버리는 것이죠. print( )는 없는거나 다름없는 함수입니다.

    그래서 오직 한번에 하나의 값만 return 할 수 있습니다. 두개의 값을 두번에 나눠서 return 할 수 없습니다.

    이해가 되셨을까요?


    5. Keyword Argument ( 인자 )

    인자인데 위치에 따라 정해지는 것이 아니라 argument의 이름으로 쌍을 이루는 방법입니다.

    def plus(a, b):
      return a + b
    
    result = plus(b=30, a=1)
    
    print(result)

    인자의 위치에 상관없이 인자의 이름에 따라 값을 결정하는 방식입니다.

    위와 같이 작성하면 인자의 순서를 신경쓸 필요 없이 인자의 이름만 신경쓰면 됩니다.

     

    def say_hello(name, age):
      return "Hello name you are age years old"
    
    hello = say_hello("모모","28")
    print(hello)

    이렇게 작성했을 때는 어떤 결과가 나올까요?

    인자는 정확하게 들어갔으므로 function 호출에는 문제가 없으나 인자를 사용하지 않았으므로 reutrn에 있는 stirng값이 그대로 출력되는 모습을 볼 수 있습니다.

    어떻게 해야 return의 string문에 불러온 인자를 사용할 수 있을까요?

    string안에 변수를 포함시키고 싶으면 string앞에 f를 붙이면 됩니다. (format) 그 다음 변수의 이름을 { }로 감싸줍니다.

    def say_hello(name, age):
      return f"Hello {name} you are {age} years old"
    
    hello = say_hello("모모","28")
    print(hello)

    깔쌈하게 집어넣었던 인자들이 사용되는 모습을 볼 수 있지요.

    또는 f 대신에 + 를 이용해서 문자열끼리 합치는것도 가능합니다.

    def say_hello(name, age):
      return "Hello " + name + " you are " + age + " years old"
    
    hello = say_hello("모모","28")
    print(hello)

    하지만 실제로 사용할때는 string을 formatting하는 방법인 첫번째 방식이 제일 간단하고 편리합니다. 두번째 방식을 사용할때는 띄어쓰기에도 큰 신경을 써야하기 때문이죠.

     

    여기서 keyword argument를 사용하고자 한다면 어떻게 사용해야 할까요.

    def say_hello(name, age):
      return "Hello " + name + " you are " + age + " years old"
    
    hello = say_hello(age="28", name="모모")
    print(hello)

    베리 이-지 하죠?

    keyword argument는 자주 사용하기 때문에 잘 알아두는게 좋습니다.

    지금은 두개의 인자만 사용하기 때문에 순서를 파악하기 편하지만 인자가 수십, 수백개로 늘어난다면 그 순서를 기억하고 작성하는것은 굉장히 골치 아파지는 일이 됩니다.

    물론 인자의 순서를 기억하고 있다면 positional argument 방식을 사용해도 좋습니다.


    [ 깜짝 Code Challenge ! ]

    7가지의 function을 만들어봅시다.

    plus, minus, times, division,  negation, power, reminder

    7가지 연산자를 이용해서 계산기를 만들어 봅시다.

    plus : 더하기
    minus : 빼기
    times : 곱하기
    division : 나누기
    negation : 역수
    power : 거듭제곱
    reminder : 나머지

    주의해야할 점이 있습니다. user들이 number type이 아닌 string type을 넣을 경우가 발생하기도 합니다.

    이렬 경우는 에러가 발생하겠지요. integer와 string은 사칙연산을 이용할 수가 없기 때문이죠.

    오류가 발생하지 않도록 예외처리를 어떻게 할지에 대해서도 고민을 해봐야합니다.

    type을 pytion의 bulit-in function을 이용해서 다른 type으로 변경하는 방식을 사용하면 됩니다.

     

    추가로 숫자를 user에게 직접 입력받고 싶다면 int를 사용하면 됩니다.

    a = input("첫 번째 숫자를 입력해주세요 --> ")
    
    print(a)

    그리고 입력받는 데이터 type을 제한하고 싶다면 다음과 같이 작성하면됩니다.

    a = int(input("첫 번째 숫자를 입력해주세요 --> "))

    int는 number를 입력해야합니다. 만약 문자를 입력하게 되면 어떻게 될까요?

    이렇게 오류가 발생하게 됩니다. 해당 내용들을 기억하며 코드 챌린지를 진행하게 되면

    # 깜짝 계산기 만들기
    
    def x_plus(a, b):
      print(f"더하기 : {a + b}")
    
    def x_minus(a, b):
      print(f"빼기 : {a - b}")
    
    def x_times(a, b):
      print(f"곱하기 : {a * b}")
    
    def x_division(a, b):
      print(f"나누기 : {a / b}")
    
    def x_negation(a, b):
      print(f"A : {-a}, B : {-b}")
    
    def x_power(a, b):
      print(f"거듭제곱 : {a ** b}")
    
    def x_reminder(a, b):
      print(f"나머지 수 : {a % b}")
    
    
    a = int(input("첫 번째 숫자를 입력해주세요 --> "))
    b = int(input("두 번째 숫자를 입력해주세요 --> "))
    
    x_plus(a, b)
    x_minus(a, b)
    x_times(a, b)
    x_division(a, b)
    x_negation(a, b)
    x_power(a, b)
    x_reminder(a, b)

    다음과 같이 구성할 수 있습니다.

    만약 문자를 입력했을때 console 창에 error가 출력되는 것이 아니라 '숫자를 입력해주세요' 를 출력하고 싶다면 좀 더 다르게 코드를 짜야겠지요? 또한 실제로 계산기 느낌으로 만들고 싶다면 선택지를 주는것도 좋은 방법입니다.


    6. if - else, if - elif ( 조건문 )

    모든 프로그래밍 언어는 if-else를 가지고 있습니다. if-else는 기본적으로 소프트웨어 logic을 컨트롤하는 방법입니다.

     

    6.1 if - else

    def plus(a,b):
      if type(b) is str:
        print("b는 str입니다.")
      else:
        print("b는 str가 아닙니다.")
    
    plus(12, "10")

    plus function을 통해 if-else문을 학습해보겠습니다.

    if는 뒤에 조건문을 붙이고 그것이 True이면 해당 문구를 실행, False이면 다음문구(else)로 넘어갑니다.

    if type(b) is str 

    의 경우에는 type(b) is str은 b의 type은 string이냐 조건문이고, 실제로 b는 "10" 이라는 string type을 가지고 있으므로 print("b는 str입니다.")가 출력됩니다.

    즉 해당 코드는 아래와 같이 이해할 수 있습니다.

    def plus(a,b):
      만약 b의 type이 string이라면:
        print("b는 str입니다.")
      아니라면:
        print("b는 str가 아닙니다.")
    
    plus(12, "10")

    a, b 둘 다 조건을 넣고 싶은 경우에는 and나 or을 이용하면 됩니다. 중요한 것은 조건문에 들어가는 내용이 True나 False인 boolean 타입으로 결론이 나야한다는 것입니다. 참이거나 거짓인 값이 나와야 하는 것입니다.

    def plus(a,b):
      if type(a) is str or type(b) is str:
        print("a와 b는 둘 중 하나가 str입니다.")
        return None
      else:
        print("a와 b는 str가 아닙니다.")
    
    plus(12, "10")

    상단의 코드 챌린지에서 사용자가 입력한 숫자가 int가 아닐 경우에는 어떻게 하면 좋을지 조금 감이 오시나요?

     

    6.2 if - elif

    if - elif문의 경우에는 조건을 여러개로 추가하고 싶을때 사용합니다.

    예시를 위해 음주를 할 수 있는 나이인지 확인할 수 있는 코드 보도록 하겠습니다.

    def age_check(age):
      print(f"당신의 나이는 {age}세 입니다.")
      if age < 18:
        print("당신은 술을 마실 수 없습니다.")
      else:
        print("당신은 술을 마실 수 있습니다.")
    
    age_check(18)

    if-else문을 이용해서는 한가지의 조건만을 만들 수 있지요. 여기에 18살일 경우에는 "세이프!" 라는 문구를 출력할 수 있도록 코드를 짜보도록 하겠습니다.

    def age_check(age):
      print(f"당신의 나이는 {age}세 입니다.")
      if age < 18:
        print("당신은 술을 마실 수 없습니다.")
      elif age == 18:
        print("세이프!")
      else:
        print("당신은 술을 마실 수 있습니다.")
    
    age_check(18)

    이렇게 elif문을 사용한다면 원하는 만큼 조건을 무한정으로 추가할 수 있습니다.


    7.  for ( 반복문 )

    # tuple
    days = ("Mon", "Tue", "Wed", "Thu", "Fri")
    
    # x is variable
    for x in days:
      print(x)

    갑자기 코드를 냅다 적어버리기. x 는 variable이고 for문은 우리가 생각하는 반복문입니다.

    x는 days라는 tuple문을 실행시키는데 순차적으로 값을 가져와 print 시킵니다.

    이때 variable의 이름은 무엇이든 상관이 없으나 배열이름은 정확하게 입력을 시켜줘야합니다.

    for x in days:

    놀라운 것은 variable을 따로 선언할 필요 없이 냅다 사용이 가능하다는 것입니다.

    for문이 실행되면 자동으로 variable이 생성되고 그 variable은 작업되는 배열의 item을 가리키게 됩니다.

    for문을 중단시키기 위해서는 break를 사용합니다.

    # tuple
    days = ("Mon", "Tue", "Wed", "Thu", "Fri")
    
    # x is variable
    for x in days:
      if x == "Wed":
        break
      else:
        print(x)

     

    variable이 호출한 값이 Wed가 되자 break가 된 모습을 볼 수 있습니다.

    for문은 string또한 순차적으로 출력시킬 수 있습니다.

    for x in "이것도 분리시켜 보시지?":
      print(x)

    for문에서는 string도 배열로 취급받고 있다는 것을 알 수 있습니다.


    8.  import ( Module 사용하기 )

    파이썬에는 module이 내장되어 있습니다. module은 기능의 집합인데 Python에 import 해서 사용할 수 있습니다.

    수학기능을 모아놓은 Module을 사용해보도록 하겠습니다. 자세한건 아래 링크를 참고해주세요.

     

    math — 수학 함수 — Python 3.10.1 문서

    math — 수학 함수 이 모듈은 C 표준에서 정의된 수학 함수에 대한 액세스를 제공합니다. 이 함수는 복소수와 함께 사용할 수 없습니다; 복소수를 지원해야 하면 cmath 모듈에 있는 같은 이름의 함

    docs.python.org

    math는 python에서 기본적으로 제공하는 module입니다. 따로 설치할 필요가 없다는 의미죠.

    print(math.ceil(1.2))

    math.ceil은 반올림을 해줍니다. 하지만 이대로 사용하면 에러가 발생합니다. math가 정의되지 않았다는 것입니다. 따라서 해당 module을 사용하기 위해서 import 과정이 필요한것입니다. 쉽게 생각하면 다운로드와 비슷합니다.

    import math
    
    print(math.ceil(1.2))

    파이썬에서는 module을 정말 많이 사용하므로 module을 import 해보고 사용해보는 연습이 필요합니다.

    이 모든 module을 암기할 필요는 없습니다. 필요할 때마다 찾아서 쓸 수 있을 정도의 이해만 있으면 됩니다.

    연습을 통해 '아 이런 module도 있구나' 를 인식하기만 하면 됩니다.

    import 할 때 알아두면 좋은 것
    1. module에 있는 기능을 전부 import 할 필요는 없습니다.
      - module내에 있는 특정 기능만을 가져오고 싶을때는 다음과 같이 입력합니다.
    from math import ceil, fsum

      - 이렇게 불러왔을 경우에는 math.ceil이라고 작성을 할 필요가 없습니다.

    from math import ceil, fsum
    
    print(ceil(1.2))
    print(fsum[1, 2, 3, 4])

      - 사용할 기능만 가져오도록 합시다.

    2. module에 있는 기능의 이름을 바꿔서 가져올 수 있습니다.

    from math import ceil as momo_ceil
    
    print(momo_ceil(1.2))

      - as를 이용해서 import 할때 이름을 정해줄 수 있습니다.

    그러면 내가 만든 module도 불러올 수 있겠지요?

    별도의 python 파일을 생성해 줍시다. ( main.py 는 그대로 둡니다. ) caculator.py

    그리고 각각의 파일에 다음과 같이 작성해줍니다.

    # calculator.py
    def plus(a, b):
      return a + b
    # main.py
    from calculator import plus
    
    print(plus(1, 2))

    실행을 시키면 

    다음과 같이 calculator.py의 plus function이 잘 실행됨을 확인할 수 있습니다.

    직접 module을 만들어보고 import 시켜본것입니다.

     

     

    이제 매우 간단한 python 주요 기능들을 알아보았으니 웹크롤링을 진행하러 갑시다.

    댓글

Designed by Nana