[패스트캠퍼스python] 외부파일 CSV, 엑셀 읽기 및 쓰기

파이썬 인강 : 외부파일 CSV, 엑셀 읽기 및 쓰기

1. CSV 읽기, 쓰기

위의 예제를 차근차근 보자
with open(작성한 파일을 저장할장소/저장할 파일명, ‘w’(작성한다는는 의미), newline=’’) as f:

  1. newline=’’
    이 의미는 이 부분이 없으면 한 줄씩 띄어쓰기로 for문을 순회하면서 데이터가 자동저장된다
    하지만 데이터 양이 많을수록 용량도 커지고 쓸데없이 불편할 수 있다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    1,2,3

    4,5,6

    7,8,9,

    10,11,12

    13,14,15

    16,17,18
    그래서 ‘’빈칸을 넣어서 띄어쓰기를 없애는 것이다
    newline=’’을 적용하면 아래와 같이 결과값이 출력된다

  1. writerow()와 writerows()의 차이점
  • writerow()는 한줄씩 띄어쓰기하여 입력된다 -> for문을 썼기에 순회하면서 전체 내용이 출력되었다.
  • writerows() 한줄씩이 아닌 전체데이터가 입력된다.(for문 반복없이 한번에 입력)

한줄씩 순회하면서 입력 방법(writerow)와 한꺼번에 전체데이터를 입력하는 방법(writerows)은 각각의 장점이 있다
예시로 회원가입목록에서 1950년생이하는 빼고 데이터를 출력하고싶을때 if조건문으로 필터링을 걸어줘서 writerow이 유용하게 쓰인다

2. 엑셀 쓰기 읽기

엑셀을 처리하는 오픈소스 : openpyxl, xlsxwriter, xlrd, xlwt, xlutils
여러가지 방법이 있지만 pandas를 가장 많이 사용한다
그 이유는 pandas는 최다사용오픈소스인 openpyxl, 랭킹 1위인 xlrd를 내부적으로 만능으로 사용할 수 있기때문이다

pandas를 이용하기 위해서는 아래 3가지를 다운로드해줘야한다
1. pip install xlrd
2. pip install openpyxl
3. pip install pandas


파이썬 인강 : 데이터베이스 연동(SQLite)

SQLite는 기본적으로 설치가 되어있다. 따라서 따로 설치할 필요없이 바로 import하면 된다

1. 테이블 생성 및 삽입

import datetime
import sqlite3

2. 삽입 날짜 생성

많이 쓰니까 꼭 알기

1
2
now = datetime.datetime.now()
print('now', now)

보기 불편하니까 포맷을 만들면 익숙한 시간형식으로 나타낼수있다

1
2
nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S')
print('nowDatetime', nowDatetime)

3. DB생성 & Autocommit 그리고 커밋

본인 DB 파일 경로로 설정해주면된다
isolation_level=None 을 넣었을 경우 자동으로 커밋 반영(Auto Commit)해준다.
설정하지 않았다면 수정 후 conn.commit() 명령어를 입력해야지만 반영된다

1
conn = sqlite3.connect('본인DB파일경로/database.db', isolation_level=None)

4. Cursor연결

1
2
c = conn.cursor()
print('Cursor Type : ', type(c))

5. 테이블 생성

데이블에서 쓰일 수 있는 Datatype에는 총 5가지가 있다

  • TEXT
  • NUMERIC
  • INTEGER
  • REAL
  • BLOB
1
2
3
c.execute(
"CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, username text, email text, phone text, website text, regdate text)")
#AUTOINCREMENT

6. 데이터 삽입

삽입에는 크게 두가지 방식이 있다

  1. 첫번째방법
    ? 를 넣는 이유는 위에서 만들었던 데이터(“nowDatetime,”)를 넣게되면 스트링형식으로 들어가기때문에 ?를 주고 뒤에 매개변수로 튜플형태로 입력한다
1
c.execute("INSERT INTO users VALUES (1 ,'Kim','Kim@naver.com', '010-0000-0000', 'Kim.com', ?)", (nowDatetime,))
  1. 두번째 방법
    ?의 갯수와 삽입할데이터의 갯수를 순서대로 일치시켜줘주면된다
1
c.execute("INSERT INTO users(id, username, email, phone, website, regdate) VALUES (?, ?, ?, ?, ?, ?)", (2, 'Park', 'Park@naver.com', '010-1111-1111', 'Park.com', nowDatetime))

7. Many 삽입(튜플, 리스트형태를 삽입가능)

가장 중요한 부분이다!
Many는 이름 그대로 대용량 데이터를 삽입하는 방법으로 튜플이나 리스트형태를 삽입가능하다

