2021.11.11 - [분류 전체보기] - IT 기업 2.4개월차 드디어 노트북 구매
2021.11.11 - [프로그래밍/Python & Django] - [파이썬 인강] 1주차 파이썬 기본 문법 환경설정 및 Python 기본(Mac)
2021.11.11 - [프로그래밍/Python & Django] - [파이썬 인강] 2주차 - 반복문,튜플, 함수, 클래스, 상속
2021.11.29 - [프로그래밍/Python & Django] - [파이썬인강]3주차-모듈과 패키지, 파일 읽/쓰기 ,예외처리 및 심화문법
안녕하세요 4주차 내용입니다.
이번주는 다소 어려운 내용이 였다고 생각하고 여러번 강의를 복습하는 시간을 가졌습니다.
파이썬의 기본 문법중 파이썬과 쓰레드, 상속등 심화 과정이 였지만 이를 극복해야 성장할 수 있기에 열심히 해봤습니다.
4주차가 파이썬 강의는 마지막이고 5주차부터 html,css 등 웹프로그래밍을 시작합니다.
이제 정리한 내용 공유하겠습니다.
클래스와 객체
절차지향 프로그래밍 : 기능이 순서대로 처리할 것 인가에 초점을 맞춘 프로그래민 (c언어가 대표적)
객체지향 프로그래밍: 객체가 중심이되고, 객체를 정의하여 상호작용에 초점을 맞춤(java)
-클래스 : 속성과 속성에 대한 함수들이 존재
-메서드 : 함수
클래스 생성
class 네임 :
pass
===
#선언
변수명 = 클래스이름()
클래스에 속성을 추가
#생성자가 필요 (__init__)
class person :
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return name+" " + age
def show_name(self):
print(self.name)
base-on=person("tistory",30)
bese-on.show_name()
속성
1.인스턴스 속성: 객체마다 다르게 가지는 속성( 생성자를 선언할때 입력받아 모든 객체의 값은 다르다)
2.모든 객체가 공유하는 속성 : 클래스에 변수 선언을하여 모든 객체가 공유를 하게됨.
3.비공개 속성: 클래스 안에서만 접근을 하기위해 __name 과 같이 하면 이름을 찾기 어렵다.
class person :
count=0
def __init__(self,name,age):
self.__name=name
self.age=age
person.count+=1
def __str__(self):
return name+" " + age
def show_name(self):
print(self.__name)
base-on=person("tistory",30)
bese-on.show_name()
base-on.age+=1
메서드
인스턴스메서드: 인스턴스 속성에 접근 가능한 메서드 첫번째 파라미터엔 self가 온다.
클래스 메서드: 클래스 속성에 접근하기 위해 사용, 파라미터로 cls 를 받는다.
@classmethod → 데코레이터
정적 메서드: 인스턴스가 필요없는 메서드, 독립적으로 사용함
@staticmethod
매직메서드 : 특별한 상황에 호출됨
__name __
상속
클래스가 많아지다보니 공통된 속성,메서드를 뽑아내서 부모클래스로 만들고 이를 할당받은 자식이 있다.
장점: 코드의 중복을 막을 수 있다. /유지보수가 용이하다
추상클래스의 추상메서드(abstract method)는 상속받은 클래스에서 반드시 구현을 해야한다.
플레이어 클래스 구현해보기
is-a(웨펀 클래스는 아이템이다) vs has-a (플레이어는 유닛을 가진다)
구성
플레이어 클래스
속성: 닉네임, 미네랄, 가스, 유닛리스트
메서드: produce(이름, 미네랄, 가스 ,체력, 방어력, 공격력)
조건 : 플레이어의 미네랄과 가스가 충분할 경우
- 출력: 유닛 객체를 생성하고 유닛리스트에 추가한다.
- 플레이어의 미네랄이 부족한 경우
- 출력: 미네랄이 부족합니다.
플레이어의 가스가 부족한 경우
- 출력: 가스가 부족합니다.
생성해보기
#속성: 이름 체력 방어력 공격력
class Unit:
def __init__(self,name,hp,shield,demage):
self.name=name
self.hp=hp
self.shield=sheild
self.demage=demage
class player:
def __init__(self,nick,mineral,gas,unit-list=[]):
self.nick=nick
self.mineral=mineral
self.gas=gas
self.unit-list=unit-list
def produce(self,name,mineral,gas,hp,shield,damage):
if self.mineral-mineral<0 :
print("미네랄이 부족합니다")
elif self.gas-gas<:
print("가스가 부족합니다")
else:
self.mineral-+mineral
self.gas-=gas
unit=Unit(name,hp,shield,demage)
self.unit-list.append(unit)
---
실행
player1=Player("base",100,100)
player1.produce(unit_info['probe']['name'],unit_info['probe']['hp'],unit_info['probe']['sheild'],unit_info['probe']['damage'])
--------
데이터베이스
데이터 베이스:구조화된 데이터 베이스
데이터 베이스 종류 사진 ~~
관리하는 방법: 데이터베이스 서버에 데이터를 삽입하고 원한는데로 조회 삭제가 가능
데이터베이스
행:레코드라하고 한 단위의 데이터
열: 데이터의 항목 (날짜, 구분, 금액)
sql 라이트를 사용하여 예제 구축
서버(서비스 제공자) 와 클라이언트 (서비스 요청자_sql문으로 출력함)
실습 환경 설치
해당 칸에 명령어 입력후 [컨트롤 + 엔터] 하면 명령어가 실행됨
---
데이터베이스 명령어 실습
DDL: 데이터 베이스 정의 언어
#테이블 생성 명령어(쿼리)
CREATE TALBE 테이블명 (컬럼명 1 데이터타입 , 컬럼명2 데이터타입);
#제약조건
1. primary key (기본키) :중복이 되지 않아 레코드를 구분 하는 열의 값
2. not null :데이터가 비어 있으면 안된다.
3. default : 기본 값
4. unique: 유일 값
5. autoincrement: 자동 증가-> 주로 기본키에 넣어준다
DROP TABLE POST;
---NOT NULL DEFAULT
CREATE TABLE POST(ID INTEGER PRIMARY KEY,
TITLE TEXT NOT NULL DEFAULT '없음',
CONTENT TEXT DEFAULT '없음');
---UNIQUE
CREATE TABLE USER ( ID INTEGER PRIMARY KEY AUTOINCREMENT,
NICKNAME TEST UNIQUE);
--- ALTER로 이름 바꾸기, 삭제, 컬럼 수정
ALTER TABLE POST RENAME TO BOARD;
ALTER TABLE BOARD ADD COLUMN POST_DATE TEXT;
ALTER TABLE BOARD DROP COLUMN POST_DATE ;
ALTER TABLE BOARD RENAME COLUMN POST_DATE TO REG_DATE ;
DML: 데이터 조작 언어
insert : 행을 추가
DML: 데이터 조작 언어
insert : 행을 추가
select : 행을 조회
selete 컬럼명 from 테이블 이름 where 조건
조건 :
ex) id =3
title like 'base-on%'
id BETWEEN 1 and 10
address in ("ad1"."ad2")
ORDER BY : 정렬하라
ORDER BY TITLE ASC#오름순 desc: 내림순
```
#update : 행의 값을 수정하는 명령어
update 테이블명 set 컬럼명 = 값, ....where 조건식
#delete : 데이터 삭제
delete from 테이블 where 조건식
실습
INSERT INTO POST (TITLE,CONTENT) VALUES('BASE-ON','TISTYROY.CON')
SELECT * FROM POST ;
SELECT * FROM POST WHERE TITLE='BASE-ON' ;
SELECT * FROM POST WHERE TITLE LIKE 'BASE-ON%' ;
SELECT * FROM POST WHERE ID BETWEEN 1 AND 3;
SELECT * FROM USER WHERE ADDRESS IN ('BUSAN','ULSAN');
SELECT * FROM USER WHERE ADDRESS IN ('BUSAN','ULSAN') ORDER BY NICKNAME DESC; #DESC 내림 , ASC 오름
join
실습전 테이블 생성
create table user ( email text primary key ,
passwd text not null,
gender text,
age, INTEGER);
--데이터 넣기
insert into user (email,passwd,gender,age) VALUES ('1@naver.com','base','male',19);
insert into user (email,passwd,gender,age) VALUES ('2@naver.com','base1','male',12);
insert into user (email,passwd,gender,age) VALUES ('3@naver.com','base3','male',13);
insert into user (email,passwd,gender,age) VALUES ('4@naver.com','base4','male',22);
-----
select * from post inner join user where post.author=user.email;
조인 추가 정리
Inner Join (내부조인)
여러 테이블을 결합시켜 한꺼번에 데이터를 조회한다.
2개의 테이블을 조인하여 데이터를 검색하는 방법중에 지정된 테이블의 컬럼 값이 일치하는 데이터만 검색 하는 방법이 내부조인
# A테이블 id와 B 테이블 id 가 동일한 값인 것을 조인
select * from A inner join B on A.id=B.id;
# 조회할 컬럼 지정
select A.neme, B.name from A inner join B on B.id = A.id
Outer Join (외부조인)
2개의 테이블을 조인하는데 검색하는 방법 중에 지정된 각 테이블의 컬럼 값이 일치하는 데이터뿐만아니라 어느 한쪽 테이블에만 데이터가 있어도 받아오는 방법이 외부조인 (기존 데이터는 다 출력하 하고 일치하는 값이 없으면 Null값으로 놔둔다. )
select * from A left outer join B on A.id=B.id
select * from A left outer join B on A.id=B.id
select gender,count(*) from user GROUP by gender;
select gender,count(*) from user where age >20 GROUP by gender;
-----
파이썬에서 sqlite3사용 방법
순서:
db파일열기 - 커서 생성 - sql 명령 실행 - 커밋 또는 롤백(commit _ 승인, rollback _ 돌아가기) - 데이터베이스 닫기
import sqlite3
conn =sqlite3.connect('/Users/bagbeomsu/Documents/python_django/SQL_DDL.db')
cur =conn.cursor()
create_sql="""
create table if not exists item(
id integer primary key autoincrement,
code text not null,
name text not null,
price interger not null
)
"""
cur.execute(create_sql)
conn.close()
값넣기
import sqlite3
conn =sqlite3.connect('/Users/bagbeomsu/Documents/python_django/SQL_DDL.db')
cur =conn.cursor()
insert_sql="""
insert into item (code,name,price) values (?,?,?)
"""
cur.execute(insert_sql,("base","on",30))
conn.commit()
conn.close()
값 한번에 여러개 넣기
import sqlite3
conn =sqlite3.connect('/Users/bagbeomsu/Documents/python_django/SQL_DDL.db')
cur =conn.cursor()
insert_sql="""
insert into item (code,name,price) values (?,?,?)
"""
data= (
("aaaa","aaaaa",1),
("bbbb","bbbbb",2),
("cccc","ccccc",3),
("dddd","ddddd",4),
)
cur.executemany(insert_sql,data)
conn.commit()
conn.close()
검색하기
import sqlite3
conn =sqlite3.connect('/Users/bagbeomsu/Documents/python_django/SQL_DDL.db')
cur =conn.cursor()
insert_sql="""
insert into item (code,name,price) values (?,?,?)
"""
data= (
("aaaa","aaaaa",1),
("bbbb","bbbbb",2),
("cccc","ccccc",3),
("dddd","ddddd",4),
)
cur.executemany(insert_sql,data)
conn.commit()
conn.close()
수정하기
import sqlite3
conn =sqlite3.connect('/Users/bagbeomsu/Documents/python_django/SQL_DDL.db')
cur =conn.cursor()
update_sql="""
update item set price=70 where price=30;
"""
cur.execute(update_sql)
conn.commit()
conn.close()
기존 30이였던 값이 70으로 변경
삭제
import sqlite3
conn =sqlite3.connect('/Users/bagbeomsu/Documents/python_django/SQL_DDL.db')
cur =conn.cursor()
delete_sql="""
delete from item where price=70;
"""
cur.execute(delete_sql)
conn.commit()
conn.close()
---
추가 정리
정규화
DB를 설계를 재구성하는 테크닉입니다. 정규화를 통해 불필요한 데이터를 지울 수 있고 삽입/갱신/삭제시 발생하는 테이블간 이상현상을 해결하기 위함 입니다.
[ 제1 정규화 ]
제1 정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다. 예를 들어 아래와 같은 고객 취미 테이블이 존재한다고 하자.
DB를 설계를 재구성하는 테크닉입니다. 정규화를 통해 불필요한 데이터를 지울 수 있고 삽입/갱신/삭제시 발생하는 테이블간 이상현상을 해결하기 위함 입니다.
[ 제1 정규화 ]
제1 정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다. 예를 들어 아래와 같은 고객 취미 테이블이 존재한다고 하자.
[ 제2 정규화 ]
제2 정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.예를 들어 아래와 같은 수강 강좌 테이블을 살펴보자.
제3 정규화
제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 여기서 이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.
[ BCNF 정규화 ]
BCNF 정규화란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다. 예를 들어 다음과 같은 특강수강 테이블이 존재한다고 하자.
------
-----
정규화 표현식
문자열에서 특정 패턴을 찾고 싶을 때 사용
유효성(이메일 주소형식인지, 패스워드에 특수문자랑 숫자가 섞여 있는지 확인)
정규표현방법
- flages
- charater classes
- anchors
- excaped characters
연습하기 좋은 페이지 소개
하는 방법
character class
. | 모든글자 |
\w | 알파벳, 숫자, 언더바 |
\W | \w 반대 |
\d | 숫자 |
\D | 숫자가 아닌 것 |
\s | 공백 |
\S | 공백이 아닌것 |
검색 | |
[abc] | abc인 문자 |
[^abc] | abc아 아닌 문자 |
[a-k] | a ~ k까지 |
[a-zA-Z] | 대소문자 |
[a-zA-Z0-9] | 대소문자 숫자 |
anchors | |
^abc | abc로 시작하는 단어 |
abc$ | abc로 끝나는 |
\b | 단어의 시작 |
\B | 단어의 끝인것 |
escaped characters | |
\., \*,\\ | 특수문자일 경우 |
Quantifiers 수량 & alternation
a* a가 0~
a+ | 1~ |
a? | 0 or 1 |
a{3} | aaa |
a{2,} | 2개 이상 |
a{1,3} | a가 1~3개 |
a+?, | 최소 구분자를 ,둠 |
ab | cd |
a(b | c)d |
a[bc]d | abd,acd |
Groups & Lookaround /그룹화 하여 뽑아낸다
(abc) 그룹찾기
(.+)\s\1 | 숫자는 전에꺼 가져오기 |
\[abc | def)].* |
\[?:(abc | def)].* |
(?-abc) | 결과엔 abc를 뺀다 |
(?!abc) | abc가 아닌 것을 찾는다 |
파이썬에서 re모듈을 사용하여 정규화하기
메서드
match: 문자열 처음부터 검색
search:문자열 전체를 검색
findall : 문자열 전체를 검색 - 찾은경우 문자열 리스트 반환
finditer: 문자열 전체를 검색 match오브젝트로 반환
fullmatch: 패턴과 문자열이 남는 부분없이 일치하는가?
종류
group 매칭된 문자열을 반환
start 매칭된 문자열 처음
end 매칭된 문자열 끝위치
span 매칭된 문자열 튜블 반환
실습
```jsx
import re
str = "love people around you, love your work, love yourself"
#match는 문자열의 앞부분이 같은지 결과값은 match결과
result = re.match('love',str)
print(result)
# 문자열의 전체를 검색
result = re.search('people',str)
print(result)
# findall 문자열의 전체를 검색 결과론 문자열 리스트로 나옴
result=re.findall('love',str)
print(result)
#finditer :문자열의 전체를 검색 결과론 match객체 이터레이터로 나옴
result=re.finditer('love',str)
print(result)
#fullmatch 패턴과 문자열이 완벽하게 일치하는지 검사
str2="abc abc"
result= re.fullmatch("abc abc",str2)
print(result)
#match object의 메서드
result =re.search('people',str)
print(result.group()) #매칭된 문자열
print(result.start()) #매칭된 문자열의 앞 인덱스
print(result.end()) #매칭된 문자열의 끝 인덱스
print(result.span()) #매칭된 문자열의 앞,뒤 인덱스
```
import re
str1="010-1234-1234"
result=re.match('\d{2,3}-\d{3,4}-\d{4}$',str1)
print(result.group())
str2="010-1234-1234,010-2345-2345,010-3456-3456"
result=re.finditer('\d{2,3}-\d{3,4}-(\d{4})(,|$)',str2)
for idx,result in enumerate(result,1):
print(f'{idx}.{result.group(1)}')
#후방탐색
str3='010-6788-1111'
result = re.sub('(?<=\d{3}-\d{4}-)\d{4}','****',str3)
print(result)
=======
동시성과 병렬성 (스레드)
동시성
프로세스에는 하나의 thread (작업을 처리하는)가 있다.
하나의 작업만 처리할 수 있지만 thread를 만들어 왓다갓다하면서 동시에 동작되는 것처럼 보이게 하게 된다.
병렬성
cpu가 여러개 있어서 동시에 동작하는 것
실습
import threading
#thead 함수
def work () :
print("|sub|")
keyword= input("검색어를 입력>>>>>>")
print(f"[sub] {keyword}로 검색시작합니다.")
print(f"[sub] end")
#메인스레드 실행되는 부분
print("|main|")
worker= threading.Thread(target=work)
worker.start()
print("\main\은 자기일을 합니다.")
print("[\main\] end1")
import threading
import time
def buyer():
for i in range(5):
print("[매수] 데이터 요청중")
time.sleep(1)
print("[매수] 데이터 요청중")
time.sleep(1)
print("[매수] 데이터 요청중")
time.sleep(1)
print("[매수] 매수 완료")
time.sleep(1)
def saler():
for i in range(5):
print("[매도] 데이터 요청중")
time.sleep(1)
print("[매도] 데이터 요청중")
time.sleep(1)
print("[매도] 데이터 요청중")
time.sleep(1)
print("[매도] 익절")
time.sleep(1)
print("[main] start")
buyer= threading.Thread(target=buyer)
saler= threading.Thread(target=saler)
buyer.start()
saler.start()
buyer.join()
saler.join()
print("[알림]장이 종료되었습니다.")
import multiprocessing as mp
#프로세스에서 실행될 함수
def work(name):
print("sub start")
print(name)
cp=mp.current_process()
print(cp.pid)
print("sub end")
if __name__=="__main__":
print("main start")
p=mp.Process(target=work,args=('base-on',))
p.start()
cp=mp.current_process()
print(cp.pid)
print('main end')
from multiprocessing import Process
import time
class SubP(Process):
def __init__(self,name):
Process.__init__(self)
self.name=name
def run(self):
print("sub "+ self.name+ " start")
time.sleep(5)
print("sub"+ self.name+ "end")
if __name__=="__main__":
print("main start")
p =SubP(name='base-o')
p.start()
print("main end")
from multiprocessing import Process
import time
class SubP(Process):
def __init__(self,name):
Process.__init__(self)
self.name=name
def run(self):
print("sub "+ self.name+ " start")
time.sleep(5)
print("sub"+ self.name+ "end")
if __name__=="__main__":
print("main start")
p =SubP(name='base-o')
p.start()
print("main end")
분할해서 블로깅을 하고 싶었지만 이벤트 참여를 통해 이렇게 올린 점 죄송합니다.
다소 길었지만 1주일 분량입니다.
다음주엔 웹프로그래밍으로 블로깅 시작하도록 하겠습니다.
감사합니다.
'프로그래밍 > Python & Django' 카테고리의 다른 글
[Python & Django] HTML /CSS 실습환경 (0) | 2021.12.13 |
---|---|
[파이썬인강]5주차- 웹 & 프론트엔드 기본(html, css) (0) | 2021.12.13 |
[파이썬인강]3주차-모듈과 패키지, 파일 읽/쓰기 ,예외처리 및 심화문법 (0) | 2021.11.29 |
[파이썬 인강] 2주차 - 반복문,튜플, 함수, 클래스, 상속 (0) | 2021.11.11 |
[파이썬 인강] 1주차 파이썬 기본 문법 환경설정 및 Python 기본(Mac) (0) | 2021.11.11 |