1.  if 문과 if-else 문

👩🏻‍💻  if문이나 if-else문을 사용하면 스크립트 안에서 조건 체크 가능


들어가기 전
 const number = prompt('숫자를 입력하세요!');

     

    💡  위 코드는 형변환을 하지 않아도 프로그램 실행에는 문제가 없음
            ▶️ 조건식에서 0과 비교를 할 때 자동으로 형변환이 되어서 계산이 되기 때문
            ▶️ but! 자바 스크립트로 프로그램을 짤 때 문제가 되는 경우가 있어서 가급적 형변환을 하는 것을 추천


if 문
<!--if조건문 기본형-->
if (불 값이 나오는 표현식) {
    불 값이 참일 때 실행할 문장
}
<script>
    if(273 < 100) { // 표현식 273 < 100이 참일 때 실행
        alert('273 < 100 => true')
    }

    let str = ' ';
    if (!str) { // 조건문 안에서 자동으로 형변환. 공백도 글자로 취급
        alert('빈 문자열입니다.'); // false라서 실행 안됨.
    }

    str = ' '; 
    if (!str.trim()) { // 조건문 안에서 자동으로 형변환.
        alert('빈 문자열입니다.') // trim()은 공백제거 함수. true라서 실행됨.
    }

    str = '값입력';
    if (str) { // 조건문 안에서 자동으로 형변환
        alert('빈 문자열이 아닙니다.'); // true라서 실행됨.
    }
</script>

if-else문
<!-- if-else 조건문 기본형 -->
if (불 값이 나오는 표현식) {
    불 값이 참일 때 실행할 문장
} else {
    불 값이 거짓일 때 실행할 문장
}
<script>
    // 오전과 오후 구분하기
    const date = new Date(); // 현재 날짜와 시간을 갖는 객체 생성
    const hour = date.getHours();

    if (hour < 12) {
        alert('오전입니다.');
    } else {
        alert('오후입니다.');
    }
    // if-else문을 삼항연산자로 변경
    console.log((hour < 12 ? '오전입니다.' : '오후입니다.'))
</script>

 


중첩 조건문 : 조건문 안에 조건문을 중첩해서 사용하는 것
<script>
    // 변수를 선언
    const date = new Date(); // 현재 날짜와 시간을 갖는 객체생성.
    const hour = date.getHours(); // 현재시간을 0 ~ 23 사이의 값으로 출력하는 메소드.

    // if-else 문
    if (hour < 11) { //표현식 hour < 11가 참일 때
        alert("아침 먹을 시간입니다.")
    } else { // 표현식 hour < 11가 거짓일 때 실행
        if (hour < 15) { // 표현식 hour < 15가 참일 때 실행.
            alert("점심 먹을 시간입니다.");
        } else { // 표현식 hour < 15가 거짓일 때 실행.
            alert("저녁 먹을 시간입니다.")
        }
    }
    // else-if 문
    if (hour < 11) { //표현식 hour < 11가 참일 때
            alert("아침 먹을 시간입니다.")
        } else if (hour < 15) { // 표현식 hour < 15가 참일 때 실행.
                alert("점심 먹을 시간입니다.");
        } else { // 표현식 hour < 15가 거짓일 때 실행.
                alert("저녁 먹을 시간입니다.")
        }
</script>

 


  💡  falseundefinednull0NaN이나 빈 문자열('')이 아닌 값은 조건문으로 테스트되었을 때, 실제로는 true를 리턴하므로, 변수가 참인지 혹은 값이 존재하는지를 테스트하기 위해 변수 이름 그 자체를 사용할 수 있다. 

let shoppingDone = false;
let childsAllowance;

if (shoppingDone) {
  // 명시적으로 '=== true'를 명시할 필요가 없습니다
  childsAllowance = 10;
} else {
  childsAllowance = 5;
}

2.  switch 문

🐰  switch 조건문의 괄호 안에 비교할 값을 입력  ▶️  이때 입력한 값을 기준으로 특정 코드를 실행

      🥕  처리할 명령이 많을 때 주로 사용

      🥕  switch 문의 조건은 case 문의 값과 일대일로 일치해야 함

🐰  일반적으로 case 뒤에는 정수나 문자열이 오는 것으로 사용
🐰  break 키워드는 switch 조건문이나 반복문을 빠져나가기 위해 사용하는 키워드
        ▶️  코드를 읽다가 break 키워드를 만나면 break 키워드를 감싼 switch 조건문이나 반복문을 완전히 빠져 나감