1
2
3
4
5
6
7
userList = (
(3, 'Lee', 'Lee@naver.com', '010-2222-2222', 'Lee.com', nowDatetime),
(4, 'Cho', 'Cho@naver.com', '010-3333-3333', 'Cho.com', nowDatetime),
(5, 'Yoo', 'Yoo@naver.com', '010-4444-4444', 'Yoo.com', nowDatetime)
)

c.executemany("INSERT INTO users(id, username, email, phone, website, regdate) VALUES (?, ?, ?, ?, ?, ?)", userList)

웹상에서 입력받은 데이터를 sqlite를 통해서 장고의 경우, orm을 통해서 대용량데이터를 입력할 수 있다

8.테이블 데이터 삭제

지우는 명령어는 conn.execute(“delete from users”)지만 몇개의 행을 지웠는지까지 확인할 수 있는 아래 명령어를 쓰는 것이 더 좋다

1
print("users db deleted : ", conn.execute("delete from users").rowcount, "rows")

9. 롤백

되돌리기를 뜻하며 커밋한 걸 되돌리는 것이다.

1
conn.rollback()

10. 접속 해제

DB를 다 사용했을때는 꼭 접속 해제 명령어를 입력해줘야한다.

1
conn.close()
데이터베이스기초활용

데이터베이스기초활용

데이터베이스 용어정리 (P63)

  1. 개체 = 엔티티(Entity) = 유무형의 객체
    테이블이라는 개체를 사용해서 DB에 데이터를 분류해서 저장해야한다.=> 데이터베이스관리자의 역할이 아닌 개발자의 역할이다
    즉 데이터 모델링과정을 잘해야 좋은 개발자이다.

Read More
DDL vs DML vs DCL

DDL vs DML vs DCL

SQL 명령어

관계형 데이터베이스 작동을 위해 사용하는 표준언어이고 모든 프로그램 및 유저가 데이터베이스의 데이터를 엑세스학 위해 사용하는 일련의 명령문이다.

Read More

[패스트캠퍼스python] 예외처리

파이썬 인강 : 예외처리

완벽한 코딩은 없다. 여러 사람이 함께 작업한다한들 예외는 언제든지 나타날수있다
만약 미세한 코딩으로인해 수백명이 결제하는 회사 시스템에 예외가 발생해버린다면 그 손해는 막심할 것이다.

1. 예외 종류

  • SyntaxError
  • TypeError
  • NameError
  • IndexError
  • ValueError
  • KeyError.. 등등

요즘은 문법적으로 에러는 없지만 코드 실행(런타임) 프로세스에서 발생하는 예외 처리가 중요하다
에디터에서 linter가 문법적인 에러를 잡아주기때문에 걱정없지만 런타임에서 발생하는 에러에 주의해야한다

항상 예외가 발생하지 않을 것으로 가정하고 먼저 코딩
그 후 런타임 예외 발생 시 예외처리 권장(EAFP 코딩 스타일)

1. SyntaxError : 잘못된 문법

문법적인 에러는 보통 linter가 잡아준다

