본문 바로가기
패스트캠퍼스

[패스트캠퍼스] 파이썬 강의 3주차 파이썬 심화 문법/ 문자열, 리스트, 할당과 복사, 매개변수, 함수, 데이터베이스, SQL

by 리잼 2022. 9. 11.
반응형

문자열 다루기

1. replace

  • 문장안에 글자를 바꿔주는 메서드
a = '오늘 날씨는 흐림입니다.'.replace("흐림", "맑음")
print(a) # 오늘 날씨는 맑음입니다.

2. find

  • 문장안에 글자를 찾아주는 메서드
b = "hello world".find('world')
print(b) # 6 ( world의 시작점인 w가 index 6에 있기 때문에 6이 출력됨 )

3. split

  • 문자열을 분리시켜주는 메서드
# split() 괄호안에 구분자를 넣어주면 구분자를 따라 문자열을 분리시켜준다

c = '동해물과 백두산이 마르고 닳도록'.split()
print(c) # ['동해물과', '백두산이', '마르고', '닳도록']

d = '동해물과:백두산이:마르고:닳도록'.split(':') 
print(d) # ['동해물과', '백두산이', '마르고', '닳도록']

4. strip

  • 문자열 공백 제거 메서드
text = '    text    '
print("[" + text.rstrip() + "]") # [    text]
print("[" + text.lstrip() + "]") # [text    ]
print("[" + text.strip() + "]") # [text]

문자열 포매팅

1. format 메서드

# 문자열에 인덱스를 설정해주면 format()에 들어있는 인덱스가 문자열 안에 삽입됨

hello = 'Hello {0} {1} {2}'.format('apple', 'banana', 'pen')
print(hello) # Hello apple banana pen

# 인덱스 번호를 생략도 가능하다
hello = 'Hello {} {} {}'.format('apple', 'banana', 'pen')
print(hello) # Hello apple banana pen

2. f-string

shoes = '나이키'
size = 270
print(f'제 신발은 {shoes}이고 size는 {size}입니다.') # 제 신발은 나이키이고 size는 270입니다.

리스트 다루기

1. 리스트 데이터 삭제 / del , pop(), remove()

fruits = ['apple', 'orange', 'mango']
del fruits[1]
print(fruits) # ['apple', 'mango']

fruits = ['apple', 'orange', 'mango']
fruits.pop(1)
print(fruits) # ['apple', 'mango']

fruits = ['apple', 'orange', 'mango']
fruits.remove('orange')
print(fruits) # ['apple', 'mango']

2. 리스트 정렬 / sort()

numbers = [0,1,2,7,3]
numbers.sort() # 오름차순 정렬
print(numbers) # [0, 1, 2, 3, 7]

numbers.sort(reverse=True) # 내림차순 정렬
print(numbers) # [7, 3, 2, 1, 0]

3. enumerate / 리스트에 인덱스 부여

titles = ['출석', '출석인증', '출석이요']

for index, title in enumerate(titles, 1):
    print(f'{index}번째 글입니다. 제목: {title}')

#1번째 글입니다. 제목: 출석
#2번째 글입니다. 제목: 출석인증
#3번째 글입니다. 제목: 출석이요

리스트 내포

  • [ 표현식 for 변수 in 순회가능한 데이터 ]
# for 사용
nums = [i for i in range(5)]
print(nums) # [0, 1, 2, 3, 4]

nums2 = [100,200,300]
double_nums = [i * 2 for i in nums2]
print(double_nums) # [200, 400, 600]
  • [ 표현식 for 변수 in 순회가능한 데이터 if 조건식]
# if 사용
nums3 = [i for i in range(10) if i%2 == 0]
print(nums3) # [0, 2, 4, 6, 8]

nums4 = [100,200,300,400,500]
double_nums2 = [i * 2 for i in nums4 if i >= 300]
print(double_nums2) # [600, 800, 1000]

리스트 내포 실습문제

# 실습문제 1
# 리스트 내포를 사용해서 word_list에 들어있는 첫글자가
# a인것만 뽑아서 list 생성

