3. 연산자

 

3.1 산술 연산자


연산자

설명

+

덧셈

-

뺄셈

*

곱셈

**

거듭제곱

/

나눗셈

//

나눗셈의

%

나눗셈의 나머지

 

 

+ (덧셈)


숫자와 문자 구분 없이 두개의 객체를 더합니다.

>>> # (+) 덧셈

... # 숫자

... 10 + 20

30

>>> # 문자

... 'abcd' + 'efgh'

'abcdefgh'

 

 

 

- (뺄셈)


숫자에서 숫자를 뺍니다.

>>>  # - (뺄셈)

... 10 - 5

5

>>> 20.7 - 10.2

10.5

 

* (곱셈)


두 숫자를 곱하기 연상을 하고 문자인 경우 숫자만큼 반복 합니다.

>>> # * (곱셈)

... 2 * 3

6

>>> 'abc ' * 3

'abc abc abc '

 

 

** (거듭제곱)


숫자에 지수연산을 합니다.

>>> # ** (거듭제곱)

... 3 ** 3

27

>>> 3 * 3 * 3

27

 

/ (나눗셈)


두 수를 나눕니다정수로 표현 하려면 정수변환을 해야 합니다.

>>>  # / (나눗셈)

... 13 / 3

4.333333333333333

>>> 13.0 / 3

4.333333333333333

>>> a = 13/3

>>> print(a)

4.333333333333333

>>> print(int(a))

4

 

// (나눗셈의 몫)


나눗셈의 몫을 구하는 식을 사용 하는 경우 양의 수에만 사용하여야 합니다음의 수의 경우 원하는 결과와 다른 값을 얻을 수 있습니다그 이유는 몫을 구할 때 좌측에 가까운 정수를 가져오기 때문입니다.

>>> # (//) 나눗셈의 몫

... 13 // 3

4

>>> 13.0 // 3

4.0

>>> -13 // 3

-5

>>> -13.0 // 3

-5.0

>>> divmod(-13, 3)

(-5, 2)

>>> divmod(13, 3)

(4, 1)

>>> abs(-13.0) // 3

4.0

 

0을 기준으로 보았을 때 양의 수는 우측으로 커지고 4.3333의 좌측에 있는 정수는 4입니다.

0을 기준으로 보았을 때 음의 수는 좌측으로 커지고 -4.3333의 좌측에 있는 정수는 -5입니다.

목과 나머지를 구하는 이유는 몇번 나눌 수 있는가, 몇이 남는가 이기 때문에 절대값으로 계산을 하는게 정답입니다.

 

% (나머지)


나눗셈의 나머지 값을 구합니다.

>>> # % (나머지)

... 13 % 3

1

>>> 13.0 % 3

1.0

>>> abs(-13.0) % 3

1.0

 

python study

 


3.2 비교 연산자


True () 또는 False (거짓)의 반환 값을 구하는 연산자로 첫 글자는 대문자 입니다.

연산자

설명

작음

<=

작거나 같음

>=

크거나 같음

<> 

 

==

같음

!=

같지 않음

 

< (작음)


(x < y) : x y보다 작은지 여부를 반환합니다.

>>> # < (작음)

... 5 < 7

True

>>> 7 < 5

False

>>> 'a' < 'b'

True

>>> 'azzz' < 'b'

True

>>> 'b' < 'azzzz'

False

>>> 'b' < 'A'

False

>>> 'a' < 'Z'

False

>>> 'z' < 'A'

False

>>> 'a' < 'A'

False

>>> 'A' < 'a'

True

 

다음과 같이 여러 숫자와 문자에 대해 한꺼번에 비교 연산을 수행할 수 있습니다. 숫자와 문자 비교는 오류가 발생 합니다.

>>> 2 < 3 < 4 < 5

True

>>> 2 < 4 < 3 < 5

False

>>> 'A' < 'b' < 'C'

False

>>> 'A' < 'C' < 'b'

True

 

> ()


(x < y) : x y보다 작은지 여부를 반환합니다.

>>> # > ()

... 5 > 7

False

>>> 7 > 5

True

>>> 'a' > 'b'

False

>>> 'azzz' > 'b'

False

>>> 'b' > 'A'

True

>>> 'a' > 'Z'

True

>>> 'a' > 'A'