1
2
3
4
5
print('test)     # ' 누락

if True # : 누락
pass
x => y # 작거나 같다는 >=로 해야함

2. NameError : 참조 변수 없음

1
2
3
a = 10
b = 15
print(c) # 예외 발생

3. ZeroDivisionError : 0 나누기 에러

모든 언어에 있는 에러이고 런타임에서 발생하는 에러이기에 중요하다

1
print(10 / 0)

4. IndexError : 인덱스 범위 오버

자주 발생하는 에러

1
2
3
4
5
6
7
8
9
x = [10, 20, 30]

print(x[1])
print(x[3]) # 예외 발생
print(x.pop())
print(x.pop())
print(x.pop())
print(x.pop()) # 예외 발생
print(x.pop(50)) # 예외 발생

5. KeyError

주로 딕셔너리에서 나오는 에러이다

1
2
3
dic = {'name': 'Kim', 'Age': 33, 'City': 'Seoul'}

print(dic['hobby']) # 키가 존재하지 않으면 예외

이런 에러를 방지하기 위해 get매서드를 사용하면 좋다

1
print(dic.get('hobby')) # 안전

6. AttributeError : 모듈, 클래스에 있는 잘못된 속성 사용시에 예외

1
2
3
4
x = [1, 2, 3]
print(x.append(4))
print(x)
print(x.add(10))

출력값은

list는 add가 없기에 AttributeError발생한다

7. ValueError : 참조 값이 없을 때 예외

1
2
3
4
t = (10, 100, 1000)

print(t.index(100))
print(t.index(7)) # 예외 발생

8. FileNotFoundError

외부파일을 불러와서 처리할때 자주 발생

터미널에 보면 디렉토리 내에 찾을 수 없다고 나온다

9. TypeError : 자료형에 맞지 않는 연산을 수행 할 경우

1
2
3
4
5
6
x = [1, 2]
y = (1, 2)
z = 'test'

print(x + y) # 예외 발생(튜플과 리스트를 결합할수없다 -> 그래서 형변환이 중요)
print(sum([1,2,3],10,1)) # 예외 발생(자료형불일치)

2. 예외 처리 기본

아래 예외 처리는 기본중의 기본이므로 꼭 알아둬야한다.

1
2
3
4
5
6
try               에러가 발생 할 가능성이 있는 코드 실행
except 에러명1: 에러가 발생하면 여기서 처리(여러 개 가능)
except 에러명2:
except 에러명3:
else: try 블록의 에러가 없을 경우 실행
finally: 항상 실행

이를 활용한 예시

1
2
3
4
5
6
7
8
try:
z = 'Kim' # 'Cho' 예외 발생
x = name.index(z)
print('{} Found it! {} in name'.format(z, x + 1))
except: # 모든 에러를 처리(Exception)
print('Not found it! - Occurred ValueError!')
else:
print('ok! else!')
HTML 목록 태그, 정의태그, 글자관련태그

HTML 목록 태그, 정의태그, 글자관련태그

목록 태그

HTML 목록 종류 3가지

-<ol>태그 : Ordered List 순서 있는 목록
-<ul>태그 : Unordered List 순서 없는 목록
-<li>태그 : 정의 목록

목록을 <ol>태그로 만들든 <ul>태그만들든간에 <li>태그는 항목을 나타내므로 모든 곳에 필수로 들어가야한다

1
2
3
4
5
6
7
8
9
10
11
12
<ol>
<li></li>
<li></li>
<li></li>
<li></li>
</ol>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>

목록태그 앞의 모양 바꾸기

  • ol태그 : 1/a/A/i/I
    ol태그 전체 비교
  • ul태그 : disc/circle/square/non
    ul태크 전체 비교




정의 태그

<dl>태그<dt>태그 <dd>태그가 세트이다

<dt>태그 는 정의내리는 대상
<dd>태그 는 정의 내용

사실 잘 사용하지 않는 태그지만 기억해두면 필요할때 요긴하게 쓸 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<h2> 자신을 4가지 관점으로 정의</h2>
<dl>
<dt>E</dt>
<dd>외향적 : 에너지가 밖으로 흐르며 사람을 만나는 것을 좋아하고 사람을 만남으로써 에너지를 얻는다.<br>
반대성향으로는 I 내향적이 있다.
</dd>
<dt>N</dt>
<dd>직관적 : 숲을 보려는 경향이 있고 아이디어나 육감에 의존하며 주의 초점은 미래와 가능성이다. 따라서 미래지향적으로 새로운 시도를 하는 것을 좋아하며 가능성과 의미를 추구하고 변화와 다양성을 좋아한다<br>
반대성향으로는 S 감각형이 있다. 이는 나무를 보려는 경향으로 실재의 경험, 오감에 주의초점이 있어 현실 수용과 관례를 따르는 결향이 있다.
</dd>
<dt>F</dt>
<dd>감정형 : 주관적 판단에 의존하며 주된 관심주제는 사람, 관계이다<br>
반대성향은 T 사고형이있으며 객관적 판단에 의존하고 주된 관심주제는 사실과 진실이다.
</dd>
<dt>J</dt>
<dd>판단형 : 정리정돈과 계획성이 있다 뚜렷한 기준과 자기의사가 있으며 신속한 결론을 내리고 분명한 목적의식이 있다.<br>
반대성향으로는 P 인식형이 있고 상황에 맞추는 개방성과 목적과 방향의 변화가 상대적으로 쉽다.
</dd>
</dl>
</dl>




글자 관련 태그

1
2
3
4
5
6
7
8
small tag : <small>Make font size smaller </small>

sup tag : <sup>supppp 윗첨자</sup>(ex)300m<sup>2</sup>의 땅이 있었으면 좋겠다

sub tag : <sub>subbbb 아래첨자</sub>
(ex)내가 아는 원소기호는 H<sub>2</sub>O

mark tag : <mark>형광펜효과</mark>

[패스트캠퍼스python] 파일 읽기

파이썬 인강 : 파일 읽기

txt파일로 읽거나 쓸 줄 알아야 어플리케이션을 만들었을때 중요한 데이터(결과값)을 저장해놓을 수 있다

  • 읽기 모드 r
  • 쓰기 모드 w : 기존 파일 삭제
  • 추가 모드 a : 파일 생성 또는 추가
  • 상대 경로(‘../‘, ‘./‘)
  • 절대 경로 확인(‘C:...’)

참고 링크

중요한 데이터.txt 파일을을 어떻게 읽을 수 있을까?

1. open()과 close() 방법

파일을 열때는 open()을 사용하고 읽어올 것이기때문에 r을 쓰면 된다
open()했으면 반드시 close 리소스 반환해줘야한다. 즉 close()로 꼭 문 닫아줘야한다.
한 번 사용한 리소스를 꼭 닫아줘야한다.

1
2
3
4
5
f = open('./resource/중요데이터.txt', 'r')
contents = f.read()
print(contents)

f.close()

2. with open()방법

파이썬에서는 open()해놓고 close()는 하지않아도 되는 방법이 있다
바로 with문!

1
2
3
4
5
with open('./resource/중요한데이터.txt', 'r') as f:
c = f.read()
print(iter(c)) #iterator함수로 변환하여 for문에서 사용가능
print(list(c)) #리스트형변환가능
print(c)

read는 전체 내용 읽어준다 ex) read(10) : 10글자 읽기

