본문 바로가기

Boostcamp/U1

[1-3] python 기초 문법 (2)

개요

  • python data structure
  • pythonic codes

1. python data structure

파이썬 기본 데이터 구조

  • 스택 stack , 큐 queue
  • 튜플 tuple , 집합 set
  • 사전 dictionary
  • Collection모듈

 

1.1 스택 stack

  • LIFO (Last In First Out) : 나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
  • append() = push : 데이터 입력
  • pop() : 데이터 출력
a = [1,2,3,4,5]
a.append(10)
a --> [1,2,3,4,5,10]
a.pop() --> 10
a --> [1,2,3,4,5]

1.2 큐 queue

  • First In First Out(FIFO) : 먼저 넣은 데이터 먼저 반환
  • stack과 반대
  • append() = put : 데이터 입력
  • pop(0) : 데이터 출력
a = [1,2,3,4,5]
a.append(10)
a --> [1,2,3,4,5,10]
a.pop(0) --> 1 출력
a --> [2,3,4,5,10]

1.3 튜플 tuple

값 변경 불가능한 리스트

선언시 "( )" 사용

리스트의 연산, 인덱싱, 슬라이싱 등 동일하게 사용 가능

why tuple?

사용자의 실수에 의한 에러 사전 방지

데이터 변경 방지

t = (1)
t --> 1   #정수로 인식

t = (1,)
t --> (1,)  #튜플로 인식

1.4 집합 set

  • 값을 순서없이 저장
  • 중복 불허하는 자료형
s = set([1,2,3,4])
s.add(1)
s.remove(1)
s.update([1,2,4,5]) --> add와 동일하지만 다수의 원소 추가 가능
s.discard(3) --> 원소 3 삭제
s.clear()  --> 모든 원소 삭제

s1 = set()
s2 = set()
s1.union(s2)  --> 합집합
s1.intersection(s2)  --> 교집합
s1.difference(s2)  --> s1 - s2

1.5 사전 dictionary

  • Hash Table 이라는 용어 사용
  • {key:value, key1:value1, ...} 형태
  • key와 value 매칭하여 key로 value 검색
c = {}
c.items()  --> dict 데이터 출력
c.keys()  --> key만 출력
c.values()  --> value만 출력
c["a"]=9 --> key:value 추가

<Lab-dict>

Command Analyzer - 어떤 사용자가 얼마나 많이 명령어를 입력했는가 등

(pdf 실행결과 참고,,

csv install은 되었는데 windows cmder에서 wget이 실행 불가

why? - linux 명령어여서 방법을 찾아야함)

1.6 Collections

from collections import deque
from collections import Counter
from collections import OrderedDict
from collections import defaultdict
from collections import namedtuple

1.6.1 depue

  • Stack과 Queue를 지원하는 모듈
  • List에 비해 효율적이고 빠른 자료 저장 방식
  • 실행 시간 빠름
  • rotate, reverse등 LinkedList 특성 지원
  • 기존 List 형태 함수 모두 지원함
from collections import deque
d = deque()
d.append(1)
d.appendleft(1)
d.popleft()
d.rotate(2)
revered(d)
d.extend([5,6,7])
d.extendleft([5,6,7])

1.6.2 Counter

  • sequence type의 data element들의 갯수를 dict 형태로 변환
  • Ditct type, keyword parameter 등 모두 처리 가능
from collections import Counter
c = Counter()
list(c.elements())  #c 원래 원소 나열

d = Counter()
c.substract(d)  #c - d (빼기)

1.6.3 OrderedDict

  • Dict와 달리, 데이터를 입력한 순서대로 dict 반환
  • python 3.6부터 입력한 순서를 보장하여 출력해줘서 필요XX

1.6.4 defaultdict

from collections import defaultdict
d = defaultdict(object)  #defaultdictionary 생성
d = defaultdict(lambda : 0)  #default 값 0으로 설정

