Python 2~3강) Python 기초

2-2강) Function and Console IO

%-format, str.format, f-string의 차이

  • %-format
print("%d %d %d" % (1,2,3))
# 1 2 3

print("I eat %d apples and %s" % (3, "sleep"))
# I eat 3 apples and sleep

print("Prod: %s, Price: %4.6f" % ("apple", 5.2325))
# Prod: apple, Price: 5.232500
  • str.format
print("{} {} {}".format("a", "b", "c"))
# a b c

print("Prod: {0}, Price: {1:.6f}".format("apple", 5.2233))
# Prod: apple, Price: 5.223300

print("Prod: {0:<10s}, Price: {1:>10.6f}".format("apple", 5.2233))
# Prod: apple     , Price:   5.223300
  • f-string
name = "choi"
age = 13.2345

print(f"Hello {name}, You are {age}")
# Hello choi, You are 13.2345

print(f"{name:*<20}")
# choi****************

print(f"{name:*>20}")
# ****************choi

print(f"{age:2.2f}")
# 13.23

string functions

str = "Artificial Intelligence and Machine Learning"

print(str.count('a')) # a가 들어간 횟수
# 4
print(str.find('telli')) # 'telli'의 위치
# 13

print(str.rfind('in', 5)) # augment 추가
# 41

print(str.startswith('arit'))
# False

print(str.endswith('ing'))
# True

print(str.split())
# ['Artificial', 'Intelligence', 'and', 'Machine', 'Learning']

str = "하위 바위 \n 바위하위"
# 하위 바위
#  바위하위

str5 = r"하위 바위 \n 바위하위"
# 하위 바위 \n 바위하위

3-1강) Python Data Structure

Tuple

  • 값이 변경 불가능한 리스트
  • 프로그램을 작동하는 동안 변경되지 않는 데이터를 저장
  • 함수의 반환값 등 사용자의 실수에 의한 에러를 사전에 방지
t = (1,2,3)
print(t+t, t*2)
# (1, 2, 3, 1, 2, 3) (1, 2, 3, 1, 2, 3)

len(t)
# 3

t[1] = 5 
# error

print(''.join(map(str,t)))
# 123

Set

  • 값을 순서없이 저장, 중복 불허
s = set([1,2,3,1,2,3])
print(s)
# {1, 2, 3}

#동일한 값 중복 불허
s.add(1)
print(s)
# {1, 2, 3}

s.update([1,4,5,6,7,9])
print(s)
# {1, 2, 3, 4, 5, 6, 7, 9}

s.discard(3)
print(s)
# {1, 2, 4, 5, 6, 7, 9}

s.clear()
print(s)
# set()
  • 집합 연산 가능
s1 = set([1,2,3,5,6])
s2 = set([4,6,2,6,1,9])

# 합집합
print(s1.union(s2))
print(s1 | s2)
# {1, 2, 3, 4, 5, 6, 9}

# 교집합
print(s1.intersection(s2))
print(s1 & s2)
# {1, 2, 6}


# 차집합
print(s1.difference(s2))
print(s1 - s2)
# {3, 5}

Dictionary

country_code = dict() # = {}로도 생성 가능
country_code = {'America' : 1, 'Korea' : 82, 'China' : 86}
print(country_code)
# {'America': 1, 'Korea': 82, 'China': 86}

print(country_code.items())
# dict_items([('America', 1), ('Korea', 82), ('China', 86)])

country_code["Germany"] = 49
print(country_code)
# {'America': 1, 'Korea': 82, 'China': 86, 'Germany': 49}

print(country_code.keys())
# dict_keys(['America', 'Korea', 'China', 'Germany'])

print(country_code.values())
# dict_values([1, 82, 86, 49])

Collections

  • List, Tuple, Dict에 대한 Python Built-in Module

Deque

  • Stack, Queue를 지원하는 모듈
  • List에 비해 빠른 저장방식을 지원
from collections import deque

deque_list = deque()
for i in range(5):
    deque_list.append(i)
print(deque_list)
# deque([0, 1, 2, 3, 4])

deque_list.appendleft(10)
print(deque_list)
# deque([10, 0, 1, 2, 3, 4])

deque_list.rotate(2)
print(deque_list)
# deque([3, 4, 10, 0, 1, 2])