3. with문과 for문 활용

1
2
3
with open('./resource/중요한데이터.txt', 'r') as f:
for c in f:
print(c)

with문과 for문 출력값

출력값을 보면 한 줄씩(line단위) 출력해준다
한줄씩 뛰어쓰기되어 나오는 것은 끝에 |n이 들어가있기때문이다
제거해주려면 어떻게 하면 될까?

1
2
3
with open('./resource/중요한데이터.txt', 'r') as f:
for c in f:
print(c.strip())

|n 입력후 출력

|n을 strip()으로 제거해주면 가독성 좋게 출력된다
위의 출력이미지와 아래의 출력이미지를 보면 가독성이 좋아진 것을 알 수 있다

4. read VS readline VS readline(문자수) VS readlines

  • read : 처음글자부터 끝까지 전체를 다 읽기. read()가 끝나고 나면 커서가 맨 마지막 글자에 있기때문에 한번 출력 후 read()를 또 출력하면 빈 내용이 출력된다
  • readline : 한 줄씩 읽기
  • readline(문자수) : 문자수 읽기
  • readlines : 전체 읽은 후 라인 단위 리스트 저장

응용한 예시를 함께보자
아래 이미지파일과 같은 score.txt파일이 있고 안의 내용의 평균을 for line in으로 구해보자

score.txt파일

1
2
3
4
5
6
7
8
9
10
11
with open('./resource/score.txt', 'r') as f:
score = []
for line in f:
score.append(int(line))
print(score)
print('Average : {:6.3f}'.format(sum(score) / len(score)))
#{6자리고 소수셋째자리까지라는 의미}

# 출력값
[95, 78, 92, 89, 100, 66]
Average : 86.7

5. 파일 쓰기

  1. 빌트인패키지인 random을 이용해서 파일을 써보자
    로또번호와 비슷하게 6개 랜덤번호를 출력하는 예제이다.
1
2
3
4
5
6
7
from random import randint
#랜덤파일로부터 randint함수를 가져와라는 뜻

with open('test2.txt', 'w') as f:
for cnt in range(6): # range(6)은 0~5까지임.
f.write(str(randint(1, 50))) # 1부터50까지
f.write('\n')
  1. writelines : 리스트 -> 파일로 저장

    1
    2
    3
    with open('test3.txt', 'w') as f:
    list = ['Kim\n', 'Park\n', 'Lee\n']
    f.writelines(list)
  2. print로 바로 저장하는 예제이다

    1
    2
    3
    with open('./resource/test3.txt', 'w') as f:
    print('Test Contents!', file=f)
    print('Test Contents!!', file=f)

ITWILL : 아이디와 비번입력, 새로고침location.reload(), 주석한번에 단축키, switch문 출력문 한줄리팩토링

ITWILL학원 : 5강 JS기초 BY 정규태강사

1.아이디와 비번체크

location.reload()는 새로고침의 역할을 한다

  1. 아이디와 비번을 존재유무 동시에 체크
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const id = "itwill001"
const pw = "it8030909"
let inputId = prompt("아이디를 입력하세요", "")
let inputPw = prompt("비밀번호를 입력하세요", "")

if(id === inputId){
if(pw === inputPw){
alert(inputId+"님 환영합니다")
}else{
alert("비밀번호가 일치하지 않습니다")
location.reload();
}
}else{
alert("존재하지 않는 회원입니다.")
location.reload();
}
  1. 아이디 존재유무 먼저 체크후 비번 체크
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const id = "itwill001"
const pw = "it8030909"
let inputId = prompt("아이디를 입력하세요", "")