<!-- 기본형 -->
switch (조건문) {
    case 조건A :
        조건이 A일 때 실행할 명령문;
        break;
    case 조건B :
        조건이 B일 때 실행할 명령문;
        break;
    default :
        break;
}
<script>
    // 변수를 선언
    const input = Number(prompt('숫자를 입력하세요.', '숫자'));

    // 조건문
    switch (input % 2) { // 나머지 연산자를 이용해서 홀수와 짝수를 구분
        case 0:
            alert('짝수입니다.');
            break;
        case 1:
            alert('홀수입니다.');
            break;
        default:
            alert('숫자가 아닙니다.'); // 숫자가 아닌걸 입력해도 에러가 나지 않음.
            break;
    }
</script>
<script>
    /* 사용자에게 월을 입력받아서 switch 이용해 계절을 출력.
       다만 1~12만 입력된다고 가정. */

    const month = Number(prompt("월을 입력하세요. (숫자 1~12 중 선택)"));

    switch (month) {
        case 12: case 1: case 2:
            document.write(`${month}월은 겨울 입니다.`);
            break;
        case 3: case 4: case 5:
            document.write(`${month}월은 봄 입니다.`);
            break;
        case 6: case 7: case 8:
            document.write(`${month}월은 여름 입니다.`);
            break;
        case 9: case 10: case 11:
            document.write(`${month}월은 가을 입니다.`)
            break;
    }
</script>

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 및 책 'Do it HTML+CSS+자바스크립트 웹 표준의 정석' ]

 


1. var 를 사용한 변수 특징

 

var를 이용한 변수 선언의 문제점 


    기존의 자바스크립트에서는 var를 이용해 변수를 선언
    그러나 var로 변수를 선언하는 것은 몇 가지 문제점이 있어서 모던 자바스크립트 개발에서는 거의 이용되지 않는다.
    문제점은 1) 변수를 덮어 쓸 수 있다는 점과 2) 다시 선언 (재선언) 할 수 있다는 점

<script>
    // var로 선언한 변수를 덮어 쓰거나 재선언하는 예.
    var val1 = 'var 변수';
    console.log(val1); // var 변수

    // var 변수는 덮어쓰기 가능
    val1 = 'var 변수 덮어 쓰기';
    console.log(val1); // var 변수 덮어 쓰기

    // var 변수는 재선언 가능
    var val1 = 'var 변수를 재선언';
    console.log(val1); // var 변수를 재선언
</script>

 

📌  덮어 쓰기 ▶️ 한 번 정의한 변수에 다른 값을 대입할 수 있음
📌  재선언  ▶️ 완전히 같은 변수명을 여러 위치에서 변수로 정의할 수 있음

✔️  변수 선언에 var만 사용하는 경우 프로젝트 규모가 커짐에 따라 의도치 않은 시점에 변수를 덮어 쓰거나 재선언하는 등의 문제가 발생

✔️  ES2015에서는 새로운 변수 선언 방법으로 const(덮어쓰는 것이 불가능한 변수)와 let(덮어쓰는 것이 가능한 변수)이 추가 


2.  let과 const

(1) let을 사용한 변수 특징


🐰  let은 재선언 ❌  덮어 쓰기 ⭕️

🐰  함수 {} 안에 선언할 시 블록({})을 벗어나면 사용할 수 없다.

<script>
  // let으로 변수 덮어 쓰기
  let val2 = 'let 변수';
  console.log(val2);

  val2 = 'let 변수 덮어 쓰기';
  console.log(val2);

  // 재선언 실행
  let val3 = 'let 변수';
  console.log(val3);

  // let은 재선언 불가능
  let val3 = 'let 변수 재선언'; // 에러
  // Uncaught SyntaxError: Identifier 'val3' has already been declared
  // '이미 선언되어 재선언 할 수 없다'는 메시지

  // 이렇게 let은 var를 이용했을 때 문제가 되었던 재선언을 개선한 변수 정의 방법.
  // 덮어 쓰기를 허가할 변수는 let을 이용해야 함.
  console.log(val3);
</script>

 


(2) const 를 사용한 변수 특징

 

🐰  const는 재선언, 덮어쓰기가 모두 불가능한 가장 엄격한 변수 선언 방법 < 상수 변수 constant variable >
🐰  const를 이용한 변수 선언은 덮어 쓰기를 사전에 감지해서 알려줌
🐰  let와 마찬가지로 재선언을 해도 에러가 발생

💡 변수 종류에 따라 const로 정의해도 변수값을 변경할 수 있는 경우가 있으므로 주의

<script>
    /* 다음은 const로 정의한 변수를 덮어 쓰려고 할 경우 */
    const val1 = 'const 변수';
    console.log(val1);

    // const 변수를 덮어 쓰기 불가능
    val1 = 'const 변수 덮어 쓰기';
    // Uncaught TypeError: Assignment to constant variable.
</script>

 

 


(3) const로 정의한 변수를 변경할 수 있는 예

 

