<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>93_bulldozer.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 12 Dec 2021 15:37:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>93_bulldozer.log</title>
            <url>https://images.velog.io/images/93_bulldozer/profile/44ff9314-7e26-4215-9651-77403e00d539/IMG_4132.JPG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 93_bulldozer.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/93_bulldozer" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Transaction]]></title>
            <link>https://velog.io/@93_bulldozer/Transaction</link>
            <guid>https://velog.io/@93_bulldozer/Transaction</guid>
            <pubDate>Sun, 12 Dec 2021 15:37:09 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/79766033-b2c1-48d7-ba91-be06d0923c3d/%E1%84%83%E1%85%A1%E1%84%8B%E1%85%AE%E1%86%AB%E1%84%85%E1%85%A9%E1%84%83%E1%85%B3.png" alt=""></p>
<p>사이트 클론코딩 프로젝트를 진행하며 새롭게 알게 된 개념인 transaction(트랜잭션)에 대해 소개해보는 시간을 가져보겠습니다.</p>
<p>트랜잭션은 이해하면 어려운 개념까진 아니라고 생각한다. (자세히 알려면 아직 갈길이 멀지만) 쉽게 말해서 여러개의 프로세스를 하나로 묶어서 동작할 수 있게 만들어 주는 것인데 
예를 들면 내 계좌에 있는 10,000원을 누군가의 계좌로 송금하는 상황이 있다고 가정해보자. 내 계좌에서 만원이 빠져나가고 상대방의 계좌로 가는 도중에 예기치 못한 사고가 발생하여 중단이 된다면? 내 만원은 말그대로 증발하고 말 것이다.
하지만 트랜잭션을 통해 하나의 프로세스로 묶어서 진행한다면 그러한 상황이 발생하여도 시작하기전으로 rollback 하기에 안전하다고 할 수 있다.</p>
<p>내가 공부하는 django에서도 transaction 기능을 제공하는데, 사용법을 알아보자. 크게 3가지로 나눌 수 있다.</p>
<h2 id="1---------데코레이터를-이용한-transaction">1.         데코레이터를 이용한 transaction</h2>
<p>transaction을 사용하기 가장 편한 방법은 데코레이터를 이용하는 법이다.</p>
<pre><code class="language-python">from django.db import transaction

@transaction.atomic
def test1(arg1, arg2):
    a.save()

    b.save()</code></pre>
<p>위와 같이 @transaction.atomic 이라는 데코레이터만 붙여주면 사용할 수 있다. 메소드 안에 코드를 쓸 필요가 없기 때문에 아주 유용하다.</p>
<h2 id="2-with-명령어를-이용한-transaction">2. with 명령어를 이용한 transaction</h2>
<pre><code class="language-python">from django.db import transaction

def test2(arg,1 arg2):
    a.save()

    with transaction.atomic():
        b.save()

        c.save()</code></pre>
<p>메소드 전체가 아닌 일부분만 묶어주고 싶을 때에는 with명령어를 통해 사용할 수 있다.</p>
<h2 id="3-savepoint를-직접-지정">3. savepoint를 직접 지정</h2>
<pre><code class="language-python">from django.db import transaction

def test3(arg1, arg2):
    a.save()

    sid = transaction.savepoint()

    try:
        b.save()

        c.save()

        transaction.savepoint_commit(sid)

    except Exception
        transaction.savepoint_rollback(sid)</code></pre>
<p>위의 두가지 (1,2번) 방식은 메소드 내에서 exception이 발생해도 저절로 rollback이 가능하기 때문에 예외처리를 따로 해줄 필요가 없다. 하지만 3번의 경우에는 그렇지 않기 때문에 savepoint와 commit을 설정해줘야하기 때문에 예외처리도 따로 해주어야한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1차 프로젝트 회고 -Dr.Tart(1)-]]></title>
            <link>https://velog.io/@93_bulldozer/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0-Dr.Tart1-</link>
            <guid>https://velog.io/@93_bulldozer/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0-Dr.Tart1-</guid>
            <pubDate>Sun, 12 Dec 2021 14:56:23 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/95ed2a2e-4bb9-4b8e-88cf-b4bfbf9fbd71/%E1%84%83%E1%85%A1%E1%86%A8%E1%84%90%E1%85%A5%E1%84%90%E1%85%A1%E1%84%85%E1%85%B3%E1%84%90%E1%85%B3.jpeg" alt=""></p>