True

 

여러개 비교

>>> 5 > 4 > 3 > 2

True

>>> 'c' > 'b' > 'a'

True

>>> 'a' > 'Z' > 'A'

True

 

<= (작거나 같음)


(x <= y) : x y 보다 작거나 같은지 여부를 반환합니다.

<= 기호를 띄어쓰기 하면 오류가 발생 합니다.

>>> # <= (작거나 같음)

... x = 10

>>> y = 20

>>> x < = y

  File "<stdin>", line 1

    x < = y

        ^

SyntaxError: invalid syntax

>>> x <= y

True

 

>= (크거나 같음)


(x >= y) : x y 보다 크거나 같은지 여부를 반환합니다.

>>> # >= (크거나 같음)

... x = 10

>>> y = 20

>>> x >= y

False

>>> x = 'b'

>>> y = 'a'

>>> x >= y

True

 

== (같음)


(x == y) : x, y 두 객체가 같은지 여부를 반환합니다.

>>> # == (같음)

... x = 10

>>> y = 10

>>> x == y

True

>>> x = 'a'

>>> y = 'b'

>>> x == y

False

>>> x = 'aaa'

>>> y = 'aAa'

>>> x == y

False

 

!= (같지 않음)


(x != y) : x, y 두 객체가 같지 않은지 여부를 반환합니다.

>>> # != (같지 않음)

... x = 'aaa'

>>> y = 'aAa'

>>> x != y

True

>>> x = 10

>>> y = 100

>>> x != y

True

 

 

3.3 부울 연산자


연산자

수식

결과

and

True and True

True

True and False

False

False and False

False

or

True or True

True

True or False

True

False or False

False

not

not True

False

not False

True

 

and


(x and y) : xy가 모두 True인 경우에만 True 이고 둘중 하나 또는 둘다 False이면 False를 반환 합니다.

>>> # and

... True and True

True

>>> (3 == 3) and (7 ==7)

True

>>> True and False

False

>>> (3 == 3) and (7 == 8)

False

>>> False and False

False

>>> (3 == 4) and (7 == 8)

False

 

or


(x and y) : xy가 모두 False인 경우에만 False이고 둘 또는 하나만 True이어도 True를 반환합니다.

>>> # or

... True or True

True

>>> (3 == 3) or (7 == 7)

True

>>> True or False

True

>>> (3 == 3) or (7 == 8)

True

>>> False or False

False

>>> (3 == 4) or (7 == 8)

False

 

not


x True 이면 반대 값인 False 를 반환하고 x False 이면 반대 값인 True를 반환합니다.

>>> # not

... not True

False

>>> not (3 == 3)

False

>>> not False

True

>>> not (7 == 8)

True

 


3.4 비트 연산자

 

연산자

설명

<< 

왼쪽 시프트 연산자, 변수 값을 지정된 비트 만큼 좌측 이동

>> 

오른쪽 시프트 연산자, 변수 값을 지정된 비트 만큼 우측 이동

&

AND 연산자, 둘다 참인 경우 True

|

OR 연산자, 둘중 하나만 참이어도 True

^

XOR 연산자, 둘중 하나만 참이어야 True

~

반전 연산자, 참이면 False, 거짓이면 True

 

<< (왼쪽 시프트)


지정된 숫자에 대해 지정된 비트 수 만큼 왼쪽으로 시프트 연산을 진행 합니다비트가 상위로 올라가며 숫자가 커집니다.

5 << 2 : 5(0000 0101)2비트 좌측으로 이동하여 20(0001 0100)이 됩니다.

2 << 3 : 2(0010)를 왼쪽으로 3비트 시프트 하여 16(0001 0000)이 됩니다.

>>> # << (왼쪽 시프트)

... 5 << 2

20

>>> 2 << 3

16

 

>> (오른쪽 시프트)


지정된 숫자에 대해 지정된 비트 수 만큼 오른쪽으로 시프트 연산을 진행 합니다비트가 우측으로 이동 하면서 첫째 자리를 넘어가는 비트는 삭제가 되어 숫자가 작아집니다.

5 >> 2 : 5(0101)2비트 우측으로 이동하여 1(0001)이 됩니다.

54 >> 3 : 54(0011 0101)을 오른쪽으로 3비트 시프트 연산하여 6(0110)이 됩니다.

