Pythonic Code
Python Basics for AI
์ค๋์ ๊ฝค๋ ์ค์ํ ๋ถ๋ถ์ ๋ค๋ฃจ๋ ํฌ์คํ
์ด๋ค. ๋ฐ๋ก Pythonic Code
์ด๋ค. ์ธ๊ณต์ง๋ฅ์ ์ํ ์ฝ๋๋ฅผ ์ง๋ ค๋ฉด ์ด์ Python
์ ์ฃผ๋ก (๊ฑฐ์ ๋ฌด์กฐ๊ฑด) ์ธํ
๋ฐ ์ด๋ ํ์ด์ฌ ์คํ์ผ๋๋ก ์ง์ผ ๋จ๋ค๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ํจ์จ์ฑ ๋ฉด์์๋ ์ด๋์ ๋ณผ ์ ์๋ค. ์ฐจ๊ทผ์ฐจ๊ทผ ๋ด๋ณด๋๋ก ํ์
- Pythonic Code
Pythonic Code
๐ Why Pythonic Code?
๋จ ์ฝ๋์ ๋ํ ์ดํด๋
๋ง์ ๊ฐ๋ฐ์๋ค์ python ์คํ์ผ๋ก ์ฝ๋ฉํจ
ํจ์จ
๋จ์ for loop append ๋ณด๋ค list ๊ฐ ์กฐ๊ธ ๋ ๋น ๋ฆ ์ต์ํด์ง๋ฉด ์ฝ๋๋ ์งง์์ง
๊ฐ์ง ๐
์ฐ๋ฉด ์ ์ง ์ฝ๋ ์ ์ง๋ ๊ฑฐ์ฒ๋ผ ๋ณด์
๊ทธ๋ผ ์ด์ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ Pythonic Code
์ ๋ํด ์์๋ณด์! ๐ง
๐ก split & join
split
string type ์ ๊ฐ์
๊ธฐ์ค๊ฐ
์ผ๋ก ๋๋ ์ List ํํ๋ก ๋ณํ
items = "zero one two three".split() #๋น์นธ์ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด ๋๋๊ธฐ
print(items)
['zero', 'one', 'two', 'three']
ex = 'python,java,javascript'.split(",")
print(ex)
['python', 'java', 'javascript']
a, b, c = ex # ์ธํจํน
ex = 'teamlab.technology.io'
subdomain, domain, tld = ex.split(".")
join
colors = ['red', 'blue', 'green', 'yellow']
"-".join(colors)
# red-blue-green-yellow
split ํจ์๋ ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ ๋ฐ๋ผ ๋๋ ๋ค์ ๋ฆฌ์คํธ ํํ๋ก ๋ฐํ๋๋ค. split์ ๊ณต๋ฐฑ๋ฟ๋ง ์๋๋ผ ์์ ์ด ์ค์ ํ ๋๋ก ๋ฌธ์์ด ๋ถ๋ฆฌ๊ฐ ์ด๋ค์ง๊ธฐ๋ ํ๋ค.
join ํจ์๋ ๋ฆฌ์คํธ์ ์๋ ๊ฒ๋ค์ token
๊ฐ์ ๋ถ์ฌ ํ ๋ฌธ์์ด๋ก ๋ง๋ค์ด์ค๋ค.
๐ list comprehension
- ๊ธฐ์กด list ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ๋ค๋ฅธ list ๋ฅผ ๋ง๋๋ ๊ธฐ๋ฒ
- ํฌ๊ด์ ์ธ list, ํฌํจ๋๋ ๋ฆฌ์คํธ๋ผ๋ ์๋ฏธ๋ก ์ฌ์ฉ๋จ
- ํ์ด์ฌ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ ์ค ํ๋
- ์ผ๋ฐ์ ์ผ๋ก for + append ๋ณด๋ค ์๋๊ฐ ๋น ๋ฆ
Basic
result = [i for i in range(10)]
# 0 1 2 3 4 5 6 7 8 9
result = [i for i in range(10) if i%2==0]
#0 2 4 6 8
์๋ ๊ฐ๋จํ list comprehension
์ด๋ค [ ]
์์ for ๋ฌธ์ ์์ฑํ์ฌ ์์ ๊ฐ์ด ๋ํ๋ผ ์ ์๋ค.
Nested for loop
word_1 = "Hello"
word_2 = "World"
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)
์์ ๊ฐ์ ์ฝ๋์ ๋๊ฐ๋ค. ๊ทธ๋์ result
์ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค. ์ด ๋ถ๋ถ์ ์ฒ์ ์ ๋ถ๋ถ์ผ๋ก ๊ธฐ์ตํด๋์.
[โHWโ, โHoโ, โHrโ, โHlโ, โHdโ, โeWโ, โeoโ, โerโ, โelโ, โedโ, โlWโ, โloโ, โlrโ, โllโ, โldโ, โlWโ, โloโ, โlrโ, โllโ, โldโ, โoWโ, โooโ, โorโ, โolโ, โodโ]
result = [[i+j for i in word_1] for j in word_2]
์ ์ฝ๋๋ ์กฐ๊ธ ๋ค๋ฅธ๋ฐ ํํํ๋ฉด ์๋์ ๊ฐ์ด ํํ๋๋ค.
line = []
temp = []
for j in word_2:
temp = []
for i in word_1:
temp.append(i+j)
line.append(temp)
๋ฐ๋ผ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๋ฉด ์๋์ ๊ฐ์ด ํํ๋๋ค.
[[โHWโ, โeWโ, โlWโ, โlWโ, โoWโ], [โHoโ, โeoโ, โloโ, โloโ, โooโ], [โHrโ, โerโ, โlrโ, โlrโ, โorโ], [โHlโ, โelโ, โllโ, โllโ, โolโ], [โHdโ, โedโ, โldโ, โldโ, โodโ]]
2dimension list
words = 'The quick brown fox jumps over the lazy dog'.splilt()
stuff = [[w.upper(), w.lower(), len(w)] for w in words]
for i in stuff:
print(i)
"""
['THE', 'the', 3],
['QUICK', 'quick', 5]
...
['Dog', 'dog', 3]
"""
๐ enumerate & zip
enumerate
list ์ element ๋ฅผ ์ถ์ถํ ๋ ๋ฒํธ๋ฅผ ๋ถ์ฌ์ ์ถ์ถ
for i, v in enumerate(['tic', 'tac', 'toe']):
print(i, v)
"""
0 tic
1 tac
2 toe
"""
zip
๋ ๊ฐ์ list ์ ๊ฐ์ ๋ณ๋ ฌ์ ์ผ๋ก ์ถ์ถํจ
alist = ['a1', 'a2', 'a3']
blist = ['b1', 'b2', 'b3']
for a, b in zip(alist, blist):
print(a,b) #tuple
"""
a1 b1
a2 b2
a3 b3
"""
enumerate & zip combination
alist = ['a1', 'a2', 'a3']
blist = ['b1', 'b2', 'b3']
for i, values in enumerate(zip(alist, blist)):
print(i, values)
"""
0 ('a1', 'b1')
1 ('a2', 'b2')
2 ('a3', 'b3')
"""
๐น lambda & map & reduce important
lambda
ํจ์ ์ด๋ฆ ์์ด, ํจ์์ฒ๋ผ ์ธ ์ ์๋ ์ต๋ช ํจ์
#general function
def f(x,y):
return x+y
print(f(1,4))
#lambda function
f = lambda x, y:x+y
print(f(1,4))
(lambda x,y:x+y)(10,50)
pep8 ์์๋ lambda ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์
Why?
- ์ด๋ ค์ด ๋ฌธ๋ฒ
- ํ ์คํธ์ ์ด๋ ค์
- ๋ฌธ์ํ docstring ์ง์ ๋ฏธ๋น
- ์ฝ๋ ํด์์ ์ด๋ ค์
- ์ด๋ฆ์ด ์กด์ฌํ์ง ์๋ ํจ์์ ์ถํ
- ๊ทธ๋๋ ๋ง์ด ์ฐ์,,,
map
๋ ๊ฐ ์ด์์ list ์๋ ์ ์ฉ ๊ฐ๋ฅํจ, if filter ์ฌ์ฉ๊ฐ๋ฅ
ex = [1,2,3,4,5]
f = lambda x:x**2
print(list(map(f, ex))) # ๊ฐ๊ฐ ์ ์ฉํ๋ ๊ฑฐ์
# 1 4 9 16 25
[f(value) for value in ex]
list comprehension
์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ ๋ ๊ฐ๋จํจ
reduce
map function ๊ณผ ๋ฌ๋ฆฌ list ์ ๋๊ฐ์ ํจ์๋ฅผ ์ ์ฉํด์ ํตํฉ
from functools import reduce
print(reduce(lambda x,y:x+y, [1,2,3,4,5]))
#15
๐ด generator
๋ฉ๋ชจ๋ฆฌ ํจ์จ
def generator_list(value):
result = []
for i in range(value):
yield i
for _ in generator_list(50):
print(_)
# generator comprehension
gen_ex = (n*n for n in range(50))
print(type(gen_ex))
# generator
When generator
- list ํ์
์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด์ฃผ๋ ํจ์๋ generator๋ก ๋ง๋ค์ด๋ผ!
- ์ฝ๊ธฐ ์ฌ์ด ์ฅ์ , ์ค๊ฐ ๊ณผ์ ์์ loop ์ด ์ค๋จ๋ ์ ์์ ๋
- ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋๋ generator expression ์ ๊ณ ๋ คํ๋ผ!
- ๋ฐ์ดํฐ๊ฐ ์ปค๋ ์ฒ๋ฆฌ์ ์ด๋ ค์์ด ์์
- ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋๋ generator ๋ฅผ ์ฐ์
โจ๏ธ function passing arguments
- keyword args
- default args
- variable-length args
Keyword arguments
ํจ์์ ์ ๋ ฅ๋๋ parameter ์ ๋ณ์๋ช ์ ์ฌ์ฉ, arguments ๋ฅผ ๋๊น
def print_sth(my_name, your_name):
print(f"Hello {your_name}, My name is {my_name}")
print_sth(your_name="TEAMLAB", my_name="Sihyun")
# Hello TEAMLAB, My name is Sihyun
Default arguments
parameter ์ ๊ธฐ๋ณธ ๊ฐ์ ์ฌ์ฉ, ์ ๋ ฅํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ ์ถ๋ ฅ
def print_sth(my_name, your_name="TEAMLAB"):
print(f"Hello {your_name}, My name is {my_name}")
print_sth("Sihyun", "TEAMLAB")
print_sth("Sihyun")
variable-length asterisk
ํจ์์ parameter ๊ฐ ์ ํด์ง์ง ์์๋ค
- ๊ฐ์๊ฐ ์ ํด์ง์ง ์์ ๋ณ์๋ฅผ ํจ์์ parameter ๋ก ์ฌ์ฉํ๋ ๋ฒ
- Keyword arguments ์ ํจ๊ป, argument ์ถ๊ฐ๊ฐ ๊ฐ๋ฅ
Asterisk(*)
๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ํจ์์ parameter ๋ฅผ ํ์ํจ- ์ ๋ ฅ๋ ๊ฐ์
tuple type
์ผ๋ก ์ฌ์ฉํ ์ ์์- ๊ฐ๋ณ์ธ์๋ ์ค์ง ํ ๊ฐ๋ง ๋งจ ๋ง์ง๋ง parameter ์์น์ ์ฌ์ฉ๊ฐ๋ฅ
def asterist_test(a, b, *args):
return a+b+sum(args)
print(asterist_test(1,2,3,4,5))
# 1 -> a, 2->b, 3,4,5 -> args
Keyword variable-length
- Parameter ์ด๋ฆ์ ๋ฐ๋ก ์ง์ ํ์ง ์๊ณ ์ ๋ ฅํ๋ ๋ฐฉ๋ฒ
asterisk(*) ๋ ๊ฐ๋ฅผ ์ฌ์ฉ
ํ์ฌ ํจ์์ parameter ๋ฅผ ํ์ํจ- ์
๋ ฅ๋ ๊ฐ์
dict type
์ผ๋ก ์ฌ์ฉํ ์ ์์ - ๊ฐ๋ณ์ธ์๋ ์ค์ง ํ ๊ฐ๋ง ๊ธฐ์กด ๊ฐ๋ณ์ธ์ ๋ค์์ ์ฌ์ฉ
def kwargs_test(**kwargs):
print(kwargs)
kwargs_test(first=3, second=4, third=5)
# {'first' : 3, 'second' : 4, 'third':5}
asterisk - unpacking a container
- tuple, dict ๋ฑ ์๋ฃํ์ ๋ค์ด๊ฐ ์๋ ๊ฐ์ unpacking
- ํจ์์ ์ ๋ ฅ๊ฐ, zip ๋ฑ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅ
def asterisk_test(a, *args):
print(a, *args) # ํ์ด์ฃผ๋ ์ญํ
print(a, args)
asterist_test(1, *(2,3,4,5,6))
# 1,2,3,4,5,6
# 1, (2,3,4,5,6)
์ง๊ธ๊น์ง pythonic code
์ ๋ํด ์์๋ณด์๋ค. ๋ชฐ๋๋ ๋ถ๋ถ๋ ์๋นํ ๋ง์๋๋งํผ ์์ฃผ ๋ณต์ตํ์!