๊ณต๋ฐฑ ์์ ์ง์
- ๋ง์ ์ธ์ด๋ค์ด ์ฝ๋ ๋ธ๋ก๋ค์ ๊ฒฝ๊ณ๋ฅผ ์ ํ๊ธฐ ์ํด ๊ดํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ด์ฌ์ ์ด๊ฑธ indentation(' : ') ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
for i in [1, 2, 3, 4, 5]:
print(i)
for j in [1, 2, 3, 4, 5]:
print(j)
print(i + j)
print(i)
print("done looping")
1
1
2
2
3
3
4
4
5
5
6
1
2
1
3
2
4
3
5
4
6
5
7
2
3
1
4
2
5
3
6
4
7
5
8
3
4
1
5
2
6
3
7
4
8
5
9
4
5
1
6
2
7
3
8
4
9
5
10
5
done looping
- ๊ดํธ ๋ฐ ๊ดํธ ์์ ๊ณต๋ฐฑ์ ๋ฌด์ํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
long_winded_computation = (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 +
13 + 14 + 15 + 16 + 17 + 18 + 19 + 20)
- ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด์ ์ด๋ฌํ ํ์์ ์ฌ์ฉํฉ๋๋ค.
list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
easier_to_read_list_of_lists = [ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
- ๋ํ Backslash(๋ฐฑ์ฌ๋์)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ฅ์ด ๋ค์ ํ์ผ๋ก ๊ณ์๋จ์ ๋ํ๋ ๋๋ค.
two_plus_three = 2 + \\
3
Modules
- ๊ธฐ๋ฅ์ด ํฌํจ๋ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ
- ์ ๊ท ํํ์ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ: ์ ๊ท ํํ์์ ์ฌ์ฉํ๊ธฐ ์ํ ํจ์ ๋ฐ ์์๋ฅผ ํฌํจํ๋ ๋ชจ๋์ด ์์ต๋๋ค.
import re
my_regex = re.compile("[0-9]+", re.I)
- alias๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import re as regex
my_regex = regex.compile("[0-9]+", regex.I)
- ๋ํ ์ด๋ ๊ฒ ๋ช ์์ ์ผ๋ก ๊ฐ์ ธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
match = 10
from re import * # uh oh, re has a match function
print(match) # "<function re.match>"
# Result: <function match at 0x7cce84681a20>
Arithmetic
- ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๊ธฐ์ตํด์ผ ํ ๊ฒ์ ๋ถ๋ฅ & ์๋ฅ ์ ๋ฆฌ์ ๋๋ค.
n = d * q + r
- ๐๋ ์ฝ์, ๐ ๋ ๋ชซ, ๐๋ ๋๋จธ์ง๋ฅผ ์๋ฏธํฉ๋๋ค.
- ๐๊ฐ ์์์ผ ๋ , 0≤๐<๐, ๐๊ฐ ์์์ผ ๋ ๐<๐≤0 ์ ๋๋ค.
print(2 ** 10) # 1024
print(2 ** 0.5) # 1.414...
print(2 ** -0.5) #
print(5 / 2) # 2.5
print(5 % 3) # 2
print(5 // 3) # 1
print((-5) % 3) # 1
print((-5) // 3) # -2
print(5 % (-3)) # -1
print((-5) // (-3)) # 1
print((-5) % (-3)) # -2
print(7.2 // 3.5) # 2.0
print(7.2 % 3.5) # 0.2
Function
- ํจ์๋ 0 ์ด์์ ์ ๋ ฅ์ ๋ฐ๊ณ ํด๋น ์ถ๋ ฅ์ ๋ฐํํ๋ ๊ท์น์ ๋๋ค.
# This
# is
# a
# comment
# CTRL + / toggles comment/uncomment
# for PEP on docstring, refer to <https://www.python.org/dev/peps/pep-0257/#abstract>
def double(x):
"""this is where you put an optional docstring
that explains what the function does.
for example, this function multiplies its input by 2"""
return x * 2
double(2)
help(double)
Help on function double in module __main__:
double(x)
this is where you put an optional docstring
that explains what the function does.
for example, this function multiplies its input by 2
- Python ํจ์๋ first-class์ด๋ฏ๋ก ๋ค๋ฅธ ์ธ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณ์์ ํ ๋นํ๊ณ ํจ์์ ์ ๋ฌํ ์ ์์ต๋๋ค.
- Function(ํจ์)๋ฅผ ๋ณ์์ฒ๋ผ Assign ํฉ๋๋ค.
def apply_to_one(f):
"""calls the function f with 1 as its argument(์ธ์๋ก ์ ๋ฌ)"""
return f(1)
my_double = double
x = apply_to_one(my_double)
print(x)
- Lambda ํจ์: ์งง์ ์ต๋ช
ํจ์๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ด๋ฆ ์๋ Function, ์งง์ Function๋ ํฌํจ๋ฉ๋๋ค.
y = apply_to_one(lambda x: x + 4)
print(y)
# Result: 5
another_double = lambda x: 2 * x
def another_double(x): return 2 * x # more readable
add = lambda x, y : x + y
add(1,2)
# Result: 3
- ํจ์ ๋งค๊ฐ๋ณ์๋ default ์ธ์๋ ์ง์ ํ ์ ์์ต๋๋ค.
def my_print(message="my default message"): # message ๊ฐ์ด ์๋, ๊ทธ๋ฅ ๊ทธ๋๋ก print
print(message)
my_print("hello") # prints 'hello'
my_print() # prints 'my default message'
def subtract(a=0, b=0):
return a - b
subtract(10, 5) # returns 5
subtract(0, 5) # returns -5
subtract(b=5) # same as previous
subtract(b=5, a=20)
# Result: 15
String
- ๋ฌธ์์ด์ ๋จ์ผ ๋๋ ์ด์ค ๋ฐ์ดํ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
single_quoted_string = 'data science'
double_quoted_string = "data science"
tab_string = "\\t" # represents the tab character
len(tab_string) # is 1
# Result: 1
- ์ผ์ค ์ด์ค quotes์ ์ฌ์ฉํ ๋ค์ค ์ค ๋ฌธ์์ด์ ์์์ ๋๋ค.
multi_line_string = """This is the first line.
and this is the second line
and this is the third line"""
multi_line_string
# Result: 'This is the first line. \\nand this is the second line \\nand this is the third line'
Exceptions
- ๋ญ๊ฐ ์๋ชป๋๋ฉด Python์ ์์ธ๋ฅผ ์ ๊ธฐํฉ๋๋ค.
try:
print(0 / 0) # ZeroDivisionError๋ก ๋ฐ๋ก ์ด๋
except ZeroDivisionError:
print("cannot divide by zero")
# Result: cannot divide by zero
Lists
- List๋ ํ์ด์ฌ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค.
integer_list = [1, 2, 3]
heterogeneous_list = ["string", 0.1, True]
list_of_lists = [ integer_list, heterogeneous_list, [] ]
list_length = len(integer_list) # eqauals 3, ๋ฆฌ์คํธ์ ๊ธธ์ด ๋ฐํ (3๊ฐ)
list_sum = sum(integer_list) # equals 6, ๋ฆฌ์คํธ์ ์๋ ๋ชจ๋ ์์์ ํฉ์ ๊ณ์ฐ (1+2+3 = 6)
- integer_list = [1, 2, 3] - ์ ์ํ List๋ฅผ ์๋ฏธํฉ๋๋ค.
- heterogeneous_list = ["string", 0.1, True] - ์๋ก ๋ค๋ฅธ type์ List๋ฅผ ์๋ฏธํฉ๋๋ค.
- list_of_lists = [ integer_list, heterogeneous_list, [] ] - ๋ฆฌ์คํธ๋ฅผ ์์๋ก ๊ฐ์ง๋ ๋ฆฌ์คํธ๋ฅผ ์ ์ํฉ๋๋ค.
- ๊ดํธ๊ฐ ์๋ ๋ชฉ๋ก์ n๋ฒ์งธ ์์๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํ ์ ์์ต๋๋ค.
x = list(range(10)) # is the list [0, 1, ..., 9]
zero = x[0] # equals 0, lists are 0-indexed
one = x[1] # equals 1
nine = x[-1] # equals 9, 'Pythonic' for last element
eight = x[-2] # equals 8, 'Pythonic' for next-to-last element
x[0] = -1 # now x is [-1, 1, 2, 3, ..., 9]
- ๋๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ List(๋ชฉ๋ก)์ "Slice"ํ ์๋ ์์ต๋๋ค.
first_three = x[:3] # [-1, 1, 2], -1 ~ 2
three_to_end = x[3:] # [3, 4, ..., 9], 3๋ถํฐ ์์
one_to_four = x[1:5] # [1, 2, 3, 4], 1๋ถํฐ 4๊น์ง ์๋ ๊ฐ ์ถ๋ ฅ
last_three = x[-3:] # [7, 8, 9], -3๋ถํฐ (๋ฐ๋, ์ญ์)
without_first_and_last = x[1:-1] # [1, 2, ..., 8] ์์์ 1๋ฒ, ๋ค์์ 1๋ฒ ์ฌ์ด ์ถ๋ ฅ
copy_of_x = x[:] # [-1, 1, 2, ..., 9] ๋ณต์ฌํด์ ์ถ๋ ฅ
print(x[::2]) # ๋ฆฌ์คํธ ์์น ์ซ์ 2๋ฒ ์์ ๊ฐ ์ถ๋ ฅ, ๋ฐ๋ณต
print(x[::-1]) # ๋ฐ๋๋ก ์ถ๋ ฅ
# Result
[-1, 2, 4, 6, 8]
[9, 8, 7, 6, 5, 4, 3, 2, 1, -1]
- in ์ฐ์ฐ์๋ฅผ ํตํด ๋ชฉ๋ก ๋ฉค๋ฒ์ญ์ ํ์ธํ ์ ์์ต๋๋ค.
1 in [1, 2, 3] # True
0 in [1, 2, 3] # False
# Result: False
- ๋ง์ฝ List๋ฅผ ํจ๊ป ์ฐ๊ฒฐ ํ๋ ค๋ฉด?
x = [1, 2, 3]
x.extend([4, 5, 6]) # x is now [1,2,3,4,5,6] ๋ฆฌ์คํธ ํ์ฅ
x = [1, 2, 3]
y = x + [4, 5, 6] # y is [1, 2, 3, 4, 5, 6]; x is unchanged. x๋ ๋ณํจ์ด ์๋ค.
- ๋ง์ฝ ํ๋ฒ์ ํ๋์ List๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด?
x = [1, 2, 3]
x.append(0) # x is now [1, 2, 3, 0]
y = x[-1] # equals 0 (์ญ์ ์ถ๋ ฅ)
z = len(x) # equals 4 (List ๊ธธ์ด ์ถ๋ ฅ)
- ๋ง์ฝ ๋ฆฌ์คํธ๋ฅผ ํด์ ํ๋ ค๋ฉด?
x, y = [1, 2] # now x is 1, y is 2
_, y = [1, 2] # now y == 2, didn't care about the first element.
# '_'๋ ์ค์ ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฐ์ ์๋ฏธํฉ๋๋ค.
Tuples
- ํํ์ List์ ๋ถ๋ณ์ ์ฌ์ด์ ๋๋ค.
- ‘ , ‘ ์ด ์์ผ๋ฉด ํํ์ ๋๋ค.
- ๋ง์ฝ ์๋์๊ฒ data๋ฅผ ์ค๋ ๋ณํ์ ์ํ์ง ์์ผ๋ฉด? → ํํ๋ก Listํ ํ๋ฉด ์๋ฉ๋๋ค.
my_list = [1, 2] # ๋ฆฌ์คํธ, ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ
my_tuple = (1, 2) # ํํ, ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ
other_tuple = 3, 4 # ํํ์ ์์ฑํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ. ๊ฐ๋ค์ ์ผํ๋ก ๊ตฌ๋ถํ์ฌ ํํ ์์ฑ ๊ฐ๋ฅ
my_list[1] = 3 # my_list is now [1, 3]
try:
my_tuple[1] = 3 # ํํ์ 2๋ฒ์งธ ์์๋ฅผ 3์ผ๋ก ๋ณ๊ฒฝํ๋ ค๊ณ ํจ. ํํ์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ ํด์ ์ฐ์ฐ๋ถ๊ฐ
except TypeError:
print("cannot modify a tuple")
# Result: cannot modify a tuple
- ํํ์ ํจ์์์ ์ฌ๋ฌ ๊ฐ์ ๋ฐํํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ๋๋ค.
def sum_and_product(x, y):
return (x + y),(x * y)
sp = sum_and_product(2, 3) # equals (5, 6)
# ํจ์์์ ๋ฐํ๋ ํํ์ (5, 6)์ด๋ฏ๋ก sp๋ (5, 6)
s, p = sum_and_product(5, 10) # s is 15, p is 50, s = x + y, p = x * y
# ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฐํ๋ ํํ์ s์ p ๋ณ์์ ๊ฐ๊ฐ ์ ์ฅ
# ํจ์์์ ๋ฐํ๋ ํํ์ (15, 50)์ด๋ฏ๋ก s๋ 15์ด๊ณ p๋ 50์ด ๋ฉ๋๋ค.
- Tuple(๋ฐ ๋ชฉ๋ก)์ multiple assignment:์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
x, y = 1, 2 # now x is 1, y is 2
x, y = y, x # Pythonic way to swap variables; now x is 2, y is 1
Dictionaries
- ๊ฐ๊ณผ ํค๋ฅผ ์ฐ๊ฒฐํ๋ ๋ ๋ค๋ฅธ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค.
- ์ฃผ์ด์ง ํค์ ํด๋นํ๋ ๊ฐ์ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์์ต๋๋ค.
empty_dict = {} # Pythonic
empty_dict2 = dict() # less Pythonic
grades = { "Joel" : 80, "Tim" : 95 } # dictionary literal. Joel: Key, Tim: Value
- ๋๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ํค ๊ฐ์ ๊ฒ์ํ ์ ์์ต๋๋ค.
joels_grade = grades["Joel"] # equals 80
grades = { "Joel" : 80, "Tim" : 95, "Tim" : 94 } # dictionary literal
grades
# Result: {'Joel': 80, 'Tim': 94}, Key ๊ฐ์ด ์ค๋ณต์ด ๋๋ฉด ๋ง์ง๋ง์ ์ง์ ๋ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
len(grades) # 2
grades.keys() # dict_keys(['Joel', 'Tim'])
grades.values() # dict_values([80, 94])
grades["Tim"] # 94
- ๋ง์ฝ KeyError,์ฌ์ ์ ์๋ ํค๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ์ ์ด๋ ๊ฒ ๋์ต๋๋ค.
try:
kates_grade = grades["Kate"]
except KeyError:
print("no grade for Kate!")
# no grade for Kate!
- ์ด๋ ๊ฒ ํค์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
joel_has_grade = "Joel" in grades # True
kate_has_grade = "Kate" in grades # False
- ์ฌ์ ์๋ ์ฌ์ ์ ์๋ ํค๋ฅผ ๊ฒ์ํ ๋ ์์ธ๋ฅผ ๋์ด๋ ๋์ ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋ get ๋ฉ์๋๊ฐ ์์ต๋๋ค:
- ๋ง์ฝ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ None์ผ๋ก ๋์ต๋๋ค.
joels_grade = grades.get("Joel", 0) # equals 80, ๋ง์ฝ Key(Joel)์ด ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก 0 ์ฌ์ฉ
kates_grade = grades.get("Kate", 0) # equals 0, Kate ํค๋ ๋์
๋๋ฆฌ์ ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ๊ฐ์ธ 0์ ๋ฐํ
no_ones_grade = grades.get("No One") # default default is None, ํค๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก None์ ์ฌ์ฉ
no_ones_grade == None # no_ones_grade์ ํ ๋น๋ ๊ฐ์ด None์ธ์ง๋ฅผ ํ์ธ.
# Result: True
- ๋์ผํ ๋๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ Key-Value ์์ ํ ๋นํฉ๋๋ค.
grades["Tim"] = 99 # replaces the old value
grades["Kate"] = 100 # adds a third entry
num_students = len(grades) # equals 3
- ์ด๋ ๊ฒ ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก Dictionary๋ฅผ ์์ฃผ ์ฌ์ฉํฉ๋๋ค.
tweet = {
"user" : "joelgrus",
"text" : "Data Science is Awesome",
"retweet_count" : 100,
"hashtags" : ["#data", "#science", "#datascience", "#awesome", "#yolo"]
}
- Iteration ์ผ๋ก ๋ชจ๋ ๋ณผ ์ ์์ต๋๋ค.
tweet_keys = tweet.keys() # ๋์
๋๋ฆฌ์ ๋ชจ๋ key๋ฅผ ๊ฐ์ ธ์์ ๋ฆฌ์คํธ๋ก ๋ณํ (key-์ด๋ฆ)
tweet_values = tweet.values() # ๋์
๋๋ฆฌ์ ๋ชจ๋ value๋ค์ ๊ฐ์ ธ์์ ๋ฆฌ์คํธ๋ก ๋ณํ (text)
tweet_items = tweet.items() # ๋์
๋๋ฆฌ์ ๋ชจ๋ (ํค, ๊ฐ) ์์ ๊ฐ์ ธ์์ ๋ฆฌ์คํธ๋ก ๋ณํ
"user" in tweet_keys # True, but uses a slow list in
# tweet_keys๋ผ๋ ๋ณ์์ ์ ์ฅ๋ ๋ฆฌ์คํธ์์ "user"๋ฅผ ์ฐพ๋ ์์
์ ์ํ
"user" in tweet # more Pythonic, uses faster dict in
# ๋์
๋๋ฆฌ์ ํค๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ํ์ธ
"joelgrus" in tweet_values # True
# tweet_values์๋ ๋์
๋๋ฆฌ์ ๊ฐ๋ค์ด ๋ค์ด ์์ผ๋ฏ๋ก, ์ด ์ฝ๋๋ "joelgrus"๋ผ๋ ๊ฐ์ด tweet ๋์
๋๋ฆฌ์ ๊ฐ ์ค์ ์๋์ง๋ฅผ ํ์ธ
# Result: True
tweet_values
# Result: dict_values(['joelgrus', 'Data Science is Awesome', 100, ['#data', '#science', '#datascience', '#awesome', '#yolo']])
- WordCount Example: Key๊ฐ ๋จ์ด์ด๊ณ Value๊ฐ ์นด์ดํธ์ธ ์ฌ์ ์ ๋ง๋ญ๋๋ค.
document = ['I', 'am', 'a', 'boy', 'I', 'love', 'you']
- First Approach
word_counts = {} # ๋จ์ด์ ๋ฑ์ฅ ํ์๋ฅผ ์ ์ฅํ ๋น ๋์
๋๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
for word in document: # ๋ฌธ์(document)์์ ๊ฐ ๋จ์ด(word)๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
if word in word_counts: # ํ์ฌ ๊ฐ์ ธ์จ ๋จ์ด๊ฐ ์ด๋ฏธ word_counts ๋์
๋๋ฆฌ์ ์๋์ง ํ์ธํฉ๋๋ค.
word_counts[word] += 1 # ๋ง์ฝ ๋จ์ด๊ฐ ์ด๋ฏธ ๋์
๋๋ฆฌ์ ์๋ค๋ฉด ํด๋น ๋จ์ด์ ๋ฑ์ฅ ํ์๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค.
else:
word_counts[word] = 1 # ๋ง์ฝ ๋จ์ด๊ฐ ๋์
๋๋ฆฌ์ ์๋ค๋ฉด ํด๋น ๋จ์ด๋ฅผ ์ถ๊ฐํ๊ณ ๋ฑ์ฅ ํ์๋ฅผ 1๋ก ์ค์ ํฉ๋๋ค.
- Second Approach
word_counts = {} # ๋จ์ด์ ๋ฑ์ฅ ํ์๋ฅผ ์ ์ฅํ ๋น ๋์
๋๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
for word in document: # ๋ฌธ์(document)์์ ๊ฐ ๋จ์ด(word)๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
try:
word_counts[word] += 1 # ๋จ์ด๊ฐ ์ด๋ฏธ ๋์
๋๋ฆฌ์ ์๋ ๊ฒฝ์ฐ ๋ฑ์ฅ ํ์๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค.
except KeyError: # KeyError๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ (๋จ์ด๊ฐ ๋์
๋๋ฆฌ์ ์๋ ๊ฒฝ์ฐ)
word_counts[word] = 1 # ์๋ก์ด ๋จ์ด๋ก ์ถ๊ฐํ๊ณ ๋ฑ์ฅ ํ์๋ฅผ 1๋ก ์ค์ ํฉ๋๋ค.
- Third Approach
word_counts = {} # ๋จ์ด์ ๋ฑ์ฅ ํ์๋ฅผ ์ ์ฅํ ๋น ๋์
๋๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
for word in document: # ๋ฌธ์(document)์์ ๊ฐ ๋จ์ด(word)๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
previous_count = word_counts.get(word, 0) # ํด๋น ๋จ์ด์ ์ด์ ๋ฑ์ฅ ํ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก 0์ ์ค์ ํฉ๋๋ค.
word_counts[word] = previous_count + 1 # ์ด์ ๋ฑ์ฅ ํ์์ 1์ ๋ํ์ฌ ํ์ฌ ๋จ์ด์ ๋ฑ์ฅ ํ์๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
word_counts
# Result: {'I': 2, 'am': 1, 'a': 1, 'boy': 1, 'love': 1, 'you': 1}
Defaultdict
- ๊ธฐ๋ณธ ๋์ ์ ํฌํจ๋์ง ์์ ํค๋ฅผ ๊ฒ์ํ๋ ค๊ณ ํ ๋ ์์ฑํ ๋ ์ ๊ณตํ zero-argument ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋จผ์ ํด๋น ํค์ ๋ํ ๊ฐ์ ์ถ๊ฐํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ์ผ๋ฐ Dictionary์ ๊ฐ์ต๋๋ค.
from collections import defaultdict
word_counts = defaultdict(int) # int()์ 0์ ์์ฑํฉ๋๋ค. ์ฆ, ๊ธฐ๋ณธ๊ฐ์ผ๋ก 0์ ์ฌ์ฉํฉ๋๋ค.
# word_counts = defaultdict(lambda: 100) # lambda ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ๊ฐ์ผ๋ก 100์ ๋ฐํํ ์๋ ์์ต๋๋ค.
for word in document: # ๋ฌธ์(document)์์ ๊ฐ ๋จ์ด(word)๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
word_counts[word] += 1 # ํด๋น ๋จ์ด์ ๋ฑ์ฅ ํ์๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค.
print(word_counts) # ๋์
๋๋ฆฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
# defaultdict(<class 'int'>, {'I': 2, 'am': 1, 'a': 1, 'boy': 1, 'love': 1, 'you': 1})
int() # 0
# defaultdict๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋น ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๋ ๋์
๋๋ฆฌ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
dd_list = defaultdict(list)
# ํค 2์ ํด๋นํ๋ ๊ฐ์ธ ๋ฆฌ์คํธ์ 1์ ์ถ๊ฐํฉ๋๋ค.
# ์ด์ ์ ์กด์ฌํ์ง ์๋ ํค์์ผ๋ฏ๋ก ๋น ๋ฆฌ์คํธ๊ฐ ์์ฑ๋ ํ์ 1์ด ์ถ๊ฐ๋ฉ๋๋ค.
dd_list[2].append(1)
# defaultdict๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋น ๋์
๋๋ฆฌ๋ฅผ ๊ฐ์ง๋ ๋์
๋๋ฆฌ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
dd_dict = defaultdict(dict)
# ํค "Joel"์ ํด๋นํ๋ ๊ฐ์ธ ๋์
๋๋ฆฌ์ "City" ํค์ "Seattle"์ ํ ๋นํฉ๋๋ค.
# ์ด์ ์ ์กด์ฌํ์ง ์๋ ํค์์ผ๋ฏ๋ก ๋น ๋์
๋๋ฆฌ๊ฐ ์์ฑ๋ ํ์ "City" ํค๊ฐ ์ถ๊ฐ๋๊ณ "Seattle"์ด ํ ๋น๋ฉ๋๋ค.
dd_dict["Joel"]["City"] = "Seattle"
# defaultdict๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ๊ฐ์ผ๋ก [0, 0] ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๋ ๋์
๋๋ฆฌ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
dd_pair = defaultdict(lambda: [0, 0])
# ํค 2์ ํด๋นํ๋ ๊ฐ์ธ ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค 1์ 1์ ํ ๋นํฉ๋๋ค.
# ์ด์ ์ ์กด์ฌํ์ง ์๋ ํค์์ผ๋ฏ๋ก [0, 0] ๋ฆฌ์คํธ๊ฐ ์์ฑ๋ ํ์ ํด๋น ์์น์ 1์ด ํ ๋น๋ฉ๋๋ค.
dd_pair[2][1] = 1
Counter
์นด์ดํฐ๋ ์ผ๋ จ์ ๊ฐ์ ๊ธฐ๋ณธ dict(int)์ ๊ฐ์ ๊ฐ์ฒด ๋งคํ ํค๋ก ๋ณํํ์ฌ ์นด์ดํธํฉ๋๋ค.
- histograms๋ฅผ ๋ง๋๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
from collections import Counter
# Counter๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์คํธ ๋ด์ ๊ฐ ์์์ ๋ฑ์ฅ ํ์๋ฅผ ์ธ์ด c์ ์ ์ฅํฉ๋๋ค.
c = Counter([0, 1, 2, 0]) # c๋ (๊ธฐ๋ณธ์ ์ผ๋ก) { 0 : 2, 1 : 1, 2 : 1 }
# Counter๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์(document)์์ ๊ฐ ๋จ์ด์ ๋ฑ์ฅ ํ์๋ฅผ ์ธ๊ณ word_counts์ ์ ์ฅํฉ๋๋ค.
word_counts = Counter(document)
# ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print(word_counts)
# Counter({'I': 2, 'am': 1, 'a': 1, 'boy': 1, 'love': 1, 'you': 1})
- ๋ฌธ์(document)์์ ๊ฐ ๋จ์ด์ ๋ฑ์ฅ ํ์๋ฅผ ์ธ์ด ๋์ ๋๋ฆฌ ํํ๋ก ๋ฐํ
- word_counts ๋ณ์์๋ ๋ฌธ์ ๋ด์ ๊ฐ ๋จ์ด์ ๋ฑ์ฅ ํ์๊ฐ ์ ์ฅ
- help ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ main ํ์ด์ง ๋ณด๊ธฐ
help(word_counts)
# Counter์ most_common() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ฒํ๊ฒ ๋ฑ์ฅํ๋ ๋จ์ด ์์ 10๊ฐ, ๋ฑ์ฅ ํ์๋ฅผ ์ถ๋ ฅ.
for word, count in word_counts.most_common(10):
print(word, count)
I 2
am 1
a 1
boy 1
love 1
you 1
Sets
๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ set์ด๋ฉฐ, ์ด๋ distinct ์์์ ์งํฉ์ ๋ํ๋ ๋๋ค.
s = set()
s.add(1) # s is now { 1 }
s.add(2) # s is now { 1, 2 }
s.add(2) # s is still { 1, 2 }
x = len(s) # equals 2
y = 2 in s # equals True
z = 3 in s # equals False
- ๊ตฌ์ฑ์ ์๊ฒฉ ํ ์คํธ์ ๊ฒฝ์ฐ ๋ชฉ๋ก๋ณด๋ค set๊ฐ ๋ ์ ํฉํฉ๋๋ค
- in์ set์์ ๋งค์ฐ ๋น ๋ฅธ ์์ ์ ๋๋ค.
hundreds_of_other_words = []
stopwords_list = ["a", "an", "at"] + hundreds_of_other_words + ["yet", "you"]
# ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ "zip"์ด stopwords์ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
# ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ๋ฉค๋ฒ์ญ ๊ฒ์ฌ๋ ๋ชจ๋ ์์๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก ๋๋ฆฝ๋๋ค.
"zip" in stopwords_list # False
# ์งํฉ์ ์ด์ฉํ์ฌ "zip"์ด stopwords์ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
# ์งํฉ์ ์ด์ฉํ ๋ฉค๋ฒ์ญ ๊ฒ์ฌ๋ ๋งค์ฐ ๋น ๋ฅด๋ฉฐ ํด์ฑ์ ์ฌ์ฉํ์ฌ ๋ฉค๋ฒ๋ฅผ ์ฐพ์ต๋๋ค.
stopwords_set = set(stopwords_list)
"zip" in stopwords_set # False
- ๋ง์ฝ Collection์์ distinct ํญ๋ชฉ์ ์ฐพ์ผ๋ ค๋ฉด?
item_list = [1, 2, 3, 1, 2, 3]
num_items = len(item_list) # 6
item_set = set(item_list) # {1, 2, 3}
num_distinct_items = len(item_set) # 3
distinct_item_list = list(item_set) # [1, 2, 3]
Control Flow
if 1 > 2:
message = "if only 1 were greater than two..."
elif 1 > 3:
message = "elif stands for 'else if'"
else:
message = "when all else fails use else (if you want to)"
- ์ผ์ง์ ์์ ์ผ์ํ else
parity = "even" if x % 2 == 0 else "odd"
- while statement:
x = 0
while x < 10:
print(x, "is less than 10")
x += 1
0 is less than 10
1 is less than 10
2 is less than 10
3 is less than 10
4 is less than 10
5 is less than 10
6 is less than 10
7 is less than 10
8 is less than 10
9 is less than 10
- for statement.
for x in range(10):
print(x, "is less than 10")
0 is less than 10
1 is less than 10
2 is less than 10
3 is less than 10
4 is less than 10
5 is less than 10
6 is less than 10
7 is less than 10
8 is less than 10
9 is less than 10
- continue & break statement
for x in range(10):
if x == 3:
continue # go immediately to the next iteration
if x == 5:
break # quit the loop entirely
print(x)
0
1
2
4
Truthiness
one_is_less_than_two = 1 < 2 # equals True, ์ฐธ - True ํ ๋น
true_equals_false = True == False # equals False, True & False๊ฐ ๊ฐ์์ง ๋น๊ต. ๋ค๋ฅด๋๊น False
- python์ None ๊ฐ์ ์ฌ์ฉํ์ฌ ์กด์ฌํ์ง ์๋ ๊ฐ์ ๋ํ๋ ๋๋ค.
x = None
print(x == None) # prints True, but is not Pythonic
print(x is None) # prints True, and is Pythonic
# True
# True
- ๋ค์์ ๋ชจ๋ "Falsy"์ ๋๋ค.
False
None
[] : (an empty list)
{} : (an empty dict)
""
set()
0
0.0
s = 'abc'
if s: # if s:๋ ๋ฌธ์์ด s๊ฐ ๋น์ด์์ง ์์ผ๋ฉด True๋ฅผ ๋ฐํ
first_char = s[0]
else: # ๋ง์ฝ ๋ฌธ์์ด์ด ๋น์ด์์ผ๋ฉด ๋น ๋ฌธ์์ด("")์ด first_char ๋ณ์์ ํ ๋น
first_char = ""
# and ์ฐ์ฐ์๋ ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์์ธ s๊ฐ ์ฐธ์ธ์ง ํ์ธ,
# ๊ทธ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ ๋ฒ์งธ ํผ์ฐ์ฐ์์ธ s[0]์ ๋ฐํ.
# ๋ง์ฝ s๊ฐ ๋น์ด์์ง ์์ผ๋ฉด s[0]์ด ๋ฐํ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด s ์์ฒด๊ฐ ๋ฐํ
first_char = s and s[0] # A simpler way of doing the same
x = None
safe_x = x or 0 # ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์์ธ x๋ฅผ ํ์ธํ๊ณ , ๋ง์ฝ x๊ฐ ๊ฑฐ์ง ๊ฐ์ด๋ผ๋ฉด(์ฌ๊ธฐ์๋ None) ๋ ๋ฒ์งธ ํผ์ฐ์ฐ์์ธ 0์ด ๋ฐํ
safe_x
# safe_x์๋ x์ ๊ฐ์ด ํ ๋น๋์ง๋ง, x๊ฐ None์ด๋ฉด 0์ด ํ ๋น
# Result: 0
- Python์๋ ๋ชฉ๋ก์ ๊ฐ์ ธ ๋ชจ๋ ์์๊ฐ ์ฐธ์ผ ๋ True๋ฅผ ์ ํํ ๋ฐํํ๋ ๋ชจ๋ ํจ์์ ์ ์ด๋ ํ๋์ ์์๊ฐ ์ฐธ์ผ ๋ True๋ฅผ ๋ฐํํ๋ ๋ชจ๋ ํจ์๊ฐ ์์ต๋๋ค.
all([True, 1, { 3 }]) # True
all([True, 1, {}]) # False, {} is falsy
any([True, 1, {}]) # True, True is truthy, ์ฃผ์ด์ง iterable์ ์์ ์ค ํ๋๋ผ๋ ์ฐธ์ด๋ฉด True๋ฅผ ๋ฐํ
all([]) # True, no falsy elements in the list, ๊ฑฐ์ง ์์๊ฐ ์์ผ๋ฏ๋ก ์ฐธ
any([]) # False, no truthy elements in the list, ์ฐธ์ธ ์์๊ฐ ์์ผ๋ฏ๋ก False
all([] + [True, True]) == all([]) and all([True, True])
# True
- ๋น ๋ฆฌ์คํธ []์ [True, True]๋ฅผ ๊ฒฐํฉํ๋ฉด [True, True]์ด ๋๊ณ , all() ํจ์๋ ์ด ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๊ฐ ์ฐธ์ด์ด์ผ ํ๋ฏ๋ก ๊ฒฐ๊ณผ๋ True๊ฐ ๋ฉ๋๋ค.
- all([])๋ ๋น ๋ฆฌ์คํธ์ด๋ฏ๋ก ๋ชจ๋ ์์๊ฐ ์ฐธ์ ๋๋ค. ๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ True๊ฐ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ all([True, True])๋ True์ ๋๋ค.
any([] + [True, False]) == any([]) or any([True, False])
# True, ๋น ๋ฆฌ์คํธ์ [True, False]๋ฅผ ์ฐ๊ฒฐํ ๋ฆฌ์คํธ์๋ ์ ์ด๋ ํ๋์ True๊ฐ ์๊ธฐ ๋๋ฌธ
- ๋น ๋ฆฌ์คํธ []์ [True, False]๋ฅผ ์ฐ๊ฒฐํ์ฌ [True, False]๋ฅผ ๋ง๋ญ๋๋ค.
- ๊ทธ๋ฐ ๋ค์ any() ํจ์๋ ์ด ๋ฆฌ์คํธ์ ์์ ์ค ํ๋๋ผ๋ True์ธ์ง ํ์ธํ์ง๋ง, ๋ ์์ ๋ชจ๋ False์ด๋ฏ๋ก ๊ฒฐ๊ณผ๋ False ์ ๋๋ค.
- any([]): ์ด ์์ ๋น ๋ฆฌ์คํธ์๋ ์์๊ฐ ์์ผ๋ฏ๋ก False๋ก ํ๊ฐ
- any([True, False]): ์ด ์์ ์ต์ํ ํ๋์ ์์ (True)๊ฐ True์์ ํ์ธํ๊ธฐ ๋๋ฌธ์ True๋ก ํ๊ฐ๋ฉ๋๋ค.
'๐ Data Engineering > ๐ Data Mining' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Data Mining] Linear Algebra (์ ํ๋์) (0) | 2024.07.09 |
---|---|
[Data Mining] Introduction to Numpy part.2 (0) | 2024.07.05 |
[Data Mining] Introduction to Numpy part.1 (0) | 2024.06.26 |
[Data Mining] Visualizing Data (0) | 2024.06.25 |
[Data Mining] Crash_Course in Python Part.2 (0) | 2024.06.25 |