내 마음대로 공간

 

 

 

주피터 노트북

파이썬 코드를 대화형으로 편리하게 실행하는 도구

셀에서 단축키

  1. 실행 : shift + Enter
    1. 잘 실행되요.
      • 두번째 단락
  2. 줄바꿈은 : Enter
  3. 문장.......
In [1]:
x = 5.0
print(x)

print(x*2)
 
5.0
10.0
In [2]:
x
Out[2]:
5.0
In [3]:
# 출력하기
print("hello 파이썬")
 
hello 파이썬
 

파이썬 필수 문법

1. 변수 타입 확인

In [4]:
a = 5
type(a)
Out[4]:
int
In [5]:
a = "foo"
type(a)
Out[5]:
str
In [6]:
a = 4.5
type(a)
Out[6]:
float
 

2. 연산

In [7]:
# 연산은 동일한 타입끼리 해야 한다. 
a = 1
'5' + a
 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-cf388df7cb81> in <module>
      1 # 연산은 동일한 타입끼리 해야 한다.
      2 a = 1
----> 3 '5' + a

TypeError: can only concatenate str (not "int") to str
 

3. 변수 선언

  • 권장하지 않는 방식
    • a=5; b=6; c=7
  • 권장하는 방식
    • a, b, c = 5, 6, 7
In [8]:
# 가능
a = b = c = 5
In [9]:
c
Out[9]:
5
In [10]:
b
Out[10]:
5
In [11]:
a, b, c = 5
 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-86bbac0260b1> in <module>
----> 1 a, b, c = 5

TypeError: cannot unpack non-iterable int object
In [12]:
a,b,c = 5,5,5
 

4. 문자열의 사용

  • 멀티라인 문자열 사용 --> " 를 연속으로 3개 사용.
In [13]:
strContents = """303고지 학살(三百三高地虐殺, 영어: Hill 303 massacre)은 한국 전쟁 와중이었던 1950년 8월 17일에 대한민국 경상북도 칠곡군 왜관읍 근교의 자고산에서 조선인민군이 미군 전쟁 포로 41명을 총살한 전쟁 범죄이다.

대구 전투가 벌어지는 동안 미 육군 제1기병사단 제5기병연대 제2대대는 자고산에서 낙동강을 도하하는 인민군에게 포위되었다. 미군 병사 대부분은 탈출하였으나, 1개 박격포소대가 인민군을 국군의 증원군으로 착각하는 바람에 붙잡히고 말았다. 인민군은 미군 포로들을 고지에서 내려보내 낙동강을 도로 건너서 후방의 포로수용소로 보내려 했지만 다른 미군들의 공격이 거세어 실패했다. 미군은 인민군의 전진을 막아냈고, 인민군은 전장을 이탈하기 시작했다. 바로 그 때 인민군 장교 중 하나가 후퇴 속도가 느려지지 않도록 포로들을 총살하라고 명령했다.

미군 측 사령부는 인민군 사령부 측에 학살 행위의 책임을 물을 것을 요구하는 라디오 방송을 내보내고 삐라를 뿌렸다. 북측에서는 자기 쪽 병사가 포로로 잡혔을 경우의 보복을 걱정하여 병사들에게 포로 취급에 관하여 보다 엄격한 지침을 내려보냈다. 현재 자고산에는 피해자 추모비가 세워져 있다."""


print(strContents)
 
303고지 학살(三百三高地虐殺, 영어: Hill 303 massacre)은 한국 전쟁 와중이었던 1950년 8월 17일에 대한민국 경상북도 칠곡군 왜관읍 근교의 자고산에서 조선인민군이 미군 전쟁 포로 41명을 총살한 전쟁 범죄이다.

대구 전투가 벌어지는 동안 미 육군 제1기병사단 제5기병연대 제2대대는 자고산에서 낙동강을 도하하는 인민군에게 포위되었다. 미군 병사 대부분은 탈출하였으나, 1개 박격포소대가 인민군을 국군의 증원군으로 착각하는 바람에 붙잡히고 말았다. 인민군은 미군 포로들을 고지에서 내려보내 낙동강을 도로 건너서 후방의 포로수용소로 보내려 했지만 다른 미군들의 공격이 거세어 실패했다. 미군은 인민군의 전진을 막아냈고, 인민군은 전장을 이탈하기 시작했다. 바로 그 때 인민군 장교 중 하나가 후퇴 속도가 느려지지 않도록 포로들을 총살하라고 명령했다.