deque_list.rotate(-2)
print(deque_list)
#deque([10, 0, 1, 2, 3, 4])

deque_list.extend([5,6,7])
print(deque_list)
# deque([10, 0, 1, 2, 3, 4, 5, 6, 7])

deque_list.extendleft([5,6,7])
print(deque_list)
# deque([7, 6, 5, 10, 0, 1, 2, 3, 4, 5, 6, 7])

max(deque_list)
# 10

DefaultDict

  • Dict의 초기값을 설정
  • Dict의 key를 초기화하지 않고도 값을 바로 변경할 수 있다는 장점이 있음
from collections import defaultdict

d = defaultdict(object)
d = defaultdict(lambda: 3)
print(d["first"]) 
# 3

Counter

  • Sequence type의 data element의 갯수를 dict 형태로 반환
  • 집합 연산을 지원
from collections import Counter

c = Counter()
c = Counter('gallahad')
print(c)
# Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})

c = Counter({'red' : 4, 'blue' : 2})
print(c)
# Counter({'red': 4, 'blue': 2})
print(list(c.elements()))
# ['red', 'red', 'red', 'red', 'blue', 'blue']

c = Counter(cats=4, dogs=8)
print(c)
# Counter({'dogs': 8, 'cats': 4})
print(list(c.elements()))
# ['cats', 'cats', 'cats', 'cats', 'dogs', 'dogs', 'dogs', 'dogs', 'dogs', 'dogs', 'dogs', 'dogs']

c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
print(c+d)
# Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2})
print(c&d)
# Counter({'b': 2, 'a': 1})
print(c|d)
# Counter({'a': 4, 'd': 4, 'c': 3, 'b': 2})

NamedTuple

  • Tuple은 항목에 index로 접근해야 되기 때문에 순서를 기억해야함
    NamedTuple은 사용자가 항목에 이름을 붙여 접근이 가능
from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(x=11, y=22)
print(p[0], p[1])
# 11 22

3-2) Pythonic Code

Enumerate

  • list element를 번호를 붙여 추출
my_str = "ABCD"
{i : v for i, v in enumerate(my_str)}
# {0: 'A', 1: 'B', 2: 'C', 3: 'D'}

Zip

  • 여러개의 list 값을 병렬적으로 추출
alist = ['a1', 'a2', 'a3']
blist = ['b1', 'b2', 'b3']
# list로 묶음
print([[a, b] for a, b in zip(alist, blist)])
# [['a1', 'b1'], ['a2', 'b2'], ['a3', 'b3']]

# tuple로 묶음
print([c for c in zip(alist, blist)])
# [('a1', 'b1'), ('a2', 'b2'), ('a3', 'b3')]

Lambda

  • 함수 이름 없이, 함수처럼 쓸 수 있는 익명함수
  • PEP 8에서는 쓰는걸 권장하지 않으나 여전히 많이 쓰임
lambda 인자: 표현식 의 형태로 나타냄

up_low = lambda x:  "-".join(x.split())
up_low("Im Happy")
# Im-Happy

f = lambda x, y: x*y
f(2, 2)
# 4

print((lambda x: x+4)(3))
# 7

Map

  • iterator(list, str, tuple)의 각 element에 function을 적용
    function의 인자가 여러개라면 iterator도 여러개
return_ = map(function, iterator)의 형태로 나타냄

ex = [1,2,3,4,5]
f = lambda x: x ** 2
g = lambda x, y: x + y

print(list(map(f, ex)))
# [1, 4, 9, 16, 25]
print([f(value) for value in ex])
# [1, 4, 9, 16, 25]

print(list(map(g, ex, ex)))
# [2, 4, 6, 8, 10]

Reduce

  • Map과 달리 누적값을 생성
from functools import reduce
print(reduce(lambda x, y: x+y, [1,2,3,4,5]))
# 15

Iterator

  • next() 메소드로 데이터를 순차적으로 호출 가능한 object
    다음 데이터를 불러올 수 없을 경우 StopIteration exception 발생
  • linked list 같은 개념

Iterable과 Iterator의 차이

  • Iterable: member를 하나씩 차례로 반환 가능한 object
    sequence type인 list, str, tuple이 대표적
  • iterable하다고 해서 iterator인 것은 아니다!
  • iterable을 iterator로 변경하고 싶다면 iter()라는 built-in fuction을 사용해야 함
