split & join¶
split 함수¶
In [1]:
items ='zero one two three'.split() # 빈칸을 기준으로 문자열 나누기
print(items)
In [2]:
example ='python,java,javascript'# ","을 기준으로 문자열 나누기
example.split(',')
Out[2]:
In [3]:
a,b,c=example.split(',') # 리스트에 있는 각 값을 a,b,c 변수로 unpacking
print(a,b,c)
In [4]:
example ='teamlab.technology.io'
subdomain, domain, tld=example.split('.')
print(subdomain, domain, tld)
- String type의 값을 '구분자'로 나눠서 List형태로 변환
join 함수¶
In [5]:
colors =['red','blue','green','yellow']
result =''.join(colors)
result
Out[5]:
In [6]:
result =' '.join(colors) # 연결시 빈칸 1칸으로 연결
result
Out[6]:
In [7]:
result =', '.join(colors) # 연결시", "으로연결
result
Out[7]:
In [8]:
result ='-'.join(colors) # 연결시"-"으로연결
result
Out[8]:
- String으로 구성된 list를 합쳐서 하나의 string으로 반환
In [9]:
# General Style
result =[]
for i in range(10):
result.append(i)
result
Out[9]:
In [10]:
# List Comprehension
result =[i for i in range(10)]
print(result)
result =[i for i in range(10) if i%2==0]
print(result)
In [11]:
# Nested For loop
word_1 ="Hello"
word_2 ="World"
result =[i+j for i in word_1 for j in word_2]
print(result)
In [12]:
case_1 =["A","B","C"]
case_2 =["D","E","A"]
result =[i+j for i in case_1 for j in case_2]
result
Out[12]:
In [13]:
# Filter: i랑j과같다면List에추가하지않음
# [i+jif not(i==j) else i for i in case_1 for j in case_2]
result =[i+j for i in case_1 for j in case_2 if not(i==j)]
result
Out[13]:
In [14]:
result.sort()
result
Out[14]:
- 조건문을 넣어서 만들 수 있음.
In [15]:
# 문장을 빈칸 기준으로 나눠 list로 변환
words ='The quick brown fox jumps over the lazy dog'.split()
print(words)
In [16]:
# list의 각 elemente들을 대문자, 소문자, 길이로 변환하여 two dimensional list로변환
stuff=[[w.upper(),w.lower(),len(w)] for w in words]
print(stuff)
In [17]:
case_1 =["A","B","C"]
case_2 =["D","E","A"]
result =[i+j for i in case_1 for j in case_2]
result
Out[17]:
In [18]:
result =[ [i+j for i in case_1] for j in case_2]
result
Out[18]:
- 여기서는 뒤에 있는 for j in case_2가 먼저 실행이 된다.
enumerate & zip¶
enumerate¶
- list의 element를 추출할 때 번호를 붙여서 추출
In [19]:
# list에 있는 index와 값을 unpacking
for i,v in enumerate(['tic','tac','toe']):
print(i,v)
In [20]:
mylist=['a','b','c','d']
# list에 있는 index와 값을 unpacking하여 list로저장
list(enumerate(mylist))
Out[20]:
In [21]:
# 문장을 list로 만들고 list의 index와 값을 unpacking하여 dict로저장
{i:j for i,j in enumerate('Artificial intelligence (AI), is intelligence demonstrated by machines,\
unlike the natural intelligence displayed by humans and animals.'.split())}
Out[21]:
zip¶
- 두 개의 list의 값을 병렬적으로 추출
In [22]:
alist=['a1','a2','a3']
blist=['b1','b2','b3']
for a,b in zip(alist,blist):# 병렬적으로값을추출
print(a,b)
In [23]:
[c for c in zip(alist,blist)]
Out[23]:
In [24]:
a,b,c=zip((1,2,3),(10,20,30),(100,200,300))
print(a,b,c)
In [25]:
# 각Tuple 같은 index를 묶어 합을 list로변환
[sum(x) for x in zip((1,2,3),(10,20,30),(100,200,300))]
Out[25]:
In [26]:
alist=['a1','a2','a3']
blist=['b1','b2','b3']
# index alist[index] blist[index] 표시
for i,(a,b)in enumerate(zip(alist,blist)):
print(i,a,b)
lambda & map &reduce¶
lambda¶
- 함수 이름 없이, 함수처럼 쓸 수 있는 익명함수
- 수학의 람다 대수에서 유래함
In [27]:
# general function
def f(x, y):
return x +y
print(f(1,4))
In [28]:
# Lambda function
f=lambda x, y: x+y
print(f(1, 4))
In [29]:
(lambda x,y:x+y)(10,50)
Out[29]:
- Python 3부터는 권장하지는 않으나 여전히 많이 쓰임
map¶
In [30]:
ex=[1,2,3,4,5]
f=lambda x,y: x+y
# 두개 이상 list
print(list(map(f, ex, ex)))
# filter
print(list(map(lambda x: x**2 if x % 2==0 else x, ex)))
- 두개 이상의 list에도 적용 가능함, if filter도 사용가능
In [31]:
ex =[1,2,3,4,5]
print(list(map(lambda x: x+x, ex)))
print((map(lambda x: x+x, ex)))
In [32]:
f=lambda x: x**2
print(map(f, ex))
for i in map(f, ex):
print(i)
In [33]:
result =map(f, ex)
print(next(result))
- python3는 iteration을생성 → list을 붙여줘야 list 사용가능
- 실행시점의 값을 생성, 메모리 효율적
In [34]:
def f(x):
return x+5
ex=[1,2,3,4,5]
list(map(f,ex))
print([f(value) for value in ex])
- map대신 comprehesion을 이용하는걸 더 권장한다
reduce¶
In [35]:
from functools import reduce
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))
- map function과 달리 list에 똑같은 함수를 적용해서 통합
요약¶
Lambda,map,reduce는 간단한 코드로 다양한 기능을 제공 그러나 코드의 직관성이 떨어져서lambda나reduce는 python3에서 사용을 권장하지 않음. Legacy library나 다양한 머신러닝 코드에서 여전히 사용중
In [36]:
for city in["Seoul", "Busan", "Pohang"]:
print(city, end="\t")
for language in("Python", "C", "Java"):
print(language, end="\t")
for char in "Python is easy":
print(char, end= " ")
In [37]:
cities = ["Seoul", "Busan", "Jeju"]
iter_obj= iter(cities)
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
- 내부적 구현으로
__iter__와__next__가 사용됨 iter()와next()함수로 iterable 객체를 iterator object로 사용
generator¶
- iterable object를 특수한 형태로 사용해주는 함수
- element가 사용되는 시점에 값을 메모리에 반환
:yield를 사용해 한번에 하나의 element만 반환함
In [38]:
# 일반적인 list
def general_list(value):
result = []
for i in range(value):
result.append(i)
return result
In [39]:
print(general_list(50))
In [40]:
import sys
result=general_list(50)
sys.getsizeof(result)
Out[40]:
In [41]:
# Generator
def generator_list(value):
result = []
for i in range(value):
yield i
In [42]:
generator_list(50)
Out[42]:
In [43]:
sys.getsizeof(generator_list(50))
Out[43]:
In [44]:
for a in generator_list(10):
print(a,end=' ')
generator 만들기¶
In [45]:
gen_ex= (n*n for n in range(500))
print(type(gen_ex))
- list comprehension과 유사한 형태로 generator형태의 list 생성
- generator expression이라는 이름으로도 부름
[ ]대신( )를 사용하여 표현
In [46]:
from sys import getsizeof
gen_ex= (n*n for n in range(500))
print(getsizeof(gen_ex))
print(getsizeof(list(gen_ex)))
list_ex= [n*n for n in range(500)]
print(getsizeof(list_ex))
- 일반적인 iterator는 generator에 비해 훨씬 큰 메모리 용량 사용
요약¶
list 타입의 데이터를 반환해주는 함수는 generator로만들어라!
→ 읽기 쉬운 장점, 중간 과정에서 loop가 중단될 수 있을때!
큰 데이터를 처리할 때는 generator expression을고려하라!
→ 데이터가 커도 처리의 어려움이 없음
파일 데이터를 처리할 때도 generator를 쓰자
function passing arguments¶
Keyword arguments¶
In [47]:
def print_somthing(my_name,your_name):
print("Hello {0}, My name is {1}".format(your_name,my_name))
print_somthing("Sungchul","TEAMLAB")
print_somthing(your_name="TEAMLAB",my_name="Sungchul")
- 함수에 입력되는 parameter의 변수명을 사용, arguments를 넘김
default arguments¶
In [48]:
def print_somthing_2(my_name,your_name="TEAMLAB"):
print("Hello {0}, My name is {1}".format(your_name,my_name))
print_somthing_2("Sungchul","TEAMLAB")
print_somthing_2("Sungchul")
- parameter의 기본값을 사용, 입력하지 않을 경우 기본값 출력
asterisk¶
가변인자¶
- 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법
- Keyword arguments와 함께,argument추가가 가능
- Asterisk(*) 기호를 사용하여 함수의 parameter를 표시함
- 입력된 값은 tuple type으로 사용할 수 있음
- 가변인자는 오직 한 개만 맨마지막 parameter 위치에 사용가능
In [49]:
def asterisk_test(a,b,*args):
return a+b+sum(args)
print(asterisk_test(1,2,3,4,5))
In [50]:
def asterisk_test(a, *args):
print(a, args)
print(type(args))
asterisk_test(1,2,3,4,5,6)
In [51]:
def asterisk_test_2(*args):
x,y,z =args
return x,y,z
print(asterisk_test_2(3,4,5))
- 가변인자는 일반적으로 *args를 변수명으로사용
- 기존parameter 이후에 나오는 값을 tuple로 저장함
키워드 가변인자¶
- Parameter 이름을 따로 지정하지 않고 입력하는 방법
- asterisk(*) 두개를 사용하여 함수의 parameter를 표시함
- 입력된 값은 dict type으로 사용할 수 있음
- 가변인자는 오직 한 개만 기존 가변인자 다음에 사용
In [52]:
def kwargs_test_1(**kwargs):
print(kwargs)
In [53]:
def asterisk_test(a, **kargs):
print(a, kargs)
print(type(kargs))
asterisk_test(1, b=2, c=3, d=4, e=5, f=6)
In [54]:
def kwargs_test_3(one,two,*args,**kwargs):
print(one+two+sum(args))
print(kwargs)
kwargs_test_3(3,4,5,6,7,8,9,first=3,second=4,third=5)
- dict형으로 저장된다.
unpaking container¶
In [55]:
def asterisk_test(a, *args):
print(a, args)
print(type(args))
asterisk_test(1, *(2, 3, 4, 5, 6))
In [56]:
def asterisk_test(a, args):
print(a, *args)
print(type(args))
asterisk_test(1, (2,3,4,5,6))
- tuple, dict 등 자료형에 들어가 있는 값을 unpacking
- 함수의 입력값, zip 등에 유용하게 사용가능
In [57]:
a, b, c = ([1, 2], [3, 4], [5, 6])
print(a, b, c)
data = ([1, 2], [3, 4], [5, 6])
print(*data)
In [58]:
def asterisk_test(a, b, c, d, e=0):
print(a, b, c, d, e)
data = {"d":1 , "c":2, "b":3}
asterisk_test(10, **data)
**는 dict타입을 풀어줄때 사용한다.
In [59]:
for data in zip(*([1, 2], [3, 4], [5, 6])):
print(data)
'AI > 이론' 카테고리의 다른 글
| Numpy part II (0) | 2021.01.25 |
|---|---|
| Numpy part I (0) | 2021.01.25 |
| Python data handling (0) | 2021.01.22 |
| File & Exception & Log Handling (0) | 2021.01.22 |
| Module and Project (0) | 2021.01.21 |
| Python Object Oriented Programming (0) | 2021.01.21 |
| python data structure (0) | 2021.01.20 |
| Variable & List (0) | 2021.01.19 |