[Week 1]Day 3 Python基礎文法II


📒 Python Data Structure


Pythonでの資料構造の使い方についての講座です.
学校で1年間資料構造の授業を受けているので、自信のある分野です.
Python Collections内部には初めて見た名前もあり、不思議でした.
今日の授業が終わったら、Collectionsファイルを開きたいです.

📝 Stack

  • メモリ構造
  • は、後で格納されたデータを先に返すことを目的としています.
  • の第1の出力を有する構成.
  • データの入力はPush、出力はPopです.
  • PythonではListを使用してStackを記述できます.
  • >>> a = [1, 2, 3, 4, 5]
    >>> a.append(6) # Push
    >>> a.pop()     # Pop
    6
    >>> a.pop()     # pop을 return 값도 가지며, 자료도 변화시킨다.
    5

    📝 Queue

  • メモリ構造
  • は、まず予め配置されたデータを返すことを目的とする
  • の第1の出力(FIFO)を有する構成.
  • データの入力はenqueueであり、出力はdequeueである.
  • PythonはListを使用してQueueを書くことができます.
  • >>> a = [1, 2, 3, 4, 5]
    >>> a.append(6)  # enqueue
    >>> a.pop(0)     # dequeue
    1
    >>> a.pop(0)
    2
    >>> print(a)
    [3, 4, 5, 6]

    📝 Tuple

  • 値変更不可リスト
  • 宣言は「[]ではなく「()」を使用します.
  • リストの演算、インデックス、スライドなどを同時に使用できます.
  • >>> t = (1, 2, 3)
    >>> type(t)
    tuple
    >>> t + t
    (1, 2, 3, 1, 2, 3)
    >>> len(t)
    3
    >>> t[0] = 5 # 값을 변경할 수 없다.
    TypeError: 'tuple' object does not support item assignment
    >>> t2 = (2)
    >>> type(t2)
    int	# 값이 하나인 tuple이여도, ','를 반드시 사용하자!

    ✏️ Why use?


    主にプログラムの実行中に変更されないデータを格納するために使用されます.
    関数の戻り値など、ユーザによるエラーを予め防止することができる.

    📝 Set

  • 値は、無秩序に格納され、重複できない資料型である.
  • Pythonではsetオブジェクト宣言を使用してオブジェクトを作成できます.
  • ▼▼▼基本文法

    >>> s = set([1, 2, 3, 1, 2, 3]) # s = {1, 2, 3} 도 가능하다.
    >>> type(s)
    set
    >>> print(s)
    {1, 2, 3} # 중복 자료는 제거한다.
    >>> s.add(4) # 원소 추가
    >>> s.remove(2) # 원소 제거. s.discard(2) 와 같은 문법
    >>> print(s)
    {1, 3, 4}
    >>> s.update([1, 2, 5, 6]) # 한 번에 여러개 추가
    >>> print(s)
    {1, 2, 3, 4, 5, 6} 
    >>> s.clear() # 모든 원소를 삭제
    remove()는 존재하지 않는 원소를 지우려고 하면 Error가 난다.
    discard()는 원소가 존재하지 않는 경우도 보장시켜준다. 

    ▼▼▼集合の演算

    >>> s1 = {1, 2, 3, 4}
    >>> s2 = {3, 4, 5, 6}
    >>> s1.union(s2) # 합집합. s1 | s2 와 같은 문법이다.
    {1, 2, 3, 4, 5, 6}
    >>> s1.intersection(s2) # 교집합. s1 & s2 와 같은 문법이다.
    {3, 4}
    >>> s1.difference(s2) # 차집합. s1 - s2 와 같은 문법이다.
    {1, 2}

    📝 Dictionary

  • データを格納すると、区別可能な値が一緒に格納されます.(Hash Table or Map)
  • を区別するためのデータ固有値をIdentifierまたはKeyと呼ぶ.
  • Key値を使用してデータ値を管理します.
    👉 キーとvalueを一致させることで、keyを使用してvalueを検索します.
  • { Key1:Value1, Key2:Value2, Key3:Value3... }持つ形.
  • の内部では、ハッシュテーブルが使用されて実装される.
  • >>> country_code = { "America":1, "Korea":82, "China":86 } # 선언. dict()로 생성 가능
    >>> country_code.items() # 보통 for 문을 돌릴 떄 사용한다.
    dict_items([('America', 1), ('Korea', 82), ('China', 86)]) # 각 tuple 형태이다.
    >>> country_code.keys() # key 값들만 반환한다.
    dict_keys(['America', 'Korea', 'China')]
    >>> country_code['Japan'] = 81 # Dict 추가. 기존 Key에 value를 바꿀 수도 있다.
    >>> country_code.values() # value 값들만 반환한다.
    dict_values([1, 82, 86, 81])
    >>> "Korea" in country_code.keys() # Key 값에 특정 값이 있는지 확인. value도 가능
    

    📝 Deque

  • StackおよびQueueモジュール
  • リストに比べて、より効率的(高速)なデータストレージをサポートします.
  • rotate、reverseなどのリンクリストの特性をサポートします.
  • は、すべての既存のリスト形式の関数をサポートします.
  • >>> from collections import deque
    
    >>> deque_list = deque() # 생성자
    >>> for i in range(5): 
    ...     deque_list.append(i) # 뒤에 추가
    >>> deque_list.appendleft(5) # 앞에 추가
    >>> deque_list	# extend([]), extendleft([]) 문법도 사용 가능하다.
    deque([5, 0, 1, 2, 3, 4])
    >>> deque_list.rotate(1)
    >>> deque_list
    deque([4, 5, 0, 1, 2, 3])
    >>> deque_list.pop() # 뒤에서 제거
    3
    >>> deque_list.popleft() # 앞에서 제거
    4
    # insert, remove 등으로 인덱스에도 접근 가능하다.

    📝 OredredDict


    Dictタイプの値をkeyまたはvalueにソートするために使用できます.

    📝 defaultdict

  • Dictタイプの値にデフォルト値を指定します.
  • の新しい値を生成し、使いやすいです.
  • >>> from collections import defaultdict
    
    >>> d = defaultdict(labda : 0) # 초기값은 함수 형태로 넣어야된다.
    >>> d["first"]
    0
    d = dict()	
    d["Key"]=d.get("Key",0) + 1 # get을 사용해서도 가능하다. 

    📝 Counter


    シーケンスタイプのデータ要素の数をdict形式で返します.
    >>> from collections import Counter
    
    >>> bat_count = ["B", "S", "B", "B", "S"]
    >>> Counter(bat_count)
    Counter({ 'B':3, 'S':2 })

    📒 Pythonic code


    彼はPythonスタイルの符号化方法とPython特有の文法を用いて、コードを効率的に書く方法を教えてくれた.
    高度なコードを書くためには、これらの問題も必要だと思います.
    これはC++スタイルに詳しい私にとって本当に役に立つ講座です.

    📝 split & join


    text dataの基礎構文を処理します.
    >>> items = 'zero one two three'.split() # 빈칸을 기준으로 문자열 나누기
    >>> print(items)
    ['zero', 'one', 'two', 'three']
    >>> example = 'python,java,javascript'
    >>> examples = example.split(',') # ','를 기준으로 문자열 나누기
    >>> print(examples)
    ['python', 'java', 'javascript']
    >>> p, j, js = example.split(',') # 패킹, 언패킹도 가능
    >>> '-'.join(examples) # join 문법. 사이에 '-'를 추가해서 문자열로 반환
    'python-java-javascript'
    

    📝 list comprehension

  • 既存リストを使用して単純な他のリスト
  • を作成する.
    速度は一般的なOrfor+appendより
  • 速い.
  • >>> result = [i for i in range(5)] # 기본 문법(for range)
    >>> result
    [0, 1, 2, 3, 4]
    >>> result = [i for i in range(10) if i % 2 == 0] # if문으로 filter 추가 가능
    >>> result
    [0, 2, 4, 6, 8]
    >>> word1 = 'ab'
    >>> word2 = 'cd'
    >>> result = [i + j for i in word1 for j in word2] # 2중 for문도 가능
    >>> result
    ['ac', 'ad', 'bc', 'bd']
    >>> result = [ [i + j for i in word1] for j in word2] # 뒤의 for문이 먼저 동작
    >>> result
    [['ac, bc'], ['ad, 'bd']]

    📝 enumerate & zip


    ✏️ enumerate


    リストの要素を抽出する場合は、番号を付けて抽出します.
    >>> for i, v in enumerate('ABC'): # 기본 문법(list도 가능!)
    ...     print(i, v)
    0 A
    1 B
    2 C
    >>> {v : i for i, v in enumerate('ABCD')} # dictionary로 만들기
    {'A' : 0, 'B' : 1, 'C' : 2, 'D' : 3}

    ✏️ zip


    2つのlistの値を並列に抽出します.
    >>> alist = ['a1', 'a2', 'a3']
    >>> blist = ['b1', 'b2', 'b3']
    >>> for a, b in zip(alist, blist): # 병렬적으로 값을 추출
    ...     print(a, b)
    a1 b1
    a2 b2
    a3 c3

    📝 lambda & map & reduce


    ✏️ lambda


    関数名がなく、関数のように使用できる匿名関数.
    数学に由来するランダ代数.
    """
    def f(x, y):
        return x + y
    """
    >>> f = lambda x, y : x + y # 기몬 문법. 상단 함수와 동일 로직
    >>> f(10, 20)
    30

    ✏️ map


    シーケンス型データがある場合、各データをマッピングする関数.
    >>> ex = [1, 2, 3, 4, 5]
    >>> list(map(lambda x : x ** 2, ex)) # list화 해주어야 됨!
    [1, 4, 9, 16, 25]
    list理解、lambdaなどで代用できます.

    ✏️ reduce


    map関数とは異なりlistに同じ関数を適用してマージします.
    >>> from functools import reduce
    
    >>> print(reduce(lambda x, y : x + y, [1, 2, 3, 4, 5])) # 하단 사진 참고
    15

    👉 Map-Reduceは主にビッグデータ量のLegacyライブラリまたは複数のMLコードを処理するために使用されます.

    📝 generator


    ✏️ iterable objects


    シーケンス・データ型からデータを順番に抽出するオブジェクト
    >>> cities = ['Seoul', 'Busan', 'Suwon']
    >>> memory_address = iter(cities) # iterable objects 선언
    >>> next(memory_address)
    'Seoul'
    >>> next(memory_address)
    'Busan'
    >>> next(memory_address)
    'Suwon'
    >>> next(memory_address)
    StopIteration

    ✏️ generator

  • iterable objectを特殊形状の関数として使用する
  • 要素を使用すると、値がメモリに返されます.
    👉yieldを使用して一度に1つの要素だけを返します.
  • >>> gen_ex = (n * n for n in range(100))
    >>> print(type(gen_ex)) # 호출 단계에서 하나씩 반환된다.
    <class 'generator'>
    メモリを節約するためには、大容量データ処理に使用することが望ましい.

    📝 asterisk


    ✏️ passing arguments


    関数に入力したパラメータの様々な形式.
  • Keyword arguments
    関数に入力したパラメータの変数名を使用して、パラメータを渡します.
  • def print_person(name, age):
        print(name, age)
        
    print_person("Gyuho", 26)
    print_person(name="Gyuho", age="26") # <<<
  • Default arguments
    パラメータのデフォルト値を使用し、入力しない場合はデフォルト値を出力します.
  • def print_person(name, age=20):
        print(name, age)
        
    print_person("Gyuho") # age는 자동으로 20이 들어간다.
    print_person("Gyuho", 26) # 물론, 값을 넣을수도 있다.
  • Variable-length arguments
    関数のパラメータが不確定な場合に使用します.
    アスタリスクを使用します.
  • ✏️ Variable-length asterisk


    これは,
  • 個の未定変数を関数パラメータとして用いる方法である.
  • Kewordパラメータとともに、パラメータを追加できます.
  • Asterisk(*)記号を使用して関数のパラメータを表します.
  • 入力された値
  • はtupleタイプとして使用できます.
  • 可変係数は、最後のパラメータ位置に使用できるのは1つだけです.
  • 可変パラメータは、通常、変数名として*argsを使用します.
  • def asterisk_test(*args):
        return sum(args)
        
    print(asterisk_test(1, 2, 3, 4, 5))
    # 15가 출력된다.

    ▼▼キーワード可変パラメータ(Keyword variable-length)

  • パラメータ名を指定せずに入力する方法です.
  • 2つの
  • アスタリスク(*)を使用して、関数のパラメータを表します.
  • 入力された値
  • はdictタイプとして使用できます.
  • 可変因子は、既存の可変因子の後に1つのみ使用される.
  • def kwargs_test(**kwargs):
        print(kwargs)
        
    kwargs_test(first = 1, second = 2, third = 3)
    # {'first':1, 'second:'2, 'third':3} 가 출력된다.
    また、アスタリスクはtuple、dicなどの資料型の値を開くためにも使用されます.