당신은 멋쟁이, 우리는 장고쟁이~

0%

Python Syntax (문법, 구문)


파이썬 프로그램은, parser 로 읽어집니다

파이썬은 매우 읽기 편한 언어가 되기 위해서 디자인 되었습니다.

파이썬 프로그래밍 언어의 문법은, 어떻게 파이썬 프로그래밍이 작성되어야 할지에 대한 규칙을 다룹니다



Python Line Structure (줄구조)


파이썬 프로그램은 여러개의 논리적 줄들로 나누어져 있고, 각 논리적 줄은, NEWLINE 토큰에 의해서 종료 됩니다.


논리적 줄은, 하나 혹은 그 이상의 줄들로 부터 생성 됩니다.


하나의 줄은, 공백, 탭, 주석같은 formfeed 로 이루어질수 있고, 비어있는 줄은 인터프리터가 무시합니다.


1
2
3
x = 1 
if x > 0:
print('이 세줄은 물리적 / 논리적 줄들 입니다.')


파이썬에서 주석 (comments)


파이썬에서 주석은, 문자열로 치지 않는 # 으로 시작하고, 물리적으로 한줄의 끝에서 끝납니다.


# 뒤의 모든 케릭터들은 주석의 부분이고, 파이썬 인터프리터는 이들을 실행하지 않고 무시합니다.



아래 예시를 들어봅니다. 참고로, 파이썬에서 다수의 줄 혹은 블럭으로 된 주석은 존재하지 않습니다.



1
2
3
4
5
x = 1 
# x 의 초기값은 1 입니다

if x > 0:
print('두번째 줄은 주석입니다') # 문자열을 출력합니다 (이것도 주석입니다!)

더 읽어보기 »

What is Python?


Python 이 무엇인가요?


파이썬은 오픈소스로 개발된 객체 지향 프로그래밍 언어로, 고등 레벨의 강력한 프로그래밍 언어 입니다. Guido Van Rossum 에 의해서 1990년대 초반에 개발되었고, Monty Python 을 따라서 이름 지어졌습니다.


파이썬은, 많은 unix 계열에서 실행되고, Mac 과 Windows 2000 대 이후 버전에서도 실행 됩니다.


파이썬은, http://www.python.org 에서 다운로드 가능합니다.


Python 프로그램은


파이썬 프로그램들은 모듈들로 이루어져 있습니다. 하나의 모듈statement 들을 포함하고 있고, statementexpressions 을 가지고 있습니다.


Module > Statements > Expressions


파이썬에서뿐만 아니라, 자주자주 나오는 컨셉인, statementsexpressions 에 대해서 알아보자면,


Expressions

수식, 연산식


Statements

실행 가능한 (executable) 코드 조각, 무엇인가를 실행하는 코드의 조각 이라고 보면 됩니다.


스택오버플로우에서 검색해 보면, 아래 예시가 나옵니다


더 읽어보기 »

Python Library and Modules


파이썬 라이브러리 (Library) 와 모듈 (Module)


Python Library and Modules


파이썬에는, 라이브러리 (Library) 혹은 모듈 (Module) 이라는것들이 존재합니다


파이썬 공부한지도 제법 시간이 오래되었지만, 라이브러리와 모듈에 대해서 설명 하라고 하면 바로 대답이 나오질 않습니다.. 짧게나마 라이브러리와 모듈에 대해서 정리하고 넘어갑니다.



파이썬에서 라이브러리 (Library) 란?


파이썬 라이브러리는 코드를 작성할 필요없이 많은 동작을 수행할수 있게 해주는 함수와 메서드의 집합입니다. 우리는, 마치 도서관 (library) 에서 책을 꺼내어 보듯이,


프로그래밍을 하면서, 파이썬 라이브러리를 꺼내어 사용할수 있습니다. 여러 파일로 이루어져 있을수 있고, 함수 메서드 속성들이 하나의 패키지로 모여져 있습니다.


어떤 파이썬 라이브러리에는,

이미 우리가 수행하고자 하는 기능과 동작들이 이미 정의되어 모여져 있기 때문에,

이를 가져다 쓰기만 하면 됩니다.


예를들면, 파이썬 이미지 라이브러리 (PIL)은, 파이썬에서 이미지 수정을 위한 파이썬 주요 라이브러리 입니다. Numpy 는 숫자 연산을 위한 강력한 라이브러리 입니다.



파이썬에서 모듈 (Module) 란?


파이썬에서 모듈 (Module) 이란?


파이썬 모듈은,

파이썬 객체로, 여러분들이 묶고 참조 할수 있는 속성들을 가지고 있는 파이썬 객체 입니다.


간단하게 이야기 해서, 모듈은 파이썬으로 이루어져 있는 하나의 파일 입니다.

하나의 모듈은 함수들 클래스들 그리고 변수들을 정의할수 있습니다.


하나의 모듈은, 실행 가능한 코드도 포함하고 있을수 있습니다.



Summary