if(id === inputId){
if(pw === inputPw){
alert(inputId+"님 환영합니다")
let inputPw = prompt("비밀번호를 입력하세요", "")
}else{
alert("비밀번호가 일치하지 않습니다")
location.reload();
}
}else{
alert("존재하지 않는 회원입니다.")
location.reload();
}

DB를 쓰면 알게되겠지만 2번방법은 아이디한번 비번한번 두번을 가져와야해서 비효율적이다
1번을 사용하는 것을 권장한다

  1. html내에서 id로 가져와서 로그인페이지 완성
    내가 궁금해져서 네이버처럼 로그인페이지를 만들어봤다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<img src="https://lh3.googleusercontent.com/proxy/kn4y-1fat85W8voylUnkZF1DBTCAwtNwaTwxKJZ-GYiWk83N6rAd2fKqIzdaPSSZKupHKxA-xyZttfXhyO6EQHKxEQ2NTEeByNqAEZaCdJScbyZcUB3nak6TlxWlKv_lRgwfZtY8gWCwjusDnUmRThBUCTYf7ElOwOvnnj772zC02yDGOB5uI-B4rkSeKZjcw0i6FpG3xsATsSvDIw4A28QN"
width=100%, height=100%>
<input id="id" type="text" size="40px" placeholder="아이디를 입력하세요"><p>
<input id="pw"type="text" size="40px" placeholder="비밀번호를 입력하세요"><p>
<button id="login"> 로그인 </button><p>
<input type="checkbox" checked>항상 아이디 기억하기


<script type="text/javascript">

let id = document.querySelector('#id');
let id = document.querySelector('#id');
let loginbtn = document.querySelector('login')

loginbtn.addEventListener('click', ()=>{
console.log(id, pw)

if( id === "it"){
if(pw === "321"){
alert(id1 + "님, 반갑습니다")
}else{
alert("비밀번호가 일치하지 않습니다")
location.reload();
}
}else{
alert("존재하지 않는 회원입니다.")
location.reload();
}
})

querySelector로 input태그 ID와 PW를 가져오려고 했으나 “존재하지 않는 회원입니다”라는 에러만 겁나 났다

querySelector가 안되는 이유는 Jquery태그를 추가해야한다고했다

그래서 다른 방법인 getElementById()로 진행해봤다.

  1. getElementById(‘id’)만 가지고 왔는데도 전혀 입력값을 가져오지못했고 “존재하지 않는 회원입니다”라는 에러
  2. getElementById(‘id’).value : 그래서 value를 끝에 추가했지만 그래도 가져오지 못했다
    왜지….
  3. 알고보니 결국 스코프 문제였다 addEventListener안에 넣었더니 정상적으로 실행되었다 뿌듯!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<img src="https://lh3.googleusercontent.com/proxy/kn4y-1fat85W8voylUnkZF1DBTCAwtNwaTwxKJZ-GYiWk83N6rAd2fKqIzdaPSSZKupHKxA-xyZttfXhyO6EQHKxEQ2NTEeByNqAEZaCdJScbyZcUB3nak6TlxWlKv_lRgwfZtY8gWCwjusDnUmRThBUCTYf7ElOwOvnnj772zC02yDGOB5uI-B4rkSeKZjcw0i6FpG3xsATsSvDIw4A28QN"
width=100%, height=100%>
<input id="id" type="text" size="40px" placeholder="아이디를 입력하세요"><p>
<input id="pw"type="text" size="40px" placeholder="비밀번호를 입력하세요"><p>
<button id="login"> 로그인 </button><p>
<input type="checkbox" checked>항상 아이디 기억하기

<script type="text/javascript">

let loginbtn = document.getElementById('login')

loginbtn.addEventListener('click', ()=>{
let id = document.getElementById('id').value;
let pw = document.getElementById('pw').value;
console.log(id, pw)

if( id === "it"){
if(pw === "321"){
alert(id1 + "님, 반갑습니다")
}else{
alert("비밀번호가 일치하지 않습니다")
location.reload();
}
}else{
alert("존재하지 않는 회원입니다.")
location.reload();
}
})

2. JS주석 한번에 단축키

  • ctrl + shift + / : 한번에 주석설정
  • ctrl + shift +\ : 한번에 주석제거

3. switch문 출력문 한줄 리팩토링

입력받은 정보를 가지고 학점을 나타내는 switch문을 만들어보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
let score = prompt('점수를 입력하시면 학점이 계산됩니다')

switch (Math.floor(score/10)){
case 10 :
case 9 :
document.write("A학점")
break;
case 8 :
document.write("B학점")
break;
case 7 :
document.write("C학점")
break;
case 6 :
document.write("D학점")
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
document.write("F학점이라니")
break;
default : document.write("0~100사이의 점수를 입력하세요")
}

