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)
Author And Source
이 문제에 관하여(Python 2~3강) Python 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hanlyang0522/Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)