미군 측 사령부는 인민군 사령부 측에 학살 행위의 책임을 물을 것을 요구하는 라디오 방송을 내보내고 삐라를 뿌렸다. 북측에서는 자기 쪽 병사가 포로로 잡혔을 경우의 보복을 걱정하여 병사들에게 포로 취급에 관하여 보다 엄격한 지침을 내려보냈다. 현재 자고산에는 피해자 추모비가 세워져 있다.
 
  • 문자열 연산(더하기)
In [14]:
a = "파이썬"
b = "데이터 분석"
In [15]:
a + b
Out[15]:
'파이썬데이터 분석'
In [16]:
print(a+b)
 
파이썬데이터 분석
 
  • 소스 문자열과 출력 문자열의 차이점.
In [17]:
txt = " 첫 줄 \n 다음줄"
In [18]:
txt
Out[18]:
' 첫 줄 \n 다음줄'
In [19]:
print(txt)
 
 첫 줄 
 다음줄
 
  • 문자열 포멧
In [20]:
# 기본형식
"{0} {1}".format(a , b)
Out[20]:
'파이썬 데이터 분석'
In [22]:
# 숫자 포멧
"{0} {0:f} {0:.2f}".format(3)
Out[22]:
'3 3.000000  3.00'
In [23]:
# 천단위
"{0:,}".format(1234567890)
Out[23]:
'1,234,567,890'
 

포멧팅 연습

주어진 변수를 모두 활용해 다음과 같은 형식으로 출력.

변수명 : 이름, 트위터

출력형식 --> 이름 : 홍길동, 트위터 : @HongGildong
In [24]:
이름 = '홍길동'

트위터 = '@HongGildong'
In [25]:
프로필 = '이름: {0}, 트위터: {1}'.format(이름, 트위터)
print(프로필)
 
이름: 홍길동, 트위터: @HongGildong
 

부울린 값

In [26]:
# true를 int로 바꾸면.
int(True)
Out[26]:
1
In [27]:
int(False)
Out[27]:
0
In [29]:
# 공백을 부울린으로 바꾸면...
bool('')
Out[29]:
False
In [30]:
bool('ddd')
Out[30]:
True
 

자료 구조

 

리스트와 튜플

In [33]:
# 리스트
로또 = [1,2,3,6,21,45,51]
In [34]:
type(로또)
Out[34]:
list
In [35]:
## 튜플
로또 = (1,2,3,6,21,45,51)
In [36]:
type(로또)
Out[36]:
tuple
 

튜플

  • 튜플의 연산
In [37]:
# 튜플 + 튜플
(1,2) + (3,4)
Out[37]:
(1, 2, 3, 4)
In [38]:
# 문자열 + 문자열
"12" + "34"
Out[38]:
'1234'
In [39]:
# 튜플의 곱하기
(1,2) * 3
Out[39]:
(1, 2, 1, 2, 1, 2)
In [40]:
# 문자열의 곱하기 
"파이썬" * 3
Out[40]:
'파이썬파이썬파이썬'
In [43]:
로또[3]
Out[43]:
6
In [45]:
# 튜플은 값을 바꿀수 없다. 
로또[3] = 8
 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-45-d3a9c85cf931> in <module>
      1 # 튜플은 값을 바꿀수 없다.
----> 2 로또[3] = 8

TypeError: 'tuple' object does not support item assignment
 

풀기(Unpacking)

  • 리스트 형태의 자료를 개별적인 값으로 분리하는 것.
In [41]:
nums = (1,2,3)
In [42]:
a, b, c = nums
In [44]:
# a, b, c = nums 의 결과는 아래와 같다. 
a = nums[0]
b = nums[1]
c = nums[2]
 

리스트 : list

In [46]:
# 리스트의 선언
nums = [1,2,3,4]
# 타입
type(nums)
Out[46]:
list
In [47]:
# 색인으로 가져오기
nums[3]
Out[47]:
4
In [48]:
# 리스트에서 값의 추가 
nums.append(5)
nums
Out[48]:
[1, 2, 3, 4, 5]
In [50]:
# 변경
nums[0] = 99
nums
Out[50]:
[99, 2, 3, 4, 5]
In [51]:
# 마지막 항목 제거
val = nums.pop()
val
Out[51]:
5
In [52]:
nums
Out[52]:
[99, 2, 3, 4]
In [53]:
#  연산
lst = [1,2] + [3,4]
lst
Out[53]:
[1, 2, 3, 4]
In [54]:
# in 연산자. --> a in b 
## : a가 b에 있는지 여부를 리턴.
5 in nums
Out[54]:
False
In [55]:
99 in nums
Out[55]:
True
 