<p>파이썬 글만 있던 삭막한 내 벨로그에 느닷없이 등장한 프로젝트 회고.. 블로그를 작성하는데에 좀처럼 흥미가 붙지않던 나는.. 웬걸 일주일 가까이 잊고 지냈다. 그날 배운건 그날 작성한다면 더할나위없이 좋겠지만 오늘에서라도 작성하는게 맞다고 생각하여 프로젝트 처음부터 회고를 진행할 예정이다.</p>
<h2 id="1-프로젝트-기획">1. 프로젝트 기획</h2>
<p>프로젝트 팀 발표 첫날. 무슨 사이트를 클론하게 될까 하는 걱정반 기대반에 나는 화장품 사이트인 Dr.jart 팀에 합류하게 되었다. </p>
<ul>
<li>Frontend : 도연님, 상훈님, 유진님</li>
<li>Backend : 정현님, 주호님, 민혁님(나)</li>
</ul>
<p>로 구성된 상상하지 못했던(?) 조합이었고(케미가 매우 좋았던건 안비밀) 자리를 옮긴 후에 바로 어떤식으로 프로젝트를 진행할지 기획을 시작했다. 지금까지 프로젝트를 진행했던 선배 기수들의 프로젝트 결과물을 보며 어떻게 기획하는지에 대해서는 몇번 생각을 해봤던지라 모인지 몇분 되지 않아서 Dr.jart에 j를 t로 바꾸어서 디저트를 판매하는  대망의 Dr.tart 프로젝트가 시작되었다..!! </p>
<blockquote>
<p>일상에 지친 당신을 위해, Dr.tart가 디저트를 처방해드립니다.</p>
</blockquote>
<p>를 슬로건으로 정하고 역할을 분배하기 시작했다.</p>
<h2 id="2-모델링">2. 모델링</h2>
<p>이제 프론트, 백으로 나뉘어서 진행방향을 설정하고, 프로젝트의  뼈대를 잡기 위한 모델링을 정현님 주호님과 시작했다. 모델링을 어떻게 진행하느냐에 따라서 프로젝트의 방향성이나 기능구현의 성패가 좌우되기에 정말 열심히 진행했다. (2-3일은 쏟아부은것 같다) 
<img src="https://images.velog.io/images/93_bulldozer/post/58705132-5a73-4fcc-9750-33dae0f1424e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.24.56.png" alt=""></p>
<p>Dr.tart는디저트를 <strong>판매</strong>하는 커머스 사이트이고 그에 따른 모델링이 필요했다. 
모델링에 있어서 아쉬웠던 점은 우리의 기반이 되는 Dr.jart 홈페이지를 많이 참고하지 못했다는 점이다. 커머스 사이트는 비슷비슷하겠지~ 했던 안일한 생각들이 프로젝트 중반부터 후반까지 한번씩 발목을 잡았다.. 우리는 기능구현을 목적으로 모델링을 시작했다.</p>
<ul>
<li>회원가입, 로그인</li>
<li>전체 상품 페이지, 상세 상품 페이지</li>
<li>장바구니</li>
<li>결제창</li>
<li>추가구현 (상품별 좋아요, 상품별 리뷰, 고객 마이페이지)</li>
</ul>
<p>지금와서 드는 생각이지만 사이트의 전체 Flow를 이해하고 모델링했으면 좀 더 수월하게 했을 것 같다. (이번이 끝이 아니니까 다행이야!) </p>
<p>ERD 리뷰를 받으며 몇가지 피드백을 얻은게 있는데</p>
<ul>
<li>상품의 가격은 확장성(국제적으로)을 생각하여 소수점까지 표현이 가능한 decimal 필드를 사용</li>
<li>order 테이블에서의 제2정규화, 유효아이디 사용</li>
<li>transaction</li>
</ul>
<p>정도였다. 모두 시도해보았으면 좋았겠지만 필수구현에도 많은 시간을 쏟았던터라 
제2정규화나 유효아이디는 접해보지 못해서 아쉬움이 남는다. decimal 같은 경우에는 사용하는데에 어려움이 없었지만 transaction은 정말 중요한 개념이기에 다른 글에서 따로 정리를 하도록 하겠다 !</p>
<h2 id="3-modelspy-작성">3. Models.py 작성</h2>
<p>ERD 모델링을 토대로 models.py를 작성하기 시작했고 크게</p>
<ul>
<li>user - 주호님</li>
<li>product - 정현님</li>
<li>order - 나</li>
</ul>
<p>로 진행했다!</p>
<p>users/models.py</p>
<pre><code class="language-python">from django.db import models

class User(models.Model):
    name         = models.CharField(max_length=100)
    email        = models.CharField(max_length=250, unique=True)
    password     = models.CharField(max_length=300)
    address      = models.CharField(max_length=100)
    vegan_or_not = models.BooleanField(default=False)
    created_at   = models.DateTimeField(auto_now_add=True)
    updated_at   = models.DateTimeField(auto_now=True)
    class Meta:
        db_table = &#39;users&#39;</code></pre>
<p>products/models.py</p>
<pre><code class="language-python">from django.db import models

from users.models  import User

class Menu(models.Model):
    name = models.CharField(max_length=20)

    class Meta:
        db_table=&#39;menus&#39;

class Category(models.Model):
    name = models.CharField(max_length=50)
    menu = models.ForeignKey(Menu, on_delete=models.CASCADE)

    class Meta:
        db_table=&#39;categories&#39;

class Product(models.Model):
    korean_name         = models.CharField(max_length=20)
    english_name        = models.CharField(max_length=20)
    thumbnail_image_url = models.URLField(max_length=200)
    price               = models.DecimalField(max_digits=10, decimal_places=2)
    created_at          = models.DateTimeField(auto_now_add=True)
    updated_at          = models.DateTimeField(auto_now=True)
    vegan_or_not        = models.BooleanField(default=False, null=False)
    sugar_level         = models.IntegerField(default=1)
    category            = models.ForeignKey(Category, on_delete=models.CASCADE)
    description         = models.CharField(max_length=1000)

    class Meta:
        db_table=&#39;products&#39;

class Image(models.Model):
    url       = models.URLField(max_length=300)
    product   = models.ForeignKey(Product, on_delete=models.CASCADE)

    class Meta:
        db_table=&#39;images&#39;

class Review(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE)
    product     = models.ForeignKey(Product, on_delete=models.CASCADE)
    content     = models.CharField(max_length=200, null=True)
    created_at  = models.DateTimeField(auto_now_add=True, null=True)
    updated_at  = models.DateTimeField(auto_now=True, null=True)

    class Meta:
        db_table=&#39;reviews&#39;

class ReviewComment(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE)
    review      = models.ForeignKey(Review, on_delete=models.CASCADE)
    content     = models.CharField(max_length=100, null=True)

    class Meta:
        db_table=&#39;review_comments&#39;

class Like(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE)
    product     = models.ForeignKey(Product, on_delete=models.CASCADE)

    class Meta:
        db_table=&#39;likes&#39;</code></pre>
<p>orders/models.py</p>
<pre><code class="language-python">from django.db import models