🐰  문자열이나 수치 등 primitive type 이라 불리는 종류의 데이터는 const를 이용해 정의한 경우 덮어 쓸 수 없음
🐰  하지만 객체나 배열 등 object type 이라 불리는 데이터들은 const로 정의해도 도중에 값을 변경할 수 있음

 

🌻  pirmitive type
      논리값 Boolean : true / false
      수치 Number : 1, 2.5
      문자열 String
      undefined : 미정의
      null : 값 없음
      Symbol : 유일하면 바꿀 수 없는 값

🌻  object type
      객체
      배열
      함수 등 primitive type 이외의 것

 

<script>
    // const를 이용해 정의한 객체의 속성값을 변경, 추가 하는 예
    // 객체 정의
    const obj1 = {
        name: '길동',
        age: 24
    };
    console.log(obj1);

    // 속성값 변경
    obj1.name = 'tom';
    console.log(obj1);

    // 속성 추가
    obj1.address = 'daegu';
    console.log(obj1);
    // const로 정의해도 객체 내용은 자유롭게 변경할 수 있음
    // 즉, 객체를 정의할 때는 기본적으로 const를 이용.

    // 재할당은 에러가 남.
    //obj1 = {
    //    name: '길동',
    //    age: 24
    //}

    // const를 이용해 정의한 배열 값을 변경, 추가하는 예
    // 배열 정의
    const arr1 = ['dog', 'cat'];
    console.log(arr1);

    // 값 변경
    arr1[0] = 'bird';
    console.log(arr1);

    // 값 추가
    arr1.push('monkey');
    console.log(arr1);
    // 배열도 const를 이용해 정의했어도 값은 자유롭게 변경할 수 있음
    // 따라서 배열 역시 기본적으로 const를 이용해 정의

</script>

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 및 책 'Do it HTML+CSS+자바스크립트 웹 표준의 정석' ]

 


 

1.  DataFrame을 활용한 데이터 생성

 

🍯  표 Table와 2차원 데이터 처리를 위해 DataFrame을 제공
       ▶️  데이터 Data를 담는 틀 Frame이라는 뜻

 

 

1) 데이터 생성

df = pd.DataFrame(data [, index = index_data, columns = columns_data])


  🐰  data 인자에는 리스트와 형태가 유사한 데이터 타입은 모두 사용 가능
        🥕  리스트, 딕셔너리, numpy의 배열 데이터, Series나 DataFrame 타입의 데이터 입력 가능
  🐰  세로축 라벨을 index라 하고, 가로축 라벨을 columns 라고 함
  🐰  index와 columns를 제외한 부분을 values라고 함

 

import pandas as pd
d1 = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]])
d1

d1 결과

 

🥕  values 부분에는 입력한 data가 순서대로 입력 돼 있고 가장 좌측의 열과 가장 윗줄의 행에는 각각 숫자가 자동으로 생성되어 index, columns를 구성
  ▶️   명시적으로 입력하지 않더라도 자동으로 index, columns가 생성

 

 


 

📁  numpy의 배열 데이터를 입력해 생성한 DataFrame 데이터의 예

import numpy as np
data_list = np.array([[10,20,30], [40,50,60], [70,80,90]])
print(data_list)
'''
[[10 20 30]
 [40 50 60]
 [70 80 90]]
'''

d2 = pd.DataFrame(data_list)
d2

d2 출력 결과


 

📁 data뿐만 아니라 index와 columns도 지정한 예

data = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])  # values
index_date = pd.date_range('2019-09-01', periods=4)
columns_list = ['A', 'B', 'C']
d3 = pd.DataFrame(data=data, index=index_date, columns=columns_list)
d3

d3 출력 결과


 

📁  딕셔너리 타입으로 2차원 데이터를 입력한 예

 

      📌  리스트나 넘파이 배열은 행 단위로 입력이 되고, 딕셔너리는 열 단위로 입력됨

table_data = {'연도': [2015, 2016, 2016, 2017, 2017],
              '지사': ['한국', '한국', '미국', '한국', '미국'],
              '고객 수': [200, 250, 450, 300, 500]}
d4 = pd.DataFrame(table_data)

d4 출력 결과

# 입력시 키의 순서를 지정할 수도 있음.
d5 = pd.DataFrame(table_data, columns=['지사', '고객 수', '연도'])
d5

d5 출력 결과


 

📁  DataFrame 데이터에서 index, columns, values을 각각 구한 예

d5.index
# RangeIndex(start=0, stop=5, step=1)

d5.columns
# Index(['지사', '고객 수', '연도'], dtype='object')

d5.values
# 0,한국,200,2015
# 1,한국,250,2016
# 2,미국,450,2016
# 3,한국,300,2017
# 4,미국,500,2017

 


 

2.  데이터 연산

🍯  Pandas의 Series()와 DataFrame()으로 생성된 데이터 끼리는 사칙연산이 가능