세트(set)

: 유일한 원소만 담는 자료형

 
  • 선언
In [1]:
set([1,2,2,3,2,4,5,4,5])
Out[1]:
{1, 2, 3, 4, 5}
In [2]:
{2,2,2,1,3,3}
Out[2]:
{1, 2, 3}
In [3]:
{'다','가', '나', '다'}
Out[3]:
{'가', '나', '다'}
 

집합

In [5]:
## 집합 
a = {0,1,2,4,5}
b = {3,4,5,7,8}
In [6]:
## 합집합.
c = a|b
c
Out[6]:
{0, 1, 2, 3, 4, 5, 7, 8}
In [7]:
# 교집합
a&b
Out[7]:
{4, 5}
In [8]:
## 차집합
a-b
Out[8]:
{0, 1, 2}
In [9]:
## 대칭차집합(xor) : 중복 원소만 제거
a^b
Out[9]:
{0, 1, 2, 3, 7, 8}
 

슬라이스

슬라이스의 개요 / 사용방법

  • 리스트, 튜플, 셋트 등과 같은 자료구조에서 항목을 멀티(범위)로 선택하는 것
In [10]:
# list 선언
nums = [1,2,3,4,5,6,7,8,9]
In [12]:
# index가 0~2까지인 데이터를 선택 : a:b  --> a <= 고 <b 은 인덱스를 가져온다.
nums[0:2]
Out[12]:
[1, 2]
In [13]:
nums[3:7]
Out[13]:
[4, 5, 6, 7]
In [14]:
# 2 색인분 끝까지 
nums[2:]
Out[14]:
[3, 4, 5, 6, 7, 8, 9]
In [19]:
# 끝에서 2번째 항목부터 끝까지.
nums[-2:]
Out[19]:
[8, 9]
In [22]:
# 슬라이스에 인덱스 범위가 벗어나는 경우. 
nums[2:100]
Out[22]:
[3, 4, 5, 6, 7, 8, 9]
In [23]:
# 색인은????
nums[20]
 
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-23-6e3b2a0f6da5> in <module>
      1 # 색인은????
----> 2 nums[20]

IndexError: list index out of range
 

슬라이스 연습

다음 문자열에서 1부터 8까지 선택

숫자들 = '0123456789'

nums = [0,1,2,3,4,5,6,7,8,9]

  1. 1부터 8까지 선택
  2. 두번째 색인에서 끝에서 첫번째 항목 이전 까지.
  3. 자료구조의 길이는?
In [24]:
숫자들 = '0123456789'
nums = [0,1,2,3,4,5,6,7,8,9]
In [25]:
숫자들[1:-1]
Out[25]:
'12345678'
In [26]:
nums[1:-1]
Out[26]:
[1, 2, 3, 4, 5, 6, 7, 8]
In [28]:
nums[1:9]
Out[28]:
[1, 2, 3, 4, 5, 6, 7, 8]
In [29]:
## 자료구조의 길이
len(숫자들)
Out[29]:
10
In [30]:
len(nums)
Out[30]:
10
 

사전(dict)

In [31]:
## 사전은 이름:값 쌍으로 이루어지는 자료구조이다. 
프로필 = {"이름" : "홍길동" , "트위트" : "@Honggildong"}
In [32]:
type(프로필)
Out[32]:
dict
In [33]:
# 사전은 색인으로 값을 찾을 수 없다. 
# 색인으로 값을 찾는 경우 에러 발생
프로필[0]
 
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-33-8913270be6b3> in <module>
      1 # 사전은 색인으로 값을 찾을 수 없다.
      2 # 색인으로 값을 찾는 경우 에러 발생
----> 3 프로필[0]