요약하자면, 라이브러리는, 변수나 함수 클래스등을 미리 만들어서 모아 놓은 것입니다.


기본 파이썬에서는 없었거나, 사용하기 편한 기능의 함수와 클래스들을 제공하고, 이를 가져다가 쓸수 있게 만들어 놓은것입니다.


import 를 사용하여, 가져와서 사용할수 있고. 보통 구글을 찾아보면, 정말 많은 라이브러리가 존재하는데. 각 라이브러리의 사용법 또한 정말 많이 검색이 되니, 개발자 입장에서는 언제든지 찾아서 끌어다가 사용할수 있습니다.


예를들어, numpy 같은 경우, 데이터 분석 분야에서 많이 사용되는 라이브러리로, 수적 계산 작업등에 널리 사용되는 라이브러리 입니다.


HTML 로 폼 출력하기 - as_table()


as_table()


마지막으로, as_table() 은 폼을 <table> HTML 로 출력합니다.

이는 print 와 같습니다.

사실 우리는 하나의 폼 객체를 print 할때에, 기본 백앤드 동작으로 as_table() 메서드를 호출합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
In [5]: f = ContactForm()                                                                                                                                                 

In [6]: f.as_table()
Out[6]: '<tr><th><label for="id_subject">Subject:</label>
</th>
<td><input type="text" name="subject" maxlength="100" required id="id_subject"></td>
</tr>\n<tr><th><label for="id_message">Message:</label></th>
<td><textarea name="message" cols="40" rows="10" required id="id_message">\n
</textarea></td></tr>
\n<tr><th><label for="id_sender">Sender:</label></th>
<td><input type="email" name="sender" required id="id_sender"></td>
</tr>\n<tr><th><label for="id_cc_myself">Cc myself:</label></th>
<td><input type="checkbox" name="cc_myself" id="id_cc_myself"></td></tr>'

<tr> 과 <td> 테그들은 생성되지만, <table>태그는 생성되지 않습니다. 이는, 사용자가 직접 추가해 주어야 합니다.

Form.as_ul()


as_ul()은 폼을 <li> 태그로 렌더링 해줍니다. 각 <li> 태그는 하나의 필드를 포함하고 있습니다.


이는, <ul> 혹은 </ul> 을 포함하고 있지 않습니다.


따라서, 여러분들은 유연하게 <ul>에 어떤 HTML 속성이든지 지정해줄수 있습니다.


1
2
3
4
5
6
7
8
9
10
In [4]: f.as_ul()                                                                                                                                                         
Out[4]: '<li><label for="id_subject">Subject:</label>
<input type="text" name="subject" maxlength="100" required id="id_subject"></li>
\n<li><label for="id_message">Message:</label>
<textarea name="message" cols="40" rows="10" required id="id_message">\n
</textarea></li>\n
<li><label for="id_sender">Sender:</label>
<input type="email" name="sender" required id="id_sender"></li>
\n<li><label for="id_cc_myself">Cc myself:</label>
<input type="checkbox" name="cc_myself" id="id_cc_myself"></li>'


Form.as_p()


as_p() 는 form 을 <p> 태그들로 렌더링 해줍니다.

<p> 태그는 하나의 필드를 가지고 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
f = ContactForm() 

# 폼 인스턴스를 생성 한뒤에
# f.as_p() 를 호출하면,

f.as_p()

# 폼의 각 필드들이 <p>태그로 감싸져서 렌더링 되는것을 확인할수 있습니다

In [2]: f = ContactForm()

In [3]: f.as_p()
Out[3]: '<p><label for="id_subject">Subject:</label>
<input type="text" name="subject" maxlength="100" required id="id_subject"></p>
\n<p><label for="id_message">Message:</label>
<textarea name="message" cols="40" rows="10" required id="id_message">\n</textarea></p>
\n<p><label for="id_sender">Sender:</label>
<input type="email" name="sender" required id="id_sender"></p>
\n<p><label for="id_cc_myself">Cc myself:</label>
<input type="checkbox" name="cc_myself" id="id_cc_myself"></p>'

Outputting forms as HTML


폼 객체의 두번째 작업은, 스스로 HTML 태그로 렌더를 해주는것입니다.


forms.py 가 아래와 같이 작성 되어 있고.


1
2
3
4
5
6
7
8
from django import forms 


class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)

shell 에서 아래와 같이 폼을 프린트 해보면,

폼이 저절로 HTML 로 렌더되는것을 확인할수 있습니다


1
2
3
4
5
from classviewsforms.forms import ContactForm 

f = ContactForm()

print(f)

더 읽어보기 »

Accessing “clean” data


Form.cleaned_data


폼안에 각 필드들은, 데이터 검증뿐만 아니라, “cleaning” (정화) 하는 역할도 합니다.


cleaning

유효하고 일관적인 포맷으로 정형화 시킵니다


이는 아주 좋은 기능입니다. 왜냐하면, 특정 필드가 여러 방법으로 입력되고, 일관적인 아웃풋을 만들어 내기 때문입니다.