🍯  파이썬의 리스트와 numpy의 배열과 달리 pandas의 데이터 끼리는 서로 크기가 달라도 연산이 가능
        ▶️  이 경우 연산을 할 수 있는 항목만 연산을 수행

 

1)  Series()로 생성한 데이터의 예

import pandas as pd

s1 = pd.Series([1,2,3,4,5])
s2 = pd.Series([10,20,30,40,50])
# 덧셈
s1 + s2

'''
0    11
1    22
2    33
3    44
4    55
dtype: int64
'''
# 뺄셈
s2 - s1

'''
0     9
1    18
2    27
3    36
4    45
dtype: int64
'''
# 곱셈
s1 * s2

'''
0     10
1     40
2     90
3    160
4    250
dtype: int64
'''
# 나눗셈
s2 / s1

'''
0    10.0
1    10.0
2    10.0
3    10.0
4    10.0
dtype: float64
'''

 


 

2) 데이터의 크기가 다른 경우

 

🐰   연산할 수 있는 부분만 연산한 결과를 보여주고 연산할 수 없는 부분은 NaN으로 표시

s3 = pd.Series([1,2,3,4])
s4 = pd.Series([10,20,30,40,50])
# 덧셈
s3 + s4

'''
0    11.0
1    22.0
2    33.0
3    44.0
4     NaN
dtype: float64
'''
# 뺄셈
s4 - s3

'''
0     9.0
1    18.0
2    27.0
3    36.0
4     NaN
dtype: float64
'''
# 곱셈
s3 * s4

'''
0     10.0
1     40.0
2     90.0
3    160.0
4      NaN
dtype: float64
'''
# 나눗셈
s4 / s3

'''
0    10.0
1    10.0
2    10.0
3    10.0
4     NaN
dtype: float64
'''

 


3) DataFrame 연산

 

🐰  Series와 마찬가지로 DataFrame도 연산할 수 있는 항목 끼리만 연산하고 그렇지 못한 항목은 NaN으로 표시
        🥕 공간은 차지하되 데이터는 없는 상태

# DataFrame()으로 생성한 데이터의 예
table_data1 = {'A': [1,2,3,4,5],
               'B': [10,20,30,40,50],
               'C': [100,200,300,400,500]}
df1 = pd.DataFrame(table_data1)
df1

table_data2 = {'A': [6,7,8],
               'B': [60,70,80],
               'C': [600,700,800]}
df2 = pd.DataFrame(table_data2)
df2

 

df 1 출력결과
df2 출력 결과

df1 + df2

출력 결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1. 파일

📁  변수는 프로그램을 실행할 때 데이터를 저장하기 좋은 방법
        ➡️  그러나 프로그램을 종료한 후에도 데이터를 유지하고 싶다면, 파일 형태로 저장해야 함

 

1) 파일과 파일 경로

 

   ⚡️  파일에는 파일 이름과 경로라는 두 가지 주요속성이 있다.
          ex. 윈도우 운영체제를 사용하는 노트북 컴퓨터의 C:\Users\al\Documents 라는 경로에

                 project.docx 라는 이름의 파일이 있는 경우
                  ▶️  파일이름 project.docx는 워드 문서이고 Users, al, Documents는 모두 폴더(디렉토리)
                  ▶️  폴더 안에는 파일이나 다른 폴더가 들어 있을 수 있음

   ⚡️ 경로의 C:\는 루트 폴더를 나타내며 모든 폴더가 이 안에 들어 있음
          📌  윈도우에서 루트 폴더의 이름은 "C:\"이며, C 드라이브라고 부름.
          📌  맥os나 리눅스에서 루트 폴더는 "/"
          📌  윈도우, 맥os에서는 폴더이름이나 파일이름의 대소문자를 구분하지 않지만, 리눅스의 경우 이를 구분함

   ⚡️ 윈도우에서의 폴더 구분은 "\" 백슬러시를 사용하고, 맥 os나 리눅스에서는 "/" 슬러시를 사용함.

# 1) Path 객체 사용.
from pathlib import Path
path = Path('spam', 'bacon', 'eggs')  # 운영체제에 맞는 경로 체제를 만들어 줌.
print(path)  # spam/bacon/eggs

# 2) platform.system() 함수 사용.
import platform
my_os = platform.system()
print("OS in my system: ", my_os)  # OS in my system:  Darwin
if my_os == 'Darwin':
    print('Mac 운영체제 입니다.')
else:
    print('Mac 운영체제가 아닙니다.')
# 현재 작업 디렉토리
print(Path.cwd())  # /Users/Desktop/pycharm/pythonProject/part2

 

2) 절대 경로와 상대 경로