KeyError: 0
In [34]:
프로필["트위트"]
Out[34]:
'@Honggildong'
In [35]:
# 사전에 존재하지 않는 이름으로 값을 설정하면 새로 추가가 된다. 
프로필['이메일'] = 'stonwin@korea.com'
In [36]:
프로필
Out[36]:
{'이름': '홍길동', '트위트': '@Honggildong', '이메일': 'stonwin@korea.com'}
In [37]:
# in 연산자 --> 이름 이 있는지 여부를 확인 가능
'이름' in 프로필
Out[37]:
True
In [38]:
# 사전의 get 함수(이름, 기본값) --> 사전에서 찾는 이름이 없으면 두번째 인자가 리턴된다. 
프로필.get('이메일', '없음')
Out[38]:
'stonwin@korea.com'
In [39]:
프로필.get('전화번호', '없음')
Out[39]:
'없음'
In [40]:
# items() 함수 : 사전의 이터레이터(Iterator)를 반환: 각 항목은 이름, 값 형식으로 반환.
프로필.items()
Out[40]:
dict_items([('이름', '홍길동'), ('트위트', '@Honggildong'), ('이메일', 'stonwin@korea.com')])
In [41]:
# items 사용한 for 문
for 키, 값 in 프로필.items():
    양식 = "{0}은 {1} 입니다."
    출력 = 양식.format(키, 값)
    print(출력)
menu = {"라떼":100, "모카":200}
menu
 
이름은 홍길동 입니다.
트위트은 @Honggildong 입니다.
이메일은 stonwin@korea.com 입니다.
Out[41]:
{'라떼': 100, '모카': 200}
 

정렬

In [43]:
nums = [0, 99, 11, 1, 2, 55, 3, 4, 5, 21, 8, 9]
In [44]:
## 정렬
sortnums = sorted(nums)
sortnums
Out[44]:
[0, 1, 2, 3, 4, 5, 8, 9, 11, 21, 55, 99]
In [45]:
nums
Out[45]:
[0, 99, 11, 1, 2, 55, 3, 4, 5, 21, 8, 9]
In [48]:
txt = "파이썬 안녕하세요"
In [51]:
sorted(txt, reverse=True)
Out[51]:
['하', '파', '이', '요', '안', '썬', '세', '녕', ' ']
In [50]:
# 도움말을 볼때는 끝에 물음표. sorted?
In [53]:
# 현재 자료구조의 역순으로 배치 : 메모리 최적화로 인해 바로 리스트화 되지 않는다. 
revText = reversed(txt)
revText
Out[53]:
<reversed at 0x1ccbcfe5ba8>
In [54]:
list(revText)
Out[54]:
['요', '세', '하', '녕', '안', ' ', '썬', '이', '파']
 

zip : 여러개의 리스트나 튜플을 짝지어 튜플 리스트 생성

In [64]:
text = '핫둘셋넷'
nums = [2,1,4,3]
arrInt = (3,1,4,2)
In [65]:
tmp = zip(nums, text)
In [66]:
tmp
Out[66]:
<zip at 0x1ccbd005d08>
In [67]:
두쌍 = list(tmp)
두쌍
Out[67]:
[(2, '핫'), (1, '둘'), (4, '셋'), (3, '넷')]
In [68]:
for a, b in 두쌍:
    print("{0} : {1}".format(a, b))
 
2 : 핫
1 : 둘
4 : 셋
3 : 넷
In [69]:
사전 = {}
for i, t in 두쌍:
    사전[str(i)] = t
사전
Out[69]:
{'2': '핫', '1': '둘', '4': '셋', '3': '넷'}
 

제어 구문

  1. Python은 들여쓰기를 통해 블럭을 구분하므로 들여쓰기에 주의해야 한다.
 

조건문

In [74]:
# if 조건
x = 1
if x < 0:
    msg = '음수'
elif x == 0:
    msg = '빵!'    
else:
    msg = '양수'
    
print(msg)
 
양수
 

반복문

In [75]:
# for 반복문
for n in [1,2,3]:
    n2 = n+1
    print(n2)
print('반복끝')
 
2
3
4
반복끝
In [76]:
# while 반복문
물 = 0
while 물 < 500:
    물 += 100
print(물)    
 
500
 

range

In [77]:
for n in [1,2,3,4,5,6,7,8,9,10]:
    n2 = n+1
    print(n2)
 
2
3
4
5
6
7
8
9
10
11
In [79]:
for _ in range(10):
    print(_ + 1)
 
1
2
3
4
5
6
7
8
9
10
In [ ]:
# range는 선언시점에 메모리에 할당되지 않는다. range변수 하나를 선언한것과 동일한 메모리 공간을 차지 한다. 
range(10)
In [80]:
# range의 리스트화 
list(range(10))
# --> 10개의 항목을 가진 리스트 생성.
Out[80]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [81]:
## 1억개의 레인지 생성 --> 변수 1개 생성과 동일.
range(10**8)
Out[81]:
range(0, 100000000)
 