자세히보면 반복되는 출력문이 보인다
이걸 리팩토링해보자
아주 간단하다! 변수만 만들어주면 된다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//switch case 출력문 한번쓰기
document.write('<hr>')
let score = prompt('점수를 입력하시면 학점이 계산됩니다')
let grade = ""; //변수만들기

switch (Math.floor(score/10)){
case 10 :
case 9 :
grade ="A"
break;
case 8 :
grade ="B"
break;
case 7 :
grade ="C"
break;
case 6 :
grade ="D"
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
grade ="F"
break;
default : document.write("0~100사이의 점수를 입력하세요")
}
document.write(grade + "학점")

[ITWILL : java]Scanner라이브러리와 equals()를 이용한 사칙연산계산기, if문과 switch문 변환 예시, 반복문과 break

ITWILL학원 : 3강 JAVA BY 윤미영강사

1. Scanner 라이브러리

기능 : 키보드로부터 데이터를 받아온다.
java.util 패키기에 있는 중요한 라이브러리이므로 사용법은 암기필수.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//1. 선언
import java.util.Scanner;
// import라는 예약어는
// 단축키는 ctrl + shift + O 누르면 자동으로 import 생성됨

Scanner sc = new Scanner(System.in);
// 의미는 나는 이제부터 스캐너라이브러리를 변수명(ex: sc)이라는 이름으로 불러서 사용하겠다는 의미
// System.in 자바의 표준입력으로 키보드를 의미한다. 즉 키보드로부터 데이터를 받아오겠다라는 의미

System.out.println("단어를 입력하세요");


//2. 변수 s에 저장
String s = sc.next();
// 콘솔창에 입력한 것들이 변수 s에 저장된다.


//3. 출력
System.out.println(s);


//4. 예시
System.out.println("이름을 입력해주세요");
String s = sc.next();

System.out.println("연락처를 -없이 입력해주세요");
int i = sc.nextInt();

System.out.println("입력하신 "+ s +"님의 휴대폰번호 0"+ i +" 가 맞습니까?");

다른 명령어들은 아래와 같다

1
2
3
4
5
6
7
8
sc.nextInt()
//키보드로부터 정수데이터를 가지고 옴

sc.next()
//키보드로부터 string(한단어)를 가지고 옴

sc.nextLine()
//키보드로부터 string(공백을 포함한 한줄전체)를 가지고 옴

2. Scanner 라이브러리를 이용한 사칙연산계산기 만들기

처음 떠오른 코드는 아래와 같다.

1
2
3
4
5
6
7
8
Scanner sc = new Scanner(System.in);
System.out.println("원하는 사칙연산 수식을 입력하세요");
int data1 = sc.nextInt();
String operator = sc.next();
int convertOper = int(operator);
int data2= sc.nextInt();

System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 + convertOper+ data2)+"입니다")

그런데 string으로 연산자를 받으니까 연산이 되지않으니까 int로 형을 바꿀려고했는데 Cannot cast from String to int 에러가 났다.

사칙연산자들의 데이터타입이 무엇인지 구글링했는데 그래도 잘 모르겠어서
강사님께 여쭈어보니 string을 int로 받아도 해결할 수 없다고 한다.

if문을 써서 equals()를 쓰는게 낫다고 했다
equals()를 어떻게 쓰는지 찾아본 뒤 바로 적용해보았다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Scanner sc = new Scanner(System.in);
System.out.println("원하는 사칙연산 수식을 입력하세요");
int data1 = sc.nextInt();
String operator = sc.next();
int data2= sc.nextInt();

if("+".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 + data2)+"입니다");
}else if("-".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 - data2)+"입니다");
}else if("*".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 * data2)+"입니다");
}else if("/".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 / data2)+"입니다");
}else{
System.out.println("또 잘못입력함? 다시 입력해주세요")
}

작동 잘된다! 역시 가르쳐주는 사람이 있으니까 좋다
switch문으로 바꾸어보자

1
2
3
4
5
6
7
8
9
10
11
switch(operator){
case "+" : System.out.println("덧셈결과는 " + (data1+data2));
break;
case "-" : System.out.println("뺄샘결과는 " + (data1-data2));
break;
case "*" : System.out.println("곱셈결과는 " + (data1*data2));
break;
case "/" : System.out.println("나눗셈결과는 " + (data1/data2));
break;
default : System.out.println("또 잘못입력함? 다시 입력해주세요");
}

3. 제어문 종류

  • 조건문
    • if(조건문)
    • switch(값)
  • 반복문
    • for(반복횟수)
    • while(조건식)

4. 조건문 : Switch문