⚡️ 절대 경로 : 항상 루트 폴더에서 시작하는 경로
⚡️ 상대 경로 : 현재 작업 디렉토리에 대한 경로 
     📌  '.' : 현재 디렉토리
    📌  '..' : 상위 디렉토리


 

3) 새로운 디렉토리 만들기

 

⚡️ os.makedirs() 함수로 새로운 디렉토리를 만들 수 있음
⚡️ os.path.isdir(path) : path 인자의 디렉토리가 있는지 확인

import os
path = './test'
if not os.path.isdir(path):
    os.makedirs(path)  # 현재 작업 폴더 안에 test라는 폴더 생성.

 

4) 파일 크기와 폴더 내용 확인

 

⚡️ os.path.getsize(path) : path 인자에 해당하는 파일 크기 반환
⚡️ os.listdir(path) : path에 있는 파일 이름 리스트를 반환

path = './input'
print(os.path.getsize(f'{path}/hello.txt'))  # 53
list_dirs = os.listdir(path)
print(list_dirs)  # ['연락처.txt', 'hello.txt', '엄마돼지아기돼지.txt']

 


 

2. 파일 열기

📁  입출력 파일을 지정하는것을 의미 ( 파일 객체 생성 )
📁  파일 입력과 파일 출력 모두 반드시 파일 열기 작업을 가장 먼저 수행

파일객체 = open(파일명, 모드)


1) 파일명

🚀  입출력 작업을 수행할 파일을 의미
🚀  파일명만 작성할 수도 있고 경로를 함께 작성할 수도 있음

# 파일명만 작성하는 경우 : 파이썬 소스 파일과 같은 경로에 존재하는 경우
open('sample.txt')

# 전체 경로를 작성하는 경우 : 빈도가 적음.
open('C:/sample.txt')

# 현재 디렉터리(.)를 기준으로 경로를 결정
open('./sample.txt')
open('./input/hello.txt')

# 상위 디렉터리(..)를 기준으로 경로를 결정
open('../sample.txt')

2) 모드

r (read) 읽기
w (write) 쓰기 (새로 쓰기 모드)
a (append) 추가 (뒤에 이어서 쓰기 모드)
x (exclusive) 배타적 추가 (파일 있으면 오류, 없으면 새로 생성)


🚀  파일의 종류
     - t (text) 텍스트 파일 : 메모장으로 열 수 있는 파일
     - b (binary) 바이너리 파일 (텍스트 파일 외의 모든 파일)


 

3. 파일 닫기

👾  파일을 더 이상 사용하지 않거나 프로그램을 종료하고자 할 때

파일객체.close()

 


 

4. 파일 생성

file = open('./output/my_file.txt', 'wt')  # 빈파일 생성
print('my_file.txt 파일이 생성되었습니다.')
file.close()

# 텍스트 파일을 새로 만들 수 있는 모드인 wt 모드를 사용하여 my_file.txt라는 이름의
# 텍스트 파일을 output 이라는 디렉토리에 생성하는 코드

🚀   with문
    -  close() 메소드를 자동으로 호출할 수 있는 문법을 제공
    -  with문을 사용하면 with문이 끝날 때 언제나 close() 메소드가 자동으로 호출

         ➡️  별도의 예외 처리를 하지 않더라도 프로그램이나 파일의 에러로 close()가 호출이 안되는 상황을 방지

# 기본 구성
with open (파일명, 모드) as 파일객체:
    파일처리코드
with open('./output/my_file_1.txt', 'wt') as file:
    print('my_file_1.txt 파일이 생성되었습니다.')

 

5.  파일 입출력

📁  파일 입출력 : 컴퓨터에 저장된 파일을 읽어 들이는 것은 물론 파일을 생성해서 컴퓨터에 저장하는 것도 가능
    📌 파일 입력 input : 기존의 파일 내용을 읽어 들이는 것
    📌 파일 출력 output : 기존 파일에 새로운 내용을 추가하거나 새로운 파일을 생성하는 것

 

1) 파일 출력 output

# 1. 텍스트 파일 생성하기
file = open('./output/hello.txt', 'wt')

# hello.txt에 글 쓰기.
file.write('안녕하세요.')
file.write('\n')  # 줄 바꿈
file.write('반갑습니다.')
file.write('\n')
print('hello.txt 파일이 생성되었습니다.')  # 진행 상황을 알기 위해서 화면 출력.

file.close()

# 2. 텍스트 파일에 내용 추가하기
# 기존 파일에 내용을 추가할 수 있는 모드는 a 모드
file = open('./output/hello.txt', 'at')

file.write('Hello.\n')
file.write('Nice to meet you.\n')
print('hello.txt 파일에 새로운 내용이 추가되었습니다.')

file.close()

 


2) 파일 입력  input

1)  read() 메소드

📁  파일로부터 데이터를 읽어 들이는 메소드
📁  텍스트 모드와 바이너리 모드에서 다른 방식으로 동작

