yuns

문법 본문

goorm 수업 정리/파이썬

문법

yuuuun 2021. 8. 3. 11:35
반응형

* AI기술 자연어 처리 전문가 양성 과정의 강의를 듣고 정리

변수

  • 값을 저장하는 공간
  • 변수는 메모리 주소를 가르킨다. (포인터)
  • 알파벳, 숫자, _로 선언한다

비트 연산자

연산자 설명
~ 비트 부정
| 비트합
& 비트곱
^ 배타적비트합
<< >> 비트시프트

비교 연산자

x == y x와 y가 같다
x is y x와 y의 주소가 같다
x != y x와 y가 다르다
x is not y x와 y의 주소가 다르다

Type Checking

isinstance(variable, type)

List

  • List Slicing: seq[start: end: step] 형태로 list자름
>>> a = [1, 2, 3, 4]
>>> b = [5, 6, 7, 8]
>>> a + b
[1, 2, 3, 4, 5, 6, 7, 8]
>>> a[0] = 10
>>> a * 2
[10, 2, 3, 4, 10, 2, 3, 4]
>>> 10 in a
True
>>> seq = [1, 2, 3, 4]
>>> len(seq)
4

>>> seq.append("Hello")
>>> seq
[1, 2, 3, 4, "Hello"]

>>>seq.extend([5, 6])   #맨 뒤에 리스트 추가 => seq += [5, 6]
>>> seq.insert(1, 1.5)  # idx 1에 1.5 삽입
>>> seq
[1, 1.5, 2, 3, 4, "Hello", 5, 6]
>>> del seq[1]          #1번째 원소 삭제
>>> seq.remove("Hello") #원하는 값 삭제

예약어 vs 내장함수 vs 메소드

예약어 내장함수 메소드
- 일종의 문법적인 요소
- 괄호를 사용하지 않음
- 재정의 불가능
- 기본 정의된 함수
- 별개의 함수 사용
- 재정의 가능
- 편의성 향상
- 객체 내의 정의된 함수
- .method()으로 접근
- Overriding
- 해당 객체를 다룸

Tuple

 불변 타입의 리스트(Immutable List)

>>> t = (1, 2, 3, 4)
>>> t = 1, 2, 3, 4     #괄호 생략 가능!
>>> t
(1, 2, 3, 4)

>>> len(t)
4
>>> t * 2
(1, 2, 3, 4, 1, 2, 3, 4)

>>> t[3] = 5
Error!
  • Tuple은 불변 타입이지만 Tuple안의 요소는 가변 타입일 수 있음
  • >>> a = (1, 2, [5, 6, 7])
    >>> a[2].append(8)
    >>> a
    (1, 2, [5, 6, 7, 8])

Packing and Unpacking

>>> t =[1, 2, 3, 4, 5]
#Unpacking
>>> a, b, c, _, _ = t
>>> c
3
>>> a, *b, c = t
>>> a, b, c
(1, [2, 3, 4], 5)

Dictionary

매핑을 위한 데이터 구조

  • Key -> Value형태로 구현
  • Key는 중복이 불가능
#key는 불변 타입이어야 함
#list는 사용할 수 없음
>>> dic = {1: "something", (1, 2.5): 1.5, 'test': 2}
>>> dic[1]
'something'

>>> dic['test']
2
>>> dic[1, 2.5]
1.5
>>> dic = {1: 'A', 2: 'B', 3: 'C'}
>>> dic
dic = {1: 'A', 2: 'B', 3: 'C'}
>>> dic.items()
dict_items([(1, 'A'), (2, 'B'), (3, 'C')])

>>> dic.keys()
dic_keys([1, 2, 3])

>>> dic.value()
dict_values(['A', 'B', 'C'])

Set

Dictionary의 Key만 모여 있는 형태(집합형)

 >>> s = set([1, 2, 3, 'hello']) #<=> list타입으로 안 해도 괜찮음
 >>> s 
 {1, 2, 3, 'hello'}
 
 >>> s.add(5)
 >>> s.add('hello')
 {1, 2, 3, 5, 'hello')
 >>> s.remove(5)
 >>> s.discard(99)              #set안의 값이 없는 값을 지울 때는 discard -> 없을 경우 무시
 >>> s
 {1, 2, 3, 'hello'}
 >>> s.update([1, 99, None])    #여러 요소를 추가 하고 싶을 경우
 
 >>> s.clear()                  #set비우기