정수식안에는 변수, 숫자, 문자, 조건들이 들어갈 수 있다.
case안의 값에는 and연산자, Boolean, 실수는 아예 들어갈 수 없다.
break;문이 없을 경우 다음 break;를 찾을때까지 모든 문장을 실행한다.
default문은 가장 마지막 작업으로 위의 case 이외의 값인 경우 default문은이 출력되고 Switch문은 끝난다

1
2
3
4
5
6
7
8
9
switch( 정수식 ){ //숫자,문자
case 값 : 출력값1;
break;
case 값 : 출력값2;
break;
case 값 : 출력값3;
break;
default : 출력값4;
}

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

switch(season){
case "spring" :
System.out.println("봄 사랑 벚꽃 말고 by 아이유");
break;
case "summner" :
System.out.println("party by 소녀시대");
break;
case "autumn" :
case "fall" :
System.out.println("11:11 by 태연");
break;
case "winter" :
System.out.println("Santa tell me by Ariana grande");
break;

default : System.out.println("잘못입력하셨거나 스페..펠..ㄹ..잉 틀리셨나봐요?");
}

5. 조건문 : switch문과 if문 비교

임의의 노래방 점수를 터미널에 입력하면 점수대별로 아래 문구를 출력하고싶다.

100점의 문구 : 실화냐? 가수다! 가수가 나타났다!

80 ~ 99점의 문구 : 노래실력이 아주 좋으신데요~

40 ~ 79점의 문구 : 매력이~ 넘쳐요

40점미만의 문구 : 노ㄹ..아니 박수실력이 나날이 늘어가네요!
그외의 점수들 : 잘못된 숫자를 입력하셨습니다.다시 입력해주세요

  1. if일때

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Scanner sc = new Scanner(System.in);
    System.out.println("점수를 입력하세요");
    int inputScore = sc.nextInt(10);

    if (inputScore == 100){
    System.out.println("WOW " + inputScore + "점 실화냐? 가수다! 가수가 나타났다!");
    }else if(inputScore >= 80 && inputScore < 100 ){
    System.out.println(inputScore + "점! 노래실력이 아주 좋으신데요~");
    }else if(inputScore >= 40 && inputScore < 80 ){
    System.out.println("내 노래 점수는 " + inputScore + "점! 매력이~ 넘쳐요");
    }else if(inputScore < 40 && inputScore >= 0){
    System.out.println(inputScore + "점! 노ㄹ..아니 박수실력이 나날이 늘어가네요!");
    }else{
    System.out.println("잘못된 숫자를 입력하셨습니다.다시 입력해주세요");
    }
  2. switch일때

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    switch(inputScore/10){
    case 10 :
    System.out.println("100점 실화냐? 가수다! 가수가 나타났다!");
    break;
    case 9 :
    case 8 :
    System.out.println("노래실력이 아주 좋으신데요~");
    break;
    case 7 :
    case 6 :
    case 5 :
    ystem.out.println("매력이~ 넘쳐요");
    break;
    case 4 :
    case 3 :
    case 2 :
    case 1 :
    System.out.println("노ㄹ..아니 박수실력이 나날이 늘어가네요!");
    break;
    default :
    System.out.println("잘못된 숫자를 입력하셨습니다.다시 입력해주세요");
    }

6. 반복문 : for문

for문의 기본은 아래와 같다

1
2
3
for(int i=0; 조건식; 증감식){
출력값
}

간단한 예시를 보면서 어떻게 컴파일이 되는지 순서를 보자

1
2
3
for(int i=1; i<10; i++){
System.out.println("Hi");
}
  1. 조건문 확인 : i는 1이고 10보다 작다 ->true
  2. 괄호안의 코드출력
  3. 증감식 확인 : 이제 i는 2
  4. 조건문 확인 : i는 2이고 10보다 작다 ->true
  5. 괄호안의 코드출력
  6. 증감식 확인 : 이제 i는 2
  7. 계속반복
  8. 조건문 확인 : i는 10이고 10보다 작다 -> false
  9. for문 종료

7. 반복문 : break

반복문에서 break를 사용하면 반복문이 바로 종료된다.

구구단 3단 예시를 들어보자

1
2
3
4
5
6
7
8
int multiply;
int result;
multiply = 3;
for(int x=1; x<=9; x++){
result = multiply * x;
System.out.print(result + ",");
}
//출력값 : 3,6,9,12,15,18,21,24,27,

출력값의 마지막 컴마를 없애고 싶다.
어떻게 하면 좋을까? if와 break를 사용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
int multiply;
int result;
multiply = 3;
for(int x=1; x<=9; x++){
result = multiply * x;
if(x==9){
System.out.println(result);
break;
}
System.out.print(result + ",");
}
//출력값 : 3,6,9,12,15,18,21,24,27