함수

  1. def 예약어로 정의 한다.
  2. return 예약어를 사용해서 값을 반환 한다.
  3. 여러 값을 반환 할 수 있다. (실제로는 하나의 값이나 튜플 형식을 취하면서 여러개를 반환)
 

기본함수 만들기

In [82]:
def 홀짝(숫자):
    if 숫자 % 2 == 1:
        return "홀수"
    else:
        return "짝수"
In [83]:
홀짝(7)
Out[83]:
'홀수'
In [84]:
홀짝(10)
Out[84]:
'짝수'
In [85]:
# nums의 각 항목을 홀짝 판정.
판정 = {}
for n in nums:
    판정[str(n)] = 홀짝(n)
판정    
Out[85]:
{'2': '짝수', '1': '홀수', '4': '짝수', '3': '홀수'}
 

함수에서 값 리턴

리턴은 단일 값만 가능하지만 리턴 타입에 따러 여러값이 리턴가능 하다.

In [87]:
def 주문하기(메뉴):
    메뉴판 = {"라떼":100}
    가격 = 메뉴판.get(메뉴, -1)
    return 메뉴, 가격
In [88]:
주문하기("라떼")
Out[88]:
('라떼', 100)
In [89]:
주문하기("주스")
Out[89]:
('주스', -1)
In [90]:
메뉴, 가격 = 주문하기("라떼")
In [91]:
메뉴
Out[91]:
'라떼'
 

매개변수 기본값 지정

In [92]:
# 매개변수에 기본 값 지정하기 : 기본값이 지정된 인자는 생략하거나 입력하거나 할 수 있다. 
def 내함수(x,y,z=1.5):
    if z > 1:
        print(z*(x+y))
    else:
        print(z/(x+y))
    
In [93]:
내함수(5,6)
 
16.5
In [94]:
내함수(5,6,7)
 
77
In [95]:
def 지역함수():
    a = []
    for i in range(5):
        a.append(i)
    print(a) 
In [99]:
지역함수()
 
[0, 1, 2, 3, 4]
In [97]:
# 함수 안에서 전역변수에 값 대입 ????
a = []
def 지역함수2():    
    for i in range(5):
        a.append(i)
    print(a)
In [98]:
지역함수2()
 
[0, 1, 2, 3, 4]
In [101]:
지역함수2()
 
[0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
 

익명함수

  • 이름이 없는 함수
  • 1회성으로 사용되는 함수
  • lambda 키워드로 시작
In [103]:
## 익명함수 : lambda 함수
def 간단함수(x):
    return x*2
In [104]:
간단함수(3)
Out[104]:
6
In [105]:
익명함수 = lambda x: x*2
In [106]:
익명함수(3)
Out[106]:
6
In [107]:
# 위 함수는 아래와 동일한 코드이다. 
def to_listfun2(sum_list, f):
    lt= []
    for x in sum_list:
        lt.append(f(x))
    return lt

# 람다함수는 어떻게 사용 ?  --> 함수에서 함수를 인자로 받을 필요가 있는 경우 : 나중에 pandas 등의 활용시 그룹함수등에서 많이 사용.
def to_listfun(sum_list, f):
    return [f(x) for x in sum_list]

lst = [4, 6, 0, 5, 1, 9]
In [108]:
## 지정된 리스트의 각각의 원소 값을 두배로 계산해서 반환하세요. 
to_listfun(lst, 간단함수)
Out[108]:
[8, 12, 0, 10, 2, 18]
In [109]:
## 지정된 리스트의 각각의 원소 값을 1.5배로 계산해서 반환하세요. 
to_listfun(lst, lambda x: x*1.5)
Out[109]:
[6.0, 9.0, 0.0, 7.5, 1.5, 13.5]
In [110]:
## 지정된 리스트의 각각의 원소 값을 1.5배 한뒤 +1을 계산해서 반환하세요. 
to_listfun(lst, lambda x: x*1.5 + 1)
Out[110]:
[7.0, 10.0, 1.0, 8.5, 2.5, 14.5]
In [111]:
to_listfun(lst, lambda x: x>4)
Out[111]:
[False, True, False, True, False, True]
 

메인 함수

  • 일반적인 프로그래밍에서의 main 함수와 동일한 개념.
  • 교육과정에서는 다루지 안는다.
In [112]:
if __name__ == "__main__":
    print("main")
 
main
In [ ]:
 
728x90

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading