Pythonic Code

Pythonic Code

Python Basics for AI

ํ•ด๋‹น ์ธ๋„ค์ผ์€ Wonkook Lee ๋‹˜์ด ๋งŒ๋“œ์‹  Thumbnail-Maker ๋ฅผ ์ด์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค

์˜ค๋Š˜์€ ๊ฝค๋‚˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ๋‹ค๋ฃจ๋Š” ํฌ์ŠคํŒ…์ด๋‹ค. ๋ฐ”๋กœ Pythonic Code ์ด๋‹ค. ์ธ๊ณต์ง€๋Šฅ์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์งœ๋ ค๋ฉด ์ด์ œ Python ์„ ์ฃผ๋กœ (๊ฑฐ์˜ ๋ฌด์กฐ๊ฑด) ์“ธํ…๋ฐ ์ด๋•Œ ํŒŒ์ด์ฌ ์Šคํƒ€์ผ๋Œ€๋กœ ์งœ์•ผ ๋‚จ๋“ค๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ํšจ์œจ์„ฑ ๋ฉด์—์„œ๋„ ์ด๋“์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฐจ๊ทผ์ฐจ๊ทผ ๋ด๋ณด๋„๋ก ํ•˜์ž

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 ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„๋„ ์ƒ๋‹นํžˆ ๋งŽ์•˜๋˜๋งŒํผ ์ž์ฃผ ๋ณต์Šตํ•˜์ž!