file.read(size)


    👾  반환값 : 텍스트 모드 - 읽어 들인 문자열, 바이너리 모드 - 읽어 들인 바이트열
    👾  매개변수 size : 텍스트 모드- 읽어 들일 최대 문자의 개수, 바이너리 모드- 읽어 들일 최대 바이트 수
    👾  매개변수 size 생략 : 파일 전체 읽음
    👾  파일의 끝에 도달 : 빈 문자열 ('') 반환

file = open('./input/hello.txt', 'rt', encoding='cp949')

str = file.read()  # 파일 전체를 한 번에 읽어 들임
print(str, end='')

file.close()

 

    💡 'encoding = cp949' 는 맥 os 에서 파일 처리할 때 사용


2)  readline() 메소드

📁  텍스트 파일을 한 줄씩 읽어서 처리하는 메소드
📁  파일이 종료되어 더 이상 읽어 들일 글자가 없으면 빈 문자열('')을 읽어 들임
📁  반복문을 이용해서 여러 번 읽어 들어야 파일 전체를 읽어 들일 수 있음

file = open('./input/hello.txt', 'rt', encoding='cp949')

while True:
    str = file.readline()
    if str == '':
        break
    print(str, end='')

file.close()

3) readlines() 메소드

📁  라인 line 하나가 아니라 전체 라인 lines을 모두 읽어 각 라인 line 단위로 리스트에 저장하는 메소드

file = open('input/hello.txt', 'rt', encoding='cp949')

line_list = file.readlines()
print(line_list) # ['안녕하세요.\n', '반갑습니다.\n', 'Hello.\n', 'Nice to meet you.\n']
for line in line_list:
    print(line, end='')

file.close()

# enumrate() 함수를 이용하면 라인 번호 line number 도 함께 출력할 수 있다
file = open('input/hello.txt', 'rt', encoding='cp949')

line_list = file.readlines()
for no, line in enumerate(line_list):
    print('{} {}'.format(no + 1, line), end='')

file.close()

# sys 모듈을 이용하면 보다 쉽게 파일을 읽을 수 있다
# sys 모듈에는 표준 입출력을 위한 stdin과 stdout 객체가 포함
# stdout은 출력을 위한 객체이며 화면 출력 메소드인 write()와 writelines() 메소드를 사용할 수 있음
# writelines() 메소드를 사용하면 리스트와 같은 반복 가능한 객체의 각 요소를 한 줄씩 자동으로 출력

import sys

file = open('input/hello.txt', 'rt', encoding='cp949')

line_list = file.readlines()
sys.stdout.writelines(line_list)

file.close()

 


 

6. pickle

📁  텍스트가 아닌 자료형 (리스트나 딕셔너리 자료형등)을 저장하기 위한 방식
📁  import pickle을 통하여 모듈 임포트가 필요
📁  pickle로 데이터를 저장하거나 불러올때는 파일을 바이너리 형식으로 읽거나 써야함 (wb, rb)
📁  모든 파이썬 데이터 객체를 저장하고 읽을 수 있음

import pickle
data = {
    'a': [1, 2.0, 3, 4 + 6j],
    'b': ("character string", "byte string"),
    'c': {None, True, False}
}
print(type(data))  # <class 'dict>

# 1. 일반 텍스트 파일 형식을 사용하는 경우.
# 저장
with open('./output/data.txt', 'w') as file:
    # file.write(data)  # TypeError: write() argument must be str, not dict
    file.write(str(data))  # write() 메서드의 인자는 문자열이어야 함.

# 읽기
with open('./output/data.txt', 'r') as file:
    data_output = file.read()
print(data_output)  
# {'a': [1, 2.0, 3, (4+6j)], 'b': ('character string', 'byte string'), 
# 'c': {False, True, None}}
print(type(data_output))  #  <class 'str'>

# 2. pickle 방식을 사용하는 경우
# 저장
with open('./output/data.my_pickle', 'wb') as file:
    pickle.dump(data, file)

# 읽기
with open('./output/data.my_pickle', 'rb') as file:
    data_output = pickle.load(file)  # 읽음.

print(data_output)  
# {'a': [1, 2.0, 3, (4+6j)], 'b': ('character string', 'byte string'), 
# 'c': {False, True, None}}
print(type(data_output))  # <class 'dict'>
print(data_output.get('a'))  # [1, 2.0, 3, (4+6j)]

 

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  외부 모듈의 이용

📁  외부 모듈은 다른 사람들이 만들어 배포하는 모듈을 말함

 

1) 패키지

    👾  모듈의 상위 개념으로 모듈의 집합을 의미
    👾  파이썬에서 기본적으로 제공하지 않더라도 외부에서 만들어진 패키지를 이용하면 패키지에 포함된 모듈을 사용할 수 있음