>>> # >> (오른쪽 시프트)

... 5 >> 2

1

>>> 54 >> 3

6

 

& (비트 AND 연산자)


(x & y) : x y에 대하여 각각의 자리수에 있는 비트에 대해 AND 연산을 진행 합니다각 자리수별 비트 값이 1인 경우에만 1이 되고 나머지는 0으로 처리합니다.

(1101) 13 &

(1010) 10

(1000) 8을 반환합니다. 1310의 자리수 별 비트 값이 모두 1인 부분만 제외하고 0이 됩니다.

>>> # & (비트 AND 연산자)

... 13 & 10

8

 

 

| (비트 OR 연산자)


(x & y) : x y에 대하여 각각의 자리수에 있는 비트에 대해 OR 연산을 진행 합니다각 자리수별 비트 값이 0인 경우에만 0이 되고 나머지는 1으로 처리합니다.

(1101) 13 |

(1010) 10

(1111) 15를 반환합니다. 1310의 자리수 별 비트 값이 하나라도 1이면 1로 됩니다.

>>> # | (비트 OR 연산자)

... 13 | 10

15

 

 

^ (비트 XOR 연산자)


(x & y) : x y에 대하여 각각의 자리수에 있는 비트에 대해 XOR 연산을 진행 합니다각 자리수 별 비트 값이 하나만 1인 경우에 1이 되고 나머지는 0으로 처리합니다.

 

(1101) 13 ^

(1010) 10

(0111) 7을 반환합니다. 1310의 자리수 별 비트 값중 하나만 1이면 1로 됩니다.

>>> # ^ (비트 XOR 연산자)

>>> 13 ^ 10

7

 

 

~ (비트 반전 연산자)


진정수에 사용하고 –( x + 1)으로 정의 된다고 Python document에 나와 있습니다.

The bitwise inversion of x is defined as -(x+1). It only applies to integral numbers.

보이는 숫자만 보면 안되고 데이터를 처리하는 단위(32, 64bit)로 나머지도 변경이 됩니다.

(1101) 13

000000000000000000000000000000000000000000000000000000000000(1101) 13

111111111111111111111111111111111111111111111111111111111111(0010) -14

 

>>> # ~ (비트 반전 연산자)

... ~13

-14

 

- copy coding - 

 

2. 데이터 형, 변수

 

2.1 숫자형

 

2.1.1 Integer


Python에서 int 일반적으로 알고 있는 정수로 사용되지 않습니다.  int란 소숫점 이하의 값이 없음을 말하는 것이 아니라 소숫점 자체가 존재 하지 않는 뜻 입니다또한 파이썬에는 long형의 자료형이 존재 하지 않고 int로 값을 표현 합니다.

소숫점 이하의 값은 버림을 하고 조건을 int 로 변경할 수 있습니다.

 

print(type(1), type(1000000), type(9999999999999999999999999999999999999999999999), sep='/')
print(int(1), int(30.0), int(-34.5), int(7777777.9999999), sep='/')
print(int(1==1), int(1 < 0), int(True), int(False), sep='/')


 결과

 <class 'int'>/<class 'int'>/<class 'int'>

 1/30/-34/7777777

 1/0/1/0

 <class 'float'>/<class 'float'>/<class 'float'>/<class 'float'>/<class 'float'>


python study


2.1.2 Float


Python에서 float는 숫자에 소숫점이 존재 하는 경우를 말하며 소숫점 이하에 값이 있고 없고는 관계 없습니다.

int 형 값은 float형으로 변환 하고 조건 값도 float 형으로 변환 합니다.


print(type(3333.3333), type(0.0), type(2e-10), type(3.0), type(4.), sep='/')
print(float(1), float(30), float(-34), float(7777777), sep='/')
print(float(1==1), float(1 < 0), float(True), float(False), sep='/')


 결과

 <class 'float'>/<class 'float'>/<class 'float'>/<class 'float'>/<class 'float'>

 1.0/30.0/-34.0/7777777.0

 1.0/0.0/1.0/0.0

 

2.2 문자, 문자열(str)

 

파이썬에서 문자는 str로 정의 합니다.

 