word_list = ['apple', 'watch', 'apolo','abocada']

#리스트 내포 사용전
result = []
for word in word_list:
    if word[0] == 'a':
        result.append(word)

print(result) # ['apple', 'apolo', 'abocada']

# 리스트 내포 사용
result2 = [word for word in word_list if word[0] == 'a']

print(result2) # ['apple', 'apolo', 'abocada']


# 실습문제 2
# 리스트 내포를 사용해서 None을 없애본다 

word = ['오메가3', 'None', '비타민C500', 'None', '홍삼절편']

# 리스트 내포 사용전
result = []
for i in word:
    if i != 'None':
        result.append(i)
    else:
        result.append('')
print(result) # ['오메가3', '', '비타민C500', '', '홍삼절편']

# 리스트 내포 사용
result2 = [i if i != 'None' else '' for i in word] # else가 사용되면 if문을 맨앞에 작성해야한다
print(result2) # ['오메가3', '', '비타민C500', '', '홍삼절편']

할당과 복사

  • 파이썬에선 변수에 데이터가 저장되는것이 아니라
    변수가 데이터를 가르키는 것이다.
x = [1,2,3,4,5]
y = x

y[2] = 0

# x를 y로 복사했다고 생각하고 y의 인덱스 2번을 0으로 바꿨지만
# 변수의 주소가 같으므로 두개의 변수값이 동일하게 나온다.
print(y) # [1, 2, 0, 4, 5]
print(x) # [1, 2, 0, 4, 5]

# 두 변수의 주소는 동일하게 나온다
print(id(y)) # 2826249916032 
print(id(x)) # 2826249916032

리스트 복사방식

  • 리스트를 복사할 땐 copy() 함수를 사용해야함
  • 중첩 리스트를 복사할땐 copy 모듈의 deepcopy()를 사용해야함
a = [5,6,7,8,9]
b = a.copy()

print(a, b) # [5, 6, 7, 8, 9] [5, 6, 7, 8, 9]
# 주소가 다르게 찍힌다.
print(id(a), id(b)) # 2079301552960 2079301553024

# 중첩 리스트 복사방식
import copy # copy 모듈을 사용해서 deepcopy()를 사용해야한다

c = [[1,2], [3,4,5]]
d = copy.deepcopy(c)
d[0][0] = 0

print(c) # [[1, 2], [3, 4, 5]]
print(d) # [[0, 2], [3, 4, 5]]

문자열 실습문제

# 소요시간을 모두 분으로 바꾸는 프로그램 작성

time = input("시간을 입력하세요 : ")
# 1. 분만 있는경우 ex) 30분
# 2. 시간만 있는 경우 ex) 2시간
# 3. 시간과 분만 있는경우 ex) 2시간 30분

if time.find('시간') == -1 : # find 함수에 -1 값을 주면 값을 찾을 수 없다 판단
    # 분만 있는경우
    result = int(time.split('분')[0]) # 만약 30분이라고 입력을 했다면 ['30',''] 으로 표시가 되므로 
else:                                 # 첫번째 리스트를 출력하기위해 [0]을 넣어줌
    if time.find('분') == -1:
        #시간만 있는경우
        result = int(time.split('시간')[0]) * 60 # 시간은 60분이므로 입력한 시간에 60을 곱해준다
    else:
        # 시간과 분이 있는 경우
        sub = time.split('시간')
        result = int(sub[0]) * 60 + int(sub[1].split('분')) 

print(result)

매개변수

위치 매개변수(Positional Parameter)

  • 가장 기본적인 매개변수
  • 함수를 호출할 때 순서대로 데이터를 넘겨줘야함
  • 다른 매개변수와 함께 쓸 때는 항상 맨 앞에 써야한다
# 함수 정의
def my_func(a,b):
	print(a,b)
    
#함수 호출
my_func(1,2)

기본 매개변수 (Default Parameter)

  • 매개변수의 기본적인 값
  • 함수를 정의할 때 매개변수의 기본 값을 지정할 수 있다.