1.6.5 namedtuple

  • tuple 형태로 Data 구조체를 저장하는 방법
  • 저장되는 data의 variable을 사전에 지정해서 저장함
  • 내부적으로 상당히 메모리 활용에 최적화된 데이터 타입
from collections import namedtuple
Point = namedtuple('Pount',['x','y'])
p = Point(x=11,y=22)
print(p[0]+p[1])

x,y = p
print(x,y)

print(p.x + p.y)

print(Point(x=11,y=22))

 


2. Pythonic code

파이썬 스타일 코드

2.1 split & join

items = 'zero one two three'.split()  
# 빈칸을 기준으로 문자열 나눠줌
items = 'zero,one,two,three'.split(",") 
# , 을 기준으로 문자열 나눔

re = ''.join(colors)
# 공백없이 문자열 합침

2.2 List comprehension

  • 기존 List 사용하여 간단하게 다른 List를 만드는 기법
  • for + append 보다 속도가 빠름
result = [i for i in range(10) if i % 2 == 0]
--> [0,1,2,3,4,5,6,7,8,9]

# if문 조건 만족하는 i 만 result에 append

# 이중 반복문
result = [i+j for i in word_1 for j in word_2]
# 아래와 동일한 코드
for i in word_1 :
	for j in word_2 :
		result.append(i+j)

[i+j for i in word_1 for j in word_2 if not(i==j)]
[i+j if not(i==j) else i for i in word_1 for j in word_2]
# else(상황문)까지 필요한 경우 for문 앞에 작성해야한다.

[[i+j for i in case_1] for j in case_2]
# 아래와 동일하다
for j in case_2 :
	line = []
	for i in case_1 :
		line.append(i+j)

2.3 Enumerate & Zip

# enumerate
for idx, value in enumerate(['a','b']) :
	print(idx,value)
--> 0 'a'
--> 1 'b'

# zip
alist = [1,2,3]
blist = [5,6,7]
for a,b in zip(alist,blist) :
	print(a,b)
--> 1 5
--> 2 6
--> 3 7

# 둘이 동시에 사용
for i, (a,b) in enumerate(zip(alist,blist)) :
	print(i,a,b)

2.4 lambda & map & reduce

  • lambda 와 reduce는 코드의 직관성이 떨어져서 사용 권장X..
  • 하지만 간단한 코드로 다양한 기능을 제공한다

<lambda>

f = (lambda x, y : x+y )
f(10,50)
--> 50

(lambda x,y : x+y)(10,50)
--> x=10 , y=50 대입

up_low = lambda x : "-".join(x.split())
# 이런식으로 lambda, join, split 함수 동시에 사용

<lambda problem>

  • 문법 어려움
  • 테스트 어려움
  • 코드 해석 어려움

<map>

ex = [1,2,3,4,5]
f = lambda x,y:x+y
# 원소 2개를 받아서
print(list(map(f,ex,ex)))
# map에서도 원소 2개 받아야함

[f(value) for value in ex]
# list comprehension으로 map없이 list 생성 가능

<reduce>

from functools import reduce
print(reduce(lambda x,y : x+y, [1,2,3,4,5]))
--> 결과 : 15
# 결과 누적 계산

2.5 literable object

  • sequence형 자료형에서 데이터를 순서대로 추출하는 object
  • iter() , next() 함수로 iterable 객체를 iterator object로 사용
  • generator 개념을 위해 iterable object 개념 필요
  • sequence type object를 이르는 말 for loop 에서 굳이 index를 사용할 것이 아니라 iterator를
  • 직접 넣으면 자동으로 element들을 순서대로 불러올 수 있다.
cities = ["Seoul","Busan","Jeju"]
iter_obj = iter(cities)   # iterator object 에 iterable 객체 가져옴

print(next(iter_obj)) --> 'Seoul'
print(next(iter_obj)) --> 'Busan'
print(next(iter_obj)) --> 'Jeju'