cities = ["Seoul", "Busan", "Pohang"]

memory_address_cities = iter(cities)
print(memory_address_cities)
# <list_iterator object at 0x7f0bc6dadbd0>

print(next(memory_address_cities))
# Seoul
print(next(memory_address_cities))
# Busan
print(next(memory_address_cities))
# Pohang
print(next(memory_address_cities))
# StopIteration

Generator

  • iterator을 특수한 형태로 쓸 수 있게 하는 함수
  • yield를 이용해 한번에 하나의 element만 return
  • generator는 yield를 만날 경우 반환값을 next()를 호출한 쪽으로 전달하며, 일반적인 함수처럼 종료되지 않고 그 상태(local 변수나 내부에서 사용된 데이터가 그대로)로 유지된다
  • 메모리를 효율적으로 사용할 수 있어 파일 데이터 등 큰 데이터를 처리하는데 용이
gen_ex = (n*n for n in range(10))
# 리스트처럼 [] 말고, ()를 사용
print(type(gen_ex))
# <class 'generator'>
print(list(gen_ex))
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

def generator_list(value):
    for i in range(value):
        yield i

for a in generator_list(10):
    print(a, end = ' ')
# 0 1 2 3 4 5 6 7 8 9

실행과정
1. for문 -> generator_list 실행
2. yield를 만나서 함수를 호출했던 구문으로 반환(return 0). 하지만 함수가 종료되는 것이 아니라 그대로 유지된 상태
3. a엔 return된 0이 들어가서 print. 그 후 for문으로 다시 generator_list 호출
4. 이때 generator_list는 처음부터 시작하는 것이 아니라 yield 이후 구문부터 실행. for문을 돌면서 i 값이 증가하고 다시 yield를 만나서 return 1
5. 이후 동일

Variable-Length Asterisk

  • 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법
  • 함수에서 정해진 parameter 이후에 나오는 값은 tuple로 저장
  • keyword 가변인자는 **를 사용해서 키워드 지정 가능. 입력된 값을 dict type로 저장
  • keyword 가변인자는 오직 1개만, 기존 가변인자 다음에 사용
def asterisk_test(a, b, *args):
    print(list(args))
    print(type(args))
    return a+b+sum(args)
asterisk_test(1,2,3,4,5)
# [3, 4, 5]
# <class 'tuple'>
# 15

def kwargs_test(**kwargs):
    print(kwargs)
    print(type(kwargs))
kwargs_test(first=3, second=4, third=5)
# {'first': 3, 'second': 4, 'third': 5}
# <class 'dict'>

def kwargs_test_2(one, two, *args, **kwargs):
    print(one + two + sum(args))
    print(args)
    print(kwargs)
kwargs_test_2(3,4,6,7,8,7, first=3, second=4, third=5)
# 35
# (6, 7, 8, 7)
# {'first': 3, 'second': 4, 'third': 5}

Asterisk

  • unpacking: tuple, dict등 자료형에 들어가있는 값을 unpacking
def asterisk_test_2(a, *args): #여러개의 가변인자를 받는 *
    print(a, *args)
    print(a, args)
    print(type(args))
    
test = (2,3,4,5,6)
asterisk_test_2(1, *test) # unpacking해주는 *
# 1 (2, 3, 4, 5, 6)
# 1 ((2, 3, 4, 5, 6),)
# <class 'tuple'>

print(*["1", "2", "3", "4"])
# 1 2 3 4
print(["1", "2", "3", "4"])
# ['1', '2', '3', '4']



ex = ([1,2], [3,4], [5,6], [5,6], [5,6])

# tuple이라 zip 불가능
for value in zip(ex):
    print(value, end=' ')
# ([1, 2],) ([3, 4],) ([5, 6],) ([5, 6],) ([5, 6],)

# unpacking으로 2차원 배열이 돼 zip 가능
for value in zip(*ex): # *ex = [1,2], [3,4], [5,6], [5,6], [5,6]
    print(value)
# (1, 3, 5, 5, 5)
# (2, 4, 6, 6, 6)

좋은 웹페이지 즐겨찾기