예를들어, DateField 는 입력값을 python 의 datetime.date 객체로 정형화 시킵니다.


‘1994-07-15’ 같이, 문자열 형태, datetime.date 객체 혹은 다른 포맷들이든 상관없이. 유효하기만 하면, DateField 는 언제나 datetime.date 객체로 정형화 시킵니다.


폼 인스턴스를 데이터와 함께 생성하고, 검증하였으면,

폼의 cleaned_data 속성에 접근하여, 깔끔한 데이터에 엑세스 할수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

In [1]: data = {'subject': 'hello',
...: 'message': 'Hi there',
...: 'sender': 'foo@example.com',
...: 'cc_myself': True}

In [4]: f = ContactForm(data)

In [5]: f.is_valid()
Out[5]: True

In [6]: f.cleaned_data
Out[6]:
{'subject': 'hello',
'message': 'Hi there',
'sender': 'foo@example.com',
'cc_myself': True}

여기서 꼭 알아야 할 부분은, cleaned_data 는 사전형태로. 깨끗한 데이터를 가지고 있습니다.


더 읽어보기 »

Checking which form data has been changed


폼 데이터 변경사항을 체크하기 위해서는 has_changed() 메서드를 사용하면 됩니다.


초기값에서부터 폼 데이터가 변경 되었는지 아니었는지 확인할 필요가 있을떄 체크 합니다.


1
2
3
4
5
6
7
8
9
10
11
In [2]: from forms_more_on_fields.forms import ContactForm  

In [7]: data = {'subject': 'hello',
...: 'message': 'Hi there',
...: 'sender': 'foo@example.com',
...: 'cc_myself': True}

In [8]: f = ContactForm(data, initial=data)

In [9]: f.has_changed()
Out[9]: False

폼이 제출 되었을때, 우리는 다시 폼을 만들고 오리지널 데이터를 제공하여 비교가 이루어 질수 있습니다.


1
2
>>> f = ContactForm(request.POST, initial=data)
>>> f.has_changed()

만약, request_POST 에서 온 data 가 initial 에 있는 데이터와 다르다면, has_changed() 는 True 를 반환할겁니다. 그렇지 않다면, False 를 반환합니다.


이 결과는, 폼안에 있는 각 필드에, has_changed() 를 호출함으로 계산됩니다.


Form.changed_data


changed_data 속성은 initial 에 제공되었던 데이터와 다른 데이터들이, 폼을 통해 (보통 request.POST를 통해서) 온 데이터들과 다를때, 폼의 bound data 안에 있는 필드들의 이름을 가진 리스트를 반환합니다.


1
2
3
4
5
>>> f = ContactForm(request.POST, initial=data)
>>> if f.has_changed():
... print("The following fields changed: %s" % ", ".join(f.changed_data))
>>> f.changed_data
['subject', 'message']

Dynamic initial values


Form.initial


initial 을 사용하여, 실행시에 폼필드의 초기값을 지정할수 있습니다.


예를들면, 여러분들은 현재 세션의 username 을 username 필드에 채워놓고 싶을지도 모릅니다

이런 동작을 구현하기 위해서, initial 인자를 Form 에 써줍니다.


이 인자가 주어질때는, 필드명이 초기값에 매핑되는 사전 형태여야 합니다.


오직 여러분들이 초기값을 지정하고 싶은 필드에만 포함합니다.
폼안에 모든 필드에 쓰는것은 불필요한 일입니다.

예를들면,


1
f = ContactForm(initial={'subject': 'Hi there!'})

이 값들은 오직 unbound 폼에만 표시되고, 만약 특정 값이 주어지지 않을때에 fallback 값으로 사용되지 않습니다.


만약 필드가 initial 을 정의하고, initial 폼을 인스턴스화 할때 포함하면, 두번째가 먼저 택해집니다. 아래 예시에는, initial 이 필드에서 주어졌고, 폼 인스턴스에도 주어졌습니다. 두번째가 우선시 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from django import forms 


class CommentForm(forms.Form):
name = forms.CharField(initial='class')
url = forms.URLField()
comment = forms.CharField()



In [1]: from forms_more_on_fields.forms import CommentForm

In [2]: f = CommentForm(initial={'name': 'instance'}, auto_id=False)

In [3]: print(f)
<tr><th>Name:</th><td><input type="text" name="name" value="instance" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>

Initial 값이 정해져 있어도,

폼의 인스턴스를 생성할때 initial 을 지정해주면, 인스턴스 생성할때 지정한 initial 값이 해당 필드에 지정이 됩니다.


Form.get_initial_for_field(field, field_name)


get_initial_for_field() 를 사용하여, 폼 필드의 초기 데이터를 조회할수 있습니다. 이는 Form.initial 과 Field.initial 로 부터, 데이터를 조회하고, 그 순서대로 호출 가능한 초기값들을 평가합니다 .