2) 패키지 관리자

    👾  외부 모듈을 사용하기 위해서는 우선 모듈이 포함된 패키지를 추가로 설치
    👾  pip라고 불리는 패키지 관리자를 사용해서 패키지를 추가, 삭제


3) 패키지 설치

💡  보통 관심있는 분야와 관련된 모듈을 검색해서 설치

       📌  맥os 에서는 터미널에 입력하여 설치

 pip install package


    👾  numpy 패키지수치해석과 통계에서 많이 사용

import numpy as np
print(np.sum([1, 2, 3, 4, 5]))  # 15

 


   

    👾  Beautiful Soup는 파이썬 웹 페이지 분석 모듈

# Beautiful Soup 모듈로 날씨 가져오기
from urllib import request
from bs4 import BeautifulSoup

# urlopen() 함수로 기상청의 전국 날씨 읽기
target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")

# 웹페이지 분석
soup = BeautifulSoup(target, "html.parser")

# location 태그 찾기
for location in soup.select("location"):
    # 내부 city, wf, tmn, tmx 태그를 찾아 출력
    print("도시:", location.select_one("city").string)
    print("날씨:", location.select_one("wf).string)
    print("최저기온:", location.select_one("tmn").string)
    print("최고기온:", location.select_one("tmx").string)
    print()
    
'''
도시: 서울
날씨: 구름많음
최저기온: 3
최고기온: 9

도시: 인천
날씨: 구름많음
최저기온: 2
최고기온: 8

도시: 수원
날씨: 구름많음
최저기온: 2
최고기온: 10
...생략...
'''

 

  📌  urllib는 URL 작업을 위한 여러 모듈을 모은 패키지 

  📌  태그를 여러개 선택할 때 select(), 한 개 선택할 때 select_one() 사용하여 값 추출

 


 

    👾  Django는 다양한 기능을 제공하는 웹 개발 프레임워크, Flask는 작은 기능만을 제공하는 웹 개발 프레임워크

pip install flask
from flask import Flask
app = Flask(__name__)

@app.rout("/")
def hello():
    return "<h1>Hello World!</h1>"
# @app.route() 는 데코레이터

 

# 맥 os 에서 Flask 코드 실행 방법
export FLASK_APP=파일 이름.py
flask run
# 터미널에 입력

 

    ⚡️  프로그램 종료할 때는 Ctrl + C


4) 패키지 삭제

pip uninstall package
ex. pip uninstall numpy

 


 

2. 라이브러리와 프레임워크

📁  라이브러리(library) : 정상적인 제어를 하는 모듈

📁  프레임워크(framework) : 제어 역전이 발생하는 모듈

    

1) 라이브러리

   - 개발자가 모듈의 기능을 호출하는 형태의 모듈

from math import sin, cos, tan, floor, ceil

 

2) 프레임워크

    - 모듈이 개발자가 작성한 코드를 실행하는 형태의 모듈 

         ex. Flask 모듈이 제공하는 명령어를 실행하면  Flask가 내부적으로 서버를 실행한 뒤 지정한 파일을 읽어 들여

               적절한 상황에 스스로 실행하게 됨

    - 개발자가 만든 함수를 모듈이 실행하는 것은 제어가 역전된 것

 


 

3. 데코레이터

 

1) 함수 데코레이터

⚡️  함수에 사용하는 데코레이터

       ➡️  대상 함수의 앞뒤에 꾸밀 부가적인 내용 혹은 반복할 내용을 데코레이터로 정의해서 손쉽게 사용할 수 있도록 한 것

# 함수 데코레이터 생성
def test(function):
    def wrapper():
        print("인사가 시작되었습니다.")
        function()
        print("인사가 종료되었습니다.")
    return wrapper
    
# 데코레이터를 붙여 함수를 만든다
@test
def hello():
    print("hello")
    
# 함수를 호출
hello()

'''
인사가 시작되었습니다.
hello
인사가 종료되었습니다.
'''

 

 

 

 

[ 내용 참고 : IT 학원 강의 및 책 '혼자 공부하는 파이썬' ]


 

1. 튜플  tuple

 

📁  리스트와 비슷한 자료형이나 한번 결정된 요소를 바꿀 수 없다는 것이 다르다.

       ➡️  이미 저장된 값 이외에는 추가, 수정, 삭제가 불가능

📁  리스트와 마찬가지로 각 요소를 구분하기 위한 인덱스가 부여되고 슬라이싱도 지원
📁  튜플은 소괄호() 나 tuple() 함수를 이용해서 생성
📁  값들을 콤마(,)로 분리하여 전달하면 자동으로 튜플이 생성

t1 = (1,2,3)
print(t1)  # (1,2,3)

