78일차 2023-06-28
Python
설치:
1. https://www.python.org/ 사이트에서 다운로드후 설치
downloads -> download for windows ->pythone-3.11.4(버전) .exe 파일 실행 -> 내 pc 고급 시스템 설정 -> 환경 변수->
(30일 말고,스크롤 내려서 개발자용 무료 있음)
Welcome to Python.org
The official home of the Python Programming Language
www.python.org
(요즘은, 환경변수 안해도 다 잡아줌)
Path에서 편집 -> 새로 만들기 -> 두개 넣어줌
(kosmo는 사용자이름)
이제 파이참을 설치(Add Launchers dir to the PATH)는 체크x
이제 디렉토리(Directory) 만들고 파이썬 파일(Python File)을 만들면 된다.
예제)
파이썬이란?
-네덜란드의 귀도 반 로섬(Guido van Rossum)이 1989년 개발한 객체지향 프로그래밍 언어이다.
-파이썬이라는 이름은 귀도가 즐겨 봤던 코미디 프로그램인 몬티 파이썬의 날아다니는 써커스
<Monty Python's Flying Circus>에서 따왔다고 한다.
-파이썬의 사전적인 의미는 고대 신화에 나오는 파르나소스 산의 동굴에 살던 큰 뱀을 뜻하는데
파이썬 책 표지와 아이콘이 뱀 모양으로 그려져 있는 이유가 여기에 있다.
-파이썬은 스크립트 언어이다. 즉 컴파일을 하지않고 한 줄 단위로 실행되기 때문에 쉽게 결과를 확인할 수 있다.
-파이썬은 문법이 매우 쉽고 간단해서 프로그래밍 입문자들이 쉽게 배울 수 있다는 특징을 가진다
-문법이 간단한데다 다양한 패키지가 제공되어 생산성이 높고, 유지 보수 비용이 적게 든다는 점 때문에
널리 쓰이는 언어로 자리잡았다. 또한 과학 계산에 특화된 패키지도 준비되어 있어서 과학, 공학 연구
분야에서도 활발히 사용되고 있다.
-파이썬과 파이썬의 패키지는 오픈 소스이며 모두 무료로 제공되고 있다
-공식 사이트 : https://www.python.org/
파이썬 개발환경 구축
1. https://www.python.org/ 사이트에서 다운로드후 설치
※Add Python 3.6 to PATH 체크 - 체크시 환경변수 PATH에 파이썬 인터프리터의 경로가 등록됨.
※Disable path length limit를 클릭.
Windows는 파일 이름과 경로의 길이가 260자로 제한되어 있다.
260자를 넘더라도 문제가 발생하지 않도록 길이 제한을 해제하자.
※설치시 아래경로에 설치된다.
32비트인 경우
C:\Users\<사용자이름>\AppData\Local\Programs\Python\Python36-32\
64비트인 경우
C:\Users\<사용자이름>\AppData\Local\Programs\Python\Python36\
위 경로에 파이썬 인터프리터가 설치돠고 하위 디렉토리인 Scripts\ 에
pip프로그램이 설치된다.
※Python 3 에서는 .py 스크립트 파일의 기본 인코딩이 UTF-8이다
2. 설치확인 및 테스트 코드 작성
콘솔창에서 dos> python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>print('Hello World')
혹은
시작 -> Python 3.6 -> IDLE (Python 3.6 32-bit)실행
※이클립스로 개발환경 구축하기
1.https://www.eclipse.org에서 Eclipse IDE for Java EE Developers다운
2.PyDev 플러그인 설치
2-1. 이클립스 help->Eclipse Marketplace클릭
find창에서 python으로 검색
2-2. 검색된 목록 중 PyDev를 설치후 이클립스 재시작(자동)
2-3. 이클립스와 파이썬 연결
Window ->Preference ->PyDev ->Interpreters->Python Interoreter클릭
Quick Auto-Config클릭하여 파이썬 인터프리터의 위치설정
2-4. 퍼스펙티브를 PyDev로 변경후 new->PyDev project생성후
new -> PyDev Module 로 .py생성 혹은
new->File 파일 생성(확장자는 .py)후 파이썬 코드 작성
Run As -> Python Run 으로 테스트
※파이썬의 종류
1. Cpython : C 로 구현된 기본적인 파이썬으로 일반적으로 파이썬이라고
하면 Cpython을 의미한다
2. Jython : Java 로 구현된 파이썬으로 JVM에서도 실행이 가능하다.
3. IronPython : C#으로 구현된 파이썬
4. PyPy : 파이썬으로 구현된 파이썬
※파이썬 2.x버전과 3.x버전의 주요 차이점
1. 파이썬 3.x 버전에서는 모든 변수가 객체(Object)로 처리된다.
2. 파이썬 3.x 버전에서는 print문이 괄호가 필수이다
3. 파이썬 3.x 버전에서는 long 형이 없어지고 <class 'int'>로 변경되었다
-파이썬 2.x버전
type(2**10) : <type 'int'>
type(2**100): <type 'long'>
-파이썬 3.x버전
type(2**10) : <class 'int'>
type(2**100): <class 'int'>
4. 파이썬 3.x 버전에서는 int/int(나누기) 연산 결과는 float으로 처리된다
-파이썬 2.x버전
1/2 : 0
type(1/2): <type 'int'>
-파이썬 3.x버전
1/2 : 0.5
type(1/2): <class 'float'>
5. 파이썬 3.x 버전에서는 문자열이 항상 유니코드로 처리되므로 u 표기 필요없음
-파이썬 2.x버전
type('안녕') : <type 'str'>
type(u'안녕') : <type 'unicode'>
-파이썬 3.x버전
print(type('안녕')) : <class 'str'>
print(type(u'안녕')) : <class 'str'>
※파이참-https://www.jetbrains.com/pycharm/download/
파이썬 코드 실행
1. 파이썬 쉘 프로그램으로 실행
-대화형식이라고 하며 짧은 파이썬 코드를 파이썬 인터프리터로 직접 실행시키는 방법이다
-파이썬 쉘 프로그램이 파이썬 인터프리터와 대화 나누듯이 실행한다 하여 대화형 쉘이라고 하며
REPL(Read-Eval-Print Loop:읽기-실행-인쇄 루프)방식이라고도 한다
-파이썬 쉘 프로그램을 실행시키려면 콘솔창에서 python을 입력하서나
혹은 시작 -> Python 3.6 -> IDLE(Python Shell프로그램)실행한다
그러면 파이썬 프롬프트(">>>")가 나타난다.
그리고 나서 ">>>" 다음에 실행하려는 파이썬 코드를 입력한 후 엔터키를 누르면 바로
실행되어 결과를 얻을 수 있다.
※콘솔창의 명령 프롬프트에서 파이썬 셸을 끝내려면 exit()를 입력하거나 Ctrl+Z를 누른후 엔터키를 친다
2. 파이썬 스크립트(Python Script: 확장자는
-파이썬 코드가 긴 경우 파이썬 코드를 저장한 .py 파일(파이썬 스크립트라고 한다)로 실행시키는 것이
REPL방식 즉 파이썬 쉘 프로그램보다는 효율적이다.
-파이썬 코드를 일반 텍스트 편집기로 작성후 파일로 저장하여 콘솔의 프롬프트에서
"python 스크립트파일명.py"로 실행시키거나
혹은 IDLE에서 File -> New File 로 파일 작성후 File -> Save메뉴로
저장후 Run 단축키(ctrl+shift+F10)
※파이썬 스크립트(.py파일)에 한글이 포함된 경우
SyntaxError: Non-UTF-8 code starting with~에러가 발생하거나 한글이 깨지는 경우
소스 코드 맨앞에 #coding:utf-8 이라고 선언해 준다
파이썬 기초 문법
1. 파이썬은 대소문자를 엄격히 구별하고 변수 선언시 자료형(Data Type) 선언이 없다.
2. 세미콜론 :
-파이썬은 다른 언어와 다르게 문장의 종료를 나타내기 위해 세미콜론(;)을 붙이지
않는다.(단, 붙여도 에러는 나지 않는다)
-파이썬은 엔터키로 명령문의 끝을 구분하며, 다른 언어와 다르게 한 줄에 한 명령문만 가능하다.
단, 한줄에 여러 명령문을 나열할때는 세미콜론으로 구분한다.
예]
두 줄에 두개의 명령문 입력(엔터로 명령의 끝 구분)
a=10
print(a)
혹은 한줄에 두 개의 명령문 입력
a=10;print(a)
3. 들여쓰기 :
-파이썬은 들여쓰기 자체가 문법이다. 그래서 들여쓰기를 하지 않는 경우
에러가 발생한다.
예]
IndentationError : expected an indented block발생하는 경우
for i in range(10):
print(i)
아래는 정상적으로 코드가 실행된다
for i in range(10):
print(i)
즉 파이썬는 {}를 사용하여 코드의 블록을 지정하지 않고 들여쓰기(Indentation)을 사용하여
코드의 블록을 지정한다.
-들여쓰기 간격은 공백 2칸, 공백 4칸, 탭 문자등 어느 것을 사용해도 무방하나
공백 4칸을 권장하고 있다.
-코드불럭을 지정할때 코드블럭의 시작코드에는 콜론(:)을 붙이고 내부의 코드에는
동일한 크기의 들여쓰기를 지정해야 한다
또한 공백과 탭 문자를 섞어 쓰면 안 된다.
예]
a=10
if a > 10 : #if 코드불럭 시작
print('a는 10보다 크다')
else : #else코드불럭 시작
print('a는 10보다 크지 않다')
주석
- 파이썬 인터 프리터에 의해 실행되지 않는 즉 무시되는 문장이다.
- 주로 코드에 대한 설명글을 달거나 혹은 임시로 실행되지 않는 코드를 만들때 사용한다
- 일반적인 주석을 표시할때 #을 사용한다
- #!는 주석문으로 실행하는 인터프리터를 의미하며
이 부분을 셔뱅(shebang)이라고 한다. 셔뱅은 현재 파일을 실행해 줄 프로그램을 지정할 때
사용한다. 즉, 셔뱅에 파이썬 경로를 지정해 놓으면 해당 파이썬으로 .py 파일을 실행한다.
예]
아래 주석문을 스크립트 파일 맨 첫줄에 작성한다.
#!/usr/bin/env python3
환경 변수에 지정된 경로에서 python3 프로그램을 찾아서 실행한다는 의미이다
단,윈도우 환경에서는 의미없다.
- '''혹은 """은 독스트링(문서화 문자열, documentation strings, docstrings) 혹은 블록 코멘트라고 하는데 #(주석)처럼
인터프리터에 의해 무시되지는 않는다 즉 하나의 명령문으로 처리하나
이 '''혹은 """사이에 여러줄 주석처럼 아무 문장이나 쓸 수 있다.
단,들여쓰기 레벨에 맞아야 한다.
예]
if True :
'''
if문 블락입니다
여기에 어떠한 주석문도 가능합니다
'''
print('무조건 실행되는 명령문')
※파이썬은 빈 클래스나 빈 함수를 만들수 없다.에러가 발생한다
def hi(): #에러.빈 함수임
def hi(): #에러
#함수 -> 인터프리터가 무시함 즉 빈 함수로 처리됨
def hi(): #정상
'''함수''' -> 인터프리터가 하나의 명령문으로 처리함 즉 빈 함수가 아님
def hi(): #정상
pass
변수
-변수란:메모리상의 임시 데이터 저장 공간의 이름
-변수 생성 :
방법1]변수명 = 데이터
단,변수명만 선언시는 name '변수명' is not defined 에러 발생
※빈 변수(값이 들어있지 않은 변수) 선언은
변수명 = None 으로 한다
None은 파이썬의 자료형(<class 'NoneType'>)으로 다른 언어의
null과 같다
방법2]변수명1, 변수명2, 변수명3 = 데이타1, 데이타2, 데이타3
단,변수와 데이타의 개수는 동일하게 맞춰주어야 하며 나열된 순서대로 값이 할당된다.
만약 변수와 값의 개수가 맞지 않으면 에러가 발생한다.
방법3]변수명1 = 변수명2 = 변수명3 = 데이타
변수 여러개가 모두 같은 값을 갖는 경우 사용한다.
-변수명 명명규칙 :
1. 영문 혹은 언더바(_)로 시작해야 한다.숫자로 시작해서는 안된다.
2. 대소문자를 구분한다.
3. 특수 문자(+, -,$, @, &등)는 사용할 수 없다.
4. 유니코드로도 만들 수 있다.(예: 한글=1)
5. 키워드(예약어)는 사용할 수 없다.
-키워드 목록 확인
>>> import keyword
>>> keyword.kwlist
변수의 자료형
※리스트,튜플,딕션너리,집합등을 순서형 자료(혹은 반복가능한 객체)라고 하는데 다른 객체들을 담을 수 있는
컨테이너(컬렉션)를 의미하기도 한다
또한 순서형 자료를 이터레이터라고도 한다
이는 컨테이너(컬렉션)에서 객체들을 하나 하나씩 꺼낼 수 있는 타입을 의미한다
-변수 삭제: 변수 삭제는 del을 사용한다.(리스트를 사용할 때 유용하게 쓰임)
※파이썬은 변수뿐만 아니라 값 자체도 객체이다. 그래서 변수에 값을 그대로 할당하지 않고
객체를 가리키는 방식을 사용한다.
1이나 2와 같은 값처럼 자주 사용하는 숫자는 sys.getrefcount()함수로
최초 참조횟수를 얻어오면 다른 숫자값에 비해 훨씬 크다
왜냐하면 파이썬 내부에서도 1이나 2를 사용하고 있기 때문이다.
※상수: 파이썬에서 상수를 선언할 수 없다.다른 언어처럼 키워드가 없다
이스케이프 시퀀스
-특정 형식에 맞게 출력하기 위해 사용하는 문자로 특정 문자 앞에 \을 붙이면
그 특정문자는 어떤 특수한 기능음 함.
예] "HitHomeRun" => 여기서 t는 일반 문자를 의미
"Hi\tHomeRun" =>여기서 t는 \와 결합해서 탭만큼 띄어쓰는
기능을 하는 이스케이프 문자가 됨.
-주요 이스케이프문자
\n: 줄 바꿈,그리고 커서는 줄바꿈한 줄의 처음에 위치
\t: 탭키만큼 들여쓰기,즉 스크린 커서를 탭키만 큼 옮김
\r: 캐리지리턴(동일한 줄의 맨 앞으로 커서 옮김,줄바꿈은 안됨)
콘솔에서 테스트 해야함,이클립스에서는 \r과 \n이 동일한 결과를 내보냄
*키보드의 엔터키는 \r\n임
\': 작은 따옴표 문자 자체 표현
\": 큰따옴표 자체 문자 표현
\\:백슬래시(\)기호 자체 *이클립스에서는 \로 보이는 경우 window->preference->general->color and fonts->basic->text fonts->굴림체로
형식 문자열
-Format String:출력형식을 지정하기 위한 형식 문자열
형식1] "형식문자열" % "값" 형식
% 앞 부분은 포맷 문자열이고, % 뒤는 실제 대입할 값이다.
이때 % 를 포맷팅 연산자(Formatting Operator)라 부른다.
만약 % 뒤의 값이 복수 개이면 튜플로 묶어주어야 한다.
예]
name ='이름은 %s입니다' % '김길동'
print(name)
person = '이름:%s,나이:%d' % ('김길동',20)
print(person)
예 에서 %s나 %d등을 변환 지시자(Conversion Specifier)라고 한다\
주요 변환 지시어]
%d 또는 %i:정수값 출력시
%f 또는 %F:실수값 출력시
%c:한 문자 출력시
%o 또는 %O:8진수 출력시
%x 또는 %X:16진수 출력시
%s:문자열 혹은 파이썬 객체를 str()을 사용하여 변환한 경우
%r:문자열 혹은 파이썬 객체를 repr()을 사용하여 변환한 경우
%%: %리터럴을 의미
형식2] "형식문자열".format() 형식
형식문자열 내의 변환 지시자의 형식은 {숫자}, {이름} 이다
※ 숫자 사용시 숫자는 0부터 시작 그렇지 않으면 아래 에러 발생
IndexError: tuple index out of range
예]
name ='이름은 {0}이고 나이는 {1}살입니다'.format('김길동',20)
print(name)
person = '이름:{name},나이:{age}'.format(name='김길동',age=20)
print(person)
-형식문자열에서 데이타 출력시 자릿수 지정 할수 있다
%숫자format-string
예]
%4c : 한문자를 출력하는 데 전체 자리수는 4
%5d: 정수 숫자를 출력하는 데 전체 자리수는 5
%6.2f%:실수를 출력하는데
소수점 둘째짜리까지만 출력하고
전체 자리수는 6(소수점 포함)
자릿수 지정시 값을 오른쪽부터 채운다
-를 붙이면 왼쪽부터 채운다
예]
print("%4d" % 12);
_ _ 12
print("%-4d" % 12);
12_ _
연산자
-단항 연산자: 항이 하나인 연산자
부호연산자 : + -
논리 부정 연산자 : not
2] 산술 연산자 :**(거듭제곱) * / //(버림 나눗셈 연산자) %(나머지 연산자) + -
3] 쉬프트연산자 : << , >>
-두항이 반드시 정수여야한다
정수 << 비트수: 왼쪽으로 비트수만큼 이동하고 오른쪽에
남은 비트는 0으로 채운다
정수 >> 비트수 : 오른쪽으로 비트수만큼 이동하고
왼쪽에 남은 비트는 부호비트로 채운다(1:음수,0:양수)
4] 비교 연산자 : < <= > >= !=
5] 비트 연산자 : &(and) ^(xor) |(or) ~(not)
- 두항이 정수여야 한다.
- 두 항이 정수값일때 비트 연산자로 사용됨
그렇지 않고 두항이 비교식일때는 논리연산자로 사용됨
예] 3> 4 & 5 < 4 : &는 논리연산자
4 & 5 : & 는 비트 연산자
- & : 비트 연산시 둘다 1일때만 1 아니면 0
- | : 둘중의 하나라도 1이면 1
- ^ : 서로 배타적일때 즉 서로 값이 다를때는 1 같으면 0
- ~ : 1이면 0 ,0이면 1
예] 4: 0000 0100
5: 0000 0101
-------------------
4&5 0000 0100 =>4
4|5 0000 0101 =>5
4^5 0000 0001 =>1
6] 논리 연산자 : and or not
7] 할당 연산자 : = += *= /= -=등
[연산자 우선 순위]
:()는 모든 연산자에 우선한다
:연산자 우선 순위는 산술 > 비교 > 논리 연산자 순이다.
같은 연산자 내에서도 우선 순위가 존재한다.
또한 연산순위가 같은 항목들이 순서 대로 나열되어 있다면 왼쪽에서 오른쪽으로 연산자의 우선 순위를 결정한다.
:산술 연산자 내의 우선 순위
**(거듭제곱) > *(곱하기),/(나누기),//(버림),%(나머지)) > +(더하기)-(빼기)
:비교 연산내의 우선순위
비교 연산자는 모두 우선순위가 같다 고로 여러 개의 비교 연산자가 사용되엇을 경우
왼쪽에서 오른쪽으로 우선순위가 결정된다.
:논리 연산내의 우선 순위
not(1) > and(2) > or(3)
예제 코드들
workspace에 python 폴더 생성
Hello.py
#coding:utf-8
print('Hello World')
print('안녕 파이썬')
#대소문자 엄격 구분
#자료형 선언이 없다
#a#NameError: name 'a' is not defined
a=None
a=10
print(a)
#한 라인에 여러개 명령어 작성시에는 마지막 명령을 제외한 명령어에는 ; 을 붙인다
b=20;c=a+b;print(c)
#result ='더하기 결과:'+c#TypeError: can only concatenate str (not "int") to str
result ='더하기 결과:'+str(c)
print(result)
#파이썬은 들여쓰기가 문법이다
#주석은 상관없다
# print(result)#IndentationError: unexpected indent
for i in range(5):
#print(i)#IndentationError: expected an indented block after 'for' statement on line 18
print(i)
if b % 2 ==0:
print(str(b)+'는 짝수')
else:
print(str(b) + '는 홀수')
Variable01폴더 생성
variable1.py
#변수 선언 방법1]변수명 = 데이터
a=10
print(a)
print(type(a))#type(변수 혹은 값):자료형 반환 <class 'int'>
print(a,type(a),sep=',')#값과 타입을 한줄로 출력
#변수 선언 방법2]변수명1, 변수명2, 변수명3,.. = 반복가능한 객체(이터레이터)
#이터레이터의 요소를 여러 변수에 나눠 담는 것을 언패킹(unpacking) 또는 구조분해(destructuring)라고 한다.
#변수명1, 변수명2, 변수명3 = 데이타1, 데이타2, 데이타3 혹은 (데이타1, 데이타2, 데이타3)
a,b,c ="파이썬",'10',20#("파이썬",'10',20)
print('a의 값:%s,a의 자료형:%s' % (a,type(a)))
print('b의 값:%s,b의 자료형:%s' % (b,type(b)))
print('c의 값:%s,c의 자료형:%s' % (c,type(c)))
#변수 선언 방법3]변수명 = 반복가능한 객체(이터레이터)
#여러 개의 데이터를 이터레이터를 이용해 하나의 변수에 묶어 담는 것을 패킹(packing)
#변수명 = 데이타1, 데이타2, 데이타3 혹은 (데이타1, 데이타2, 데이타3)
d=10,'20','파이썬'#(10,'20','파이썬') 즉 int,str,str객체를 튜플로 묶어서(패킹) 변수 d에 저장
print('d의 값:%s,d의 자료형:%s' % (d,type(d)))
#변수 선언 방법4]변수명1 = None
#z#NameError: name 'z' is not defined
z=None
print('z의 값:%s,z의 자료형:%s' % (z,type(z)))
x,y=10,20
print('x=',x,',y=',y)
y,x=x,y
print('x=',x,',y=',y)
import keyword
print(keyword.kwlist)
#elif = 10#SyntaxError: invalid syntax 키워드를 변수로 사용할 수 없다
#변수 삭제
del x# 혹은 del(x)
#print(x)#NameError: name 'x' is not defined
variable2.py
import sys
print(sys.getrefcount(2023))
x=2023
print(sys.getrefcount(2023))
y=2023
print(sys.getrefcount(2023))
print(sys.getrefcount(1))
# is 연산자 : 객체가 같은 타입인지 판단하는 연산자.
print( x is y)
DataType02폴더 생성
numberType1.py
#정수형(int)은 소수점이 없는 숫자를 의미
#100,-100등
def pprint(value):
print('value:',value,sep='',end=',')
print('type:',type(value),sep='')
a=100
pprint(a)
#파이썬3에서는 정수 / 정수 = 실수 이다(파이썬 2은 정수 / 정수 = 정수 이다).
b=10/5
pprint(b)
#int()함수 : 실수를 정수로 변환하는 함수-소수점 이하를 버린다
c= int(b)
pprint(c)
'''
※정수는 10진수 이외에도 2진수, 8진수, 16진수로 표현가능
2진수: 숫자 앞에 0b(B)를 붙이며 0과 1을 사용.
8진수: 숫자 앞에 0o(O)를 붙이며 0부터 7까지 사용.
16진수: 숫자 앞에 0x(X) 붙이며 0부터 9, A부터 F까지 사용(소문자 a부터 f도 가능).
'''
print('[각 진수로 숫자 표현하기]')
print('2진수:',0b10)#1 * 2^1 + 0 * 2^0 = 2+0
print('8진수:',0o10)
print('16진수:',0x10)
#int 타입의 숫자는 크기에 제한이 없다. 즉, 아무리 큰 정수라도 표현할 수 있다
#파이썬3에서 int형으로 통합되었다.(파이썬 2는 long형이 별도로 존재)
d=3576832475643865234756438756234089534879564895629349856748957623498523495670943825643856024875603485340658
pprint(d)
#실수형(float)은 소수점이 있는 숫자를 의미
#10.0,-3.14등
#실수 와 정수 의 연산결과는 실수 이다
a=10
b=3.5
pprint(a+b)
a=0.1
b=0.2
print(a+b)#0.30000000000000004
print(a+b ==0.3)#False
#float()함수 : 정수를 실수로 변환하는 함수
pprint(float(1+2))
numberType2.py
import sys,math
from decimal import Decimal
'''
파이썬은 부동 소수점 방식으로 실수를 표현하는데
고정 소수점 방식보다 넓은 범위의 수를 나타낼 수 있어
과학기술 계산에 많이 이용되지만, 근삿값으로 표현한다
단,고정 소수점 방식보다 연산 속도가 느리다
즉,0.1+0.2의 결과인 0.30000000000000004는 0.3을 표현한 근삿값이다
'''
a=0.1
b=0.2
'''
실수를 근삿값으로 표현하면서 발생하는 문제를
부동소수점 반올림 오차(Floating Point Rounding error)라고 한다.
따라서 실수를 비교할 때는 연산한 값과 비교할 값의 차이를 구한 뒤
sys.float_info.epsilon보다 작거나 같은지 판단해야 한다
'''
print(a+b==0.3)
#부동 소수점 반올림 오차 해결방법1
'''
2.220446049250313e-16(sys.float_info.epsilon)값을
머신 엡실론(machine epsilon)
이라고 한다
연산한 값(a+b)과 비교할 값(0.3)의 차이가 머신 엡실론보다
작거나 같다면 두 실수는 같은 값이라 할 수 있다.
'''
print(sys.float_info.epsilon)
print(math.fabs(a+b - 0.3) <= sys.float_info.epsilon)#True
#파이썬 3.5이상부터는 두 실수가 같은지 판단할 때 math.isclose 함수를 사용.
#부동 소수점 반올림 오차 해결방법2
print(math.isclose(a+b,0.3))#True
#부동 소수점 반올림 오차 해결방법3
#decimal 모듈의 Decimal로 고정 소수점으로 변환 -
# 고정 소수점은 부동소수점처럼 반올림 오차가 없다
print(Decimal('0.1')+Decimal('0.2') == Decimal('0.3'))#True
boolNescape.py
#bool형:True,False 두 값만 가진다
# True는 1, False는 0의 값을 가진다
#0,0.0,0+0j는 False와 같고 None,''(빈문자) ,빈 객체([],(),{},set())는 조건식으로 판단시 False로 간주된다
print('[bool형]')
b1 = True
b2 = False
print('value:',b1,',type:',type(b2))
print(b1 + b2)#산술연산[O]
print(b1 > b2)#비교연산[O]
print(b1 and b2)#논리 연산[O]
print('[escape문자]')
#1]\n : 줄바꿈 기능
print('Welcome To Pytho\n')
print('\nHi Python')
print('Let\'s Do it\nGo Fighting')
#2]\r:커서를 해당 줄에서 맨 처음으로(carrige return)
print('My Nick is Superman\rXX')
#3]\t:탭키 만큼 띄어쓰기 기능
print('국어t영어t수학')
print('국어\t영어\t수학')
#4]\':single quotation 표시
#문자열을 '(싱글쿼테이션)으로 감싸도 되는 곳에서는 의미 있다.
print('나의 닉은 \'슈퍼맨\' 입니다')
#5]\":double quotaion표시
print("나의 닉은 \"슈퍼맨\" 입니다")
#6]\\:\은 이스케이프 문자 역할을 하는
# 특수문자가 아니라는 것을
# 인터프리터에게
# 알려주는 기능(중요)
print('D:\\nDrive\\table')
stringType.py
#파이썬에서 문자열을 만드는 방법은 총 4가지로
# ' , " ,''',"""로 감싸면 문자열이 된다.
print('Hello World')
print("Hello World")
print('''Hello World''')
#print('Hello
# World')#SyntaxError: unterminated string literal (detected at line 6)
print('''Hello
World''')
print("""
Hello
World
!
""")
# '''와 """안에는 ' 와 " 둘다 넣을 수 있다
print('''
올해 2023's의 목표
1.건강
2.취업
''')
print("""
올해 2023's의 목표
1."건강"
2."취업"
""")
s='HELLO'
print('value:',s,',type:',type(s))
#len()함수로 문자열 길이 구하기
print(len(s))
print(len('안녕'))
'''
※유니코드 문자열을 인코딩없이 그대로 파일에 쓰거나 다른 시스템으로
네트워크 전송을 할 수는 없다.
왜냐하면 유니코드 문자열은 단순히 문자셋의 규칙이기 때문이다.
파일에 쓰거나 다른 시스템으로 유니코드 문자열을 전송하기 위해서는
바이트로 변환해야만 한다
'''
#encode('문자셋') : 유니코드 문자열을 바이트 문자열로 만드는 함수
#문자셋를 생략하면 디폴트 값인 utf-8로 동작.
print(s)#HELLO 문자열 :type이 str
print(s.encode(encoding='utf-8'),type(s.encode()))#b'HELLO' 바이트 문자열 :type이 bytes
print('안녕')#안녕
print('안녕'.encode())#b'\xec\x95\x88\xeb\x85\x95'
print(len(b'\xec\x95\x88\xeb\x85\x95'))#한글은 3바이트 차지
#decode():인코딩된 바이트 문자열을 (유니코드) 문자열로 변환하는 함수(bytes클래스의 메소드)
print(b'HELLO'.decode())#HELLO
print(b'\xec\x95\x88\xeb\x85\x95'.decode())#안녕
#문자열 연결하기 : + 사용
print('HELLO '+'WORLD')
#print('HELLO '+'WORLD ' + 2023)#TypeError: can only concatenate str (not "int") to str
print('HELLO '+'WORLD ' + str(2023))
#문자열 반복하기 : * 사용
#0이나 음수를 곱하면 빈 문자열 단, 실수는 곱할 수 없다(에러)
print('=' * 50)
formatString.py
'''
format string:출력형식을 지정하기 위한 형식 문자열
형식1] "형식문자열" % 값 형식
% 앞 부분은 포맷 문자열이고, % 뒤는 실제 대입할 값이다.
이때 % 를 포맷팅 연산자(Formatting Operator)라 부른다.
만약 % 뒤의 값이 복수 개이면 튜플로 묶어주어야 한다.
예]
name ='이름은 %s입니다' % '김길동'
print(name)
person = '이름:%s,나이:%d' % ('김길동',20)
print(person)
예 에서 %s나 %d등을 변환 지시자(Conversion Specifier)라고 한다
주요 변환 지시어
%d 또는 %i:정수값 출력시
%f 또는 %F:실수값 출력시
%c:한 문자 출력시
%o 또는 %O:8진수 출력시
%x 또는 %X:16진수 출력시
%s:문자열 혹은 파이썬 객체를 str()을 사용하여 변환한 경우
%r:문자열 혹은 파이썬 객체를 repr()을 사용하여 변환한 경우
%%: %리터럴을 의미
형식2] "형식문자열".format(인자들)
형식문자열 내의 변환 지시자의 형식은 {숫자}, {이름} 이다
※ 숫자 사용시 숫자는 0부터 시작 그렇지 않으면 아래 에러 발생
IndexError: tuple index out of range
예]
name ='이름은 {1}이고 나이는 {0}살입니다'.format(20,'김길동',)
print(name)
person = '이름:{name},나이:{age}'.format(name='김길동',age=20)
print(person)
'''
kor =99;eng=80;math=96
avg = (kor+eng+math)/3
print('[형식 문자열 미 사용시]')
print('국어:'+str(kor)+',영어:'+str(eng)+',수학:'+str(math)+',평균:'+str(avg))
print('[형식 문자열 사용시 - 포맷팅 연산자(%)]')
print('국어:%d,영어:%d,수학:%d,평균:%f' % (kor,eng,math,avg))
print('[형식 문자열 사용시 - str타입의 format()메소드:숫자 인덱스]')
print('국어:{0},영어:{1},수학:{2},평균:{3}'.format(kor,eng,math,avg))
print('[형식 문자열 사용시 - str타입의 format()메소드:숫자 인덱스 생략]')
print('국어:{},영어:{},수학:{},평균:{}'.format(kor,eng,math,avg))
print('[형식 문자열 사용시 - str타입의 format()메소드:키워드 사용]')
print('국어:{kor},영어:{eng},수학:{math},평균:{avg}'.format(kor=kor,eng=eng,avg=avg,math=math))
#형식 문자열 쓰는 곳에서 특수문자(이스케이프문자) 사용가능
print('국어:%d\t영어:%d\t수학:%d\t평균:%f' % (kor,eng,math,avg))
print('국어:{}\t영어:{}\t수학:{}\t평균:{}'.format(kor,eng,math,avg))
'''
형식 문자열에서 데이타 출력시 자릿수 지정
%숫자format-string
예]
%4c : 한문자를 출력하는 데 전체 자리수는 4
%5d: 정수 숫자를 출력하는 데 전체 자리수는 5
%6.2f%:실수를 출력하는데
소수점 둘째짜리까지만 출력하고
전체 자리수는 6(소수점 포함)
자릿수 지정시 값을 오른쪽부터 채운다
-를 붙이면 왼쪽부터 채운다
예]
print("%4d" % 12);
_ _ 12
print("%-4d" % 12);
12_ _
'''
print('[출력 자리수 미 지정]')
print('국어:%d,영어:%d,수학:%d,평균:%f' % (kor,eng,math,avg))
print('[출력 자리수 지정(양수)]')
print('국어:%4d,영어:%4d,수학:%4d,평균:%7.2f' % (kor,eng,math,avg))
print('[출력 자리수 지정(음수)]')
print('국어:%-4d,영어:%-4d,수학:%-4d,평균:%.2f' % (kor,eng,math,avg))
inputNprint.py
'''
input()함수: 표준입력(키보드)으로 부터 사용자 입력을 받는 함수.
이 함수가 실행되기 전까지 Blocking상태가 된다.
즉 다음 라인의 코드가 실행이 안되고 멈춘다
입력한 값은 모두 문자열<class 'str'>로 처리된다.
방법1]한번에 하나의 데이타만 입력받기
변수 = input()
변수 = input('안내 메시지')
'''
'''
print('[input()함수]')
print('나이를 입력하세요?',end='')
age = input()
print('age의 값:{},age의 타입:{}'.format(age,type(age)))
'''
'''
age = input('나이를 입력하세요?')
print('age의 값:{},age의 타입:{}'.format(age,type(age)))
'''
'''
방법2]한번에 여러 데이타를 입력받기
-input()함수에서 문자열 객체의 split()함수(구분자를 기준으로 분리하는 함수로 반환값은 리스트타입)를 호출하여
여러 개의 변수에 저장(각 변수는 콤마로 구분)
구분자 생략시 공백을 기준으로 분리한다.
변수1, 변수2,... = input().split()
변수1, 변수2,... = input().split(구분자)
변수1, 변수2,... = input('안내 메시지').split()
변수1, 변수2,... = input('안내 메시지').split(구분자)
'''
'''
multi = input('값을 여러개 입력하세요?(공백이 디폴트)').split()
print('multi의 값:{},multi의 타입:{}'.format(multi,type(multi)))
'''
'''
a,b = input('콤마를 기준으로 두 개의 숫자를 입력하세요?').split(',')
c=int(a) + int(b)
print(c)
'''
'''
혹은 입력받은 값을 숫자(정수 혹은 실수)로 변경시 map함수를 이용하면 편리하다
map(함수,리스트 혹은 튜플)는 리스트의 요소를 첫번째 인자로 지정한 함수를 이용해서
처리해주는 함수이다.
단,튜플일때는 원본 튜플을 변경하는 것이 아니라 새 튜플을 생성한다
변수1, 변수2,... = map(함수명만 혹은 람다식, input().split())
변수1, 변수2,... = map(함수명만 혹은 람다식, input().split(구분자))
변수1, 변수2,... = map(함수명만 혹은 람다식, input('안내 메시지').split())
변수1, 변수2,... = map(함수명만 혹은 람다식, input('안내 메시지').split(구분자))
'''
#a,b = map(int,input('콤마를 기준으로 두 개의 숫자를 입력하세요?').split(','))
a,b = map(lambda x:int(x) * 2,input('콤마를 기준으로 두 개의 숫자를 입력하세요?').split(','))
print('두 숫자의 합(2씩 곱한 값):',a+b)
print('[print()함수]')
'''
※ 콤마로 구분해서 여러개 값을 출력할 수 있다
print(값1, 값2, 값3,..[,sep='문자 또는 문자열'][,end='문자 또는 문자열'][,file=파일포인터])
sep키워드 인수:콤마로 구분된 값을 여러 구분자로 결합하여 출력할 수 있다. (기본값은 공백)
end키워드 인수:출력시 줄바꿈 효과를 변경할 수 있다. (기본값은 \n)
file키워드 인수:출력 결과를 파일, 표준 에러처리로 보낼 수 있다.
'''
#1.여러개 동시에 출력하기:공백(디폴트)
a,b = input('공백 기준 두 개의 값 입력?').split()
print(a,b,'공백')
#2.여러개 동시에 출력하기:sep사용
print(a,b,'공백',sep='★')
print(a,b,'공백',sep='\n')
#3.여러개 동시에 출력하기:sep 및 end 키워드 인수 사용
print(a,b,'공백',sep=',',end='')
print('입니다')
#4.여러개 동시에 출력하기:file 키워드 인수 사용-표준에러 콘솔 출력
import sys
print(a,b,'공백',file=sys.stderr)
#5.여러개 동시에 출력하기:file 키워드 인수 사용-파일로 출력
f=open('output.txt','w',encoding='utf-8')
print(a,b,'공백',file=f,sep='\n')
Operator03폴더 생성
sansulop.py
#※연산자-데이타를 처리하는 기호
'''
-산술연산자(이항 연산자)의 결과는 다양하다
-산술연산자내 에서의 연산 우선순위
** > (*,%,/,//) > (+,-)
-우선 순위가 같은 경우 왼쪽에서 오른쪽으로 연산한다
-산술 연산자를 써서 식을 만들면 산술식
-//(버림나눗셈 연산자)는 파이썬 3에서 추가됨.
-증감 연산자가 없다(++,--)
'''
print('[버림 나누기 연산자]')
print('5/2의 결과:',5/2)
print('5//2의 결과:',5//2)#int(5/2)와 같다 즉 정수/정수=정수를 만들어주는 효과
print('int(5/2)의 결과:',int(5/2))
#divmod()함수 : 몫과 나머지를 동시에 구할 수 있는 함수로 결과값을 튜플로 반환한다 (몫,나머지)
print('[몫과 나머지 동시에 구하기]')
a= divmod(5,2)
print('value:{},type:{}'.format(a,type(a)))
print('몫:{},나머지:{}'.format(a[0],a[1]))
div,mod= divmod(5,2)
print('몫:{},나머지:{}'.format(div,mod))
print('[거듭 제곱 연산자]')
print(2**5)##2의 5승 즉 2*2*2*2*2
print('[산술 연산자 우선 순위]')
result = 5 % 2 - 6//3 * 5 + 3**2;
'''
1]3 ** 2 = 9
2]5 %2 = 1
3]6//3 = 2
중간정리] 1 - 2*5 + 9
4]2 * 5 =10;
5]1-10=-9
6] -9+9 =0
'''
print(result)
beeKyeop.py
'''
-비교연산자(이항연산자)의 결과는
True아니면 False(bool값)
> : ~보다 크다
>=: ~보다 크거나 같다
< : ~보다 작다
<=: ~보다 작거나 같다
!=: 같지 않다
==: 같다
-비교 연산자는 모두 우선순위가 같다
-산술연산자가 비교 연산자보다 우선 순위가 높다
-비교 연산자를 사용한 식은 비교식
'''
from locale import format
print('[숫자 비교]')
num1 = num2 =10
print(num1 >=num2)
b= num1 <= num2
print('%d <= %d의 결과:%s' % (num1,num2,b))
b= num1 != num2
print('%d != %d의 결과:%s' % (num1,num2,b))
#숫자뿐만 아니라 문자열도 ==와 != 연산자로 비교할 수 있다
#물론 대소도 비교 가능.이때는 아스키 코드혹은 유니코드값으로 비교한다
'''
아스키 코드:1byte로 표현할 수 있는 문자
(영문자 와 숫자)
십진수로 정의한 값을 아스키 코드라 함.
예]A의 아스키 코드값:65(이진수:1000001)
키보드에서 A라고 치면 컴퓨터 메모리에
1000001로 저장됨.
소문자 a는 아스키 코드값이 97
유니코드:1BYTE로 표현이 안되는 문자
(한글이나 한자등)
은 3BYTE가 필요하다.\\x16진수로 정의한 값을
유니코드라 한다.
'''
print('[문자열 비교]')
print('HELLO' == 'hello')
print('ABC' >= 'ABc')
b = 15 % 3 * 2 + 4 > (10-2) *4 != True
#1](10-2) : 8
#2]15 % 3 : 0
#3] 2]의결과 * 2 : 0
#4] 1]의 결과 * 4 : 32
#중간정리: 0 + 4 > 32 != True
#5]0+ 4 : 4
# 4 > 32 != True
#6] 4 > 32 : False
# False != True : True
print('15 %% 3 * 2 + 4 > (10-2) *4 != True의 결과:%s' % b)
# ==, !=는 값 자체를 비교하고, is, is not은 객체(object)를 비교
# id()함수:객체의 주소값 반환하는 함수
print('[==와 is 연산자]')
a=1
b=1.0
print(a==b)
print(a is b)
print('a의 주소:{},b의 주소:{}'.format(id(a),id(b)))
#bool()함수: 정수, 실수 혹은 문자열,객체등을 bool로 만들 때는 사용
#0혹은 0.0이 그리고 ''(빈문자열) 혹은 빈 객체를 제외한 모든 정수,실수, 문자열,객체등은 True이다
#빈 리스트[]를 bool로 변환시 False로 변환됨
a=0.0
b=False
print('value:{},type:{}'.format(a,type(a)))
print('value:{},type:{}'.format(b,type(b)))
print(a==b)#0.0==0
print(a is b)
print(bool(a))
print(bool(a) is b)
print('0:{},0.0:{},빈 문자열:{},빈 객체:{}'.format(bool(0),bool(0.0),bool(''),bool([])))
print('-1:{},3.0:{},\'HELLO\':{},[1,2]:{}'.format(bool(-1),bool(3.0),bool('HELLO'),bool([1,2])))
#※빈 리스트를 bool값과 비교시에는 bool()함수로 변환후 비교
#단,빈 리스트를 not함께 쓸때는 bool()변환 불필요
a=[]
print(a==b)#[]는 0으로 처리 불가([]==False)
print(bool(a)==b)#False == False
print((not a)!=b)#True != False
noliop.py
"""
-논리연산자(이항연산자)의 결과값은 True,False이다.
and: and연산자(논리곱) 두 항이 참일때만 참이다 (~그리고)
or : or연산자(논리합) 두 항중의 하나라도 참이면 참(~또는 ,혹은)
not(단항연산자) : not연산자(논리부정) 단항이 참이면 거짓,거짓이면 참(~아니다)
-논리연산자의 우선 순위: not > and> or
※단락평가(short-circuit evalution)
단락 평가는 첫 번째 항만으로 결과가 확실할 때 두 번째 항은 계산하지 않는 방법을 말한다.
and는 첫째항이 거짓이면 두번째항은 계산 안한다
or는 첫째항이 참이면 두번째항을 계산 안한다
-산술 > 비교 >논리연산자순으로 우선순위가 적용됨.
"""
print('[논리 연산자]')
num1,num2 = 15,10
b = num1 > num2 and num1 ==num2
print('{} > {} and {} == {}의 결과:{}'.format(num1,num2,num1,num2,b))
b = True or False
print('{} or {} 의 결과:{}'.format(True,False,b))
print('[연산자 우선순위]')
b= 5 *2 % 3 > 6-2*2 and 10 <=6 *2 or 5 * 3 !=10
#1] 52 : 10
#2] 1]의 결과 % 3 = 10 % 3 :1
#3] 22 :4
#4] 62 :12
#5] 53 :15
#중간정리] 1 > 6-4 and 10 <=12 or 15 != 10
#6] 6-4 : 2
#7] 1 > 6의 결과] = 1 > 2 : False
#중간정리]False and 10 <=12 or 15 !=10
#8] 10 <=12 : True
#9] 15 != 10: True
#최종] False and True or True
#10] False and True : False
#11] False or True : True
print('5 *2 %% 3 > 6-2*2 and 10 <=6 *2 or 5 * 3 !=10의 결과:',b,sep='')
#※파이썬에는 xor연산자가 따로 없다 xor연산을 하려면 아래와 같은 방법으로 한다
#방법1] bool(값) ^ bool(값)
print('[파이썬의 XOR연산 첫번째]')
print( 3 > 2 ^ 3 > 1)
print( bool(1) ^ bool(0))
#방법2] operator모듈의 xor함수 사용
print('[파이썬의 XOR연산 두번째]')
import operator
print(operator.__file__)#모듈이 있는 경로 알아내기(__file__속성으로)
print(dir(operator))#operator모듈에 포함된 API알아보기(dir()함수로)
print(operator.xor(3>2,3>1))
print(operator.xor(bool(1),bool(0)))
haldangop.py
"""
[할당(대입)연산자]
= : 변수 = 값(변수)
오른쪽에 있는 값을 왼쪽의 변수에
할당(대입)한다.
[축약표현]
+=,-=,*=,%=..등등
변수1 += 값(변수2) => 변수1 = 변수1+값 혹은
변수1 = 변수1+변수2
"""
#대입 연산자(=)로 초기화
#대입 연산자의 오른쪽식이 항상 먼저 실행된후
#그 결과값을 왼쪽의 변수에 대입
num1 = 100
num2 = num1
#200 = num1#[x]왼쪽에는 항상 변수가 와야 한다.
#2]축약표현
#※산술 연산자에만 적용
num1+=100#num1=num1+100
num1 %=num2#num1=num1 % num2
print(num1,num2)
num2 *= 2+10#num2 = num2 * (2+10)
print(num2)
bitop.py
#비트 연산는 비트 단위로 계산
#bin(정수):십진수를 2진수로 변환하는 함수(str반환)
#int('2진수문자열', 2) :이진수 문자열을 십진수로 변환
print(bin(10))#10을 이진수로 변환 0b1010
print(0b1010)
print(int('1010',2))#2진수로 된 문자열 1010를 10진수로 변환
'''
[쉬프트 연산자]
-두 항이 반드시 정수여야한다
정수 << 비트수: 왼쪽으로 비트수만큼 이동하고
오른쪽에
남은 비트는 0으로 채운다
정수 >> 비트수 : 오른쪽으로 비트수만큼 이동하고
왼쪽에 남은 비트는 부호비트로
채운다(1:음수,0:양수)
'''
b1 = 10
bit1=2
'''
b1 : 0000 1010
<<
2
--------------
0010 1000=> 32+8 =40
'''
result = b1 << bit1
print(result)
'''
b1 : 0000 1010
>>
2
--------------
0000 0010
'''
result = b1 >> bit1
print(result)
b1=-9
'''
b1 : 1111 0111
<<
2
--------------
1101 1100=> -64+16+8+4
'''
result = b1 << bit1
print(result)
'''
b1 : 1111 0111
>>
2
--------------
1111 1101=> -4+1
'''
result = b1 >> bit1
print(result)
b1=3
b2 =-15
'''
3: 0000 0011
-15: 1111 0001
------------------
'''
print(b1 & b2)
print(b1 | b2)
print(b1 ^ b2)
print(~b1)