break를 입력하면 if조건이 만족되는 순간 바로 반복문이 종료된다
아래 예시는 구구단 3단 나타내지만 if조건문을 5까지 입력했다
3*5까지 진행하는 구구단이다.

1
2
3
4
5
6
7
8
9
10
11
12
int multiply;
int result;
multiply = 3;
for(int x=1; x<=9; x++){
result = multiply * x;
if(x==5){
System.out.println(result);
break;
}
System.out.print(result + ",");
}
//출력값 : 3,6,9,12,15

x가 6,7,8,9가 남았지만 if조건을 만족하고 break때문에 반복문이 종료된다.

[패스트캠퍼스python] 모듈과 패키지

파이썬 인강 : 모듈과 패키지

우리가 알게 모르게 사용하고 있었던 모듈에 대해 배워보자

모듈과 패키지

가장 중요한 점은 왜 패키지로 개발/배포/사용해야하는지 그 이유를 명확히 알아야 한다는 점이다.

  • 모듈 : 파일 하나하나가 모듈. 독립적인 파일
  • 패키지 : 모듈들을 파일형태로 관리하는 것을 패키지리고 한다

참고로

  • .. : 부모 디렉토리 이동
  • . : 현재 디렉토리 이동

아래 두가지 파일을 이용해서 모듈과 패키지에 대해 공부해보자
fibonacci.py는 피보나치수열 만드는 파일이다.

fibonacci.py

calculations.py는 아래와같은 세가지의 함수를 가지고 있다

calculations.py

1. 클래스를 가져와서 사용하는 방법

클래스를 가져올 수 있다

  1. 일반적인 방법
1
2
3
4
5
6
7
8
9
10
11
from pkg.fibonacci import Fibonacci #클래스명(fibonacci)

Fibonacci.fib(10)

print("ex1 : ", Fibonacci.fib2(20))
print("ex1 : ", Fibonacci().title) #인스턴스화

# 출력값은
0 1 1 2 3 5 8
ex1 : [0, 1, 1, 2, 3, 5, 8, 13]
ex1 : fibonacci

피보나치수열이 잘 출력되었음을 알수있다.

  1. *을 사용한 방법
    메모리를 많이 사용하기때문에 권장하지 않는 방법이지만 알아둬야한다

별을 이용한 방법

*는 모든 리소스를 다 가져오는 것을 뜻한다.
터미널을 보면 피보나치 수열이 잘 나타남을 확인할 수 있다

  1. as 사용하는 방법
    권장하는 방법으로 계속 class fullname을 사용하는 것보다 가독성이 높기때문이다.
    as는 Alias(엘리아스)의 약자로 별칭이란 뜻이다.
1
2
3
4
5
6
7
8
9
10
11
from pkg.fibonacci import Fibonacci as fb

fb.fib(50)

print("ex3 : ", fb.fib2(60))
print("ex3 : ", fb().title)

# 출력값
0 1 1 2 3 5 8 13 21 34
ex3 : [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
ex3 : fibonacci

2. 함수를 가져와서 사용하는 방법

  1. import + as 조합
    이번에는 클래스말고 함수를 가져와 사용해보자.

import와 as 조합

클래스를 가져왔던 것과

  1. from + import + as 조합
    권장하는 방법으로 모듈의 많은 함수들 중에서 필요한 함수만 가져와서 쓸수있다
    어떠한 언어를 다루던 리소스를 낭비하지 않도록 명확히 코딩하는 것이 좋다
1
2
3
4
5
6
from pkg.calculations import div as d

print("ex5 : ", int(d(100,10)))

# 출력값은
ex5 : 10

3. builtins(빌트인)

1
2
3
import builtins

print(dir(builtins))

출력값이 너무 길어서 이미지파일로 준비했다

builtins 출력값

우리가 빌트인인지 모르고 사용했던 list함수, type함수등이 들어가 있는 것을 확인할 수 있다

4. __init__.py의 필요성

용도 : 해당 디렉토리가 패키지임을 선언할 때 사용한다.
Python 2.x대를 사용하고 있다면 __init__.py가 필수이다
Python3.x : 파일이 없어도 패키지 인식하지만 3.x보다 하위 버전 호환 위해서 생성하는 것이 안전

5. 단위테스트

독립적으로 만든 파일이 독립적으로 잘 실행되는지는 확인하기 위해서 아래 if name문을 써준다
아래 형태로 쓰도록 딱 정해놓았다.
만든함수()부분에 만들었던 함수들을 넣어 독립적으로 실행되는지 체크할 수 있다
if문이기때문에 import으로 가져온 파일에서는 출력이 안된다 GOOD!

1
2
3
4
5
# 단위 실행(독립적으로 파일 실행)
if __name__ == "__main__":
print("This is", dir())
만든함수()
만든함수()