본문 바로가기
프로그래밍/Python & Django

[파이썬인강]4주차 클레스와 객체 ,상속, 데이터베이스, 정규표현식, 스레드

by Cloud_Park 2021. 12. 7.

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주차-모듈과 패키지, 파일 읽/쓰기 ,예외처리 및 심화문법

 

[파이썬인강]3주차-모듈과 패키지, 파일 읽/쓰기 ,예외처리 및 심화문법

2021.11.11 - [분류 전체보기] - IT 기업 2.4개월차 드디어 노트북 구매 2021.11.11 - [프로그래밍/Python & Django] - [파이썬 인강] 1주차 파이썬 기본 문법 환경설정 및 Python 기본(Mac) 2021.11.11 - [프로그..

base-on.tistory.com

 

 

 

안녕하세요 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문으로 출력함)

 

 

실습 환경 설치

 

https://sqlitebrowser.org/dl/

해당 칸에 명령어 입력후 [컨트롤 + 엔터] 하면 명령어가 실행됨

 

 

 

---

데이터베이스 명령어 실습

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

연습하기 좋은 페이지 소개

https://regexr.com/639t5

https://regexr.com/

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

하는 방법

 

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주일 분량입니다.

다음주엔 웹프로그래밍으로 블로깅 시작하도록 하겠습니다.

감사합니다.