# 이렇게 next() 함수를 써서 순서대로 iterable 객체를 iterator object로 가져와 호출해줌.

일반적으로 iterator가 generator보다 훨씬 큰 메모리 용량 사용한다.

2.6 generator

  • iterable object를 특수한 형태로 사용해주는 함수
  • element가 사용되는 시점에 값을 메로리에 반환
  • yield를 사용해 한번에 하나의 element만 반환
  • generator : 함수안 yield 키워드를 사용하여 생성
  • genrator 특징
    • iterable한 순서가 지정됨(모든 generator는 iterator)
    • 느슨하게 평가된다.(순서의 다음 값은 필요에 따라 계산됨)
    • 함수의 내부 로컬 변수를 통해 내부상태가 유지된다.
    • 무한한 순서가 있는 객체를 모델링할 수 있다.(명확한 끝이 없는 데이터 스트림)
    • 자연스러운 스트림 처리를 위 파이프라인으로 구성할수 있다.
def generator_list(value):
	result = []
	for i in range(value):
		yield i

for a in generator_list(50) :
	print(a)

# result 리스트 내
# 50개의 메모리 주소만 받은 리스트 생성하고(실제 값X)
# 메모리 주소 통해 하나씩 값 호출하여 출력(yield 함수)
# 메모리 용량 적게 사용(iterator보다)

gen_ex = (n*n for in range(500))
# list comprehension처럼 generator expression 생성
# []가 아닌 ()로 generator형태의 list 생성 가능

when generator

  • list 타입의 데이터를 반환해주는 함수 만들때
  • 큰 데이터를 처리할 때 - generator expression 활용
  • 파일 데이터 처리할 때

2.7 function passing arguments

  • Keyword arguments그리고 arguments를 넘김
  • 함수에 입력되는 parameter의 변수명을 사용
  • Default argumentsparameter 기본 값 입력안할 경우 default 값 출력
  • parameter의 기본 값을 사용
  • Variable-length-arguments

2.8 variable-length asterisk (가변인자)

  • 개수가 정해지지 않은 변수를 함수의 parameter로 사용
  • 입력된 값은 tuple 형태로 사용 가능
  • *args 로 입력되며, 한번만 입력 가능
  • 맨 마지막 parameter 위치에 입력
def asterisk_test(a,b,*args):
return a+b+sum(args)

print(asterisk_test(1,2,3,4,5)
--> 결과 : 15
# a = 1, b = 2 가 들어가고
# *args에는 (3,4,5)가 들어간다.

2.8.1 Keyword variable-length (키워드 가변인자)

  • parameter 이름을 따로 지정X하고 입력
  • 입력된 값은 dict 타입으로 사용 가능
  • **kwargs 로 표시, 한번만 입력 가능
  • 가변인자(*args) 있다면, 가변인자 뒤에 입력
def kwargs_test(**kwargs) :
	print(kwargs)

def kwargs_test2(a,b,*args,**kwargs):
	print(a+b+sum(*args)) --> 336
	print(b) --> 300
	print(args)  --> (5,6,7,8) 
	print(kwargs)  --> {'first':3,'second':4}

kwargs_test2(10,300,5,6,7,8, first=3,second=4)

kwargs_test2(one=10,two=300,first=3,second=4)
# 첫인자부터 키워드인자로 시작하면,
# 뒤에도 다 키워드 인자로 입력해줘야한다
# 안그럼 error

3. 피어세션

  • 모더레이터(홍채원)
  • 강의 시간에 새롭게 배운 개념과 어려운 부분 등 공유
  • leetcode <Palindrome(회문문자열)>문제 풀이 공유
  • 개발자로 취직하는 방법은..

'Boostcamp > U1' 카테고리의 다른 글

[1-4] python 기초 문법 (3)  (0) 2022.05.25
[1-2] python 기초 문법 (1)  (0) 2021.11.19
[1-1] python 개발환경  (0) 2021.11.19