Introduction to Python Collected by Kwangho Lee isystems Design Lab http://isystems.unist.ac.kr/ UNIST Reference Wikidocs (https://wikidocs.net/6) TensorFlow Essential (https://livebook.manning.com/#!/book/machinelearning-with-tensorflow/chapter-2/1) Table of Contents I. 1. What is Python? I. 1.1 how to use jupyter notebook II. 2. Basic Python I. 2.1 사칙연산 II. 2.2 변수에숫자대입하고계산하기 III. 2.3 변수에문자대입하고출력하기 III. 3. Data types I. 3.1 int II. 3.2 float III. 3.3 bool IV. 3.4 string V. 3.5 list VI. 3.6 dictionary IV. 4. Condition V. 5. Loop VI. 6. Function VII. 7. Packages I. 7.1 numpy II. 7.2 matplotlib III. 7.3 tensorflow 1. What is Python? In [1]: if 4 in [1,2,3,4]: print("4 is in here!") 4 is in here! 위코드는다음과같다. " 만약 4 가 [1,2,3,4] 안에있으면 '4 is in here!' 를출력한다." 이처럼 Python 을사용하면직관적으로프로그래밍을할수있다.
1.1 how to use jupyter notebook Esc 키를누른후 h 키를누르면누르면 jupyter notebook 의 cheat sheet 가나온다. jupyter notebook 에는 Command Mode, Edit Mode, 총두가지모드가있다. 셀을클릭하면셀내에코드를짤수있는 Edit Mode 가되고, 그상태에서 ESC 를누르면셀자체를수정할수있는 Command Mode 가된다. 많이사용하는단축키 Esc: Command Mode 로전환 Command Mode a: 현재셀위에셀추가 b: 현재셀밑에설추가 x: 현재셀삭제 Enter : 현재셀에서 Edit Mode 로전환 Edit Mode Tab: 들여쓰기 Shift + Tab: 커서가위치한라인, 혹은드래그된라인들여쓰기취소 Esc: Command Mode 로전환혼용 Ctrl + Enter: 현재셀실행 Shift + Enter: 현재셀실행후밑의셀로이동, 밑에셀이없을경우셀추가 2. Basic Python 2.1 사칙연산 계산기를사용하듯작성한다. In [2]: 1 + 2 Out[2]: 3 In [3]: 3 / 2.4 Out[3]: 1.25 In [4]: 3 * 9 Out[4]: 27 2.2 변수에숫자대입하고계산하기 In [5]: a = 1 b = 2 a + b Out[5]: 3 2.3 변수에문자대입하고출력하기
In [6]: a = 'Python' print(a) Python 3. Data types int float bool string list dictionary Python 에는여러가지자료형이있지만, 특정자료형을맞추기위해변수설정을따로신경쓸필요는없다. 3.1 int int 는정수형 (integer) 의줄임말로, 정수를저장하는자료형이다. In [7]: a = 123 a = -56 a = 0 type(a) Out[7]: int 3.2 float float 는실수형 (Floating-point) 을표현하며소수점이포함된숫자를말한다. In [8]: a = 1.2 a = -3.45 type(a) Out[8]: float 3.3 bool bool 은참, 거짓 (boolean) 두가지값을표현한다. In [9]: Out[9]: a = True a = False type(a) bool 3.4 string string 은문자열을나타내며단어, 문자등으로구성된문자들의집합을의미한다. 예시는다음과같다.
In [10]: Out[10]: a = 'Hello World!' a = 'a' a = '123' type(a) str 문자열을사용하기위해서는문자열로만들고싶은부분양끝을따옴표 (', ") 로둘러싸면된다. 1) 큰따옴표 In [11]: Out[11]: "Hello World!" 'Hello World!' 2) 작은따옴표 In [12]: Out[12]: 'Python is fun!' 'Python is fun!' string 과함께변수를출력하고싶을때는.format() 을사용하면편리하다. 사용방법은다음과같다. ' 사용하고싶은문자열 { }'.foramt( 변수 ) 문자열내에중괄호 ({}) 를포함시키고문자열맨끝에.format( 변수 ) 를입력하면 문자열내에있는중괄호안에변수가대입된다. In [13]: a = 24 b = 'My age: {}'.format(a) print(b) My age: 24 3.5 list 1 보다크고 10 보다작은자연수중홀수인숫자집합 {1, 3, 5, 7, 9} 를생각해보자. 이런집합은 int 나 string 으로 표현하기어렵다. Python 에서는이런숫자모음을담아둘수있는자료형 list 가존재한다. In [14]: odd = [1, 3, 5, 7, 9] 리스트를만들때는요소들을대괄호 ([]) 로감싸주고각요소들을쉼표 (,) 로구분해준다. 리스트명 = [ 요소 1, 요소 2, 요소 3,...] 리스트안에는어떠한자료형도포함시킬수있다.
In [15]: a = [] b = [1, 2, 3] c = ['I', 'love', 'deep', 'learning'] d = [1, 2, 'Combination', 'of', 'int and str'] print(d) [1, 2, 'Combination', 'of', 'int and str'] 리스트명 [ 숫자 ] 를사용하여각요소에접근가능하다. 주의할점은순서가 0 번부터시작한다는점이다. In [16]: d[0] Out[16]: 1 In [17]: d[1] Out[17]: 2 In [18]: Out[18]: d[4] 'int and str' 리스트의요소를여러개갖고오고싶은경우엔슬라이싱 (slicing) 이란방법을사용하면된다. 리스트명 [ 시작 : 끝 ] 주의할점은마지막순서는포함되지않는다는점이다. In [19]: d[0:1] Out[19]: [1] In [20]: d[0:2] Out[20]: [1, 2] In [21]: Out[21]: d[1:4] [2, 'Combination', 'of'] In [22]: d[0:0] Out[22]: [] 3.6 dictionary ' 이름 '=' 홍길동 ' 이고 ' 생일 '='1970 년 1 월 1 일 ' 인사람에대한변수를만든다고생각해보자. 파이썬에는이런대응관계를나타내는자료형이있고이를 dictionary 라부른다. dinctionary 는 list 처럼순차적으로해당요소값을구하지않고 Key 를통해 Value 를얻는다. 이것이 dictionary 의큰특징이다. baseball 이란단어뜻을찾기위해사전의내용을순차적으로모두검색하는것이아니라 baseball 이라는단어가있는곳만펼처보는것이다. 맨위의예시에선 ' 이름 ' 이 Key 가되고 ' 홍길동 ' 이 Value 가될것이다.
다음은기본적인 dictionary 의모습이다. {key1 : value1, key2 : value2, key3 : value3} 각요소는 Key : Value 형태로이루어져있고쉼표 (,) 로구분되어있다. Key 에는변하지않은값을사용하고, Value 에는변하는값, 변하지않는값모두사용가능하다. In [23]: dic = { 'name' : 'isystems', 'website' : 'http://isystems.unist.ac.kr/teaching/machine-learning/', 1 : 'Hello World', 32 : [1,2,3,4] } dictionary 에서 Key 를사용해 Value 를얻는방법은다음과같다. 딕셔너리명 [ 키 ] In [24]: Out[24]: dic['name'] 'isystems' In [25]: Out[25]: dic['website'] 'http://isystems.unist.ac.kr/teaching/machine-learning/' In [26]: Out[26]: dic[1] 'Hello World' In [27]: dic[32] Out[27]: [1, 2, 3, 4] 4. Condition 조건문은프로그램에서주어진조건을판단하여상황에맞게처리해야할때쓰이는것이다. Python 에서는조건문에 if 와 else 를사용한다. if 문의기본구조는다음과같다.
if 조건 : 수행할문장 1 수행할문장 2 else: 수행할문장 A 수행할문장 B... 조건문이참 (True) 이면 if 문바로다음의문장들 (if 블록 ) 을수행하고, 거짓이면 else 문다음문장들 (else 블록 ) 을수행하 게된다. 이때 else 는 if 없이독립적으로사용할수없다. In [28]: weekday = True if weekday: print("go to the LAB") else: print("wake up at 11:00 a.m and Go to the LAB") Go to the LAB In [29]: weekday = False if weekday: print("go to the LAB") else: print("wake up at 11:00 a.m and Go to the LAB") Wake up at 11:00 a.m and Go to the LAB 주의할점 if 문을만들때는 if 조건 : 바로아래문장부터 if 문에속하는모든문장에들여쓰기를해주어야한다. 그렇지않으면오류가발생한다. In [30]: if True: print('hello') print('world') print('!!!') File "<ipython-input-30-1bea1ba66701>", line 4 print('!!!') ^ IndentationError: unexpected indent 5. Loop 반복적으로수행해야할일이있을경우반복문을사용한다. Python 에서는여러반복문을제공해주는데, 그중 for 문을자주사용한다. for 문의기본적인구조는다음과같다.
for 변수 in 리스트 ( 또는튜플, 문자열 ): 수행할문장 1 수행할문장 2... 리스트나튜플, 문자열의첫번째요소부터마지막요소까지차례로변수에대입되어 for 문블록안의문장들이수행된다. In [31]: test_list = ['one', 'two', 'three'] for i in test_list: print(i) one two three 일정횟수만큼반복하는코드를짜고싶은경우내장함수인 range() 를이용하면된다. In [32]: for i in range(3): print(i) print("hi") 0 Hi 1 Hi 2 Hi 6. Function 프로그래밍을하면서같은내용을반복해서작성한다면, 함수를사용하는것이좋다. ' 반복적으로사용되는가치있는부분 ' 을한덩어리로묶어서 ' 어떤입력값이주어졌을때어떤결과값을돌려주는 ' 것을함수라한다. Python 함수의구조는다음과같다. def 함수명 ( 입력인수 ): 수행할문장 1 수행할문장 2... def 는함수를만들때사용하는키워드이며함수명은함수를만드는사람이임의로정할수있다. 다음과같이 x와 y를입력인수로받아더한값을돌려주는함수를만든다면, f(x, y) = x + y
In [33]: def my_sum(x, y): return x + y 위와같이코드를작성할수있다. 여기에서, return 은함수의결과값을돌려주는명령어이다. return 이없으면함수는아 무값도반환하지않는다. In [34]: a = 3 b = 11 result = my_sum(a, b) print(result) 14 함수의인수에초기값을미리설정할수도있다. In [35]: def my_sum2(x=1, y=2): return x + y In [36]: print(my_sum2(4, 5)) # x == 4, y == 5 print(my_sum2(x=4, y=5)) # x == 4, y == 5 print(my_sum2(x=4)) # x == 4, y == 2 print(my_sum2()) # x == 1, y == 2 9 9 6 3 7. Packages 모듈, 또는패키지란함수나변수또는클래스들을모아놓은파일을말한다. 즉, 다른 Python 프로그램에서불러와사용할수있게끔만들어진 Python 파일이라고도할수있다. Python 에는굉장히유용한여러패키지가있는데그중많이쓰이는 numpy, matplotlib, 그리고 tensorflow 에 대해간략히소개하겠다. 모듈을코드내에추가하는방법은다음과같다. import 모듈명 import 모듈명 as 임의의축약이름 from 모듈명 import 모듈내변수, 함수혹은클래스 각각의미하는바는, 1) 모듈을전부코드내에추가한다. 2) 모듈을전부코드내에추가하고모듈명을임의의축약이름으로바꿔사용한다. 3) 모듈내에있는특정변수, 함수혹은클래스만추가한다.
7.1 numpy numpy는거의모든 Python 프로그램에서사용되는패키지이다. array라는데이터타입을이용해서 matrix나 tensor를표현하기도하고, 수학적계산에서기초가되는여러함수를제공한다. In [37]: import numpy a = numpy.array([1, 2, 3]) print(a) [1 2 3] In [38]: import numpy as np a = np.array([1, 2, 3]) print(type(a)) print(a.shape) print(a) <class 'numpy.ndarray'> (3,) [1 2 3] In [39]: b = np.array([[1,2,3],[4,5,6]]) print(type(b)) print(b.shape) print(b) <class 'numpy.ndarray'> (2, 3) [[1 2 3] [4 5 6]] np.array의각요소에접근하는방법은 list에서사용하던방법과같다. 어레이명 [ 숫자 ] 를사용하여각요소에접근가능하다. 차원이늘어나면어레이명 [ 숫자, 숫자, 숫자,...] 혹은어레이명 [ 숫자 ][ 숫자 ] 로접근한다. 순서가 0번부터시작한다는점에주의한다. In [40]: a[0] Out[40]: 1 In [41]: a[2] Out[41]: 3
In [42]: b[0] Out[42]: array([1, 2, 3]) In [43]: b[0,1] Out[43]: 2 In [44]: b[0][1] Out[44]: 2 어레이의요소를여러개갖고오고싶은경우엔리스트와같이슬라이싱 (slicing) 이란방법을사용하면된다. 어레이명 [ 시작 : 끝 ] 차원이늘어나면다음과같이슬라이싱이가능하다. 어레이명 [ 시작 : 끝, 시작 : 끝 ] 마지막인덱스는포함되지않는다. In [45]: Out[45]: a[0:1] array([1]) In [46]: a[0:2] Out[46]: array([1, 2]) In [47]: Out[47]: a[0:0] array([], dtype=int64) In [48]: b[0:2] Out[48]: array([[1, 2, 3], [4, 5, 6]]) In [49]: b[0:2, 0:2] Out[49]: array([[1, 2], [4, 5]]) 시작, 끝을정하지않고 ':' 만사용할시, 해당 dimension 의모든요소가포함된다. 어레이명 [ : ] In [50]: b[0:2, :] Out[50]: array([[1, 2, 3], [4, 5, 6]]) 어레이명 [ 시작 : 끝 ][ 시작 : 끝 ] 은기대하는값을반환하지않는다. In [51]: b[0:2][0:2] Out[51]: array([[1, 2, 3], [4, 5, 6]])
이외에도, array 내에가장큰값을반환하는 numpy.argmax(), matrix 연산에용이한 np.matrix 등다양한클래스들이있다. 참고링크 numpy official tutorial (https://docs.scipy.org/doc/numpy-dev/user/quickstart.html) numpy reference (https://docs.scipy.org/doc/numpy/reference/) 7.2 matplotlib matplotlib 는이미지나데이터를시각화하거나그래프를그릴때유용한패키지이다. import 할땐다음과같이쓴다. In [52]: import matplotlib.pyplot as plt 그리고싶은이미지나데이터를 figure 위에올리고이를 show 한다. 간단한사용방법은다음과같다. plt.plot(x, y) plt.show() 이미지를출력할때는다음과같이작성한다. plt.imshow( 이미지 ) plt.show() 이때이미지는 RGB 값을갖고있는 2 차원데이터일수도있고단순한 2 차원 array 일수도있다.
In [53]: # Compute the x and y coordinates for points on a sine curve x = np.arange(0,3*np.pi,0.1) y = np.sin(x) # Plot the points using matplotlib plt.plot(x, y) plt.show() 아래에서사용된 cpickle 은 Python 자료형으로데이터를저장하고불러오는패키지이다. In [54]: from six.moves import cpickle input_image = cpickle.load(open('./image_files/lena.pkl', 'rb')) In [55]: Out[55]: type(input_image) numpy.ndarray In [56]: input_image.shape Out[56]: (512, 512) In [57]: plt.imshow(input_image, 'gray') plt.show()
pyplot 에는여러기능들이있으므로, 잘사용하면간결하게시각화가가능하다. 참고링크 pyplot official tutorial (https://matplotlib.org/users/pyplot_tutorial.html) pyplot reference (https://matplotlib.org/api/pyplot_summary.html) 7.3 tensorflow tensorflow는 google에서제공하는 deep learning 패키지이다. Python 코드는한줄씩실행되어가며진행된다면 tensorflow는모든계산을그래프로그린뒤, 마지막에 Session을열어한꺼번에계산한다는것이특징이다. tensorflow에는크게세가지구조가있다. 상수를뜻하는 tf.constant( 임의의데이터 ) 변수를뜻하는 tf.variable( 임의의데이터혹은 random value) 처음엔아무것도없는빈그릇이지만들어오는데이터를담을수있는 tf.placeholder( 데이터타입, 데이터모양 ) In [58]: import tensorflow as tf a = tf.constant([1, 2, 3]) b = tf.constant([4, 5, 6]) c = tf.constant([[1, 2],[3, 4]]) d = tf.constant([[1,-1], [-1, 1]]) w = tf.variable([1, 1]) x = tf.placeholder(tf.float32, [2, 2]) summation = a + b multiplication = c * d In [59]: Out[59]: summation <tf.tensor 'add:0' shape=(3,) dtype=int32> In [60]: Out[60]: multiplication <tf.tensor 'mul:0' shape=(2, 2) dtype=int32>
위와같이결과값이아직없다. 계산기에비유하자면 3 + 4 를적어놓기만한상태로아직계산기에입력하기전단계인것이다. 이값을계산하기위해서는 tf.session() 안에수식을집어넣어주면된다. In [61]: Out[61]: sess = tf.session() sess.run(summation) array([5, 7, 9], dtype=int32) In [62]: sess.run(multiplication) Out[62]: array([[ 1, -2], [-3, 4]], dtype=int32) tf.variable 을사용하기위해서는변수를먼저초기화해주는작업이필요하다. In [63]: init = tf.global_variables_initializer() sess.run(init) In [64]: Out[64]: sess.run(w) array([1, 1], dtype=int32) tf.placeholder 를사용하기위해서는 sess.run() 을할때 feed_dict 라는인수를이용하여데이터를넣어주면된다. feed_dict 에 dictionary 형태로값을넣는다. 이때 Key 는 placeholder 의변수명이되고 Value 는넣고싶은데이터가된다. In [65]: sess.run(x, feed_dict={x : [[1,2],[3,4]]}) Out[65]: array([[ 1., 2.], [ 3., 4.]], dtype=float32)