# 괄호 없이 사용 가능
t2 = 1,2,3
print(t2)  #(1,2,3)

def sample():
   return (1,2)

print(sample())  #(1, 2)
# 값이 2개 반환된 것이 아니라 튜플을 자동으로 적용해서 반환함

# 리스트를 튜플로 변경
t3 = tuple([100, 3.14, 'hello'])
print(t3)  # (100, 3.14, 'hello')

# 값을 1개만 보관하는 튜플을 생성할 경우에는 값과 콤마(,)를 반드시 함께 작성
t4 = (100)
print(t4)  # 100  / 값으로 인식
print(type(t4))  # <class 'int'>

t5 = (100, )
print(t5)  # (100, ) / 튜플로 인식
print(type(t5))  # <class 'tuple'>

# 값을 swap 교환
a = 10
b = 20
print(a, b)  # 10 20
a, b = b, a  # (a, b) = (b, a)
print(a, b)  # 20 10

a, b = 100, '홍길동'
print(a)  # 100
print(b)  # 홍길동

 

 


 

2. 람다  lambda

 

📁  함수를 짧게 쓸 수 있는 파이썬의 문법

 

1)  콜백 함수  callback function

    ⚡️  함수의 매개변수에 사용하는 함수

# 매개변수로 받은 함수를 10번 호출하는 함수
def call_10_times(func):
    for i in range(10):
        func()
        
# 간단한 출력하는 함수
def print_hello():
    print("안녕하세요")
    
# 조합하기
call_10_times(print_hello)
# -> print_hello() 함수를 10번 실행

 


 

2) filter() 함수와 map() 함수

⚡️  함수를 매개변수로 사용하는 대표적인 표준함수

⚡️  map() 함수는 리스트의 요소를 함수에 넣고 리턴된 값으로 새로운 리스트를 구성

⚡️  filter() 함수는 리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로, 새로운 리스트를 구성

# map()
map(함수, 리스트)

# filter()
filter(함수, 리스트)
def power(item):
    return item * item
def under_3(item):
    return item < 3

list_input_a = [1, 2, 3, 4, 5]

# map() 사용
output_a = map(power, list_input_a)
print(output_a)  # <map object at 0x104c228f0>
print(list(output_a))  # [1, 4, 9, 16, 25]

# filter() 사용
output_b = filter(under_3, list_input_a)
print(output_b)  # <filter object at 0x104c22800>
print(list(output_b))  # [1, 2]

 

  👾  <map object> 와 <filter object> 를 제너레이터라고 부른다.

 


 

3) 람다의 개념

⚡️  간단한 함수를 쉽게 선언하는 방법을 뜻함

# 기본형식
lambda 매개변수: 리턴값
list_input_a = [1, 2, 3, 4, 5]

# map() 함수
output_a = map(lambda x: x * x, list_input_a)
print(output_a)  # <map object at 0x102d12860>
print(list(output_a))  # [1, 4, 9, 16, 25]

# filter() 함수
output_b = filter(lambda x: x < 3, list_input_a)
print(output_b)  # <filter object at 0x102d61810>
print(list(output_b))  # [1, 2]

 


 

3. 제너레이터  generator

📁  이터레이터를 직접 만들 때 사용하는 코드

📁  함수 내부에 yield 키워드를 사용하면 해당 함수는 제너레이터 함수가 된다.

📁  일반 함수와 달리 함수를 호출해도 함수 내부의 코드가 실행되지 않는다.

 

def test():
    print("함수가 호출되었습니다")
    yield "test"
    
print("A 지점 통과")  # A 지점 통과
test()

print("B 지점 통과")  # B 지점 통과
test()
print(test())  # <generator object test at 0x104ceda10>

 

  📌  위 예제에서 test()함수는 출력되지 않고, 제너레이터를 리턴한다.

  📌  제너레이터 객체는 next() 함수를 사용해 함수 내부 코드를 실행한다.

          ➡️  이때 yield 키워드 부분까지만 실행하며, next() 함수의 리턴값으로 yield 키워드 뒤에 입력한 값이 출력된다

 

def test():
    print("A 지점 통과")
    yield 1
    print("B 지점 통과")
    yield 2
    print("C 지점 통과")
  
output = test()

# next() 함수 호출
print("D 지점 통과")
a = next(output)
print(a)
print("E 지점 통과")
b = next(output)
print(b)
print("F 지점 통과")
c = next(output)
print(c)

next(output)

 

 

 

📌  next() 함수를 호출할 때마다 함수 내부의 내용이 진행

📌  next() 함수를 호출한 이후 yield 키워드를 만나지 못하고 함수가 끝나면 StopIteration 이라는 예외가 발생

 

 

 

 

 

 

 

 

 

[ 내용참고 : 책 '혼자 공부하는 파이썬' ]

+ Recent posts