# 함수정의
def post_info(title, content='내용없음'):
	print('제목:', title)
	print('내용:', content)
    
# 함수호출
post_info('출석합니다.')

# 제목 : 출석합니다.
# 내용 : 내용없음

키워드 매개변수 (Keyword Parameter)

  • 함수 호출 시 키워드를 붙혀 호출한다
  • 매개변수의 순서를 지키지 않아도 된다
# 함수정의
def post_info(title, content):
	print('제목:', title)
	print('내용:', content)

# 함수호출
post_info(content='재밌다', title='코딩')

# 제목 : 코딩
# 내용 : 재밌다

위치 가변 매개변수 (Positional Variable Length Parameter)

  • 가변 매개변수 = 개수가 정해지지 않은 매개변수
  • 매개변수 앞에 * < 붙음. ( 튜플형 )
# 함수정의1
def print_fruits(*args):
	print(args)

# 함수정의2
def print_fruits(*args):
    for arg in args:
        print(arg)

# 함수호출
print_fruits('apple','orange','mango')

#apple
#orange
#mango

키워드 가변 매개변수 (Keyword Variable Length Parameter)

  • 가변 매개변수 = 개수가 정해지지 않은 매개변수
  • 매개변수 앞에 ** < 붙음 ( 딕셔너리형 )
# 함수정의1
def comment_info(**kwargs):
	print(kwargs)
    
#  함수정의2
def comment_info(**kwargs):
    for key, value in kwargs.items():
        print(f'{key} : {value}')

# 함수호출
comment_info(name='파린이', comment='감사합니다')

# name : 파린이
# comment : 감사합니다

람다함수

람다 함수란

  • 간단한 형태의 함수
  • 다른 함수의 인자(argument)로 넣을 수 있음
  • 코드가 간결해지고, 메모리가 절약됨
# 기존 함수
def minus_one(a):
    return a-1

# 람다 함수
lambda a : a-1

# 람다 함수 호출방법

# 1. 함수 자체 호출
print((lambda a:a-1)(10))
# 2. 변수에 람다를 담아서 호출
minus_one_2 = lambda a : a-1
print(minus_one_2(100))

#람다함수에서 if 문 사용

# 기존 함수
def is_positive_number(a):
    if a > 0:
        return True
    else:
        return False

# 람다 함수
lambda a : True if a > 0 else False

# 람다 함수 호출 (1)
print((lambda a : True if a > 0 else False)(-2))
# 람다 함수 호출 (2)
is_positive_number = lambda a : True if a > 0 else False
print(is_positive_number(2))

 

map

  • 기존 리스트를 수정해서 새로운 리스트를 만들 때 사용

사용방법