set 연산자

>>> s1 = set([1, 2, 3, 4])
>>> s2 = set([3, 4, 5, 6])

#교집합
>>> s1 & s2
{3, 4}

#합집합
>>> s1 | s2
{1, 2, 3, 4, 5, 6}

#차집합
>>> s1 - s2
{1, 2}

#XOR 배타적 합집합
>>> s1 ^ s2
{1, 2, 5, 6}

frozenset

set의 불변 타입

Condition & Loop

Condition

If - elif - else

삼항 연산자

[value1] if [condition] else [value2]

>>> value = 32
>>> "odd" if value % 2 else "even"
'even'

"", 0, None, [] 는 False임

>>> for key in {'a': 1, 'b': 2}:
         print(key)
         
a
b

>>> for key in {'a': 1, 'b': 2}.items():
         print(key)
         
('a', 1)
('b', 2)

Function

  • 함수: 명령을 수행하는 일종의 기능 단위
    • 코드를 논리적으로 분리, 캡슐화 용도
    • 필요한 경우 반복적으로 호출
    • Return 명령어가 없는 경우 None을 반환
  • ****! 인자로 받은 것을 바로 수정하는 것은 권장하지 않음!!!
  • 상위에 정의된 변수는 언제나 읽기 가능
  • 함수 내 정의된 변수 이름은 그 함수 내에서만 유효함

Variable Scope

  • Global
    • 최상위에 선언
    • 다른 파일에서 접근 가능
  • Local 
    • 함수 안에 선언
    • 상위 함수에서는 접근 불가능

Global & Nonlocal

  • 상위 변수 수정 선언
  • 함수 맨 앞에 선언함
    • global: 최상위 변수
    • nonlocal: 바로 상위 변수
  • 스파게티 코드의 주 원인 -> 사용하지 않는 것을 권장
var = 1
def main():
   var = 10
   def function1():
       global var
       var += 1
   def function2():
       nonlocal var
       var + 1
       
   function1()
   function2()
   print(var)
main()
print(var)

Variable Capture 불가

var = 1
def function():
    print(var)
var += 1
function = 1


=> 결과는 2
  • 함수형 언어에서 쓰이는 Capture와 다름
  • 상위 값이 바뀌면 하위 값이 바뀜
  • 프로그램을 스파게티로 만드는 주요 원인
    • 상위 객체엔 가능하면 접근하지 않기
    • 최대한 파라미터로 받기
    • 최상위 선언도 가급적 지양하기

Closure

  • 같은 arugment를 받았을 때 같은 결과를 보임

Closure 만들기

print_closure의 function 자체를 보내기 때문에 변수를 넣어서 return해주지 않음!

 

 

Decorator

  • 함수 하나를 인자로 받아 같은 형태의 함수를 반환하는 함수
  • @을 사용하여 함수를 꾸미는데 사용 가능
def print_closure_factory(function):
    def print_closure(var):
        print("Input: ", var)
        out = function(var)
        print("Output: ", out)
        return out
    return print_closure
    
def add(var):
    return var + 2
print_add = print_closure_factory(add)
print_add(10)
def print_closure_factory(function):
    def print_closure(var):
        print("Input: ", var)
        out = function(var)
        print("Output: ", out)
        return out
    return print_closure
    
@print_decorator
def add(var):
    return var + 2
add(10)

Decorator에 인자를 추가하기 위해서는 함수를 한번 더 wrapping 필요하다

def times_decorator_factory(times):
    def times_decorator(function):
        def closure(var):
             for _ in range(times):
                 var = function(var)
            return var
        return closure
    return times_decorator
@times_decorator_factory(5)
def add(number):
	return number + 2
print(add(5))

Appropriate Decorating

  • 함수에 warpping하기 때문에 기존 함수에 접근 불가함
    • Docstring, 함수 이름 등 기존 함수의 특성을 가져올 필요가 있음
    • functools library의 wraps decorator를 사용
def print_decorator(function):
  def print_closure(var):
    print("Input: ", var)
    out = function9var)
    print("Output: ", out)
  return print_closure
    
@print_decorator
def add(var):
  return var + 2
print(add.__name__)
from functools import wraps
def print_decorator(function):
  @wraps(function)
  def print_closure(var):
  	print("Input: ", var)
    out = function(var)
    print("Output: ", out)
  return print_closure
  
