프리렉 - FREELEC
http://freelec.co.kr/book/catalogue_view.asp?UID=134
이강성저
주석은 사람이 코드를 이해하기 위해서 추가되는 설명으로 실행에는 전혀 영향을 미치지 않는다. 파이썬 주석은 줄 어디에서나 시작할 수 있다. # 으로 시작하는 부분부터 주석으로 취급된다.
# 라인을 주석으로
a = 1 # 주석..
가) 파이썬의 예약어 목록을 확인하는 방법과 어떤 단어가 예약어인지 확인하는 방법은 무엇인가?
import keyword
print (len(keyword.kwlist)) # 예약어 갯수
print (keyword.kwlist) # 전체 목록
print('is' in keyword.kwlist)
print('python' in keyword.kwlist)
나) 변수의 이름을 지을 때 따라야 하는 규칙을 정리해 보자.
- 유니코드 문자나 _ 로 시작한다
- 이름에 공백이 없어야 한다
- 아스키코드의 특수문자는 사용할 수 없다(예:!@#$)
- 예약어가 아니어야 한다.
변수 = 1
print(변수)
월_일_시 = '2013.11.12'
print (월_일_시)
그래도_영문_변수를_사용하는_것이_좋습니다 = True
print(그래도_영문_변수를_사용하는_것이_좋습니다)
다) 변수의 이름을 지으면서 조심해야 할 점은 무엇인가?
1. 변수의 이름을 일관성 있게 작성하는 것이 좋습니다. 예를 들면 여러 단어를 연결할 때, veryCloseFriends, very_close_friends 등과 같이 할 수 있습니다. 어느 것도 관계 없으나 일관성 있는 것이 좋습니다.
2. 변수의 이름과 함수의 이름, 클래스 이름등 구분되도록 규칙을 정하는게 좋습니다. 클래스 이름은 대문자로 시작하고, 함수나 메쏘드 이름은 소문자로 시작하고, 변수 이름은 단어의 연결을 _으로 하고 하는 등의 규칙을 정하는 것이 좋습니다.
3. 변수의 이름이 기존에 사용되는 이름과 충돌되면 기존의 이름은 사라지거나 보이지 않게됩니다. 이 점을 조심해야 합니다. 다음 예와 같이 이미 존재하는 함수와 혼동될 수 있습니다.
print (abs(-1)) # 내장 함수
abs = 2.0
print(abs * 2.0)
del abs # 변수 삭제
print (abs(-1)) # 내장 함수
가) 치환문의 종류를 정리해 보자.
단순 치환문 : =
확장 치환문 : +=, -=, *=, /=, //=, %=, \**=, >>=, <<=, &=, ^=, &=, |=
a = 1
a += 1 # a = a + 1
a *= 2 # a = a * 2
a *= 3+4 # a = a * (3+4)
나) 치환문에서 a = a+1의 의미는 무엇인가?
이전의 a 값에 1을 더하고 그 결과를 다시 a에 저장한다.
다) 1+3 = a가 가능하지 않은 이유는 무엇인가?
좌변은 대입 가능한 변수가, 우변은 식이 와야 한다. 우측의 결과 값이 좌측에 저장되어야 하는데 1+3은 이 것이 가능하지 않다.
라) a = b = 0과 a = (b = 0)의 차이는 무엇인가?
a = b = 0 은 0 객체를 b와 a가 참조하도록 한다.
a = (b = 0)은 (b = 0)를 수행하고 그 결과 값을 a에 전달하라는 의미이다. 하지만 파이썬에서는 이것이 가능하지 않다. b=0은 식이 아니고 문으로 취급되기 때문이다. 아래의 실행 예를 보자.
a = b = 0
a = (b = 0)
외부 모듈을 가져다 쓰는 기능이다. 외부 모듈을 가져오기 할 때, 해당 모듈의 코드가 실행되면서 함수, 클래스, 변수등이 모듈 이름 공간에 등록된다. 한 번 가져오기 한 모듈은 메모리에 존재하며 중복적으로 가져오기를 하지는 않는다. 사용 방법은 다음과 같다.
import math # 모듈 이름을 현재의 이름 공간으로 가져온다.
math.sin(math.pi/2)
import math # 이미 앞서 가져오기를 수행했기 때문에 아무런 기능을 하지 않는다.
from math import sin, pi # 모듈의 특정한 이름들만 가져온다.
sin(pi/2)
from math import * # 모듈에 등록된 전체 이름이 현재의 이름 공간으로 저장된다.
cos(pi/4)
가) 키보드로부터 숫자를 입력받고 입력받은 수보다 100이 큰 수를 출력해 보자.
n = int(input('type a number : '))
print(n+100)
나) 화면 출력 함수 print( )로 출력 마지막에 줄 바꾸기를 하지 않는 방법은 무엇인가?
print ('first line', end=' ') # 줄 바꾸기 대신 공백으로 처리
print ('second line')
print ('third line')
다) 복잡한 자료형을 출력할 때 사용하는 pprint 모듈의 실행 예를 보이시오.
import pprint
tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', ('parrot', ('fresh fruit',))))))))
pprint.pprint(tup, indent=2)
pprint.pprint(tup, indent=2, depth=4, width=40)
가) 각각의 자료형의 특징을 정리해 보자.
2.5절 자료형의 종류 참조
나) 문자열과 리스트, 튜플의 특징을 다음 관점에서 간단히 설명하고 실행 예를 보이시오.
# string
s1 = "python string"
s2 = "python string" "connected"
s3 = "python \
string connected"
s4 = '''multi line string
line2
line3'''
print (s1)
print (s2)
print (s3)
print (s4)
# list
l1 = []
l2 = [1,2,3]
l3 = ['python', 'rules', 10000]
print (l1, l2, l3)
# tuple
t1 = ()
t2 = (1,)
t3 = (1,2,3)
print (t1, t2, t3)
s = "python string"
s[0], s[-1], s[1:], s[1:-2], s[::2], s[::-1]
l3 = ['python', 'rules', 10000]
l3[0], l3[:2]
t3 = (1,2,3,4,5)
t3[0], t3[:2]
s+s, s*2
l3 + l2, l3 * 3
t3 + t3, t3 * 2
# 리스트만 가능
l3 = ['python', 'rules', 10000]
l3[0] = 100
print (l3)
l3[1:3] = [4,5]
print (l3)
다) 사전은 문자열이나 리스트, 튜플과 어떻게 다른지 간단히 정리해 보자.
문자열, 리스트, 튜플은 순서가 있는 자료형으로 순서에 의한 인덱싱, 슬라이싱등이 가능하다. 사전은 순서가 아닌 키에 의해서 값을 검색하는 자료형이다. 2.5.6절 참조.
가) s[0][0][0]이 어떤 값이 나오는가 보고 이유를 설명해 보자.
s = 'python'
s[0][0][0] # 파이썬에는 문자 자료형이 없다. 모두 문자열이다. 따라서 인덱싱이 연속적으로 가능하다.
나) s[-100], s[100], s[-100:100] 문들을 실행해 보고 실행되는 것과 실행되지 않는 것을 확인 하시오. 그리고 실행되지 않는 경우에는 어떠한 에러 메시지를 내는지 관찰하시오.
s[-100] # s[100]도 같은 결과
s[-100:100]
다) s[1:-1]는 어떤 결과를 내는가?
s[1:-1]
라) s[3:-3]은 어떤 결과를 내는가?
s[3:-3]
sin( 0) = 0.000
sin( 10) = 0.174
sin( 20) = 0.342
…
sin( 90) = 1.000
sin(100) = 0.985
…
sin(360) = -0.000
출력 양식을 맞추는 문제는 다음 코드를 변형해서 사용한다. 두 개의 값 10, 20.12345를 형식에 맞게 출력하는 예제이다.
>>> print ('{0:3d} : {1:6.3f}'.format(10, 20.12345))
10 : 20.123
import math
for deg in range(0, 360+1, 10):
rad = math.radians(deg)
print ('sin({0:3d}) = {1:6.3f}'.format(deg, math.sin(rad)))
# ex09.py
import math
from turtle import *
reset()
yamp = 100
for deg in range(0, 361, 10):
rad = math.radians(deg)
y = yamp * math.sin(rad)
goto(rad*50, y)
done()
# ex10.py
import math
from turtle import *
reset()
t1 = Turtle() # 거북이1
t2 = Turtle() # 거북이2
yamp = 100
rad = 0
y1 = yamp * math.sin(rad)
y2 = yamp * math.cos(rad)
# 초기 위치로 이동
t1.up(); t2.up() # 거북이가 지나가도 흔적이 남지 않도록 위로 올린다.
t1.goto(0, y1)
t2.goto(0, y2)
t1.down(); t2.down() # 다시 거북이 바닥으로..
# 그래프 그리기
for deg in range(0, 361, 10):
rad = math.radians(deg)
y1 = yamp * math.sin(rad)
y2 = yamp * math.cos(rad)
t1.goto(rad*50, y1) # 거북이1
t2.goto(rad*50, y2) # 거북이2
done()
\(sin(x) = \frac{sin(x)}{x}\)
# ex11.py
import math
from turtle import *
reset()
t1 = Turtle()
yamp = 100
xscale = 20
rad = 0
# 초기 위치로 이동
t1.up()
x = math.radians(math.degrees(-6*math.pi))
y = yamp * math.sin(x) / x
t1.goto(x*xscale,y)
t1.down()
# sinc 함수 그리기
for deg in range(int(math.degrees(-6*math.pi)), int(math.degrees(6*math.pi))+1, 10):
x = math.radians(deg)
if x == 0:
y = yamp
else:
y = yamp * math.sin(x) / x
t1.goto(x*xscale, y)
done()
s = '''We propose to start by making it possible to teach programming
in Python, an existing scripting language, and to focus on creating a
new development environment and teaching materials for it.'''
s.split( )을 하면 이 문자열이 단어 단위로 분리된 문자열 리스트를 얻게 된다. 이 리스트 에 저장된 단어들을 알파벳 순으로 정렬하고(sort 메서드 이용), 각 단어를 순서대로 하 나씩 출력해 보자. 집합 자료형을 이용한다.
s = '''We propose to start by making it possible to teach programming
in Python, an existing scripting language, and to focus on creating a
new development environment and teaching materials for it.'''
word_list = list(set(s.split()))
word_list.sort()
word_list
n = 1
while n < 20:
print(n, end=' ')
n += 2
n = 20
while n >= 0:
print(n, end=' ')
n -= 2
acc = 0
n = 1
while n < 100:
acc += n
n += 2
print(acc)
>>> for el in range(-10, 260):
exec('x = {0}'.format(el))
exec('y = {0}'.format(el))
print(el, x is y)
참고로 exec( ) 함수는 문자열로 표현된 파이썬 문을 실행한다.
>>> exec('a = 1')
>>> exec('a = a + 1')
>>> a
2
# -5 ~ 256 가지의 수치 객체는 1개가 공유된다.
for el in range(-10, 260):
exec('x = {0}'.format(el))
exec('y = {0}'.format(el))
print(el, x is y)