class Cart(models.Model):
    product      = models.ForeignKey(&#39;products.Product&#39;, on_delete=models.CASCADE)
    user         = models.ForeignKey(&#39;users.User&#39;, on_delete=models.CASCADE)
    quantity     = models.IntegerField(default=0)

    class Meta:
        db_table = &#39;carts&#39;

class OrderStatus(models.Model):
    status = models.CharField(max_length=20)

    class Meta:
        db_table = &#39;order_status&#39;

class Order(models.Model):
    user         = models.ForeignKey(&#39;users.User&#39;, on_delete=models.CASCADE)
    created_at   = models.DateTimeField(auto_now_add=True, null=True)
    updated_at   = models.DateTimeField(auto_now=True, null=True)
    address      = models.CharField(max_length=100)
    order_status = models.ForeignKey(&#39;OrderStatus&#39;, on_delete=models.CASCADE)

    class Meta:
        db_table = &#39;orders&#39;

class OrderItem(models.Model):
    order        = models.ForeignKey(&#39;Order&#39;, on_delete=models.CASCADE)
    product      = models.ForeignKey(&#39;products.Product&#39;, on_delete=models.CASCADE)
    quantity     = models.IntegerField(default=1)
    created_at   = models.DateTimeField(auto_now_add=True, null=True)
    updated_at   = models.DateTimeField(auto_now=True, null=True)

    class Meta:
        db_table = &#39;order_items&#39;</code></pre>
<p>위와 같이 모델링 작업을 마쳤고 다음 글에선 이를 토대로 한 view 작성에 대해 얘기해보겠다 !!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[python for loop]]></title>
            <link>https://velog.io/@93_bulldozer/python-for-loop</link>
            <guid>https://velog.io/@93_bulldozer/python-for-loop</guid>
            <pubDate>Thu, 25 Nov 2021 08:43:24 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/2b3373d7-4495-4625-a355-66c7e7abe220/python.png" alt=""></p>
<p>오늘 글에서는 오랜 시간 나를 괴롭히던 python for문에 대하여 알아보겠습니다. 본인이 가장 어려워하는 문법이기도 하고 동시에 for문을 완벽히 숙지하고 싶은 마음에 진지하게 블로그를 작성하는 시간을 가져보겠습니다. 
(다른분들은 알고리즘 풀면서 range도 쓰고 하시던데 나는 아직 적용하기가 너무 힘들었던 ㅜㅜ... 오늘 태준님께 질문해서 개념정립은 했지만 아직 내꺼!라고 하기엔 이른 감이 없지않아 있다. 설명해주시면서 쉽지않은 개념이라고까지 하셨으니,, 그래도 잘 정리하고 공부하자 !)</p>
<hr>
<h3 id="python-for-loop">python for loop</h3>
<p>for문은 list(혹은 다른 자료 구조)의 요소를 한번에 하나씩 가지고 원하는 로직을 실행할 수 있게 해주는 역할을 합니다. for문의 문법을 살펴봅시다.</p>
<blockquote>
<pre><code class="language-python">for element in list:
    do_something_with_element</code></pre>
</blockquote>
<pre><code>
list의 요소(element)를 한번에 한개씩 가지고 for문 안에 있는 코드를 실행하게 됩니다.
![](https://images.velog.io/images/93_bulldozer/post/03f4605e-6d6f-4caf-aa14-89b9b7f487de/%E1%84%83%E1%85%A1%E1%84%8B%E1%85%AE%E1%86%AB%E1%84%85%E1%85%A9%E1%84%83%E1%85%B3%20(3).jpeg)


(들여쓰기에 유의함은 필수입니다 !!) 또한 for문은 list뿐 아니라 tuple, set 등 다른 자료구조와도 사용할 수 있습니다.

---
###     break 와 continue

위에서 보았듯이 for문에서는 list가 가지고 있는 데이터의 수 만큼 for문에 속해있는 코드를 실행합니다(5개의 요소가 있다면 5번 반복). 그런데 모두 반복하기 전에 그만두고 싶을때가 있을 수 있습니다. 그럴때 break문을 사용하면 됩니다.

![](https://images.velog.io/images/93_bulldozer/post/9af0a6dc-48f7-417a-a84f-20f0df3f13d8/%E1%84%83%E1%85%A1%E1%84%8B%E1%85%AE%E1%86%AB%E1%84%85%E1%85%A9%E1%84%83%E1%85%B3%20(4).jpeg)

만약 break처럼 for문을 그만두고 싶지는 않지만 다음 요소로 넘어가고 싶을 때는
continue문을 사용하면 됩니다.

![](https://images.velog.io/images/93_bulldozer/post/d8fc1601-6121-4770-a930-226a95c150a5/%E1%84%83%E1%85%A1%E1%84%8B%E1%85%AE%E1%86%AB%E1%84%85%E1%85%A9%E1%84%83%E1%85%B3%20(5).jpeg)

---

### range
python 반복문을 통해 여러번 코드 수행을 할 수 있다. 일반적인 반복문과 같은 형태에는 range가 있는데 밑의 코드를 보며 알아보자

&gt;```python
our_list = [];
&gt;
for i in range(0, 5):
    our_list.append(i)
&gt;
&gt;print(our_list) # [0,1,2,3,4]</code></pre><p>range를 이용해서 0부터 4까지의 데이터를 리스트에 집어넣는 코드이다. 위에서 알 수 있듯이 range는 시작조건, 종료조건을 쓸 수 있다. (종료조건 뒤에 생략조건을 넣을 수 있는데, (0,5,2) 라면 0,2,4 가 출력된다.)</p>
<p>반복문은 거꾸로도 수행이 가능한데, 10부터 0까지 거꾸로 반복해서 짝수를 리스트에 넣고싶다면</p>
<blockquote>
<pre><code class="language-python">our_list = []
</code></pre>
</blockquote>
<p>for i in range(10, 0, -2):
    our_list.append(i)</p>
<blockquote>
<p>print(our_list) # [10,8,6,4,2]</p>
</blockquote>
<pre><code>
이런식으로 표현이 가능하다. 

---
### 예제1

* my_list의 요소의 총 합(total)을 리턴하는 list_loop함수를 완성해 주세요.

&gt;```python
def list_loop():
    my_list = [2, 3, 4, 5, 6]
&gt;
    total = 0
    for i in my_list:
      total = total + i
&gt;
    return total</code></pre><p>my_list 의 요소가 5개이므로 5번돌면서 한개씩 더해준다 ! 
따라서 total을 print해보면 20이 나온다</p>
<hr>
<h3 id="예제2">예제2</h3>
<p>get_all_letters 함수를 작성하세요.</p>
<p>단어가 주어졌을때, get_all_letters 함수는 주어진 단어에 포함된 모든 문자를 담고 있는 배열을 반환합니다.</p>
<blockquote>
<pre><code class="language-python"></code></pre>
</blockquote>
<h1 id="example">example</h1>
<p>output = get_all_letters(&#39;Radagast&#39;)
print(output) # [&#39;R&#39;, &#39;a&#39;, &#39;d&#39;, &#39;a&#39;, &#39;g&#39;, &#39;a&#39;, &#39;s&#39;, &#39;t&#39;]</p>
<pre><code>
&gt;```python
def get_all_letters():
    str_list = []
    mission_str = &quot;wecode&quot;
&gt;
    for i in mission_str:
      str_list.append(i)
&gt;      
    return str_list # [&#39;w&#39;, &#39;e&#39;, &#39;c&#39;, &#39;o&#39;, &#39;d&#39;, &#39;e&#39;]</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Python Dictionary]]></title>
            <link>https://velog.io/@93_bulldozer/Python-Dictionary-1w9q3tpf</link>
            <guid>https://velog.io/@93_bulldozer/Python-Dictionary-1w9q3tpf</guid>
            <pubDate>Wed, 24 Nov 2021 08:37:01 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/b07f4880-da70-42fd-9ff2-bd7f6d278bb3/python.png" alt=""></p>
<p>이번 글에서는 python의 또 다른 자료구조인 dictionary에 대해 알아봅시다 !</p>
<hr>
<h3 id="python-dictionary">python dictionary</h3>
<p>dictionary는 list와 마찬가지로 python의 자료구조 중 하나이다. 다음 문법을 통해 기본 구조를 알아보자</p>
<blockquote>
<pre><code class="language-python">my_dic = { &quot;key1&quot; : &quot;value1&quot;, &quot;key2&quot; : &quot;value2&quot;}</code></pre>
</blockquote>
<pre><code>
위 문법에 대한 설명은 다음과 같다.

* 중괄호 { } 를 사용해 dictionary를 선언한다.
* key 와 value 의 값으로 이루어져있다. key : value 순서로 이루어진다.
* 각각의 key : value는 ,(comma)로 구분한다.

인기가수 아이유를 통해 자세히 알아보자.

&gt;```python
IU = { &quot;실명&quot; : &quot;이지은&quot;, &quot;가명&quot; : &quot;아이유&quot;}</code></pre><p>여기에 태어난 년도를 추가하고 싶다면,</p>
<blockquote>
<pre><code class="language-python">IU = { &quot;실명&quot; : &quot;이지은&quot;, &quot;가명&quot; : &quot;아이유&quot;, &quot;태어난 년도&quot; : 1993}</code></pre>
</blockquote>
<pre><code>
와 같이 추가해줄 수 있다.

---

### dictionary에서 요소 읽어들이기
요소를 읽어들이는 방법은 list와 유사한데, 차이점은 index가 아닌 key값을 사용한다는 것이다.

&gt;```python
IU[&quot;실명&quot;]</code></pre><p>key값은 다음과 같은 특징을 가지고 있다.</p>
<ul>
<li>key는 string 뿐만 아니라 숫자도 가능하다</li>
<li>key 값은 중복될 수 없다.</li>
</ul>
<hr>
<h3 id="dictionary-요소-추가하기">dictionary 요소 추가하기</h3>
<p>dictionary에 요소를 추가하는 법은 다음과 같은 문법을 같는다.</p>
<blockquote>
<pre><code class="language-python">dictionary_name[new_key] = new_value</code></pre>
</blockquote>
<pre><code>
아까 만들었던 아이유 dictionary에 직업 : 가수 라는 요소를 추가하고 싶다면

&gt;```python
IU[&quot;직업&quot;] = &quot;가수&quot;</code></pre><p>처럼 작성해주면 된다.</p>
<hr>
<h3 id="dictionary-요소-수정하기">dictionary 요소 수정하기</h3>
<p>수정 역시 list와는 다르게 index가 아닌 key 값을 이용해 진행한다.</p>
<blockquote>
<pre><code class="language-python">IU = { &quot;실명&quot; : &quot;이지은&quot;, &quot;가명&quot; : &quot;아이유&quot;, &quot;직업&quot; : &quot;가수&quot;}
IU[&quot;실명&quot;] = &quot;이지금&quot;</code></pre>
</blockquote>
<pre><code>
을 출력하면 실명 : 이지금 으로 나오게 된다 !!

---
### dictionary 삭제하기

&gt;```python
IU = { &quot;실명&quot; : &quot;이지은&quot;, &quot;가명&quot; : &quot;아이유&quot;, &quot;직업&quot; : &quot;가수&quot;}
del IU[&quot;직업&quot;]</code></pre><p>을 작성해주면 직업 데이터가 없는 초기의 상태로 돌아가게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[python tuple, set]]></title>
            <link>https://velog.io/@93_bulldozer/python-tuple-set</link>
            <guid>https://velog.io/@93_bulldozer/python-tuple-set</guid>
            <pubDate>Mon, 22 Nov 2021 06:24:40 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/e832803e-9a40-47d9-a119-9f556b2d9f1a/python.png" alt=""></p>
<p>저번시간과 저저번시간을 통해 python의 list에 대해 알아보았다. list와 같이 데이터를 저장하게 해주는 것을 Data Structure(자료구조)라 하는데 python에는 list외에도 여러 자료구조들이 있다. 먼저 tuple에 대해 알아보자</p>
<hr>
<h3 id="tuple">Tuple</h3>
<p>tuple은 list와 마찬가지로 데이터들을 저장할 때 쓰인다. 기본적으로는 list와 동일하지만 차이를 가지고 있는데</p>
<ul>
<li>list는 수정이 가능하지만 tuple은 한번 선언되면 수정이 불가능</li>
</ul>
<p>이라는 점이다.</p>
<p>tuple을 선언하는 문법은 다음과 같은데</p>
<blockquote>
<pre><code class="language-python">champ = (&quot;가렌&quot;, &quot;갈리오&quot;, &quot;갱플랭크&quot;, &quot;나미&quot;, &quot;나서스&quot;)</code></pre>
</blockquote>
<pre><code>
list와의 차이점이라면 대괄호 대신 일반 괄호인 소괄호를 쓴다는 점이다. 이 외의 읽어들이는 방법이라던가 slicing 방법은 list와 동일하다.

그렇다면 tuple은 왜 존재하는걸까? ~~그러게~~
tuple은 보통 2~5개 사이의 요소들을 저장할때 사용되고 즉석적으로 표현하고 싶을 때 쓰게 된다. 그래도 궁금증이 해소가 안될텐데 가장 큰 차이는 list와 tuple의 메모리 용량의 차이이다. list가 tuple에 비해 제공하는 기능이 더 많기 때문에 메모리 용량을 많이 잡아먹는 것이다. 따라서 수정이 필요없고 간단한 형태의 데이터를 표현하고 싶을 때 tuple을 이용하는 것이 더 효과적이라고 볼 수 있다 !! ~~(개발자는 효율성이 생명이라 했던가..)~~

---
### Set

이번엔 다른 자료구조인 set에 대해 알아보고자 한다. set 역시 list, tuple과 마찬가지로 여러 데이터들을 저장하게 되는데, 이 역시 차이점이 없다면 이용할 필요가 없지않은가. set이 list, tuple과의 차이점을 알아보자

* set은 list와 다르게 데이터들이 순서대로 저장되지 않는다. 그러므로 for문에서 읽어들일때 데이터들이 순서대로 나오는게 아니라 무작위로 나오게 된다.
* 순서가 없으므로 list에서 사용했던 index값도 없다. (몇번째 요소인지 찾기 불가능)
* 동일한 값의 데이터가 1개 이상 존재 할 수 없다. (=중복된 데이터 저장 불가) 만일 새로 저장하려고 하는 요소와 동일한 값의 요소가 존재한다면 새로운 요소가 이 전 요소를 치환(replace)하게 된다.

차이점을 알아보았으니 set을 생성하는 법을 알아보자

&gt;```python
champ = {&quot;가렌&quot;, &quot;갈리오&quot;, &quot;갱플랭크&quot;, &quot;나미&quot;, &quot;나서스&quot;}</code></pre><p>보다시피 list는 [ ] tuple은 ( ) set은 { } 의 구조를 가지고 있다.
또한 list에서 사용했던 append와 remove 역시 사용가능하다.</p>
<h4 id="set에서의-가장-중요한-점은-데이터-중복이-안된다는-것을-기억하자-">set에서의 가장 중요한 점은 데이터 중복이 안된다는 것을 기억하자 !!</h4>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[python list 부수기 (2)]]></title>
            <link>https://velog.io/@93_bulldozer/python-list-%EB%B6%80%EC%88%98%EA%B8%B0-2</link>
            <guid>https://velog.io/@93_bulldozer/python-list-%EB%B6%80%EC%88%98%EA%B8%B0-2</guid>
            <pubDate>Sat, 20 Nov 2021 08:57:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/ca56bf35-8188-4864-ac75-77bfa0329c8e/python.png" alt="">
오늘도 어김없이 찾아온 list 부수기 시간..!! 알고리즘을 풀어보며 느끼지만 기본이 중요하다고 다시 느꼈고 필요성을 느끼게 됐다 !! 오늘도 차근차근 쌓아보자</p>
<hr>
<h3 id="list에-데이터-추가하기append가-아닌-">list에 데이터 추가하기(append가 아닌 +)</h3>
<p>지난 글에서는 append method를 이용하여 list에 데이터를 추가해보았다. 오늘은 다른 방법인 + 에 대해 알아보자 !! (+로 추가하는 방법을 알면 append는 굳이 왜쓰나 라는 생각이 들었지만 곰곰히 생각해보니 list의 길이가 너무 길어짐과 동시에 추가적으로 뒤에 데이터를 넣어줘야하는 상황일때 쓰는게 아닐까.. <del>아님말고</del>)</p>
<blockquote>
</blockquote>
<pre><code class="language-python">list1 = [1, 2, 3, 4]
list2 = [5, 6, 7]
&gt;
list1 + list2
print(list1)
[1, 2, 3, 4]
&gt;
list1 = list1 + list2
print(list1)
[1, 2, 3, 4, 5, 6, 7]</code></pre>
<p>위에 코드를 보면 알 수 있듯이 +를 사용해서 list를 합할 수 있다. 여기서 조심해야 할 점은 +를 사용하면 기존의 list가 수정되지 않고 새로운 list가 생성되기 때문에 저장하고자 하는 변수에 지정을 해줘야 한다는 것이다.</p>
<hr>
<h3 id="insert">insert</h3>
<p>append와 +말고 insert를 사용해서 새로운 데이터를 추가 할  수 있다. 앞의 두가지 방식과 다른점은 원하는 위치에 삽입할 수 있다는 점이다.
<img src="https://images.velog.io/images/93_bulldozer/post/fd7cb5d9-8d26-45ef-a20e-1101eb28198b/list.jpeg" alt=""></p>
<p>위와 같은 방식으로 추가를 하게 되는데,  명실상부 최고의 게임 LOL의 챔피언 list로 예를 들어보겠다.</p>
<blockquote>
<pre><code class="language-python">champ = [&quot;가렌&quot;, &quot;갈리오&quot;, &quot;나미&quot;, &quot;나서스&quot;]</code></pre>
</blockquote>
<pre><code>
LOL에 등장하는 챔피언을 가나다순으로 list에 넣어줬다. LOL을 즐기는 유저들은 알 수도 있지만 &quot;가렌&quot;과 &quot;갈리오&quot; 사이에 갱플랭크가 빠진 것을 알 수 있다. 여기서 갱플랭크를 추가하고자 한다면

&gt;```python
champ.insert(1, &quot;갱플랭크&quot;)
# [&quot;가렌&quot;, &quot;갈리오&quot;, &quot;갱플랭크&quot;, &quot;나미&quot;, &quot;나서스&quot;] </code></pre><p>이런식으로 삽입하고자 하는 데이터의 index를 지정해주어 추가할 수 있다.</p>
<hr>
<h3 id="list-slicing">list slicing</h3>
<p>우리는 python에서 list의 일부분을 따로 copy할 수 있는데 이를 slicing이라고 한다.
이번에도 LOL 챔피언 리스트를 통해 살펴보자 !</p>
<blockquote>
<pre><code class="language-python">champ = [&quot;가렌&quot;, &quot;갈리오&quot;, &quot;갱플랭크&quot;, &quot;나미&quot;, &quot;나서스&quot;]</code></pre>
</blockquote>
<pre><code>
위와 같은 list에서 갈리오와 갱플랭크만 따로 copy해서 sub_champ라는 list에 넣어주고 싶다면

&gt;```python
sub_champ = champ[1:2]
print(sub_champ) 
#[&quot;갈리오&quot;, &quot;갱플랭크&quot;] 출력</code></pre><p>이런식으로 시작과 끝의 index를 설정해주면 된다.
list slicing의 문법을 자세히 살펴보면</p>
<ol>
<li>list 이름이 먼저 위치하고</li>
<li>그 다음 중괄호가 열린다</li>
<li>부분적인 list가 시작할 첫번째 데이터의 index 번호를 써주고</li>
<li>:으로 구분지어 준 뒤에</li>
<li>멈추고자 하는 데이터의 index 번호를 쓴 뒤 중괄호를 닫아준다.</li>
</ol>
<p>의 순서로 진행하면 된다. </p>
<ul>
<li>또한 index값을 공백으로 줄 수 있는데 ( ex) [:2] or [0:] )
시작 index가 공백이면 list의 처음 요소부터 시작, 끝 index가 공백이면 지정한 index부터 끝까지를 의미한다.</li>
</ul>
<hr>
<h3 id="del--remove-로-list-data-삭제하기">del , remove 로 list data 삭제하기</h3>
<p>추가를 했으니 삭제하는 법을 알아보자. 이번에도 등장하는 챔피언들..</p>
<blockquote>
<pre><code class="language-python">champ = [&quot;가렌&quot;, &quot;갈리오&quot;, &quot;갱플랭크&quot;, &quot;나미&quot;, &quot;나서스&quot;]</code></pre>
</blockquote>
<pre><code>
먼저 del을 사용해 갱플랭크를 지우고 싶다면

&gt;```python
del champ[2]</code></pre><p>이렇게 해당 요소의 index를 적어서 삭제 할 수 있다. 이렇게해서 삭제되면 해당 index는 바로 다음 순서인 나미로 채워지게 된다.</p>
<p>이번엔 remove를 이용해 갱플랭크를 지워보자 !</p>
<blockquote>
<pre><code class="language-python">champ.remove(&quot;갱플랭크&quot;)</code></pre>
</blockquote>
<pre><code>
del과는 다르게 index 값이 아닌 삭제하고자 하는 데이터를 직접 입력함으로써 실행할 수 있다.

---</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[python list 부수기 (1)]]></title>
            <link>https://velog.io/@93_bulldozer/python-list-%EB%B6%80%EC%88%98%EA%B8%B0-1</link>
            <guid>https://velog.io/@93_bulldozer/python-list-%EB%B6%80%EC%88%98%EA%B8%B0-1</guid>
            <pubDate>Thu, 18 Nov 2021 11:11:11 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/9f1fc040-7810-47e9-8d59-3a8093bb12d8/python.png" alt=""></p>
<p>요 며칠 코드카타를 진행하며 느낀 바가 굉장히 많다. 컴퓨터 언어를 접한지 얼마 되지 않았는데 알고리즘이라니 !!! 처음엔 걱정100이었지만 내 티키타카 짝꿍 진성님과 서로 아이디어를 공유하고 로직을 짜보고 코드를 작성하는 과정에서 느끼는 성취감이 엄청나다. 하지만 동시에 느끼는건... <del>무지에서 나오는 무기력함이랄까..</del> 확실히 python을 내것으로 만들면 알고리즘 푸는 속도도 빨라지고 흥미도 더더욱 느낄 수 있겠다는 생각이 들어서 열심히 공부해보려고 한다.</p>
<p>그런의미로 <strong>오늘은 python의 List를 부숴보려고 한다</strong></p>
<hr>
<h3 id="python-list는-무엇일까">python list는 무엇일까</h3>
<p>python에서의 list는 자료구조(data structure) 중 하나로, 여러 값들을 순차열 적으로 저장할 수 있다. list 작성법을 살펴보도록 하자<img src="https://images.velog.io/images/93_bulldozer/post/70f542b0-5843-4f67-ba14-98f2706af89c/%E1%84%83%E1%85%A1%E1%84%8B%E1%85%AE%E1%86%AB%E1%84%85%E1%85%A9%E1%84%83%E1%85%B3%20(1).jpeg" alt=""></p>
<p>위와 같이 대괄호[ ]안에 값을 나열하게 되며 쉼표(,)를 통해 각각의 값을 구분짓는다. list에 저장된 값들은 element(요소)라고 표현한다. element에는 string 이외에도 숫자, boolean값 등 모든 타입의 값을 저장 할 수 있고 서로 다른 타입의 값들을 저장하는 것도 가능하다.</p>
<p>list안의 요소를 list로 채우는 것도 가능하다. 다음과 같이</p>
<blockquote>
<pre><code class="language-python">[[&quot;아이유&quot;, 20], [&quot;유아인&quot;, 30]]</code></pre>
</blockquote>
<pre><code>
이런식으로 표현이 가능하다. 이를 Multi-dimensional lists(다차원 리스트)라 부른다.

---

### index를 이용한 list 접근

pythond에서는 index를 이용하여 list의 데이터에 접근할 수 있다. 사용법은 다음과 같은데,

&gt;* 리스트의 인덱스는 [ ] 대괄호에 숫자를 넣어 호출한다.
* 이는 문자열에서 개별 스펠링을 접근할 때와 같은 방식이다.
* list 역시 string과 마찬가지로 0을 기준으로 index를 시작한다.

밑에 코드를 통해 list의 데이터에 접근해보자 !

&gt;```python
numbers = [50, 60, 70]
print(numbers[0])
print(data = numbers[2]) # 50 70 출력</code></pre><p>index를 이용해 데이터 수정도 가능하다.</p>
<blockquote>
<pre><code class="language-python">my_list[10,20,30] # 두번쨰 요소인 20을 100으로 바꾸고 싶다면
my_list[1] = 100 # 이렇게 수정해주고
print(my_list) # 출력해주면 [10,100,30] 이 출력된다</code></pre>
</blockquote>
<pre><code>
---

### 다차원 리스트 데이터 접근

다차원 리스트 데이터 접근은 어떻게 할 수 있을까. 그것은 바로!
접근하려는 깊이만큼 대괄호 [ ] 를 추가하여 접근할 수 있다.
다음 list를 통해 접근해보자.

&gt;```python
any_list = [
  [1,2,3],
  [4,5,6],
  [7,8,9],
  [[10,11,12], 13, 14]
]</code></pre><p>위에서 알아봤듯이 index로 접근해서 4번째 요소를 찾게 된다면</p>
<blockquote>
<pre><code class="language-python">any_list[3] = [[10,11,12], 13, 14]</code></pre>
</blockquote>
<pre><code>
가 나올것이다. 여기서 만약 숫자 11만을 리턴하고 싶다면

&gt; ```python
any_list[3][0][2] = 11</code></pre><p>이라는 결과가 나온다. 어렵게 생각할 것 없이 [ ] 대괄호 영어로는 braket을 순차적으로 추가해주면 된다.</p>
<hr>
<h3 id="append-method">append method</h3>
<p>이미 선언한 list에 새로운 데이터를 추가하고 싶다면 어떻게 해야할까. 바로
append()라는 이름의 method를 사용하면 된다. </p>
<blockquote>
<pre><code class="language-python">my_list = [1,2,3]
my_list.append(4)
print(my_list) </code></pre>
</blockquote>
<h1 id="1234-출력">[1,2,3,4] 출력</h1>
<pre><code>
이런식으로 사용할 수 있는데 여기서의 특징은 리스트 가장 끝  자리에 새로운 값이 추가된다는 점이다.

---

### pop method

더하기를 알아본 김에 값을 빼주는 method도 알아보자. pop 이라는 녀석인데 사용법과 특징은 append와 같다.

&gt; ```python
my_list = [1,4,6]
my_list.pop()
print(my_list)
# [1,4]</code></pre><p>이런식으로 마지막 요소가 빠지며 출력되게 된다.</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[python Function]]></title>
            <link>https://velog.io/@93_bulldozer/python-Function</link>
            <guid>https://velog.io/@93_bulldozer/python-Function</guid>
            <pubDate>Tue, 16 Nov 2021 12:32:05 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/c04e1f43-435a-4365-906d-58598ca81e35/python.png" alt=""></p>
<p>python에서 function(함수)는 일정한 작업을 수행하는 코드블럭이다. (개념적으론 수학의 함수와 동일) 함수를 사용하는 이유는</p>
<blockquote>
<ul>
<li>반복되어 계속 사용되는 코드들을 함수로 정의하여 효과적으로 사용하기 위해.</li>
</ul>
</blockquote>
<ul>
<li>함수로 정리 하여 해서 코드의 가독성을 높이기 위해.</li>
</ul>
<p>사용된다. 다음은 함수의 기본 개념이다.</p>
<p><img src="https://images.velog.io/images/93_bulldozer/post/43956959-b4c6-4188-b319-e49da3dfbca2/%E1%84%83%E1%85%A1%E1%84%8B%E1%85%AE%E1%86%AB%E1%84%85%E1%85%A9%E1%84%83%E1%85%B3.jpeg" alt=""></p>
<hr>
<h3 id="python-함수의-기본-문법">python 함수의 기본 문법</h3>
<blockquote>
<pre><code class="language-python">def 함수명(parameter):
    문장1
    문장2
    ...
    문장N
    [return 리턴값]</code></pre>
</blockquote>
<pre><code>
python에서의 함수는 이와 같은 기본 문법을 갖는다. 여기서의 특징은

* parameter와 return은 optional
* Input parameter가 없는 함수도 있을 수 있으며, return 값이 없는 함수도 있을 수 있다.
* return 값은 함수에서 해당 함수를 호출한 주체(invoker)에게 결과값(output)을 보내주는 것이다.

---

예제를 통해 함수의 기본 구조를 파악해보자

#### Assignment

multipy 함수를 작성해 주세요
* parameter 2개를 input으로 받습니다.
* 2개의 parameter를 곱한 값을 리턴합니다.

&gt;```python
def multiply(num1, num2):#num1과 num2를 parameter로 받고 num1*num2
  return num1*num2       #를 통해 multipy를 구현.</code></pre><hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[python if statement]]></title>
            <link>https://velog.io/@93_bulldozer/python-if-statement</link>
            <guid>https://velog.io/@93_bulldozer/python-if-statement</guid>
            <pubDate>Tue, 16 Nov 2021 02:07:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/a6f29df6-e07a-45b1-a608-687b94c2e460/python.png" alt=""></p>
<p>python에도 if문이라고 부르는 if statement가 존재하고, 특정한 조건을 확인 할 때 사용한다.</p>
<hr>
<h3 id="python-if-statement의-구조">python if statement의 구조</h3>
<p>python if문의 자세한 구조는 다음과 같다.</p>
<blockquote>
<pre><code class="language-python">if expression:
    codes to execute ```</code></pre>
</blockquote>
<p>expression 뒤에 오는 값이 True이면 출력하고 Fasle이면 실행되지 않는 구조이다.</p>
<p>또한 전 시간에 살펴보았던 들여쓰기의 중요성을 다시 한 번 느낄 수 있는데,</p>
<blockquote>
<pre><code class="language-python">if condition:
    print(&quot;if statement code 1&quot;)
    print(&quot;if statement code 2&quot;)
print(&quot;Not if statemet code&quot;)```</code></pre>
</blockquote>
<p>다음과 같이 code1,2의 print는 if문 안에서 들여쓰기 되어있으므로 if문과 연결되어 있는 코드이다(condition변수가 True이면 실행됨). code3 의 출력문은 if문과 동일한 간격 선상에 있으므로 독립적인 구문이다(condition변수와 상관없이 실행됨).</p>
<hr>
<h3 id="python-논리-연산자">python 논리 연산자</h3>
<p>python에서는 논리 연산자가 존재하는데 대표적으로 and, or, not이 있다. 다음 표를 통해 살펴보자.</p>
<table>
<thead>
<tr>
<th>논리연산자</th>
<th>문법</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>and</strong></td>
<td>a and b</td>
<td>AND(논리곱), 양쪽 모두 참일때 참</td>
</tr>
<tr>
<td><strong>or</strong></td>
<td>a or b</td>
<td>OR(논리합), 양쪽 중 한 쪽만 참이라도 참</td>
</tr>
<tr>
<td><strong>not</strong></td>
<td>not x</td>
<td>NOT(논리부정), 참과 거짓을 뒤집음</td>
</tr>
</tbody></table>
<p>※ 식 하나에 and, or, not이 모두 있으면 not, and, or 순으로 된다.</p>
<p>다음 예제를 통해 자세히 살펴보자.</p>
<h4 id="assignment">Assignment</h4>
<p>is_odd_and_greater_than_twenty 함수를 작성하세요.</p>
<ul>
<li>숫자가 주어졌을때 주어진 숫자가 홀수이고 20보다 큰 경우에만 True를 리턴 합니다.</li>
<li>조건을 만족하지 않을 경우 False을 리턴 합니다.</li>
</ul>
<p>다음과 같은 문제가 주어졌을때 우리는 두가지 방법으로 해결할 수 있다. 위에서 살펴본 and 연산자를 사용하거나 if문을 중첩하는 방법인데, 지금은 and 연산자를 이용해 문제를 해결하겠다.</p>
<blockquote>
<pre><code class="language-python">def is_odd_and_greater_than_twenty(num):
    if num % 2 == 1 and num &gt; 20:
      return True
    else:
      return False</code></pre>
</blockquote>
<pre><code>
위의 코드와 같이 num을 2로 나눠 나머지가 1이 나옴과 동시에 20보다 큰 경우엔 True를 반환해주는 식이다. 

---

### elif and else

위에서 살펴본 if문은 딱 하나의 condition 만 판단하는 간단한 구조였다. 하지만 python에서는 더 복잡한 경우가 있을 수 도 있다.(아니 압도적으로 더 많다 ㅠ ㅠ)

자동차 브랜드를 예로 들면 현대,기아에서 제조한 차는 &#39;국산차&#39;로 출력하고 아니면
&#39;외제차&#39;로 출력해야 한다고 할 때 단순 if 문으로 작성한다면 

&gt;```python
if car == &quot;현대&quot;:
    print(&quot;국산차&quot;)
if car == &quot;기아&quot;:
    print(&quot;국산차&quot;)
if car != &quot;현대&quot;:
    print(&quot;외제차&quot;)
if car != &quot;기아&quot;:     
    print(&quot;외제차&quot;)</code></pre><p>얼마나 끔찍한 상황인가.. 이를 해결하기 위해 python에서는 elif(js에선 else if였는데..) 와 else를 지원한다. 위의 끔찍한 코드를 간결히 해결하기 위해 elif를 써보면</p>
<blockquote>
<pre><code class="language-python">if car == &quot;현대&quot;:
    print(&quot;현대는 국산차&quot;)
elif car == &quot;기아&quot;:
    print(&quot;기아는 국산차&quot;)</code></pre>
</blockquote>
<pre><code>
else 도 이용해보겠다.

&gt;```python
if car == &quot;현대&quot;:
   print(&quot;현대는 국산차&quot;)
elif car == &quot;기아&quot;:
   print(&quot;기아는 국산차&quot;)
else:
   print(&quot;외제차&quot;)</code></pre><p>이런식으로 코드를 줄여나갈 수 있다 !!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[python 기초 문법 정리]]></title>
            <link>https://velog.io/@93_bulldozer/python-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@93_bulldozer/python-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 13 Nov 2021 14:48:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/93_bulldozer/post/430ad36c-249e-44a5-8f24-7c63030450a1/python.png" alt=""></p>
<p>javascript를 처음 배웠을 때와 마찬가지로 python 역시 cosole창에 &#39;hello world!&#39;를 출력하는 것으로 문법을 시작한다.</p>
<h3 id="python-print">python print</h3>
<p>python에서 화면에 출력하고자 하는 경우엔 print 명령어를 쓰게 된다.
&#39;hello world!&#39;를 출력하고 싶다면</p>
<blockquote>
<pre><code class="language-python">print(&quot;Hello World!&quot;) # Hello World! 출력</code></pre>
</blockquote>
<pre><code>
---
### python Data Types

인간과 컴퓨터의 언어체계에는 차이가 있다. 숫자 2를 예로 들어보면 
2, &quot;2&quot;, 2.0 등은 우리에겐 숫자 2로 인식되지만 컴퓨터는 전부 다 다른 의미로 받아들이게 된다. 따라서 정확한 data type을 컴퓨터에게 인식시켜줄 필요가 있다.

python에서의 data type들을 살펴보면

1. String
큰따움표(&quot;&quot;) 안에 있는 글자들은 _string_ 이다. 
&gt;&quot;Hello World!&quot; , &quot;2&quot;


2. Integer
숫자 중에서도 정수값을 의미한다 . 
&gt;1, 2, 100

3. Float
숫자 중 소수점이 포함된 수를 의미한다.
&gt;2.0, 29.9, 100.5

4. Complex Numbers
숫자 중 실수와 허수를 포함하고 있는 복소수를 의미한다. python에서는 j를 사용하여 허수를 표현한다. 
&gt;1+3j, 2-4j

5. Boolean
True 나 False 이 2가지 값만 가지고 있으며 조건문에서 많이 사용된다. 
&gt;1 == 1 -&gt; True
2 == 1 -&gt; False
2 == &quot;2&quot; -&gt; False (Data type이 틀리기 때문)


---
### python 에서의 수학 연산
python에서는 다른 프로그래밍 언어와 마찬가지로 기본 수학 연산 기능이 있고 더 나아가 여러 고급 연산 기능을 포함하고 있다. 밑에 예시를 통해 살펴보자.
&gt;
```python
print(1 + 1) # 2
print(10 - 2) # 8
print(3 * 3) # 9
print(10 / 2) # 5
print(2 ** 3) # 8 (2의 세제곱)
print(13 // 2) # 6 (나머지를 버린 값)
print(13 % 2) # 1 (나머지를 구하는 연산자)</code></pre><p>이러한 연산자들 뿐 아니라 변수 값을 연산해야하는 상황이 올때</p>
<blockquote>
<pre><code class="language-python">num1 = 10
num1 += 1
print(num1) # 11</code></pre>
</blockquote>
<pre><code>
와 마찬가지로 +=, -= 등을 사용할 수 있다.

---
### python 의 문자열 연산
python에서는 숫자뿐만 아니라 string(문자열)도  더할 수 있다.
&quot;Hello World!&quot; 를 예시로 보면

&gt;```python
print(&quot;Hello World!) #Hello Wolrd!</code></pre><p>로 구현할 수 있지만</p>
<blockquote>
<pre><code class="language-python">print(&quot;Hello &quot; + &quot;World!&quot;) #Hello World!</code></pre>
</blockquote>
<pre><code>
도 가능하다. 이를 string concatenation 이라고 하는데, 특정 문자열만 변수에 저장되어 있을 때 사용하면 편리하다.

---
### Significant Whitespace
javascript와 같은 다른 컴퓨터 언어에서의 들여쓰기는 단순히 코드의 가독성을 높이기 위해 이용되고, 종속을 나타내기 위해서 중괄호(&quot;{}&quot;)를 사용한다.
하지만 python에서의 들여쓰기는 &#39;요구사항&#39;으로서 코드의 종속성을 나타내게 된다

예를 들어 javascript에서의 {} 문법은
&gt; ```javascript
function func() {
    ... code here
}</code></pre><p>이런식이라면 python에서 종속을 나타내는 방식은</p>
<p><img src="https://images.velog.io/images/93_bulldozer/post/39d77cf5-1e49-4127-bae6-04b9c973b18a/%E1%84%83%E1%85%B3%E1%86%AF%E1%84%8B%E1%85%A7%E1%84%8A%E1%85%B3%E1%84%80%E1%85%B5.jpeg" alt=""></p>
<p>이런식으로 표현한다. 들여쓰기의 칸 수는 일반적으로 4칸이고 대부분 tab 사이즈를 space 4칸으로 설정해서 tab으로 들여쓰기를 한다. 들여쓰기는 함수 뿐만이 아니라 if문, for문, class등 파이썬의 모든 것에 적용된다.</p>
<hr>
<p>python 언어를 접한지 열흘정도 되었다. 아직 알아야 할것도 많고(사실 들여쓰기도 곧잘 헷갈린다 ㅠㅠ..) 막히는 부분이 너무 많아서 블로그 작성을 미루기만 했었다. 는 내 생각이고 결국 변명일 뿐이니까 !! 아직 갈길이 멀고 먼 백엔드 개발자이지만 조급해하지않고 차근차근 실력을 쌓아야겠다는 생각이다.
화이팅 !!</p>
]]></description>
        </item>
    </channel>
</rss>