<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>doit_sophie.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 20 May 2024 11:59:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. doit_sophie.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/doit_sophie" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[blender 기초 | 핫도그 만들기]]></title>
            <link>https://velog.io/@doit_sophie/blender-%EA%B8%B0%EC%B4%88-%ED%95%AB%EB%8F%84%EA%B7%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@doit_sophie/blender-%EA%B8%B0%EC%B4%88-%ED%95%AB%EB%8F%84%EA%B7%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 20 May 2024 11:59:00 GMT</pubDate>
            <description><![CDATA[<h3 id="완성본">완성본</h3>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/d009b2cb-58b6-4537-acc8-3e0d36583d9f/image.png" alt=""></p>
<blockquote>
<p>*<em>빵&amp;소세지 만들기 *</em></p>
</blockquote>
<p>(UV Sophere &gt; Segments:32, Rings:16)
(edit mode &gt; 선모드 &gt; alt+중간선 선택 &gt; control+b &gt; 작게 틈 만들기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/70e5f8cf-5f8c-4749-a968-71f994428b05/image.png" alt="">
(우측 상단의 엑스레이 모드 클릭 &gt; Z축 클릭 &gt; 오브젝트의 x축 위의 모든 점 선택 &gt; G+Z &gt; 위로 늘리기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/9d4583ee-90c3-4d4a-a974-fc012c492e4c/image.png" alt="">
(소세지도 같은 작업이라 미리 만들기)
(object mode &gt; shift+d &gt; 넘패드7 &gt; S로 크기 조절)
(edit mode &gt; x축 위의 점 모두 선택 &gt; g+z로 길이 늘려주기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/94a7101d-b891-4a74-9d46-e0aeb205c293/image.png" alt="">
(edit mode &gt; 넘패드7 &gt; 엑스레이모드 on &gt; y축 기준 6줄의 점 모두 선택 &gt; delete)
<img src="https://velog.velcdn.com/images/doit_sophie/post/881bd37b-3304-4edb-8cec-a2e4c6189ccb/image.png" alt="">
<img src="https://velog.velcdn.com/images/doit_sophie/post/113b7d7d-e82a-4464-b84d-85cd4fcdd420/image.png" alt="">
(엑스레이모드 off &gt; 꼭지점 클릭 &gt; alt+가장자리 아무 점 클릭 &gt; f)
<img src="https://velog.velcdn.com/images/doit_sophie/post/6070cd75-d1e5-499e-90aa-3f54b7383f4e/image.png" alt="">
(상단, 하단의 꼭지점 선택 &gt; J)
<img src="https://velog.velcdn.com/images/doit_sophie/post/a912ccd1-a82a-4a66-8cdd-e0e8ec358de7/image.png" alt="">
(넘패드1 &gt; k &gt; 좌측점 클릭 &gt; 우측점 클릭 &gt; 엔터)X반복
(만 마지막 점은 이미 사각형이기때문에 자를 필요 없음)
<img src="https://velog.velcdn.com/images/doit_sophie/post/26487f98-3842-4e22-ad9b-6b351577ad21/image.png" alt="">
<img src="https://velog.velcdn.com/images/doit_sophie/post/dcb810ea-b2f5-49b1-a921-5e6692cd7d8e/image.png" alt="">
(object mode &gt; shift+a &gt; curve &gt; beziere)
<img src="https://velog.velcdn.com/images/doit_sophie/post/84e4923f-18f2-4fae-8bde-246f2aeab7f1/image.png" alt="">
(edit mode &gt; 기존 베지어 삭제 &gt; 넘패드3 &gt; curve pen으로 J곡선 그리기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/2bc2faae-671e-4da8-9895-2958f90c9f77/image.png" alt="">
(object mode &gt; 빵 선택 &gt; add modifier &gt; deform &gt; curve)
<img src="https://velog.velcdn.com/images/doit_sophie/post/6f20e68d-c72c-4617-bc26-625871ada1dd/image.png" alt="">
(Curve object:BezierCurve, Deform Axis:Z &gt; 소세지빵 R+Z+180으로 돌려주기 &gt; G+Z로 빵을 곡선 위로 올려주기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/59e6cef4-3439-4926-8655-db5e836e4761/image.png" alt="">
(edit mode &gt; control+r &gt; 마우스휠 위로 굴려서 선 추가해주기)</p>
<ul>
<li>소세지빵의 곡선을 더 만들어주기 위해
<img src="https://velog.velcdn.com/images/doit_sophie/post/61f86414-d3ec-44e8-a316-8d2a73d90a1b/image.png" alt="">
<img src="https://velog.velcdn.com/images/doit_sophie/post/5c1b2295-910b-4a1d-8e2d-9fae0473db8a/image.png" alt="">
(소세지에도 똑같이 control+r로 선 추가해주기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/ed71b13b-3f82-4e75-a311-433fa2b92303/image.png" alt="">
(object mode &gt; 소세지 선택 후 빵 선택 &gt; control+L &gt; copy modifier )
<img src="https://velog.velcdn.com/images/doit_sophie/post/43c01880-0670-4ff4-b5a0-97eed9618892/image.png" alt="">
(G+Z로 소세지 위치 조정)
<img src="https://velog.velcdn.com/images/doit_sophie/post/b83df5f7-a8fd-4652-8acf-e0134d0e3eea/image.png" alt="">
(add modifier &gt; generate &gt; decimate &gt; Ratio 낮추기 &gt; 질감을 불규칙적으로 만듦)
<img src="https://velog.velcdn.com/images/doit_sophie/post/9208b9f7-9a69-4dee-b68f-401c0e2bf8fb/image.png" alt="">
(소세지에도 효과 주기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/f9c32b96-8b99-4611-8717-2d9fd395c0bf/image.png" alt=""></li>
</ul>
<blockquote>
<p>*<em>소스 얹기 *</em></p>
</blockquote>
<p>(object mode &gt; shift+a &gt; curve &gt; beziere &gt; edit mode &gt; 선 삭제)
(curve pen 선택 &gt; 소스 모양대로 선 만들어주기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/88833097-d9b1-42b2-a090-8e8c87832d83/image.png" alt="">
(object mode &gt; add modifier &gt; shrink wrap)
<img src="https://velog.velcdn.com/images/doit_sophie/post/fa05220b-a4c4-4448-9cdf-1075db80ad71/image.png" alt="">
(Wrap Method:Target Normal, Target:Sausage)
<img src="https://velog.velcdn.com/images/doit_sophie/post/48d51cb8-8ff8-4e3d-ac78-a27514e29912/image.png" alt="">
(G+Y로 소세지에 가깝게 위치 &gt; Data탭 &gt; Geometry &gt; Bevel &gt; Round &gt; Depth:0.05m, Fill Caps 체크 &gt; shrink wrap을 apply )
<img src="https://velog.velcdn.com/images/doit_sophie/post/5ea4943d-e19e-4ab9-9bff-1c027cb4c0d8/image.png" alt="">
<img src="https://velog.velcdn.com/images/doit_sophie/post/05a0192e-8cd8-4832-baf8-e5af1fb91364/image.png" alt="">
(control+a &gt; all transform)
<img src="https://velog.velcdn.com/images/doit_sophie/post/5d0d9b9b-fd83-4ce9-bcfa-de74ce4f99d4/image.png" alt="">
(edit mode &gt; alt+s &gt; 소스 두께 조절)
<img src="https://velog.velcdn.com/images/doit_sophie/post/d77106b5-b9c7-4d52-8d1b-7700eac3dd73/image.png" alt=""></p>
<p>(별깍지 모양으로 변경하려면 &gt; shift+a &gt; curve &gt; circle )
<img src="https://velog.velcdn.com/images/doit_sophie/post/cc33c525-840f-4d40-9346-4e381fb06a42/image.png" alt=""></p>
<p>(edit modee &gt; 우클릭 &gt; subdivide &gt; 네 점 선택 &gt; s로 일그러트리기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/0796a6c6-2acd-4559-9459-13fe936d1f45/image.png" alt="">
(나머지 점 선택 &gt; v &gt; vector &gt; 뽀족하게 만들기)
<img src="https://velog.velcdn.com/images/doit_sophie/post/c5eed75b-9290-4fda-8d7b-461b5bd93876/image.png" alt="">
(object mode &gt; 소스 선택 &gt; Data탭 &gt; Bevel &gt; obeject탭 선택 &gt; Object:star &gt; 별모양의 크기에 따라 소스 크기가 달라짐)
<img src="https://velog.velcdn.com/images/doit_sophie/post/e8852d6f-e8e4-4e59-a3bc-e61f488577c3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python기초(6): 객체지향프로그래밍(OOP), Class, Method, Inheritance]]></title>
            <link>https://velog.io/@doit_sophie/Python%EA%B8%B0%EC%B4%886-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8DOOP</link>
            <guid>https://velog.io/@doit_sophie/Python%EA%B8%B0%EC%B4%886-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8DOOP</guid>
            <pubDate>Tue, 05 Mar 2024 05:12:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>객체지향프로그래밍(Object Oriented Programming)이란?</p>
</blockquote>
<p>객체지향프로그래밍은 코드를 구성하는 방법 중 하나이며, 매우 직관적이고 데이터와 코드를 잘 구성해준다. 파이썬 뿐만 아니라 Java, C#, JavaScript, TypeScript, Dart 등등 다양한 언어에서 객체지향프로그래밍을 지원한다.</p>
<blockquote>
<p>객제지향 프로그래밍의 특징</p>
</blockquote>
<p><strong>1. 클래스(Class)</strong>
데이터를 정의하고, 그 데이터를 기반으로 동작하는 함수를 정의하는 것을 도와준다.</p>
<p><strong>2. 메소드(method)</strong>
클래스 안에 있는 함수를 말한다. 지금까지 만들었던 함수(function)와 똑같은데 단지 위치의 차이만 존재한다. class에 안에 있으면 method, class 밖에 있으면 function이다.</p>
<p>파이썬은 클래스를 위한 다양한 종류의 메서드를 제공하는데, 그 중에서 <strong>init</strong> 메서드는 클래스를 생성할 때 자동으로 실행되는 메서드이다.</p>
<p>작성할 때는 def <strong>init</strong>(): 이렇게 작성하는데, 이때 중요한 점은
method를 가지고 있을 경우 method의 첫번째 argument는 자동으로 self가 된다.
굳이 self라고 명명할 필요는 없지만 보통은 self라고 쓴다고 한다.</p>
<pre><code>class Puppy:

  def __init__(self):
        print(self)
      print(&quot;Puppy is born!&quot;)

ruffus = Puppy()

print(ruffus)</code></pre><p>위의 예시에 있는 코드를 실행해보면 self와 ruffus 모두 동일한 object를 갖는 것을 알 수 있다. 즉, Puppy라는 class에 있는 모든 method는 <strong>init</strong> 뿐만 아니라 모든 밑줄을 사용하는 method와 우리가 만든 모든 method에 대해서 첫 번째 argument로 그들 자신을 참조한다는 뜻이다. </p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/662ba533-656d-4963-a2c3-acb1ff558d8a/image.png" alt=""></p>
<p>아래의 예시와 같이 Puppy라는 클래스를 각기 다른 변수명으로 지정한 후,
클래스 안의 메소드를 호출해보면 self에 대해 좀 더 이해할 수 있다.</p>
<pre><code>class Puppy:

  def __init__(self):
      self.name = &quot;Ruffus&quot;
      self.age = 0.1
      self.breed = &quot;Beagle&quot;

ruffus = Puppy()
bibi = Puppy()

print(
  bibi.name,
  ruffus.name
)</code></pre><p>먼저 Puppy의 메소드로 name, age, breed 등을 만들어 놓은 후
각각 ruffus, bibi라는 변수명으로 지정한다.</p>
<p>그런 후에 print함수로 bibi.name, ruffus.name을 호출하면
self자리에 각각 bibi, ruffus가 들어가서 둘 다 Ruffus라는 값이 콘솔창에 뜨게 된다.</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/a2cd0175-750a-49a6-a6f4-4a28f1c735cb/image.png" alt=""></p>
<p>여기서 조금 변경하면 메소드에 지정된 값이 아닌, 함수에서 호출한 각각의 값을 불러올 수도 있다.</p>
<p>기존의 메소드는 self라는 자동 argument만 가진 후 메소드 안에 name, age, breed를 아예 고정해뒀기 때문에 클래스를 호출하면 무조건 Ruffus라는 이름의 0.1살, Beagle이 호출된다. 그런데 여기에 name, breed라는 argument를 추가해서 함수를 호출할 때 해당 값을 지정할 수 있도록 변경할 수 있다.</p>
<pre><code>class Puppy:

  def __init__(self, name, breed):
      self.name = name
      self.age = 0.1
      self.breed = breed

ruffus = Puppy(&quot;Ruffus&quot;, &quot;Beagle&quot;)
bibi = Puppy(&quot;Bibi&quot;, &quot;Golden Retriever&quot;)

print(
  bibi.name,
  ruffus.name
)</code></pre><p>위의 예시처럼 age 값만 고정하고 name과 breed는 argument에 지정한 이름 그대로 넣어준다. 그런 후에 각각 ruffus, bibi라는 변수명으로 지정한 후 argument로 각 변수명이 원하는 값(Ruffus,Beagle/Bibi,Golden Retriever)을 지정한다.</p>
<p>그런 후에 print 함수로 호출해주면 아까와는 달리 Bibi, Ruffus라는 각기다른 결과값을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/c6a9380e-5e32-4962-a102-98a7c1957d50/image.png" alt=""></p>
<p><strong>2.1 <strong>str</strong>()</strong></p>
<p><strong>str</strong>()메서드는 <strong>init</strong>()에서 세팅해둔 데이터를 활용해 문자열로 나타낼 때 사용된다.</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/c9b81450-94d0-4a3b-bd38-fc7d4bd4931b/image.png" alt=""></p>
<p>여기서 중요한 점은 우리가 커스터마이징한대로 결과값을 호출하기 위해서는 변수 그 자체(eg. print(bibi))를 호출해야 한다는 점이다.</p>
<p>만약 아까처럼 print(bibi.name)을 호출하면 init메서드에서 지정한 값이 호출된다.</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/aee0dfa1-ecab-4139-b7cc-7f86da1460b5/image.png" alt=""></p>
<p><strong>2.2 __를 사용하지 않는 메서드</strong></p>
<p>파이썬에서 반드시 __를 사용해서 메서드를 만들어야하는 것은 아니다.
woof_woof()라는 함수명을 사용해서 Woof!Woof!라고 프린트되는 메서드를 만들 수 있고 </p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/39f6633d-3e3d-4037-a9a8-431fcd70aa6c/image.png" alt=""></p>
<p>introduce()함수를 만들어서 위에서 만든 woof_woof() 메서드와 <strong>init</strong>에서 지정한 argument를 동시에 활용할 수도 있다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/ef0bf117-7d7f-4a22-959e-4c8cf8e0f9e8/image.png" alt=""></p>
<p><strong>3. 상속(Inheritance)</strong></p>
<p>상속은 우리가 만든 코드를 저장하고 다시 사용할 수 있도록 해준다.</p>
<p>예를 들어서 우리가 위에서 만든 Puppy 클래스 외에 GuardDog 이라는 새로운 클래스를 만든다고 할 때, name, breed, age를 또 지정해야하면 Puppy 클래스에서 만든 코드를 또 만들어줘야하는 이중 일이 된다.</p>
<p>이런 경우에 Puppy와 GuardDog이 공통으로 가지는 요소(age, name, breed)를 Dog이라는 클래스를 만들어서 상속받을 수 있도록 해줌으로써 해결할 수 있다.</p>
<p>상속을 해주기 위해서 먼저 Dog이라는 클래스를 만들어준다.</p>
<pre><code>class Dog:

  def __init__(self, name, breed, age):
    self.name = name
    self.breed = breed
    self.age = age</code></pre><p>그런 후, 해당 클래스를 상속받을 Puppy와 GuardDog 클래스의 argument에 Dog 클래스를 넣어준다.</p>
<pre><code>class GuardDog(Dog):

class Puppy(Dog):</code></pre><p>이렇게 해줌으로써 Puppy가 woof_woof도 가지는 동시에 name, breed, age도 가지도록 해줄 수 있다.</p>
<p>그런데 이렇게 실행해주면 Dog에 <strong>init</strong>이 age라는 필수 argument가 없다고 나온다.<br>왜냐하면 Puppy와 GuardDog을 초기화 할 때 파이썬은 자동으로 Dog의 <strong>init</strong>()메소드를 호출하고 있고, 그렇기 때문에 Dog 클래스는 (name, breed, age) 세 개의 argument를 받길 원하는데 Puppy와 GuardDog은 name과 breed만 보내주고 있기 때문이다(기존의 코드에서는 age를 각각 0.1, 5로 고정했기때문).</p>
<p>이를 해결하기 위해서 age=0.1, age=5 이렇게 똑같이 추가해줄 수 도 있지만,
다른 방법으로 Puppy와 GuardDog의 init메소드를 활용할 수도 있다.</p>
<p>먼저, Puppy와 GuardDog의 init메소드를 초기화해주기 위해 super를 사용한다.
여기서 super는 Dog인 부모의 class를 참조하는 걸 말한다.
따라서 super().<strong>init</strong>()은 Dog의 init메소드를 호출한다는 의미다.</p>
<p>그런 다음 외부에서 입력한 name, breed, 그리고 고정된 0.1을 받기 위해서 super().<strong>init</strong>(name, breed, 0.1)을 입력해준다.</p>
<pre><code>class Puppy(Dog):
    def __init__(self, name, breed):
        super().__init__(name, breed, 0.1)</code></pre><p>class GuardDog에도 똑같은 과정대로 변경해주는데 나이만 5로 변경해준다.</p>
<pre><code>class GuardDog(Dog):

  def __init__(self, name, breed):
    super().__init__(name, breed, 5)
    self.aggresive = True

  def rrrrr(self):
    print(&quot;stay away!&quot;)</code></pre><p>정리하자면, GuardDog을 초기화할 때 def__init__(self, name, breed)를 통해 외부에서 받아온 name과 breed값을 붙여 넣고, 그것들을 super().<strong>init</strong>(name, breed, 5)를 통해 Dog의 <strong>init</strong>() 메소드에 전달해주는 것이다.</p>
<p>이렇게 코드를 작성한 후에 ruffus는 Puppy, bibi는 GuardDog의 Class를 받는다고 해준 후 각각 외부의 입력값인 name과 breed를 입력해준다.</p>
<pre><code>ruffus = Puppy(
  name = &quot;Ruffus&quot;,
  breed = &quot;Beagle&quot;
)
bibi = GuardDog(
  name = &quot;Bibi&quot;,
  breed = &quot;Chihuahu&quot;
)</code></pre><p>그런다음 bibi와 ruffus를 각각 호출해주면 참조한 class 값을 잘 받아오는 것을 알 수 있다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/c6bb8382-dbce-4d81-960d-81cde1f3d1ef/image.png" alt=""></p>
<p>전체 코드</p>
<pre><code>#ruffus와 bibi 둘 다 영향을 받는 class
class Dog:

  def __init__(self, name, breed, age):
    self.name = name
    self.breed = breed
    self.age = age

  def sleep(self):
    print(&quot;Zzzzzz...&quot;)

  def introduce(self):
    print(f&quot;I am {self.name} and I am {self.age} years old&quot;)

class GuardDog(Dog):

  def __init__(self, name, breed):
    super().__init__(name, breed, 5)

    self.aggresive = True

  def rrrrr(self):
    print(&quot;stay away!&quot;)


class Puppy(Dog):
  #Dog의 init매소드 참조
  def __init__(self, name, breed):
    super().__init__(name, breed, 0.1)

    self.spoiled = True

  #문장 그대로 나타내주는 매소드
  def __str__(self):
    return f&quot;Puppy named {self.name}, breed:{self.breed}, age:{self.age}&quot;

  def woof_woof(self):
    print(&quot;Woof Woof!&quot;)

#ruffus는 Puppy 클래스, bibi는 GuardDog 클래스 참조
ruffus = Puppy(
  name = &quot;Ruffus&quot;,
  breed = &quot;Beagle&quot;
)
bibi = GuardDog(
  name = &quot;Bibi&quot;,
  breed = &quot;Chihuahu&quot;
)


#Puppy 클래스 참조
ruffus.introduce()
#GuardDog 클래스 참조
bibi.rrrrr()
#Dog 클래스 참조(공통)
ruffus.sleep()
bibi.sleep()</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초(5): Pypi의 Requests로 url formatting하기]]></title>
            <link>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%884-Pypi%EC%9D%98-Requests%EB%A1%9C-url-formatting</link>
            <guid>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%884-Pypi%EC%9D%98-Requests%EB%A1%9C-url-formatting</guid>
            <pubDate>Mon, 08 Jan 2024 13:47:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>1. Pypi의 Requests 모듈 사용해보기</strong></p>
</blockquote>
<p>The Python Standard Library에는 파이썬에서 기본적으로 제공하는 모듈들이 있다.</p>
<p>하지만 이 모듈 이외에 다른 사람이 만들어 놓은 모듈을 사용하고 싶을 때는 <a href="https://pypi.org/"><strong>Pypi</strong></a>를 활용할 수 있다.</p>
<p>Pypi는 다른 사람이 만든 프로젝트나 모듈을 모아둔 곳이다.</p>
<p>(강의는 replit을 사용해서 코드를 실행하고 있으며, replit에서는 별다른 코드없이 package에서 requests를 바로 설치한 후 import 해주면 끝이다.)
<img src="https://velog.velcdn.com/images/doit_sophie/post/47edb080-0c6d-425f-b44d-6e6a9ee75e86/image.png" alt=""></p>
<p>우리가 사용할 requests 모듈은 get이라는 function을 갖고 있는데, 이 get은 하나의 url을 받고 우리가 웹사이트를 가져올 수 있게 해준다.</p>
<p>get 함수를 사용해서 website 변수에 들어있는 주소를 요청하면, 웹사이트에서는 &lt;response[200]&gt;,&lt;response[400]&gt; 등으로 응답한다.</p>
<p>여기서 http 상태 코드에 대해 잠시 설명하면, 인터넷은 Http 프로토콜을 기반으로 하며, 컴퓨터들은 http request로 서로 소통한다. 그래서  http 상태 코드를 활용해 request의 결과를 확인할 수 있다.(출처:<a href="https://pks424.tistory.com/entry/Http-%EC%9D%91%EB%8B%B5%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9C">일상기록 블로그</a>)
<img src="https://velog.velcdn.com/images/doit_sophie/post/170ddb12-93d3-4da8-86f3-ed50e3e4a9a9/image.png" alt=""></p>
<p>다시 돌아와서, print(response)를 실행했을 때 콘솔창에 &lt;Response [200]&gt;이라고 뜨면 웹사이트가 성공적으로 응답했다는 뜻이다. 그런 다음 get함수로 가져온 &lt;response[200]&gt;,&lt;response[400]&gt; 등의 리턴값을 이를 response라는 임의의 변수에 저장해준다.
<del>(내 경우에는 twitter.com를 호출했을 때 400에러가 뜬다. 다른 웹사이트 주소와 달리 트위터만 www가 없어서 그게 문제인가 싶어 www가 안붙는 임의의 티스토리 블로그 주소도 넣어보고, 인터넷 방문 기록도 지워봤는데 소용이 없었다.)</del>
<img src="https://velog.velcdn.com/images/doit_sophie/post/43d163c1-cda0-46a4-8de0-3f6dd6176759/image.png" alt=""></p>
<p>여기서 우리는 String으로 된 &lt;Response[200]&gt;이 아닌 상태 코드(200,400..)로도 바꿀 수 있는데, print(response.status_code)를 사용해주면 손쉽게 상태코드 형태로 콘솔창에 나타낼 수 있다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/b010fdcf-fb31-4e83-8a51-cfe1b2215081/image.png" alt=""></p>
<p>여기서 얻은 상태코드를 활용해서 딕셔너리 형태(<a href="https://google.com:ok)%EB%A1%9C%EB%8F%84">https://google.com:ok)로도</a> 만들 수 있는데, 그러기 위해서는 먼저 results라는 변수명을 가진 빈 딕셔너리를 하나 만들어 준다.</p>
<pre><code>result = {}</code></pre><p>그 다음에 아까 만들어 둔 if문으로 돌아가서 만약 상태코드가 200일 경우, result의 key(여기서는  순서대로 website 튜플 안의 각각의 주소들이 된다.)의 값이 OK로 표시되도록 한다.
([website] 안의 website가 for문으로 인해 순서대로 돌아가면서 google, airbnb, twitter,facebook,tiktok이 되는 것이다.)</p>
<pre><code>if response.status_code == 200:
    results[website] = &quot;ok&quot;</code></pre><p>else에 해당하는 코드도 동일하게 작성해주면 아래와 같은 코드가 완성된다.</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/6481095a-35d6-4246-a83b-53e56c7dd654/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초(4): For 반복문, not]]></title>
            <link>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%884-For-%EB%B0%98%EB%B3%B5%EB%AC%B8-not</link>
            <guid>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%884-For-%EB%B0%98%EB%B3%B5%EB%AC%B8-not</guid>
            <pubDate>Mon, 08 Jan 2024 09:20:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>1. for 반복문</strong></p>
</blockquote>
<p>for 반복문을 사용하면 리스트 안의 데이터를 일일이 꺼낼 필요없이 한 번에 접근할 수 있다.</p>
<p>for 반복문을 사용하기 위해서는 <strong>for 아무이름 in 리스트명:</strong> 이렇게 사용해주면 되는데, 여기서 &#39;아무이름&#39;은 리스트 안의 각 데이터(google, airbnb..)를 가리킨다.</p>
<p>&#39;아무이름&#39;은 변수명을 지을때처럼 아무거나 사용할 수 있지만 되도록이면 리스트명의 단수형으로 적어주는 게 인식하기 쉽다.(예: websites -&gt; website, photoes -&gt; photo)</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/142f5271-7897-4c77-9564-567eb316dfa0/image.png" alt=""></p>
<blockquote>
<p><strong>2. for 반복문을 사용해 url formatting 해보기</strong></p>
</blockquote>
<p>튜플에 있는 웹사이트 주소 중, https:// 가 붙어있지 않은 경우를 구분해내려고 한다.</p>
<p>단순히 구분하기 위해서는 if/else문을 사용해서 https:// 로 시작하는 경우와 그렇지 않은 경우 print 함수를 사용해서 콘솔창에 나타낼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/cc00844f-3717-4f79-84e2-a3a89bf22e7a/image.png" alt="">
여기서 더 나아가 https:// 가 붙어있지 않은 데이터에 해당 주소를 추가하기 위해서는 if not을 사용해서 주소가 붙어있지 않은 데이터를 골라낸 후(만약 not을 사용하고 싶지 않다면  == False를 사용해줘도 동일하게 작동한다.), f&quot;&quot;를 사용해 해당 주소를 추가해 줄 수 있다.</p>
<p>그런 다음, 기존의 website 튜플에 https:// 가 붙은 주소들로 새로 저장(업데이트)해준다. </p>
<p>중요한 건, print함수는 반드시 if문 밖에 써줘야 모든 데이터가 콘솔창에 표시된다는 점이다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/a4297a36-00d1-43fe-b6bc-c2eae10e629e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초(3): 자료 구조(list, methods, tuple, dictionary)]]></title>
            <link>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%883-%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0list-methods-tuple-dictionary</link>
            <guid>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%883-%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0list-methods-tuple-dictionary</guid>
            <pubDate>Mon, 08 Jan 2024 08:41:04 GMT</pubDate>
            <description><![CDATA[<p><em>※ 본문은 노마드코더의 &#39;Python으로 웹 스크래퍼 만들기&#39;강의 내용을 개인적으로 정리한 것입니다.</em></p>
<blockquote>
<p><strong>1. 리스트(list) &amp; 메소드(Mehtods)</strong></p>
</blockquote>
<p><strong>자료구조란</strong> 데이터를 구조화할 때 사용되며, 파이선의 자료 구조(data structure)에는 <strong><em>list, tuple, dictionary</em></strong>가 있다.</p>
<p>먼저, <strong>list</strong>를 만드는 방법은 대괄호([]) 안에 리스트 요소를 콤마(,)로 구분하는 것이다.</p>
<pre><code>days_of_week = [&quot;Mon&quot;, &quot;Tue&quot;, &quot;Wed&quot;, &quot;Thu&quot;, &quot;Fri&quot;]</code></pre><p>이렇게 만들어진 리스트를 print(days_of_week)로 출력해보면 콘솔창에 이렇게 표시된다.</p>
<pre><code>[&#39;Mon&#39;, &#39;Tue&#39;, &#39;Wed&#39;, &#39;Thu&#39;, &#39;Fri&#39;]</code></pre><p>출력된 내용만 봤을 때는 리스트를 사용했을 때와 사용하지 않았을 때(days_of_week=&quot;Mon,Tue,Wed...&quot;)의 차이점이 없어 보이지만, 리스트는 메소드를 사용할 수 있다는 점에서 엄청난 차이점을 갖는다.</p>
<p><strong>메소드란</strong> 데이터 뒤에 결합된 function을 말하는데, print, input, random 같이 데이터와의 결합없이 아무때나 쓸 수 있는 일반적인 function과는 차이가 있다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/096de198-4375-41e3-a374-67f78ede5f8c/image.png" alt="">
예시에서처럼 name이라는 변수는 sophie라는 string을 가지고 있기 때문에 capitalize, upper 등의 메소드를 사용할 수 있는 것이고, 만약 string이 아닌 int를 갖는 number라는 변수가 있다면 거기에 맞는 또다른 메소드를 사용할 수 있게 된다.</p>
<p>변수없이 바로 &quot;sophie&quot;라는 string만으로도 해당 메소드들을 사용할 수 있다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/f4eac386-d7ce-4a48-a873-ab4987fb27cf/image.png" alt=""></p>
<p>다시 돌아와서 아까 만들어 둔 days_of_week 변수를 메소드와 결합하면 다양한 기능을 사용할 수 있다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/095d0ee5-d311-4e84-b167-f94a28e09457/image.png" alt=""></p>
<p><strong>리스트 안의 특정 데이터에 접근하는 방법</strong>은 변수 오른쪽에 대괄호를 열고, 해당 데이터가 몇 번째 자리에 있는지 적어주면 된다. 중요한 것은 1이 아니라 <strong>0부터 시작</strong>이라는 점이다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/f7a02472-a6db-4153-b07f-b5b9e9795281/image.png" alt="">
뿐만 아니라, 마이너스 부호(-)를 넣어서 뒤에서부터 순서대로 접근할 수도 있는데 이때는 0이 아니라 <strong>-1부터 시작</strong>한다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/f9cb0e6e-f97e-4bc3-bdfb-3c51692fd424/image.png" alt=""></p>
<p>리스트는 문자열, 숫자 뿐만 아니라 boolean, 또다른 리스트 등을 모두 합쳐서 사용할 수 있다.</p>
<pre><code>list = [1, 2, 3, True, False, &quot;hi&quot;, [1, 2, 3]]</code></pre><blockquote>
<p><strong>2. 튜플(Tuples)</strong></p>
</blockquote>
<p>튜플의 역할 자체는 리스트와 매우 비슷하다. 하지만 <strong>튜플과 리스트의 차이점</strong>은,</p>
<ol>
<li>대괄호 대신 <strong>소괄호()</strong>를 사용</li>
<li><strong>데이터 변경 불가능</strong></li>
</ol>
<p>그래서 days를 변경하기 위해 온점을 넣어도 쓸 수 있는 메소드가 한정적이다.</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/73dda6e0-bac9-4db3-baad-1827a3b8e7d2/image.png" alt=""></p>
<p>튜플에서도 리스트와 마찬가지로 특정 데이터에 접근할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/60a2afd0-d8cc-4a1e-a837-8f28e30934a7/image.png" alt=""></p>
<blockquote>
<p><strong>3. 딕셔너리(Dictionary/Dicts)</strong></p>
</blockquote>
<p><strong>딕셔너리의 특징</strong>은</p>
<ol>
<li><strong>중괄호{}</strong>를 사용</li>
<li><strong>키</strong>와 <strong>값</strong>이 한 쌍으로 구성된다는 점이다.</li>
</ol>
<p>이 때, 큰따옴표(&quot;&quot;)나 작은따옴표(&#39;&#39;) 둘 중에 아무거나 사용해도 상관없고, 값의 형태는 string, int, boolean, list, tuple, dictionary 모두 사용할 수 있다. 
<img src="https://velog.velcdn.com/images/doit_sophie/post/e70a6bd3-4c56-4a6b-a8d9-68dda78e08fa/image.png" alt=""></p>
<p>위에서 튜플의 데이터는 변경할 수 없다고 했지만, 더 정확히는 튜플의 기존 값에 추가 혹은 일부 삭제는 불가능하지만 튜플 <strong>전체를 삭제</strong>하거나 튜플 전체의 값을 <strong>새로운 값으로 대체</strong>하는 것은 가능하다. </p>
<p><strong>딕셔너리에서 특정 데이터를 가져오는 방법</strong>은 두 가지가 있는데,</p>
<ol>
<li><strong>get 메소드</strong>를 사용하거나</li>
<li><strong>대괄호</strong>를 사용하는 것이다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/f359b04e-8d37-4133-b751-cbc0c26102fa/image.png" alt=""></li>
</ol>
<p><strong>딕셔너리에 데이터를 추가하는 방법</strong>을 살펴보면</p>
<p><strong>1. 새로운 키와 값을 추가하는 방법</strong>
변수에 대괄호를 열고 새로운 키명을 적어준 후, 부등호 뒤에 해당 키의 값을 적어준다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/41d315e7-ccce-4699-873c-3b99199a0ab2/image.png" alt=""></p>
<p><strong>2. 기존의 키에 새로운 값을 추가하는 방법</strong>
변수에 대괄호를 열어 어떤 키인지 선택한 후 append 메소드를 사용해서 새로운 값을 추가해준다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/20e7d4c9-e79e-437a-942c-4f0e5ecbb07a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초(2): 조건문(If, Else, Elif, input, int, string, python standard library, randint, while)]]></title>
            <link>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%882-%EC%A1%B0%EA%B1%B4%EB%AC%B8If-Else-Elif-input-int-string-python-standard-library-randint-while</link>
            <guid>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%882-%EC%A1%B0%EA%B1%B4%EB%AC%B8If-Else-Elif-input-int-string-python-standard-library-randint-while</guid>
            <pubDate>Fri, 05 Jan 2024 10:21:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>1. If 조건문</strong></p>
</blockquote>
<p>Python에서 조건문을 사용하는 형식은 아래와 같다.</p>
<p><strong>if 조건이되는문장:
    조건이 만족될 때 출력되는 값</strong></p>
<p>예시를 통해 살펴보자.</p>
<pre><code>#간단한 조건문 예시(참(위), 거짓(아래))

if 10 &gt; 5:
  print(&quot;Correct!&quot;)  
#출력:Correct!

if 10 &lt; 5:
  print(&quot;Correct!&quot;) 
#출력: (아무것도 출력되지 않음)</code></pre><p>변수를 사용할 경우에는 변수의 값을 미리 지정해 준 후 조건문에 사용할 수 있다. </p>
<pre><code>a = &quot;Sophie&quot;

if a == &quot;Sophie&quot;
    print(&quot;True!&quot;)

#출력: True!</code></pre><p>위의 예시에서 단일부등호(=)와 이중부등호(==)의 차이는
단일부등호는 변수의 값을 지정할 때 사용하며
이중부등호는 값이 같다는 것을 나타낼 때 사용한다는 점이다</p>
<blockquote>
<p><strong>2. Else</strong></p>
</blockquote>
<p>if 조건문이 참이 아닐 경우에 특정한 값이 출력되길 원한다면 else를 사용하면 된다. else는 선택사항이기 때문에 항상 사용할 필요는 없다.</p>
<pre><code>password_correct = True

if password_correct:
  print(&quot;Here is your money&quot;)
else:
  print(&quot;Wrong password&quot;)

#출력 Here is your money</code></pre><blockquote>
<p><strong>3. Elif</strong></p>
</blockquote>
<p>2개 이상의 조건문을 사용하고 싶을 때는 Elif를 사용하면 된다.</p>
<p>주의할 점은, Elif를 사용했을 때 첫 번째와 세 번째 조건이 모두 참일 경우
먼저 오는 참의 조건에 해당하는 값이 실행되고나면 조건문은 종료된다.</p>
<p>왜냐하면 어떤 한 조건이 true가 되는 순간,
파이썬은 즉시 그 안쪽 코드를 실행할 뿐 나머지는 확인하지 않기 때문이다.</p>
<pre><code>winner = 10

if winner &gt; 10:
  print(&quot;Winner is greater than 10&quot;)
elif winner &lt; 10:
  print(&quot;Winner is less than 10&quot;)
else:
  print(&quot;Winner is 10&quot;)

#출력: Winner is 10</code></pre><blockquote>
<p><strong>4. 부등호</strong></p>
</blockquote>
<pre><code>&gt;  크다
&lt;  작다
&gt;= 크거나 같다
&lt;= 작거나 크다
== 같다
!= 같지 않다</code></pre><blockquote>
<p><strong>5. input 함수</strong></p>
</blockquote>
<p>input은 오직 하나의 argument만 받는다.</p>
<pre><code>input(&quot;How old are you?&quot;)

#출력: How old are you?</code></pre><p>위의 예시에서 괄호 안의 How old are you?가 인자에 해당하는데, input은 단순히 인자를 프린트하는 것 뿐만 아니라 사용자의 응답을 기다린다.</p>
<p>즉, 결과값으로 How old are you?가 출력되더라도 코드는 계속 실행상태가 된다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/0078b192-cb72-4578-a6b3-03494a23003f/image.png" alt="">
따라서 임의로 코드를 정지하던지, 출력된 How old are you?에 대한 답을 입력해야만 코드가 종료된다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/ce6b399d-dd9f-4828-8e4b-0eb1df40fad0/image.png" alt="">
여기서 사용자가 입력하는 값이 이 함수의 리턴값이 된다.
이 리턴값을 사용하기 위해서 임의의 변수를 지정한 후 print 등의 함수로 사용할 수 있다.</p>
<pre><code>age = input(&quot;How old are you?&quot;)

print(&quot;user answer is&quot;, age)

#출력:
How old are you?24
user answer is 24</code></pre><blockquote>
<p><strong>6. type: int(정수), string(문자)</strong></p>
</blockquote>
<p>input은 string을 기본값을 받는다.</p>
<p>따라서 사용자가 입력한 값을 정수로 인식하게 하기 위해서는 int를 사용해야 한다.</p>
<pre><code>age = int(input(&quot;How old are you?&quot;))

if age &lt; 18:
  print(&quot;You can&#39;t drink.&quot;)
elif age &gt;= 18 and age &lt;= 35:
  print(&quot;you drink beer!&quot;)
elif age == 60 or age == 70:
  print(&quot;Beer is not good for you.&quot;)
else:
  print(&quot;Go ahead!&quot;)</code></pre><p>위의 예시처럼 input()함수 앞에 사용한 int를 통해, &quot;사용자가 입력한 값&quot;에서 큰 따옴표를 제거하고 그 안의 정수값만 결과값으로 받아들인다.</p>
<p>이때, 만약 사용자가 숫자가 아닌 글자를 입력하면 오류가 난다.</p>
<p>그렇다면 int를 사용하지 않고 바로 input만 사용하면 어떨까?</p>
<p>결론부터 말하자면 사용자가 숫자로만 입력하면 가능하지만, 문자로 입력하면 잘못된 결과가 도출된다는 것이다.</p>
<p>먼저, input은 string을 받기 때문에 if 조건절에서도 string을 사용해줘야 한다. 그러면 적어도 조건절을 작성할 때는 오류가 나지 않으며, 사용자가 숫자를 입력한다는 전제하에서도 올바른 결과값이 도출된다.</p>
<p>하지만 문제는 사용자가 문자를 입력하면 위의 모든 if,elif 조건절이 모두 거짓이므로 else에 해당하는 &quot;Go ahead!&quot;가 출력된다.</p>
<p>따라서 input에서 사용자가 입력한 값을 숫자로 사용하고 싶을 때는 int를 사용해야한다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/4e30da5d-40bf-4eae-a20a-21a2176811ab/image.png" alt=""></p>
<blockquote>
<p><strong>7. Python Standard Library의 기능을 활용해서 랜덤숫자 만들기</strong></p>
</blockquote>
<p>내가 입력한 숫자와 pc가 선택한 임의의 숫자를 비교하는 코드를 만들어보려고 한다.</p>
<p>Python에는 input, print, int처럼 기본적으로 제공되는 기능이 존재하는데, <a href="https://docs.python.org/3/library/index.html">Standard Library</a>에서 확인할 수 있다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/3e830161-6302-43a9-8e07-3464e7d1537e/image.png" alt=""></p>
<p><a href="https://docs.python.org/3/library/functions.html">Built-in Functions</a>에 나와있는 함수의 경우, 추가적인 과정없이 사용할 수 있다. input, print, int 등이 여기에 해당한다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/d6655258-0b8c-458d-90f4-c4860593cc7e/image.png" alt=""></p>
<p>이와 달리, 우리가 사용하려는 <a href="https://docs.python.org/3/library/random.html">random</a>기능은 파이썬에 미리 설치되어 있지 않기때문에 import해주는 과정이 필요하다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/7b5f64da-4789-441d-9ba1-4d8f411b047d/image.png" alt="">
random 카테고리에 있는 randint 함수를 사용하기위해_<strong>from random import randit  *<em>_라는 코드를 작성해서 모듈(파일)에있는 함수를 가져온 후,
pc_choice를 *</em>randint(1,50)</strong>라고 지정해서 1과 50 사이의 정수를 랜덤으로 도출되게 한다.</p>
<pre><code>from random import randint

user_choice = int(input(&quot;Choose number.&quot;))
pc_choice = randint(1,50)

if user_choice == pc_choice:
  print(&quot;You won!&quot;)
elif user_choice &gt; pc_choice:
  print(&quot;Lower! Computer chose&quot;, pc_choice)
elif user_choice &lt; pc_choice:
  print(&quot;Higher!Computer chose&quot;, pc_choice)</code></pre><p><img src="https://velog.velcdn.com/images/doit_sophie/post/f8d82347-1aec-4a60-80af-be6b4e65522a/image.png" alt=""></p>
<blockquote>
<p><strong>8. while</strong></p>
</blockquote>
<p>while은 if와 같은 조건절이지만, 조건문이 false가 될 때까지 코드를 계속해서 실행시킨다는 차이점이 있다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/23df9487-e73e-45fe-bed8-e5287f745c74/image.png" alt=""></p>
<p>while을 사용하면 위에서 작성한 랜덤숫자 코드를 매번 실행하지 않아도,
이길때까지 반복되게 만들 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/doit_sophie/post/830d2161-0dac-49bc-b5df-8f3c7c5aa950/image.png" alt=""></p>
<p>playing = True라는 변수를 먼저 설정해 준 후, playing이 True인 동안 계속해서 user_choice라는 input 함수가 실행되도록 해준다.</p>
<p>이 때 user_choice 변수의 정의와 if조건문이 반드시 while 함수 안에 들어가야 한다.</p>
<p>또한, &quot;You won!&quot;이 떴을 때, playing=False가 되도록 해서 게임이 종료되게 해준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초(1): 변수, 함수, 매개변수, 인자, 함수기본값, 사칙연산, 리턴, f""]]></title>
            <link>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%881-%EB%B3%80%EC%88%98-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@doit_sophie/Python-%EA%B8%B0%EC%B4%881-%EB%B3%80%EC%88%98-%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 14 Dec 2023 10:32:23 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>1. 변수(Varaibles)</strong></p>
</blockquote>
<p>변수는 세로 작성을 원칙으로 한다.</p>
<pre><code>a = 2
b = 3
c = a + b
a = 11
b = 13
print(c) 
#출력: 5</code></pre><p>변수명은 반드시 글자로 시작하며, 숫자는 중간이나 끝에만 들어갈 수 있다.</p>
<pre><code>#옳은 예시
my_age = 88 (snake case)
myAge = 88 (camel case)
my1age = 88
myAge1 = 88

#틀린 예시
1myAge = 88</code></pre><blockquote>
<p><strong>2. Data Type</strong></p>
</blockquote>
<p>데이터 형식을 문자로 나타내고 싶을 때는 &quot;&quot; 안에 작성한다.</p>
<pre><code>my_name = sophie (x)
my_name = &quot;sophie&quot; (o)

my_age = &quot;12&quot;</code></pre><p>Boolean은 대문자 True 혹은 False로 작성한다.</p>
<pre><code>alive  = True
dead = False
print(alive)
#출력: True</code></pre><blockquote>
<p>** 3. 함수(Function)**</p>
</blockquote>
<p><strong>함수란,</strong> 우리가 작성해서 몇 번이고 재사용이 가능한 코드를 말한다.</p>
<p>함수를 정의할 때는 def 뒤에 함수명을 작성한다.
여기서 주의할 사항은 def say_hello(): 다음 줄에 들여쓰기(tap 혹은 space d두 번)를 하지 않고 함수를 정의할 경우, 에러가 난다.</p>
<p>왜냐하면 파이썬은 빈 공백을 이용해서 어떤 것 안에 어떤 게 있는지 이해하기 때문이다.</p>
<pre><code>#옳은 예시
def say_hello():
    print(&quot;hello how r u?&quot;)  
say_hello()

#틀린 예시
def say_hello():
print(&quot;hello how r u?&quot;)  
say_hello()</code></pre><blockquote>
<p>** 4. 매개변수(Parameter)&amp;인자(argument)**</p>
</blockquote>
<p><strong>매개변수란</strong>, 함수 내에 데이터가 들어갈 수 있는 공간, 혹은 함수 안으로 데이터를 보내 함수의 결과를 바꿀 수 있게 해주는 것을 말한다. 아래 예시에서 say_hello()라는 함수의 괄호 안에 들어가는 user_name이 여기에 해당한다. 여기서 user_name은 임의로 지정한 것일 뿐 user, member 등 다른 이름이 될 수 있으며, 특정한 값(예: 철수, 영희, sophie 등등)을 갖고 있지는 않다.</p>
<p><strong>인자란</strong>, 함수가 호출될 때 우리가 지정한 매개변수의 자리에 들어갈 특정한 값을 가리킨다. 호출한 say_hello(sophie)에서 sophie가 바로 인자에 해당한다.</p>
<pre><code>def say_hello(user_name):
    print(&quot;hello&quot;, user_name, &quot;how r u?&quot;)

say_hello(&quot;sophie&quot;)
#출력: hello sophie how are u? </code></pre><p>만약 <strong>매개변수를 여러개 지정</strong>하고 싶다면 콤마를 사용하면 된다.
이때, 각각의 매개변수의 순서에 맞게 인자의 순서를 맞춰줘야 한다.</p>
<pre><code>def say_hello(user_name, user_age):
    print(&quot;hello&quot;, user_name)
    print(&quot;you are&quot;, user_age, &quot;years old&quot;)

say_hello(&quot;sophie&quot;, 12)

#출력: hello sophie
      you are 12 years old </code></pre><p>이때, <strong>매개변수에 기본값을 지정</strong>할 수도 있는데, 
아래 예시를 보면 say_hello 함수는 1개의 인자를 반드시 받아야하지만
만약 인자를 넣지 않았을 때 사용자에게 에러메세지를 띄우는 대신
위에서 지정한 기본값(anonymous)이 나타나도록 하는 것이다.</p>
<pre><code>def say_hello(user_name=&quot;anonymous&quot;):
    print(&quot;Hello&quot;, user_name)

say_hello(&quot;sohpie&quot;)
say_hello()

#출력: Hello sophie
      Hello anonymous

def plus(a=0, b=0):
  print(a + b)

def minus(a=0, b=0):
  print(a-b)

def multiplication(a=0, b=0):
  print(a*b)

def division(a=0, b=1):
  print(a/b)

def square(a=0, b=1):
  print(a**b)


#수식으로 만든 예시

def plus(a=0, b=0):
  print(a + b)

def minus(a=0, b=0):
  print(a-b)

def multiplication(a=0, b=0):
  print(a*b)

def division(a=0, b=1):
  print(a/b)

def square(a=0, b=1):
  print(a**b)


plus(1,3)
plus()

minus(2,4)
minus()

multiplication(2,7)
multiplication()

division(2,4)
division()

square(3,2)
square()

#출력
4
0
-2
0
14
0
0.5
0.0
9
0</code></pre><blockquote>
<p><strong>5. 리턴(return)</strong></p>
</blockquote>
<p><strong>리턴이란</strong>, 함수 바깥으로 값을 보내는 것을 의미한다.</p>
<p>지금까지는 함수로부터 도출된 값을 단순히 print()를 통해 콘솔창에 나타내기만 했다면,
return을 사용하면 함수로부터 받은 값을 함수 밖으로 꺼내 쓸 수 있게 된다.</p>
<p>아래 예시를 보면, tax_calc()의 리턴값을 pay_tax()에 사용하기 위해
두 개 함수의 연결고리인 to_pay 변수를 만들어준 것을 알 수 있다.</p>
<pre><code>def tax_calc(money):
    return money * 0.35

def pay_tax(tax):
    print(&quot;thank you for paying&quot;, tax)

to_pay = tax_calc(150000000)

pay_tax(to_pay)

#출력: thank you for paying 52500000.0</code></pre><p>해당 함수를 더 짧게 만들고 싶다면 to_pay 변수를 없애고
tex_calc(150000000)함수를 pay_tax의 인자 자리에 직접 넣어도 된다.</p>
<pre><code>def tax_calc(money):
    return money * 0.35

def pay_tax(tax):
    print(&quot;thank you for paying&quot;, tax)

pay_tax(tax_calc(150000000))

#출력: thank you for paying 52500000.0</code></pre><blockquote>
<p><strong>f&quot;{변수}&quot;: 문자열 안에 변수를 넣는 방법</strong></p>
</blockquote>
<p>파이썬에서는 쌍따옴표(&quot;&quot;) 앞에 f(format)를 붙여주면 문자열 안에 중괄호를 써서 변수를 바로 사용할 수 있다.</p>
<pre><code>my_name = &quot;sophie&quot;
my_age = 12
my_eyes_color = &quot;brown&quot;

f&quot;Hello I&#39;m {my_name}, I have {my_age} years in the earth, my eyes color is {my_eyes_color}&quot;

#출력: Hello I&#39;m sophie, I have 12 years in the earth, my eyes color is brown</code></pre><p>이걸 리턴값과 함께 사용할 수 있는 예시를 보자.</p>
<pre><code>def make_juice(fruit):
  return f&quot;{fruit}+🥤&quot;


def add_ice(juice):
  return f&quot;{juice}+🧊&quot;


def add_sugar(iced_juice):
  return f&quot;{iced_juice}+🍬&quot;


juice = make_juice(&quot;🍎&quot;)
print(juice) #이해를 돕기 위해

cold_juice = add_ice(juice)
print(cold_juice) #이해를 돕기 위해

perfect_juice = add_sugar(cold_juice)

print(perfect_juice)


#출력:
🍎+🥤
🍎+🥤+🧊
🍎+🥤+🧊+🍬</code></pre><p>return의 특징 중 하나는, <strong>리턴을 사용하는 순간 함수가 종료</strong>된다는 점이다.
예를 들어, 아래 예시에서 return f&quot;{fruit}+🥤&quot;뒤에 작성된 print(&quot;lalala&quot;)는 실행되지 않고
곧바로 return f&quot;{fruit}+🥤&quot;이 불린 곳인 juice = make_juice(&quot;🍎&quot;)으로 돌아간다.</p>
<pre><code>def make_juice(fruit):
  return f&quot;{fruit}+🥤&quot;
  print(&quot;lalala&quot;)


def add_ice(juice):
  return f&quot;{juice}+🧊&quot;


def add_sugar(iced_juice):
  return f&quot;{iced_juice}+🍬&quot;


juice = make_juice(&quot;🍎&quot;)
cold_juice = add_ice(juice)
perfect_juice = add_sugar(cold_juice)

print(perfect_juice)</code></pre><blockquote>
<p>각주, 코멘트</p>
</blockquote>
<p>한 줄을 각주처리 할 때는  #을 문장 앞에 붙여주면 되고,
두 줄 이상을 각주처리 할 때는 코드 시작줄과 마지막줄 끝에 쌍따옴표(&quot;) 세 개를 써주면 된다.
<img src="https://velog.velcdn.com/images/doit_sophie/post/b9a82c35-0ef1-4c0d-aed0-1801cc4af872/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>