print(type('a'), type('I am a boy!'), type('-34.5'), type('7777777.9999999'), sep='/')


 결과

 <class 'str'>/<class 'str'>/<class 'str'>/<class 'str'>

 

2.2.1 작은 따옴표


문자열을 작은 따옴표로 묶어서 표현합니다.


txt1 = '문자열을 작은 따옴표로 묶었습니다.'
print(txt1)
print('문자열을 작은 따옴표로 묶었습니다.')


 결과 

 문자열을 작은 따옴표로 묶었습니다.

 문자열을 작은 따옴표로 묶었습니다.

 

2.2.2 큰 따옴표


작은 따옴표와 동일하게 사용됩니다.

작은 따옴표도 포함해서 사용이 가능 합니다.


txt2 = "문자열 큰따옴표 안에  '작은' 따옴표가 있습니다."
print(txt2)
print("문자열 큰따옴표 안에  '작은' 따옴표가 있습니다."


 결과 

 문자열 큰따옴표 안에  '작은따옴표가 있습니다.

 문자열 큰따옴표 안에  '작은따옴표가 있습니다.


2.2.3 따옴표 세게 (“”” 또는 ‘’’)


긴 주석이 필요한 경우에 사용 합니다.

따옴표 세개로 묶은 문자열 안에서는 작은 따옴표와 큰 따옴표를 마음대로 사용할 수 있습니다.


"""
시작과 끝을 따옴표로 마크하여 아무 글이나 편안하게 써도 됩니다.
Its fine.
▒◀◁◆◈◎★☎☜〈》』】〔
ぁぇぉきけこさとずねづサシセラャヮ
★㎱㎳㎪薙蕞햰ÚÅöåⓙⓖが♧♥♣☎ボ㈅ㆃㆃ
"""

 

2.2.4 문자열 Format


format을 사용하여 문자열의 일부를 상황에 따라 다른 문자로 대체할 수 있습니다.

개인별 맞춤 메일, 공지, 안내, 경고 등에 사용 할 수 있습니다.

 

user_name = "홍길동"
user_name2 = "강감찬"
count = 10

print('{}회원님은 {}번째 로그인 하셨습니다.'.format(user_name, count))
print('{2}회원님은 {1}번째 로그인 하셨습니다'.format(user_name, count, user_name2))

 

 결과 

 홍길동회원님은 10번째 로그인 하셨습니다.

 강감찬회원님은 10번째 로그인 하셨습니다

 

2.2.5 특수 문자


특수 문자는 역슬래시(\)를 사용해서 입력 가능 합니다.

- 작은 따옴표, 큰 따옴표 하나를 입력 하는 경우 : \’, \”

- 역슬래시를 하나 입력하는 경우 : \\

- (tab)을 입력 하는 경우 : 시작\t

- 줄바꿈 하는 경우: \n (이 문장을 출력 하고\n다음줄에 이 문장이 나옵니다.)

- 문장 또는 명령어가 길 경우 이어 쓰기를 위해 끝에 추가 합니다   

print('- 작은 따옴표, 큰 따옴표 하나를 입력 하는 경우 : \', \"')
print('- 역슬래시를 하나 입력하는 경우 : \\')
print('- (tab)을 입력 하는 경우 : 시작\t')
print('- 줄바꿈 하는 경우: \n (이 문장을 출력 하고\n다음줄에 이 문장이 나옵니다.)')
txt3 =
'이 문장은 끝난게 아니고 \
여기 이 문장까지가 끝입니다.'
print(txt3)
sum1 =
3 + 3 \
       +
4 + 4
print(sum1)
txt4 =
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaa' \
     
'bbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
print(txt4)

 결과 

 작은 따옴표큰 따옴표 하나를 입력 하는 경우 : ', "

 - 역슬래시를 하나 입력하는 경우 : \

 - (tab)을 입력 하는 경우 : 시작  

 - 줄바꿈 하는 경우:

 (이 문장을 출력 하고

 다음줄에 이 문장이 나옵니다.)

 이 문장은 끝난게 아니고 여기 이 문장까지가 끝입니다.

 14

 aaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbb

 

 

2.3 변수

 

프로그램 중간에 값을 담아둘 수 있는 공간을 위한 변수를 만들 수 있습니다.

변수의 생성 규칙은

- 알파벳 대소문자, 대소문자를 사용 할 수 있으며 대소문자가 구분됩니다.

- 숫자(0~9)를 사용할 수 있습니다.

- 밑줄(_)문자를 사용할 수 있습니다.

- 변수의 시작 첫 문자는 알파벳이나 밑줄로 시작하며 숫자는 오류 발생합니다.

 

 aValue7 = 30
 AValue7 = 60
 _AValue7 = 90
 print(aValue7, AValue7, _AValue7, sep=',')


 결과

 30,60,90

 

 7AValue = 120

 

 결과 

 7AValue = 120

          ^

 SyntaxError: invalid syntax


- copy coding -


Python을 학습하기 위해 파이썬을 꼭 설치할 필요는 없습니다. 파이썬 사이트에서는 online console을 제공하여 웹브라우저에서 테스트가 가능합니다몇일전 ‘Python 기초학습 1’을 올리려고 할때 이 기능이 없어져서 삭제한줄 알았는데 오늘은 또 나타났습니다아마 버전업을 했거나 내부 작업이 있었던듯 하네요다시 수정해서 올리는데 또 사라지면 내가 거짓말쟁이가 되는데...


python_online_console

사용법은 노란색 네모 버튼을 클릭 하면 잠시후 콘솔 창으로 변합니다그럼 그곳에서 코딩을 하거나 다른곳에서 코딩하고 복사를 해도 됩니다.


python_online_console


python study

 

1. 기초


1.1 주석


- # 이후의 문장

- 예외 : 문자 인코딩

# 문자로 시작되는 문장은 주석으로 인식 합니다.

위치는 관계 없고 # 이후의 문장은 모두 주석으로 인식 됩니다.

a = 1
b = 2
c = a + b  # a 더하기 b의 값을 c에 저장 합니다.
#
여기에 기입된 문자는 주석 입니다.
print(c)


 결과

 3

 

 

1.2 인코딩


#으로 시작 되어도 프로그램 상단에 있는 인코딩은 주석이 아닙니다.

#-*- coding: utf-8 -*-

 

#-*- coding: euc-kr -*-

 

1.3 세미 콜론(;)


명령 행의 끝을 나타내기 위해 세미 콜론(;)을 사용하거나 하지 않거나 동일한 결과가 나옵니다.

print ('use semicolon test')
print ('use semicolon test');

 결과 

 use semicolon test

 use semicolon test

 

위의 명령은 동일한 결과가 나오지만 세미콜론 사용은 권장하지 않습니다.

세미 콜론을 이용하여 두개의 명령어를 연결해서 작업할 수도 있지만 이것도 권장하지 않습니다.

 

cnt = 10; print (cnt)

 결과 

 10


한 줄에 하나의 명령만 사용하길 권장하고 모두 그렇게 사용 하고 있어 세미콜론이 들어가면 다른 개발자에게 오히려 혼란을 줄 수 있습니다.

 

1.4 print


- print 명령으로 출력을 하면 자동 줄바꿈 됩니다.

print('문자 출력 테스트 하기')
print('문자 출력 ')
print('테스트 하기')

 결과 

 문자 출력 테스트 하기

 문자 출력

 테스트 하기


 

- 숫자, Boolean 등도 출력이 가능 합니다.


print(3, 3.333, 0.33333, 2e10, 2e-7)
print(3 + 2, 3.7 * 4, 3 < 4, False, True, 1 == 0)


 결과 

 3 3.333 0.33333 20000000000.0 2e-07

 5 14.8 True False True False

 

- 출력에 구분자를 넣어서 출력이 가능 합니다.

 

print(3, 3.333, 0.33333, 2e10, 2e-7, sep=',')
print(3 + 2, 3.7 * 4, 3 < 4, False, True, 1 == 0, sep='/')


 결과 

 3,3.333,0.33333,20000000000.0,2e-07

 5/14.8/True/False/True/False


문장의 끝을 변경 할 수 있습니다.

 

print('문자 출력 ', end='')
print('테스트 하기')

print('문자 출력 ', end=' 여기에 ')
print('테스트 하기')


 결과

 문자 출력 테스트 하기

 문자 출력  여기에 테스트 하기

 

1.5 들여쓰기


한줄로 명령이 종료되는 경우 다음 줄에 들여쓰기를 하면 오류가 발생 합니다.

조건문, 반복문 같이 다음에 명령이 종속되는 경우만 들여쓰기를 사용 합니다.


if(1==1):
   
print('1 = 1')
else:
   
print('! != 1')


 결과 

 1 = 1


- copy coding -


전에 설명했던 숫자 이미지 하나 불러와서 숫자 맞추기를 이용하여 이번에는 직접 손으로 쓴 숫자를 이미지를 사용하여 맞추기를 해보겠습니다이미지를 만드는게 귀찮았는데 오늘은 시간이 좀 남아서 시도해 보았습니다.

 

1. 숫자 이미지 만들기

2. 디렉토리 생성

3. 코딩

4. 결과

5. 전체 소스

 


1. 숫자 이미지 만들기

 

숫자 이미지는 이미지 편집 프로그램이 없다면 윈도우즈 보조프로그램에 기본적으로 들어있는 그림판을 이용해서 만들면 됩니다.


tensorflow_mnist


그림판에 마우스를 이용해서 3을 써보았습니다. 좀 덜덜거리며 씌여졌지만 처음 한번 쓴걸 사용하기로 했습니다숫자를 적었으니 저장을 합니다.

 

파일 > 다른 이름으로 저장 > PNG


물론 다른 이미지로 저장을 해도 됩니다그럼 불러올 때 그에 맞추어서 소스를 수정해 사용하시면 되고요.


tensorflow_mnist


tensorflow_model03.png로 저장을 했습니다

tensorflow_mnist


2. 디렉토리 생성

 

손으로 작성한 숫자 이미지를 저장할 위치를 만들었습니다그리고 숫자 이미지는 number 디렉토리로 이동을 했습니다전에 테스트 했던 9도 아직 삭제를 안해서 같이 있네요.


tensorflow_mnist



3. 코딩

 

처음에 나오는 부분은 전에 설명했던 부분이고 이미지를 불러오는 부분부터 변경이 되었습니다기존에는 이미지 사이즈가 테스트 하기에 적당한 크기 였지만 이번에는 사이즈를 조정해야 해서 변경을 하였습니다.

 

이미지를 cv2를 이용해서 불러오고 화면에 출력을 해 봅니다.


gray = cv2.imread("F:/tensordata/number/tensorflow_model03.png", cv2.IMREAD_GRAYSCALE)

plt.imshow(gray)

plt.show() 


불러온 이미지의 사이즈를 테스트에 적합 하게 수정해 줍니다.


gray = cv2.resize(255-gray, (28, 28))

test_num = gray.flatten() / 255.0

test_num = test_num.reshape((-1, 28, 28, 1))


변경된 이미지를 사용하여 숫자 번호가 몇인지 알아맞춰 봅니다.


print('The Answer is ', model.predict_classes(test_num))



4. 결과

 

The Answer is  [3] 이라고 하는군요정답 입니다.


tensorflow_mnist



5. 전체 소스


import tensorflow as tf

import matplotlib.pyplot as plt

from PIL import Image

mnist = tf.keras.datasets.mnist

import cv2

 

(x_train, y_train),(x_test, y_test) = mnist.load_data()

x_train, x_test = x_train / 255.0, x_test / 255.0

 

model = tf.keras.models.Sequential([

  tf.keras.layers.Flatten(),

  tf.keras.layers.Dense(512, activation=tf.nn.relu),

  tf.keras.layers.Dropout(0.2),

  tf.keras.layers.Dense(10, activation=tf.nn.softmax)

])

model.compile(optimizer='adam',

              loss='sparse_categorical_crossentropy',

              metrics=['accuracy'])

 

model.fit(x_train, y_train, epochs=5)

score = model.evaluate(x_test, y_test)


# 이미지 불러와 출력

gray = cv2.imread("F:/tensordata/number/tensorflow_model03.png", cv2.IMREAD_GRAYSCALE)

plt.imshow(gray)

plt.show()


# 이미지 사이즈 변경

gray = cv2.resize(255-gray, (28, 28))

test_num = gray.flatten() / 255.0

test_num = test_num.reshape((-1, 28, 28, 1))


# 이미지 숫자 테스트 

print('The Answer is ', model.predict_classes(test_num))



1···56789101112

+ Recent posts