# 사용방법
map(함수, 순서가 있는 자료형)
map(int, ['3','4','5','6']

list(map(함수, 순서가 있는 자료형)
list(map(int, ['3','4','5','6'])

# - 예제
# 리스트 모든 요소의 공백 제거
items = ['       로지텍 마우스  ',' 앱솔 키보드   ']

# 1) for문 사용 경우
for i in range(len(items)):
    items[i] = items[i].strip()

print(items)

# 2) map 사용
def strip_all(x):
    return x.strip()

items = list(map(strip_all, items))

# 3) 람다 사용
items = list(map(lambda x : x.strip(), items))
print(items)

filter

  • 기존 리스트에서 조건을 만족하는 요소를 뽑고 싶을 때
# 사용방법
# filter(함수, 순서가있는 자료형)
def func(x):
    return x < 0

print(list(filter(func, [-3,-2,0,5,7])))

# -예제
# 리스트에서 길이가 3이하인 문자들만 필터링
animals = ['cat','tiger','dog','bird','monkey']

# 1) for 사용
result = []
for i in animals:
    if len(i) <= 3:
        result.append(i)
print(result)

# 2) 필터 사용
def word_check(x):
    return len(x) <= 3
result = list(filter(word_check, animals))
print(result)

# 3) 람다 사용

result = list(filter(lambda x : len(x) <= 3, animals))
print(result)

클래스와 객체

절차지향

  • 기능들을 어떤 순서대로 처리할 것인가에 초점을 맞춤

객체지향

  • 객체가 중심이 되고, 객체를 정의하고 객체간 상호작용에 초점을 맞춤
# Unit클래스
class Unit:
    """
    속성 : 이름, 체력, 방어박, 공격력
    """
    def __init__(self, name, hp, shield, demage):
        self.name = name
        self.hp = hp
        self.shield = shield
        self.demage = demage
        print(f"[{self.name}](이)가 생성 되었습니다.")
    # 객체를 출력할 때 호출되는 메서드

    def __str__(self):
        return f"[{self.name}] 체력: {self.hp} 방어막: {self.shield} 공격력: {self.demage}"

# 객체 생성
probe = Unit("프로브", 20, 20, 5) # [프로브](이)가 생성 되었습니다.
zealot = Unit("질럿", 100, 60, 16) # [질럿](이)가 생성 되었습니다.
dragoon = Unit("드라군", 100, 80, 20) # [드라군](이)가 생성 되었습니다.

# 객체 호출
print(probe) # [프로브] 체력: 20 방어막: 20 공격력: 5
print(zealot) # [질럿] 체력: 100 방어막: 60 공격력: 16
print(dragoon) # [드라군] 체력: 100 방어막: 80 공격력: 20

여러가지 메서드


데이터 베이스

데이터 베이스 구성요소

  • 데이터 베이스 ( database ) : 테이블의 집합
  • 테이블 ( table ) : 행의 집합
  • 행 ( row ) : 한 단위의 데이터 기록
  • 열  ( column ) : 데이터의 항목

DBMS ( Database Management System )

  • 데이터 베이스를 관리해주는 프로그램

SQL 이란

  • Structured Query Language
    데이터 베이스를 관리하기 위해 사용되는 언어

SQLite 데이터 타입

데이터 타입 설명
Integer 정수
real 실수
text 문자열
null null 값 ( 데이터 없음 )

DDL ( Data Definition Language ) / CREATE, ALTER, DROP

  • 데이터 정의 언어
# CREATE TABLE 테이블명 (컬럼1 데이터타입, 컬럼2 데이터 타입);
CREATE TABLE post (id integer, title text);

# 제약 조건
# 1. primary key / 레코드를 구분짓는 값 유일한 값.
# 2. not null / 빠지면 안되는 값 
# 3. default / 아무런 데이터가 없으면 데이터에 들어가는 기본 값
CREATE TABLE post (id integer primay key,
		title text not null default '제목없음',
                    content text default '내용없음');
# 4. unique / 중복이 될 수 없는 유일한 값
#    autoincrement << 자동 증가 옵션
CREATE TABLE user (id int primary key autoincrement,
					nickname text unique);

DML ( Data Manipulation Language ) / INSERT, SELECT, UPDATE, DELETE

  • 데이터 조작 언어
# INSERT
# 데이터(행) 추가 명령
# INSERT INTO 테이블명 (컬럼1, 컬럼2) VALUES (값1, 값2);

INSERT INTO post (title, content) VALUES ('코딩', '재밌어요);

# SELECT
# 데이터 조회 명령 
# SELECT * FROM 테이블명

SELECT * FROM post

# WHERE / SELECT의 조건
# SELECT * FROM WHERE 조건;
SELECT * FROM post WHERE id=3;
SELECT * FROM post WHERE title like 'startcoding%';
SELECT title content FROM post WHERE id BETWEEN 1 an 10;
SELECT * FROM user address IN ('seoul', 'busan', daegou');

# ORDER BY / 정렬 ASC(오름차순) DESC(내림차순)
# SELECT * FROM 테이블 명 ORDER BY 컬럼명 [ASC|DESC]
SELECT * FROM post ORDER BY title ASC

# UPDATE
# 데이터 수정 명령
#UPDATE 테이블명 SET 컬럼명 = 값, 내용 WHERE 조건식;
UPDATE post SET title = '제목 수정중',
			content = '본문 수정중'
            WHERE id = 3;

# DELETE
# 데이터 삭제 명령
# DELETE FROM 테이블명 WHERE 조건식;
DELETE FROM post WHERE id = 3;

GROUP BY, JOIN

  • 테이블 그룹화명령
# GROUP BY
# 그룹화해서 계산하는 명령
# SELECT count(*) FROM 테이블명 GROUP BY 컬럼명;
SELECT gender, count(*) FROM user GROUP BY gender;
SELECT gender, avg(age) FROM user WHERE age > 20 GROUP BY gender;

# JOIN
# 두 테이블을 묶어서 조회할 때
# SELECT * FROM 테이블명1 INNER JOIN 테이블2 WHERE 조건;
SELECT * FROM post INNER JOIN user WHERE post.author = user.email;

파이썬 SQLite3 사용법

사용순서

  1. DB 파일열기
  2. 커서 생성
  3. SQL명령 실행
  4. 커밋 또는 롤백
  5. DB닫기

INSERT

# 모듈 추가
import sqlite3

# 데이터베이스 열기
conn = sqlite3.connect('myvenv/Chapter05/sql.ddl.db')

# 커서 생성
cur = conn.cursor()

# SQL 명령 작성
CREATE_SQL = """
    CREATE TABLE IF NOT EXISTS Item(
        id integer primary key autoincrement,
        code text not null,
        name text not null,
        price integer not null
    )
"""

# INSERT
INSERT_SQL = "INSERT INTO item(code, name, price) VALUES(?,?,?)"
# SQL 명령 실행
cur.execute(INSERT_SQL, ('A00001', '게이밍마우스', 380000))


# 데이터 여러개 한번에 추가
data = (
    ('A00001', '게이밍마우스', 380000),
    ('A00002', '최신형 스마트폰', 800000),
    ('A00003', '가성비 노트북', 650000)
)

cur.executemany(INSERT_SQL, data)


#커밋 : INSERT, UPDATE, DELETE 는 커밋을 해야 데이터베이스에 반영이된다.
conn.commit()

# 데이터 베이스 닫기
conn.close()

SELECT

# 모듈 추가
import sqlite3

# 데이터베이스 열기
conn = sqlite3.connect('myvenv/Chapter05/sql.ddl.db')

# 커서 생성
cur = conn.cursor()


# SQL 명령 작성
SELETC_SQL = "SELECT * FROM item LIMIT 2"

# SQL 명령 실행
cur.execute(SELETC_SQL)


rows = cur.fetchall()
for row in rows:
    print(row)

# 데이터 베이스 닫기
conn.close()

UPDATE

# 모듈 추가
from select import select
import sqlite3

# 데이터베이스 열기
conn = sqlite3.connect('myvenv/Chapter05/sql.ddl.db')

# 커서 생성
cur = conn.cursor()


# SQL 명령 작성
UPDATE_SQL = "UPDATE Item SET price = 650000 where code = 'A00002';"

# SQL 명령 실행
cur.execute(UPDATE_SQL)

conn.commit()
# 데이터 베이스 닫기
conn.close()

DELETE

# 모듈 추가
from select import select
import sqlite3

# 데이터베이스 열기
conn = sqlite3.connect('myvenv/Chapter05/sql.ddl.db')

# 커서 생성
cur = conn.cursor()


# SQL 명령 작성
DELETE_SQL = "DELETE FROM Item WHERE code='A00002';"

# SQL 명령 실행
cur.execute(DELETE_SQL)

conn.commit()
# 데이터 베이스 닫기
conn.close()

3주차를 마치며 ...

함수와 클래스를 속성으로 배우려니 이해하기 어려운부분이 많았던 것 같다

코딩은 반복숙달.. 복습만이 살길이요 .. 따라치기만 하지말고 이해를 하도록 노력해야겠다

DB부분은 전 직장에서 하던거라 어렵지 않다 연습해야 할 것은 select시 원하는 값을 출력 되도록

반복문을 어떻게 작성해주느냐 정도? 반복문은 왜이렇게 해도해도 잘 안되는지 ..

더 노력하자 ~

반응형