@print_decorator
def add(var):
  return var + 2
    
print(add.__name__)

Recursive Function

  • 자기 자신을 호출하여 반복적으로 수행

Fuction Parameters

  • 인자를 명시적으로 대입 가능
  • 인자를 기본값으로 설정 가능
  • 기본값이 설정된 인자는 맨 뒤에 붙여서 써야 함

Variable Length Parameter

  • 인자의 개수가 정해져 있지 않을 경우 사용
  • *(Asterisk)를 사용하여 남은 여러 인자를 packing가능
  • 가변인자는 맨 마지막에 단 한 개만 위치 가능
def add_all(a, b, *args):
    print(args)
    sum = 0
    for elem in args:
        sum += elem
    return a + b + sum
    
print(add_all(1, 2, 3, 4, 5))     # 15

Keyword variable Length Parmater

  • 명시적으로 지정된 파라미터가 남을 경우 키워드 가변인자 사용
  • **(Double asterisk)를 사용하여 남는 키워들 변수를 packing할 것
  • list로 묶여야 하는 것은 *로 사용
  • dictionary로 묶여야 되는 것은 **로 사용
def func(a, ** kwargs):
    print(kwargs)
    
func(a=1, c=3)   # {'c':3}
  • 파라미터 순서: 일반인자 -> 기본값 인자 -> 가변 인자 -> 키워드 가변인자
def function(var1, var2=10, *args, **kwargs):
    print(var1, var2, args, kwargs)
    
function(1, 2, 3, var3=10) #1, 2, (3,) {'var3': 10}

Parameter Unpacking

  • sequence에 *를 붙이면 unpacking
    • 리스트, 튜플에 적용가능
def function(a, b, c):
    print(a, b, c)
l = [1, 2, 3]
function(*l)            #1 2 3
  • Dictionary에 ** 를 붙이면 keyword unpacking
def function(var1, var2, **kwargs):
    print(var1, var2, kwargs)
    
    
d = {'var1': 10, 'var2': 20, 'var3': 30}
function(**d)    #10 20 {'var3':30}

Type hints

  • 함수에 타입 힌트 제공이 가능

Pythonic Programming

Comprehension

result = [i * 2 for i in range(10)]
result = {str(i): i for i in rnage(10)}

Generator

  • range함수의 경우 숫자를 하나씩 생성하여 반환하는데 이러한 요소를 하나씩 생성하여 반환하는 객체를 Generator라고 한다.
    • function에 yield를 사용할 경우 Generator가 된다
    • function에 return이 없음
    • yield 하는 위치에서 값을 반환함
    • 다시 값을 요청 받을 때 yield 다음 줄부터 실행
    • return 될 시 반복을 멈춘다.
      • StopIteration Exception 발생
    • Sequence 전체를 생성하는 것이 아니므로 메모리 효율적
      • 매우 큰 데이터셋을 처리할 때 Generator 사용 권장
    • 괄호로 Generator Comprehension 형태로 선언 가능
      • Function 등으로 이미 괄호가 쳐져 있다면 괄호 생략 가능
def my_range(stop):
    number = 0
    while number < stop:
        yield number
        number += 1
        
        
for i in my_range(5):
    print(i)

 

even_generator = (i * 2 for i in range(100))

소괄호를 쳐줬기 때문에 generator형태로 반환됨

Built-in Functions

  • sum
  • any: 하나라도 참이면 참
  • all: 모두다 참이여야 함
  • max, min
  • zip
    • unpacking을 사용하기 때문에 2차원 리스트의 열 단위 접근 역시 가능
    • generator의 경우 list로 묶어야 값을 확인할 수 있음!
arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for col in zip(*arr):
    print(col)
  • map: 각 요소에 function 함수를 적용하여 반환  map([function], [iterable])
  • filter: 각 요소에 function 함수를 적용하여 참이 나오는 것만 반환 filter([function], [iterable])

Lambda Function

  • 함수의 이름 없이 빠르게 만들어 쓸 수 있는 익명 함수
반응형

'goorm 수업 정리 > 파이썬' 카테고리의 다른 글

파일 입출력  (0) 2021.08.06
정규표현식  (0) 2021.08.06
자료구조, 문자열, 정규표현식  (0) 2021.08.05
문법(2)  (0) 2021.08.04
Intro  (0) 2021.08.02
Comments