반응형

 

6. 파이썬 프로그래밍 어떻게 시작해야 할까?

 

I. 구구단 프로그램 - 2

프로그램을 만들려면 먼저입력출력을 생각하라.

구구단 프로그램 중 2단을 만든다면, 2를 입력값으로 주었을 때 어떻게 출력되어야 할까?

1. 함수의 이름은? GuGu

2. 입력 받는 값은? 2

3. 출력하는 값은? 2(2, 4, 6, 8, ···, 18)

4. 결과는 어떤 형태로 저장하지? 연속된 자료형이니까 리스트

 

사상을 먼저 정리한다.

 

1. GuGu라는 함수에 2를 입력값으로 주고, result라는 변수에 결과값 넣기

result = GuGu(2)

 

2. 결과값 형태 고민하기 -리스트

리스트 자료형. 따라서 result = [2, 4, 6, 8, 10, 12, 14, 16, 18]

 

3. 이름을 GuGu로 지은 함수 만들기

def GuGu(n):

    print(n) #1의 것 실행하면 2가 나온다.

GuGu(2)처럼 실행하면 2를 출력하게 됨

 

4. 결과값을 담을 리스트 생성하기

def GuGu(n):

result = []

 

5. result 리스트에 요소 추가하기 - append 내장함수 사용

 

6. 반복문 만들기

result.append(n*□)위치에 1부터 9까지 숫자만 다르게 들어가 있음

똑같은 일을 반복할 때는반복문을 사용함

>>> i = 1

>>> while i < 10:

           print(i)

           i = i+1

 

7. GuGu 함수 완성하기

#ggd01.py

def GuGu(n):

    result = []#결과값을 저장할 리스트인 result

    i = 1

    while i < 10:

        result.append(n*i)

        i = i+1

 

    return result

 

print(GuGu(2))

 

#숫자를 입력해서 하기

def GuGu(n):

    result = [ ]

    i = 1

    for i in range(1,10):

        result.append(n * i)

 

    return result

 

input1 =int(input("숫자를 입력하여 주십시요."))

print(GuGu(input1))

 

II. 3 5의 배수 합하기

1000미만의 자연수에서 3 5의 배수는 어떻게 구할 수 있을까?

10 미만의 자연수에서 3 5의 배수를 구하면 3, 5, 6, 9이고,  총합은 23이다.

1000 미만의 자연수에서 3의 배수와 5의 배수의 총합을 구하라

1. 입력 받는 값은? 1부터 999까지(1000 미만의 자연수)

2. 출력하는 값은? 3의 배수와 5의 배수의 총합

3. 생각해 볼 것은?

하나. 3의 배수와 5의 배수는 어떻게 찾지?     

. 3의 배수와 5의 배수가 겹칠 때는 어떻게 하지?

 

1. 1000 미만의 자연수 구하기

① 변수에 초기값 1을 준 후 루프를 돌리며 1씩 증가시켜서 999까지 진행

n = 1

while n < 1000:

    print(n)

    n+= 1

range함수를 사용

for n in range(1,1000):

    print(n)

2. 3 5의 배수 구하기

1부터 1000까지의 수 중 3으로 나누었을 때 나누어 떨어지는 경우, 3으로 나누었을 때 나머지가 0인 경우가 3의 배수임

따라서 %연산자를 이용하면 3의 배수를 찾을 수 있음

for n in range(1,1000):

    if n %3  ==0:

        print(n)

5의 배수는 n % 5 0이 되는 수로 구할 수 있음

3. 3 5의 배수에 해당하는 수를 result 변수에 계속해서 더해 주기

#multi01.py

result = 0

for n in range(1,1000):

    if n % 3 ==0 or n % 5 ==0:

        result += n

print(result)

 

=> http://euler.synap.co.kr/prob_list.php

프로젝트 오일러

 

III. 게시판 페이징하기

A씨는 게시판 프로그램을 작성하고 있는데, 게시물의 총 건수와 한 페이지에 보여줄 게시물 수를 입력으로 주었을 때 총 페이지 수를 출력하는 프로그램이 필요함

1. 함수의 이름은? getTotalPage

2. 입력 받는 값은? 게시물의 총 건수(m), 한 페이지에 보여줄 게시물 수(n)

3. 출력하는 값은? 총 페이지수

게시물의 총 건수가 5이고 한 페이지에서 보여 줄 게시물 수가 10이면, 총 페이지수는 1

게시물의 총 건수가 15이고 한 페이지에서 보여 줄 게시물 수가 10라면, 총 페이지수는 2

1. 총 페이지수 구하기

총 건수(m)를 한 페이지에 보여줄 게시물 수(n)로 나누고 1을 더하면 총 페이지 수를 얻을 수 있음

총 페이지수 = 총 건수 / 한 페이지당 보여줄 건수 + 1

2. 공식 적용하고 확인하기

m n으로 나눌 때 소수점 아래 자리를 버리기 위해 / 대신 // 연산자를 사용함

def getTotalPage(m,n):

    return m //n +1

 

print(getTotalPage(5,10))

print(getTotalPage(15,10))

print(getTotalPage(25,10))

print(getTotalPage(30,10))

첫 번째, 두 번째, 세 번째 케이스는 공식에 맞게 결과가 출력됨

네 번째 케이스는 총 건수가 30이고 한 페이지에 보여줄 건수가 10이라면, 총 페이지 수는 3되어야 함

3. 실패 케이스 해결하기

def getTotalPage(m,n):

    if m % n ==0:

        return m // n

    else:

        return m // n +1

   

print(getTotalPage(5,10))

print(getTotalPage(15,10))

print(getTotalPage(25,10))

print(getTotalPage(30,10))

나누었을 때 나머지가 0인 경우는 나누기의 몫만 돌려주고 그 외의 경우에는 1을 더하여 돌려주도록 변경함

 

IV. 간단한 메모장 만들기

원하는 메모를 파일에 저장하고 추가 및 조회가 가능한 간단한 메모장을 만듦

1. 필요한 기능은? 메모 추가하기, 메모 조회하기

2. 입력 받는 값은? 메모의 내용, 프로그램 실행 옵션

3. 출력하는 값은? memo.txt

다음 명령을 실행했을 때 메모를 추가할 수 있도록 만들어 봄

C:\doIt>python memo_1217.py -a "Life is too short"

-a

Life is too short

memo.py는 우리가 작성할 프로그램 이름임

-a는 이 프로그램의 실행 옵션임

Life is too short”는 추가할 메모 내용임

 

C:\doIt>python memo.py -a "Life is too short"

-a

Life is too short

 

C:\doIt>python memo.py -a "You need python"

-a

You need python

 

type memo.txt#파일 있어야 가능하다

 

1. 입력으로 받은 옵션과 메모를 출력하는 소스 코드를 작성하기

# C:/doit/memo.py

import sys

 

option = sys.argv[1]

memo = sys.argv[2]

 

print(option)

print(memo)

sys.argv는 프로그램 실행 시 입력된 값을 읽어 들일 수 있는 라이브러리임

sys.argv[0]는 프로그램 이름인 memo.py이므로 만들려는 기능에는 필요 없음

sys.argv[1]은 프로그램 실행 옵션 값임

sys.argv[2]는 메모 내용임

 

2. 옵션과 메모를 출력하는 소스 코드를 확인하기

입력으로 전달한 옵션과 메모 내용이 그대로 출력되는 것을 확인할 수 있음

 

3. 입력으로 받은 메모를 파일에 쓰도록 소스 코드를 변경하기

option = sys.argv[1]

 

if option == 'a':

    memo = sys.argv[2]

    f= open('memo.txt','txt')

    f.write(memo)

    f.write('\n')

    f.close()

옵션 ‘-a’인 경우에만 memo값을 읽어 memo.txt 파일에 그 값을 쓰도록 함

메모는 항상 새로운 내용이 작성되는 것이 아니라 한 줄씩 추가되어야 하므로 파일 열기 모드를 ‘a’로 함

메모를 추가할 때마다 다음 줄에 저장되도록 하기 위해서 줄바꿈 문자(\n)도 추가로 파일에 쓰게 했음

 

4. 명령을 수행하고 메모 확인하기

파일에 메모가 기입되었는지 확인함

추가된 메모가 정상적으로 저장된 것을 볼 수 있음

 

5. 작성한 메모를 출력하는 소스 코드를 추가하기

메모 출력은 다음과 같이 동작하도록 만들어 봄

메모 추가는 –a 옵션을 사용함

메모 출력은 –v 옵션을 사용함

option = sys.argv[1]

 

if option == 'a':

    memo = sys.argv[2]

    f= open('memo.txt','txt')

    f.write(memo)

    f.write('\n')

    f.close()

elif option == '-v':

    f = open('memo.txt')

    memo = fread()

    f.close()

    print(memo)

옵션으로 –v가 들어온 경우 memo.txt 파일을 읽어서 출력함

 

6. 소스 코드를 수정한 후 명령을 수행하기

입력했던 메모가 그대로 출력되는 것을 확인할 수 있음

 

V. 탭을 4개의 공백으로 바꾸기

문서 파일을 읽어서 그 문서 파일 내에 있는 탭(tab)을 공백(space) 4개로 바꿈

1. 필요한 기능은? 문서 파일 읽어 들이기, 문자열 변경하기

2. 입력 받는 값은? 탭을 포함한 문서 파일

3. 출력하는 값은? 탭이 공백으로 수정된 문서 파일

다음과 같은 형식으로 프로그램이 수정되도록 만들어 봄

tabto4.py는 우리가 작성해야 할 파이썬 프로그램 이름임

src는 탭을 포함하고 있는 원본 파일 이름임

dst는 파일 내의 탭을 공백 4개로 변환한 결과를 저장할 파일 이름임

 

1. tabto4.py 파일을 작성하기

# C:/doit/tabto4.py

import sys

 

src = sys.argv[1]

dst = sys.argv[2]

 

print(src)

print(dst)

sys.argv를 이용하여 입력값을 확인하도록 만든 코드임

 

2. 입력값이 정상적으로 출력되는지 확인하기

C:\doIt\excersize>python PPT_6.5_tabto.py a.txt b.txt

a.txt

b.txt

입력으로 전달한 a.txt b.txt가 정상적으로 출력되는 것을 확인할 수 있음

 

3. 테스트를 위한 원본 파일(탭을 포함하는 파일) a.txt를 작성하기

Life       is         too       short

You       need     python

각 단어들은 탭(\t)문자로 분리되도록 입력해야 함

 

4. a.txt 파일을 읽어서 탭을 공백 4개로 변환할 수 있도록 소스 코드를 변경하기

# C:/doit/tabto4.py

import sys

 

src = sys.argv[1]

dst = sys.argv[2]

 

#print(src)

#print(dst)

 

f = open(src)

tab_content = f.read()

f.close()

 

space_content = tab_content.replace("\t"," "*4)

print(space_content)

src에 해당되는 입력 파일을 읽어서 그 내용을 tab_content라는 변수에 저장함

문자열의 replace 함수를 이용하여 탭(\t) 4개의 공백으로 변경함

 

5. tabto2.py 변경한 후 명령을 수행하기

C:\doIt\excersize>python PPT_6.5_tabto.py a.txt b.txt

Life    is    too    short

You    need    python

탭 문자가 공백 4개로 변경되어 출력될 것임

하지만 탭과 공백의 차이점을 눈으로 확인할 수 없으므로 탭이 정상적으로 공백으로 변경되었는지 확인하기 어려움

 

6. 변경된 내용을 b.txt 파일에 저장할 수 있도록 프로그램을 변경하기

# C:/doit/tabto4.py

import sys

 

src = sys.argv[1]

dst = sys.argv[2]

 

#print(src)

#print(dst)

 

f = open(src)

tab_content = f.read()

f.close()

 

space_content = tab_content.replace("\t"," "*4)

#print(space_content)

 

f = open(dst,'w')

f.write(space_content)

f.close()

탭이 공백으로 변경된 space_content를 출력 파일인 dst에 쓰도록 코드를 수정함

 

7. 프로그램 실행하기

C:\doIt\excersize>python PPT_6.5_tabto.py a.txt b.txt

b.txt 파일이 디렉터리에 생성됨

에디터로 b.txt 파일을 열어 탭이 4개의 공백 문자로 변경되었는지 확인함

 

VI. 하위 디렉터리 검색하기

특정 디렉터리부터 시작해서 그 하위 모든 파일 중 파이썬 파일(*.py)만 출력해 주는 프로그램을 만들려면 어떻게 해야 할까?

1. 함수의 이름은? search

2. 입력 받는 값은? 디텍터리(“C:/”)

3. 출력하는 값은? 파이썬 파일(*.py)

 

1. sub_dir_search.py 파일을 작성하기

#C:/doit/sub_dir_search.py

def search(dirname):

    print(dirname)

 

search("C:/")

search라는 함수를 만들고 시작 디렉터리를 입력 받도록 코드를 작성함

 

2. 디렉터리에 있는 파일을 검색할 수 있도록 소스를 변경하기

#C:/doit/sub_dir_search.py

import os

 

def search(dirname):

    #print(dirname)

    filenames = os.listdir(dirname)

    for filename in filenames:

        full_filename = os.path.join(dirname,filename)

        print(full_filename)

 

search("C:/")

os.listdir을 사용하면 해당 디렉터리에 있는 파일들의 리스트를 구할 수 있음

파일 리스트는 파일 이름만 포함되어 있으므로 경로를 포함한 파일 이름을 구하 기 위해서는 입력으로 받은 dirname을 앞에 덧붙여 주어야

os.path.join 함수는 디렉터리와 파일 이름을 이어주는 전체 경로를 구해 줌

위 코드를 수행하면 “C:/” 디렉터리에 있는 파일이 출력될 것임

 

3. “C:/” 디렉터리에 있는 확장자가 .py인 파일만을 출력하도록 소스 코드를 변경하기

#C:/doit/sub_dir_search.py

import os

 

def search(dirname):

    #print(dirname)

    filenames = os.listdir(dirname)

    for filename in filenames:

        full_filename = os.path.join(dirname,filename)

        #print(full_filename)

        ext = os.path.splitext(full_filename)[-1]

        if ext == '.py':

            print(full_filename)

           

search("C:/")

파일에서 확장자를 추출하기 위해 os 모듈의 os.path.splitext 함수를 사용하였음

os.path.splitext는 파일 이름을 확장자를 기준으로 두 부분으로 나눔

따라서 os.path.splitext(full_filename)[-1]은 해당 파일의 확장 이름이 됨

“C:/” 디렉터리에 파이썬 파일이 없다면 아무것도 출력되지 않음

 

4. “C:/” 하위 디렉터리(sub directory)도 검색이 가능하도록 소스 코드를 변경하기

#C:/doit/sub_dir_search.py

import os

 

def search(dirname):

    #print(dirname)

    try:

        filenames = os.listdir(dirname)

        for filename in filenames:

            full_filename = os.path.join(dirname,filename)

            #print(full_filename)

            #ext = os.path.splitext(full_filename)[-1]

            #if ext == '.py':

            #    print(full_filename)

            if os.path.isdir(full_filename):

                search(full_filename)

            else:

                ext = os.path.splitext(full_filename)[-1]

                if ext == '.py':

                    print(full_filename)

    except PermissionError:

        pass

           

search("C:/")

try ∙∙∙ exception PermissionError로 함수 전체를 감싼 이유는 os.listdir를 수행할 때 권한이 없는 디렉터리에 접근하더라도 프로그램이 오류로 종료되지 않고 수행되도 록 하기 위해서임

os.path.isdir 함수는 full_filename이 디렉터리인지 파일인지 구분하기 위해 사용함

디렉터리일 경우 해당 경로를 입력받아 다시 search함수를 호출함 (재귀 호출)

해당 디렉터리의 파일이 디렉터리일 경우, 다시 search함수를 호출하면 해당 디렉터 리의 하위 파일을 다시 검색하기 시작하므로 결국 모든 파일들을 검색할 수 있게 됨

glob 

특정 디렉터리에 있는 파일 이름을 모두 알아야 할 때 사용하는 모듈

6 33 페이지

C:/” 하위 디렉터리(sub directory)도 검색이 가능하도록 소스 코드를 변경하기

 

 

 

 

 

VII.행운권 추첨 프로그램

1부터 200 사이의 번호 중에서 난수 값을 발생시켜 행운번호를 출력함

1. 함수의 이름은? getNumber

2. 입력 받는 값은?

행운권 추첨을 시작합니다(y/n)

3. 출력하는 값은?

당첨번호 : 151

당첨되셨습니다!! 축하합니다

 

1. 행운권 추첨 프로그램(1/2)

#lucky01.py

import random

 

##함수 선언 부분 ##

def getNumber():

    return random.randint(1,200)

 

##메인 프로그램 부분 ##

print("** 행운권 추첨을 시작합니다 ** ")

num = getNumber()

print("당첨번호 : %d" % num)

print("당첨되셨습니다. !! 축하합니다.\n")

 

1. 행운권 추첨 프로그램(2/2)

#lucky02.py

import random

 

##함수 선언 부분 ##

def getNumber():

    return random.randint(1,200)

 

##변수 선언 부분 ##

lotto = []

num = 0

 

##메인 프로그램 부분 ##

while True:

    start = input("** 행운권 추첨을 시작합니다(y/n) **")

    if start == "n":

        break

 

    num = getNumber()

 

    if lotto.count(num) ==0:

        lotto.append(num)

 

   

    print("         당첨번호 : %d" % num)

    print("    당첨되셨습니다!! 축하합니다\n")

 

#lucky03.py

import random

 

#random으로 생성

def getNumber(totalNum):

    return random.randint(1,totalNum)

 

##변수 선언 부분 ##

lotto = []

num = 0

totalNum = 0

 

#참석 인원수 추가

try:

    while True:

        totalNum = int(input("참석 인원은 몇명입니까?"))

        if totalNum > 0 :break

        else:print("0이상 입력하여 주십시요.")

except ValueError:

    print("참석 인원을 입력하여 주십시요.")

       

while True:

 

    #마감 종료시  

    if len(lotto) == totalNum :

        print("행운권 추첨 마감되였습니다.다음 기회에 도전하여 주십시요.")

        break

 

    #행원권 추첨

    start = input("행운권 추첨을 시작합니다.(y/n) **")

    if start not in ('y','n'):

        print("y/n만 가능합니다.")

        continue

           

    if start == "n": break

   

    #당첨된것은 안나오게 하는 것

    while True:

        num = getNumber(totalNum)

       

        if lotto.count(num) == 0:

            lotto.append(num)

       

            print("  당첨번호 : %d" %num)

            print("  당첨되셨습니다.!! 축하합니다. \n")

            break

        else:

            continue

 

 

1부터 46 사이의 번호 중에서 난수 값을 발생시켜 6개의 로또번호를 출력함

1. 함수의 이름은? getNumber

2. 입력 받는 값은?

로또 추첨을 시작합니다

3. 출력하는 값은?

당첨된 로또 번호  13  14  19  26  40  43

1. 로또 추첨 프로그램

#lotto.py

import random

 

##함수 선언 부분 ##

def getNumber():

    return random.randrange(1,46)

 

##변수 선언 부분 ##

lotto = []

num = 0

 

##메인 프로그램 부분 ##

print("** 로또 추첨을 시작합니다 ** \n")

 

 

while True:

    num = getNumber()

 

    if lotto.count(num) == 0:

        lotto.append(num)

 

    if len(lotto) >= 6:

        break

   

print("당첨된 로또 번호 :", end = ' ')

lotto.sort()

for i in range(0,6):

    print("%d" % lotto[i], end = ' ')

 

 

반응형

'Study > Python' 카테고리의 다른 글

python-8  (0) 2020.09.12
Python-7  (0) 2020.09.12
python-5  (0) 2020.09.09
python-4  (0) 2020.09.08
python-3  (0) 2020.09.08
반응형

 

5. 파이썬 날개 달기, 객체지향 프로그래밍

I. 클래스

클래스(class)는 객체 지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메소드 (함수)를 정의하는 일종의 틀(template)이다.

클래스는 객체를 생성하기 위해 변수와 메소드(함수)를 정의하는 일종의 틀

모듈:변수,함수 또는 크랠스를 모아 놓은 파일 파이썬 파일

패키지 : 모듈을 계층적(디렉터리 구조)으로 관리

함수->클래스->모듈->패키지

class는 변수하고 함수로 주어진다.

class안에 쓰는 것을 메소드 라고 한다.

 

클래스는 도대체 왜 필요한가?

함수를 이용해 계산기의더하기기능을 구현한 예:

#add1.py

result = 0

 

def add(num):

    global result

    result += num

    return result

 

print(add(3))#3

print(add(4))#7

계산된 결과값을 유지하기 위해서 result라는 전역 변수(global)를 사용했음

실행하면 예상한 대로 다음과 같은 결과값이 출력됨

한 프로그램에서 2대의 계산기가 필요한 상황이 발생하면 어떻게 해야 할까?       

각 계산기는 각각의 결과값을 유지하기 위해 add 함수를 각각 따로 만들어야 함

 

 

#add2.py

result1 = 0

result2 = 0

#계산기 1

def add1(num):

    global result1

    result1 += num

    return result1

#계산기 2

def add2(num):

    global result2

    result2 += num

    return result2

print(add1(3))#3

print(add1(4))#7

print(add2(3))#3

print(add2(7))#10

똑같은 일을 하는 add1 add2 함수를 만들었고, 결과값을 유지하면서 저장하는 전역 변수 result1, result2가 필요하게 되었음

결과값은 다음과 같이 출력됨

위와 같은 경우 클래스를 이용하면 간단하게 해결할 수 있음

 

#add3.py

class Calculator:

    def __init__(self):

        self.result = 0

    def add(self,num):

        self.result += num

        return self.result

    def sub(self,num):

        self.result -= num

        return self.result

 

cal1 = Calculator()

cal2 = Calculator()

print(cal1.add(3))

print(cal1.add(4))

print(cal2.add(3))

print(cal2.add(7))

실행하면 함수 2개를 사용했을 때와 동일한 결과가 출력됨

 

Calculator 클래스로 만든 별개의 계산기 cal1, cal2(객체)는 각각의 역할을 수행함

계산기(cal1, cal2)의 결과값도 각각 독립적인 값을 유지함

클래스를 사용하면 계산기 대수가 늘어나더라도 객체를 생성하기만 하면 되기 때문에 함수를 사용하는 경우와 달리 매우 간단해짐

Calculator 클래스에 빼기 기능 함수를 추가한 예:

>>> def sub(self,num):

           self.result -= num

           return self.result

 

=>클래스와 객체

클래스는 과자 틀과 비슷함

클래스(class)란 똑같은 무엇인가를 계속 만들어낼 수 있는 설계 도면이고 (과자 틀) ,객체(object)란 클래스로 만든 피조물 (과자 틀을 사용해 만든 과자) 을 뜻함

과자 틀 -> 클래스(class)

과자 틀을 사용해 만든 과자  ->객체(object)

클래스의 간단한 예:

>>> class Cookie:

...     pass

...

위의 클래스는 아무런 기능도 갖고 있지 않은 껍질뿐인 클래스임

하지만 껍질뿐인 클래스도 객체를 생성하는 기능이 있음

객체는 클래스로 만들며, 1개의 클래스는 무수히 많은 객체를 만들어낼 수 있음

>>> a = Cookie

>>> a

<class '__main__.Cookie'>#Cookie라는 클래스이다.

>>> id(a)

1254491128320

앞에서 만든 Cookie 클래스의 객체를 만드는 방법

>>> a = Cookie()

Cookie()의 결과값을 돌려받은 a b가 객체임

함수를 사용해서 그 결과값을 돌려받는 모습과 비슷함

>>> a

<__main__.Cookie object at 0x000001241595E820>

>>> type(a)

<class '__main__.Cookie'>

[객체와 인스턴스의 차이]

클래스로 만든 객체를 인스턴스라고도 함

a = Cookie() 이렇게 만든 a는 객체임

a 객체는 Cookie의 인스턴스임

즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용됨

a는 ‘인스턴스’ 보다는 a는 ‘객체’라는 표현이 어울림

a는 ‘Cookie의 객체’보다는 a는 ‘Cookie의 인스턴스’라는 표현이 어울림

 

#self라는 틀별한 의미를 가지고 있다. 첫 번째 매개변수  self는 특별한 의미를 가짐

self.first = first

self.second = second

self에 따라 매개변수가 다를 수 있다.

self는 객체가 default로 넘어간다.

self는 객체자신을 얘긴한다. 나를 호출한 자기 자신을 얘기한다.

def setdata(self, first, second)

self.first = first

self.second = second ->메소드의 수행문

self는 객체로 바꾼다. 번역을 하고 a.first a가 부르는 객체이다.

a.setdata() self a이다.

 

 

함수는 입력값 가지고 결과값 내는 것이다.

반복해서 사용할때

함수밖에 하고 안에 변수가 다르게 사용하는 게 좋다.

class 안에서는 return 을 안해도 된다.

함수의 결과값은 하나이다.

함수를 빠져나갈때는  return사용한다.break사용하면 안된다.

 

thread문제에서 클래스 문제가

thread 관련 연습문제

#PPT_5.9_thread.py

#CPU하나가 순서대로 진행한 것이다.

import time

import threading

 

class RacingCar:

    def __init__(self,name):

        self.carName = name

    def runCar(self):

        for i in range(0,5):

            carStr = self.carName + '-%d만 달립니다.\n' % (i+1)

            print(carStr,end="")

            time.sleep(0.1)

 

##매인 코드 부분

car1 = RacingCar("H자동차")       

car2 = RacingCar("K자동차")

car3 = RacingCar("D자동차")

 

#객체를 3개 생성한다.

th1 = threading.Thread(target = car1.runCar)

th2 = threading.Thread(target = car2.runCar)

th3 = threading.Thread(target = car3.runCar)

 

#스레드 시작 시키는 것

th1.start()

th2.start()

th3.start()

 

#스레드 종료 시키는 것

th1.join()

th2.join()

th3.join()

 

=>사칙연산 클래스 만들기

클래스를 어떻게 만들지 먼저 구상하기

사칙연산을 가능하게 하는 FourCal 클래스가 다음처럼 동작한다고 가정함

=>클래스 구조 만들기

>>> class FourCal:

           pass

 

a = FourCal() 처럼 객체를 아무 기능이 없이 만듦

FourCal 클래스는 아무런 변수나 함수도 포함하지 않지만, 원하는 객체 a를 만들 수 있는 기능은 가지고 있음

>>> a = FourCal()

>>> type(a)

a = FourCal() a 객체를 먼저 만들고, 그 다음에 type(a) a라는 객체가 어떤 타입인지 알아보았음

역시 객체 a FourCal 클래스의 객체임을 알 수 있음

 

=>객체에 숫자 지정할 수 있게 만들기

>>> class FourCal:

           def setdata(self,first,second): 

                       self.first = first               

                       self.second = second      

 

이전에 만들었던 pass 문장을 삭제하고, setdata 함수를 만듦

클래스 안에 함수는 메소드(Method)라고 부름

a.setdata(4, 2)

a 객체에 사칙연산을 할 때 사용할 2개의 숫자를 먼저 알려주기 위해 연산을 수행할 대상(4, 2)을 객체에 지정할 수 있게 만듦

① setdata 메소드의 매개변수

매개변수로 self, first, second라는 3개의 입력값을 받음

메소드의 첫 번째 매개변수 self는 특별한 의미를 가짐

>>> a = FourCal()

>>> a.setdata(4,2)  <-객체를 통해 클래스의 매소드를 호출하려면 도트(.) 연산자를 사용함

 

a.setdata(4, 2)처럼 호출하면 setdata 메소드의 첫 번째 매개변수 self에는 setdata 메소드를 호출한 객체 a가 자동으로 전달됨

 

==>[매소드의 또 다른 호출 방법]

>>> a = FourCal()

>>> FourCal.setdata(a,4,2)

‘클래스명.메소드‘ 형태로 호출할 때는 객체 a를 첫 번째 매개변수 self에 전달해 주어야 함

반면에 앞에서 보았듯이 ‘객체.메소드‘ 형태로 호출할 때는 self를 반드시 생략해서 호출해야 함

setdata 메소드의 수행문

a.setdata(4, 2)처럼 호출하면 setdata 메소드의 매개변수 first, second에는 각각 값 4 2가 전달되어 setdata 메소드의 수행문은 다음과 같이 해석됨

self는 전달된 객체 a이므로 다시 다음과 같이 해석됨

a 객체에 객체변수 first가 생성되고 값 4가 저장됨

객체에 생성되는 객체만의 변수를 객체변수라고 부름

>>> a = FourCal()

>>> a.setdata(4,2)

>>> print(a.first)

>>> print(a.second)

 

a 객체에 객체변수 first second가 생성되었음을 확인할 수 있음

>>> a= FourCal()

>>> b= FourCal()

>>> a.setdata(4,2)

>>> print(a.first)

>>> b.setdata(3,7)

>>> print(b.first)

a b 객체는 first라는 객체변수를 가지고 있지만 그 변수의 값은 각기 다름

객체변수는 다른 객체에 영향을 받지 않고 독립적으로 그 값을 유지함

 

=>더하기 기능 만들기

>>> class FourCal:

           def setdata(self,first,second):

                       self.first = first

                       self.second = second

           def add(self):

                       result = self.first + self.second

                       return result

>>> a= FourCal()

>>> a.setdata(4,2)

>>> print(a.add())

a.add()라고 호출하면 새로 추가된 add 메소드가 호출되어 값 6이 출력됨

어떤 과정을 거쳐 출력되는지 add 메소드를 자세히 살펴봄

add 메소드의 매개변수는 self이고, 반환 값은 result

=>곱하기, 빼기, 나누기 기능 만들기

>>> class FourCal:

           def setdata(self,first,second):

                       self.first = first

                       self.second = second

           def add(self):

                       result = self.first + self.second

                       return result

           def mul(self):

                       result = self.first * self.second

                       return result

           def sub(self):

                       result = self.first - self.second

                       return result

           def div(self):

                       result = self.first / self.second

                       return result

 

          

>>> a= FourCal()

>>> b= FourCal()

>>> a.setdata(4,2)

>>> b.setdata(3,8)

>>> a.add()

>>> a.mul()

>>> a.sub()

>>> a.div()

>>> b.add()

>>> b.mul()

>>> b.sub()

>>> b.div()

 

=>생성자(Constructor)

위에서 만든 FourCal 클래스를 다음과 같이 실행하면 어떻게 될까?

>>> a= FourCal()

>>> a.add()

FourCal 클래스의 인스턴스 a setdata 메소드를 수행하지 않고, add 메소드를 수행하면 오류가 발생함.

왜냐하면 setdata 메소드를 수행해야 객체 a first second가 생성되는 때문임

객체에 초기값을 설정해야 할 필요가 있을 때는 생성자를 구현하는 것이 안전함

생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메소드를 의미함

메소트 이름으로 __init__를 사용하면 이 메소드는 생성자가 됨

 

>>> class FourCal:

           def __init__(self,first,second):

                       self.first = first

                       self.second = second

           def setdata(self,first,second):

                       self.first = first

                       self.second = second

           def add(self):

                       result = self.first + self.second

                       return result

           def mul(self):

                       result = self.first * self.second

                       return result

           def sub(self):

                       result = self.first - self.second

                       return result

           def div(self):

                       result = self.first / self.second

                       return result

 

==>생성자 __init__ 메소드

setdata 메소드와의 차이점은 이름을 __init__으로 했기 때문에 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출됨

>>> a= FourCal()

>>> a= FourCal(4,2)

__init__ 메소드가 호출되면 객체변수가 생성되는 것을 확인할 수 있음

>>> a= FourCal(4,2)

>>> print(a.first)

>>> print(a.second)

>>> a.add()

>>> a.div()

 

==>연습문제

===>res형태로 받기

#FourCal()

class FourCal():

    def setdata(self, first,second):

        self.first = first

        self.second = second

        self.res = 0

    def add(self):#어느 객체가 호출 했는지 알아야 한다. a/b중에서 어떤것인지

        self.res = self.first + self.second

    def mul(self):

        self.res = self.first * self.second

    def sub(self):

        self.res = self.first - self.second

    def div(self):

        self.res = self.first / self.second

 

#객체 변수는 많이 만들지 않은게 좋다. 사이즈를 작게 하는 게 좋다.

그래서 self.res = 0 비효율성이다.

a = FourCal()                 <-a = FourCal처럼 입력해서 a라는 객체를 만듦

a.setdata(4,2)                 <-a.setdata(4, 2)처럼 입력해서 4 2라는 숫자를 a에 지정해 줌

print("a.first %d " % a.first)

print("a.second %d " % a.second)

a.add()

print("a.add() %d " % a.res) <-a.add()를 수행하면 두 수를 합한 결과(4 + 2)를 돌려줌

a.mul()

print("a.mul() %d " % a.res) <-a.mul()를 수행하면 두 수를 곱한 결과(4 * 2)를 돌려줌

a.sub()

print("a.sub() %d " % a.res) <-a.sub()를 수행하면 두 수를 뺀 결과(4 - 2)를 돌려줌

a.div()

print("a.div() %d " % a.res) <-a.div()를 수행하면 두 수를 나눈 결과(4 / 2)를 돌려줌

 

 

b = FourCal()

b.setdata(5,5)

print("b.first %d " % b.first)

print("b.second %d " % b.second)

b.add()

print("b.add() %d " % b.res)

b.mul()

print("b.mul() %d " % b.res)

b.sub()

print("b.sub() %d " % b.res)

b.div()

print("a.div() %d " % b.res)

 

#init용도

 def __init__(self, first, second):#객체 만들때 저장한다.

        #__init__ 생성자를 자동으로 해준다.setdata 안해도 된다.

        self.first = first

        self.second = second

    #def setdata(self, first,second):

    #    self.first = first

    #    self.second = second

    def add(self):#어느 객체가 호출 했는지 알아야 한다. a/b중에서 어떤것인지

        result = self.first + self.second

        return result

    def mul(self):

        result = self.first * self.second

        return result

    def sub(self):

        result = self.first - self.second

        return result

    def div(self):

        result = self.first / self.second

        return result

 

a = FourCal(4,2)#FourCal 매개변수 만들어라

#a.setdata(4,2)

print("a.first %d " % a.first)

print("a.second %d " % a.second)

print("a.add() %d " % a.add())

print("a.mul() %d " % a.mul())

print("a.sub() %d " % a.sub())

print("a.div() %d " % a.div())

b = FourCal(3,8)

#b.setdata(3,8)

print("a.first %d " % b.first)

print("a.second %d " % b.second)

print("a.add() %d " % b.add())

print("a.mul() %d " % b.mul())

print("a.sub() %d " % b.sub())

print("a.div() %d " % b.div())

a라는 객체 만들때 __init__ 생긴다.

 

=>클래스의 상속

상속(Inheritance)이란 ‘물려받다’라는 뜻으로, 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것임

FourCal 클래스를 상속하는 MoreFourCal 클래스 만들기

#class상속

>>> class MoreFourCal(FourCal):

           pass

 

>>> a = MoreFourCal(4,2)

>>> a.add()

>>> a.mul()

MoreFourCal 클래스는 FourCal 클래스의 모든 기능을 사용할 수 있음

클래스의 상속 사용법

class 클래스 이름(상속할 클래스 이름)

기능이 개선된 기능을 만들겠다.

FourCal를 수정불가할때 수정권한이 없을 경우  MoreFourCal기능을 상속 받아서 변경한다.

solution소스 안준다.그래서 소스는 없고 상속받아서 한다.

내 부모 클라스의 메소드를 전부 사용가능하다.

a b제곱 을 계산하는 MoreFourcal 클래스 만들기

 

>>> class MoreFourCal(FourCal):

           def pow(self):

                       result = self.first ** self.second

                       return result

 

          

>>> a = MoreFourCal(4,2)

>>> a.pow()

 

[왜 상속을 해야 할까?] 

상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경 하려고 할 때 사용한다. 

기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이 라면 상속을 사용해야 한다.

=>매소드 오버라이딩(Overriding)

>>> a= FourCal(4,0)

>>> a.div()

div 메소드를 호출하면 4 0으로 나누려고 하기 때문에 오류가 발생함

0으로 나누면 오류가 난다.

자식의 메소드를 불러 쓴다.

>>> class SafeFourCal(FourCal):

    def div(self):

        if self.second == 0:

            return 0

        else:

            return self.first / self.second 

>>> a= SafeFourCal(4,0)

>>> a.div()

 

SafeFourCal 클래스는 FourCal 클래스에 있는 div 메소드를 동일한 이름으로 다시 작성하였음

부모 클래스에 있는 메소드를 동일한 이름으로 다시 만드는 것을 메소드 오버라이딩(Overriding, 덮어쓰기) 이라고 함

메소드를 오버라이딩하면 부모 클래스의 메소드 대신 오버라이딩한 메소드가 호출됨

 

=>클래스 변수

>>> class Family:

           lastname = "" #Family안에 있는 변수 전역변수

Family 클래스에 선언한 lastname이 클래스 변수임

클래스 변수는 클래스 안에 메소드(함수)와 마찬가지로 변수를 선언하여 생성함

클래스 변수 사용

>>> class Family:

           lastname = "" 

>>> print(Family.lastname)#클래스 이름.클래스 변수로 사용

>>> a = Family()

>>> b = Family()

>>> print(a.lastname)#클래스로 만든 객체를 통해서 사용

>>> print(b.lastname)

Family 클래스의 lastname이라는 문자열로 바꾸면 어떻게 될까?

>>> Family.lastname =""

>>> print(a.lastname)#

>>> print(b.lastname)#

#클래스 변수 값을 변경했더니 클래스로 만든 객체의 lastname 값도 모두 변경됨

# , 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징이 있음

a.lastname ="kim"#이 경우 메모리에 주소가 바꿔진다.

print(a.lastname)#kim

print(b.lastname)#

대입하는것

 

연습문제 모듈을 클래스로 바꾸기

#126 1

class Calcultor:

    def __init__(self):

        self.value = 0

    def add(self,val):

        self.value += val

 

class UpgradeCalculator(Calcultor):

    def minus(self,val):

        self.value -= val

       

cal = UpgradeCalculator()

cal.add(10)

cal.minus(7)

 

print(cal.value)#10에서 7을 뺀 3을 출력

 

#2

class Calculator:

    def __init__(self):

        self.value = 0

 

    def add(self,val):

        self.value += val

       

class MaxLmitCalculator(Calculator):

    def add(self,val):

        self.value += val

        if self.value>= 100:

            self.value = 100

           

 

cal = MaxLmitCalculator()

cal.add(50) #50더하기

cal.add(60) #60더하기

 

print(cal.value)#100을 출력

 

#계산기 class

class Calculator:

    def __init__(self,oper,var1,var2):

        self.oper = oper

        self.var1 = var1

        self.var2 = var2

    def cal(self):

        result =  eval(str(self.var1)+self.oper+str(self.var2))

        return result

   

#에러메시지 class

class ErrMessage:

    def __init__(self,var):

        self.var = var

    def intErr(self):

        print('숫자만 입력 가능합니다.'.format(self.var))

       

operList = ('+','-','*','/') 

var=var1=var2 = 0 #값 초기화

while True:

    #1.계산 구분 판단

    while True:

        oper= input("계산 구분 ('+','-','*','/') 을 입력하세요")

        if oper in operList:

            break

        else:print("정확한 계산 구분을 입력하여주세요.") 

 

    #2.숫자입력

    while True:

        try:           

            var = var1 = int(input("첫 번째 수를 입력하세요. : "))

        except ValueError :  # 에러 종류

            ErrMessage(var).intErr()

            continue

        break

    

    while True:

        try:

            var = var2 = int(input("두 번째 수를 입력하세요. : "))

            if oper=="/" and var2== 0:

                print("'%s' 일경우 %d가 불가능합니다." % (oper,var2))

                continue

            else:

                break

        except ValueError :  # 에러 종류

            ErrMessage(var).intErr()

            continue

        break

 

    #3. 계산 및 결과

    cal = Calculator(oper, var1, var2)

    print("계산기 : %d %s %d = %d" % (var1,oper,var2, cal.cal()))

 

    #4. 종료여부

    result = input("enter 눌릴 겨우 종료됩니다.")

    if result == '':

        print("계산기 종료합니다.")

        break

    else:print("계산기 진행됩니다.")

 

II. 모듈

모듈이란?

함수나 변수 또는 클래스를 모아 놓은 파일

다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 함

 

디렉트리 검색

>>> import os

>>> os.getcwd()

'C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python38'

디렉트리를 확인해야 한다.

 

#모듈화

#계산기 class

class Calculator:

    def __init__(self,oper,var1,var2):

        self.oper = oper

        self.var1 = var1

        self.var2 = var2

    def cal(self):

        result =  eval(str(self.var1)+self.oper+str(self.var2))

        return result

 

import cal_04_1216 as cal

   

#에러메시지 class

class ErrMessage:

    def __init__(self,var):

        self.var = var

    def intErr(self):

        print('숫자만 입력 가능합니다.'.format(self.var))

       

operList = ('+','-','*','/') 

var=var1=var2 = 0 #값 초기화

while True:

    #1.계산 구분 판단

    while True:

        oper= input("계산 구분 ('+','-','*','/') 을 입력하세요")

        if oper in operList:

            break

        else:print("정확한 계산 구분을 입력하여주세요.") 

 

    #2.숫자입력

    while True:

        try:           

            var = var1 = int(input("첫 번째 수를 입력하세요. : "))

        except ValueError :  # 에러 종류

            ErrMessage(var).intErr()

            continue

        break

    

    while True:

        try:

            var = var2 = int(input("두 번째 수를 입력하세요. : "))

            if oper=="/" and var2== 0:

                print("'%s' 일경우 %d가 불가능합니다." % (oper,var2))

                continue

            else:

                break

        except ValueError :  # 에러 종류

            ErrMessage(var).intErr()

            continue

        break

 

    #3. 계산 및 결과

    cal1 = cal.Calculator(oper, var1, var2)

    res = cal1.cal()

    print("계산기 : %d %s %d = %d" % (var1,oper,var2, res))

 

    #4. 종료여부

    result = input("enter 눌릴 겨우 종료됩니다.")

    if result == '':

        print("계산기 종료합니다.")

        break

    else:print("계산기 진행됩니다.")

 

모듈 만들기

# mod1.py

def add(a,b):

    return a+b

def sub(a,b):

    return a-b

위와 같이 add sub 함수만 있는 파일 mod1.py를 만들고, c:\doit 디렉터리에 저장

확장자 .py로 만든 파이썬 파일은 모두 모듈임

 

=>모듈 불러오기

import mod1

print(mod1.add(3,4))

print(mod1.sub(3,4))

mod1.py를 불러오기 위해 import mod1이라고 입력함

import는 이미 만들어진 파이썬 모듈을 사용할 수 있게 해주는 명령어임

mod1.py 파일에 있는 add 함수를 사용하기 위해서는 mod1.add 처럼 모듈 이름 뒤에 ‘.’(도트 연산자)를 붙이고 함수 이름을 쓰면 됨

 

=>import의 사용 방법

import 모듈 이름

모듈 이름은 mod1.py에서 .py라는 확장자를 제거한 mod1만을 가리킴

모듈 이름.함수 이름 처럼 사용함

=>모듈 이름 없이 함수 이름만 쓰는 방법

from 모듈 이름 import 모듈 함수

모듈 이름을 붙이지 않고 모듈의 함수를 쓸 수 있음

from mod1 import add

add(3,4)

mod1.py 파일의 add 함수만 사용할 수 있음

add 함수와 sub 함수를 모두 사용하는 방법은 2가지가 있음

     from mod1 import add, sub

     from mod1 import *

    번 방법은 콤마로 구분하여 필요한 함수를 불러올 수 있음

   번 방법은 * 문자를 사용하여 모든 함수를 불러올 수 있음

 

=>if __name__ == “__main__”: 의 의미

# mod1.py

def add(a,b):

    return a+b

def sub(a,b):

return a-b

 

print(add(1,4))

print(add(4,2))

add(1, 4) sub(4, 2)의 결과를 출력하는 문장을 추가함

작성한 mod1.py 파일을 다음과 같이 실행함

#모듈 테스트시 사용하면 됨 다른데서  import할 경우 찍히지 않게끔 하는 것

if __name__ == "__main__":

    print(add(1, 4))

if __name__ == "__main__": import로 호출시는 실행되지 말아라 라는 뜻이다.

이러한 문제를 방지하려면, mod1.py 파일의 마지막 부분을 변경해야 함

# mod1.py

def add(a,b):

    return a+b

def sub(a,b):

    return a-b

 

if __name__ == "__main__":

    print(add(1,4))

    print(add(4,2))

#python mod1.py cmd창에서 호출

if __name__ == “__main__”:을 사용하면 C:\doit>python mod1.py처럼 직접 이 파일을 실행시켰을 때는 __name__ == “__main__”이 참이 되어 if문 다음 문장이 수행됨

반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 __name__ == “__main__”이 거짓이 되어 if문 다음 문장이 수행되지 않음

 

=>클래스나 변수 등을 포함한 모듈

#mod2.py

PI = 3.141592                #원주율 값에 해당하는 PI 변수

 

class Math:                    #원의 넓이를 계산하는 Math 클래스

    def solv(self, r):

        return PI * (r ** 2)

 

def add(a,b):                  #두 값을 더하는 add함수

    return a+b

 

#파일을 직접 실행시켰을 때 수행됨

if __name__ == "__main__":

    print(PI)

    a = Math()

    print(a.solv(2))

    print(add(PI,4.4))

변수, 클래스, 함수 등을 모두 포함하고 있는 모듈임

 

#mod2.py 모듈을 다른 파일에서 불러오기

import mod2 as mod2

 

result = mod2.add(3,4)

print(result)

print(mod2.PI)

print(mod2.Math().solv(2))

 

#print(mod2.__name__)

#모델 이름이 들어간다.mod2

 

CMD창에서 해결 하는 방법

cd C:\doit

mkdir mymod #새 디렉터리 생성

move mod2.py mymod #지정한 디렉터리로 파일 이동

 

1.sys.path.append(모듈을 저장한 디렉터리)사용하기

import sys

sys.path

sys.path.append("C:/doit/mymod")

2.pythonpathn 환결 변수 사용하기

set PYTHONPATH = C:\doit\mymod

python

import mod2

 

III. 패키지

패키지란 무엇인가?

패키지(Package)는 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해줌

관리의 효율성

모듈 이름이 A.B인 경우에 A는 패키지이름이 되고, B A 패키지의 B 모듈이 됨

파이썬 패키지는 디렉터리와 파이썬 모듈로 이루어진 구조임

game, sound, graphic, play는 디렉터리 이름 이고, 확장자가 .py인 파일이 파이썬 모듈임

game 디렉터리가 이 패키지의 루트 디렉터 리이고, sound, graphic, play는 서브 디렉터 리임

패키지 구조로 파이썬 프로그램을 만드는 것 이 공동 작업이나 유지 보수 등 여러 면에서 유리함

각 디렉터리에 __init__.py 파일을 만들어 놓기만 하고 내용은 일단 비워 둠

일반 디렉터리와 구분하는 것 이다.

__init__.py있으면 패키지이다.

 

 

=>패키지 만들기

==>패키지 기본 구성 요소 준비하기

1. C:\doit 디렉터리 밑에 game 및 서브 디렉터리를 생성하고 .py 파일들을 만듦

C:/doit/game/__init__.py

C:/doit/game/sound/__init__.py

C:/doit/game/sound/echo.py

C:/doit/game/graphic/__init__.py

C:/doit/game/graphic/render.py

 

2. 각 디렉터리에 __init__.py 파일을 만들어 놓기만 하고 내용은 일단 비워 둠

3. echo.py 파일은 다음과 같이 만듦

#echo.py

def echo_test():

    print("echo")

4. render 파일을 다음과 같이 만듦

#render.py

def render_test():

    print("render")

5. game 패키지를 참조할 수 있도록 명령 프롬프트창에서 set 명령어로 PYTHONPATH 환경 변수에 C:\doit 디렉터리를 추가함

명렬 프롬프트

C:\>set PYTHONPATH=C:\doit

C:\>python

Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit

(AM... Type "help", "copyright", "credits" or "license" for more information.

>>> 

=>패키지 안의 함수 실행하기

==>패키지를 사용하여 echo.py 파일의 echo_test 함수를 실행해 봄 (3가지 방법)

3가지 방법

첫 번째, echo 모듈을 import하여 실행하는 방법(폴더이름)

>>> import game.sound.echo

>>> game.sound.echo.echo_test()

echo

두 번째, echo 모듈이 있는 디렉터리 까지를 from ··· import하여 실행하는 방법(from-폴더이름)

>>> from game.sound import echo

>>> echo.echo_test()

echo

세 번째, echo 모듈의 echo_test 함수를 직접 import하여 실행하는 방법(from-폴더이름)

>>> from game.sound.echo import echo_test

>>> echo_test()

echo

import game을 수행하면 game 디렉터리의 모듈 또는 game 디렉터리의 __init__.py에 정의된 것만 참조할 수 있음

도트 연산자(.)를 사용해서 import a.b.c처럼 import할 때 가장 마지막 항목인 c는 반드시 모듈 또는 패키지여야만 함

 

cmd

set PYTHONPATH=C:\doIt

python shell

>>> import sys

>>> sys.path.append("c:\doIt")

>>> import game.sound.echo

>>> game.sound.echo.echo_test()

echo

 

#현재 경로 출력

>>> import os

>>> os.getcwd()

 

교제 페이지 213,214

>>> from game.sound.echo import *

>>> echo_test()

echo

 

import는 모듈까지 가능하다.

패키지 안의 함수 사용할 때 주의사항

첫 번째, 다음과 같이 echo_test 함수를 사용하는 것은 불가능함=>패키지까지는 안된다.

>>> import game

>>> game.sound.echo.echo_test()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: ‘module' object has no attribute ‘sound’

import game을 수행하면 game 디렉터리의 모듈 또는 game 디렉터리의 __init__.py에 정의된 것만 참조할 수 있음

두 번째, import 마직막 항목에 함수를 사용하는 것도 불가능함

>>> import game.sound.echo.echo_test

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ImportError: No module named echo_test

도트 연산자(.)를 사용해서 import a.b.c처럼 import할 때 가장 마지막 항목인 c는 반드시 모듈 또는 패키지여야만 함

 

==>__init__.py의 용도

__init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 함

game, sound, graphic 등 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않음

sound 디렉터리의 __init__.py를 제거하고 다음을 수행해 봄

>>> import game.sound.echo

Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named sound.echo

sound 디렉터리에 __init__.py 파일이 없어서 ImportError가 발생하게 됨

python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식함. 하위 버전 호환을 위해 생성하는 것이 안전함

==> __all__의 용도

>>> from game.sound import *

>>> echo.echo_test()

Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name ‘echo’ is not defined

echo 모듈을 사용할 수 있어야 할 것 같은데, echo라는 이름이 정의되지 않았다는 이름 오류(NameError)가 발생함

오류 이유는, 특정 디텍터리의 모듈을 *를 사용하여 import 할 때에는 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정해야 함

# C:\doit/game/sound/__init_.py

__all__ = [‘echo’]

여기서 __all__이 의미하는 것은 sound 디렉터리에서 *기호를 이용하여 import할 경우 이곳에 정의된 echo 모듈만 import 된다는 의미임

>>> from game.sound import *

>>> echo.echo_test()

echo

 __init__.py

페케지 확인

모듈인지 확인

 

=>relative 패키지

graphic 디렉터리의 render.py 모듈이 sound 디렉터리의 echo.py 모듈을 사용하려면,

render.py를 수정하면 가능함

# render.py

from game.sound.echo import echo_test

def render_test():

print ("render")

echo_test()

from game.sound.echo import echo_test라는 문장을 추가하여 echo_test()함수를 사용할 수 있도록 수정함

수정 후 다음과 같이 수행함

>>> from game.graphic.render import render_test

>>> render_test()

render

echo

상대경로

from game.sound.echo import echo_test

절대경로

from ..sound.echo import echo_test

..은 부모 디렉터리, .은 현재 디렉터리를 의미함

전체 경로를 이용하여 import할 수 있지만, relative하게 import하는 것도 가능함

 

 

 

# render.py

from ..sound.echo import echo_test

def render_test():

print ("render")

echo_test()

..은 부모 디렉터리, .은 현재 디렉터리를 의미함

graphic sound 디렉터리는 동일한 깊이(depth)이므로 부모 디렉터리(..)를 사용하여 위와 같은 import가 가능한 것임

..과 같은 relative한 접근자는 render.py와 같이 모듈 안에서만 사용해야 함

파이썬 인터프리터에서 relative한 접근자를 사용하면 ‘SystemError: cannot perform relative import’와 같은 오류가 발생함

 

IV. 예외 처리

프로그램을 만들다 보면 수없이 많은 오류를 만나게 됨

오류가 발생하는 이유는 프로그램이 잘못 동작하는 것을 막기 위한 배려임

하지만 이러한 오류를 무시하고 싶을 때가 있는데 try, except를 이용해서 예외적으로 오류를 처리할 수 있게 해줌

오류는 어떨 때 발생하는가?

try, except

try: ···

except:

    [발생오류[as 오류 메시지 변수]]:

 

 

#lambda

add = lambda a,b:a+b

result = add(3,4)

print(result)

 

input1 = input("6.숫자를 여러 개 입력하세요 :")

result =["\u2605"*int(n) for n in input1]

print(result)

 

python에서 thread자주 사용하는지:

경로 바꾸는 두가지 방식죽 다 사용해도 되는지?

sys.path.append()

os.chdir

 

#thread_car01.py

#CPU하나가 순서대로 진행한 것이다.

import time

 

class RacingCar:

    def __init__(self,name):

        self.carName = name

    def runCar(self):

        for i in range(0,5):

            carStr = self.carName + '-%d만 달립니다.' % (i+1)

            print(carStr)

            time.sleep(0.1)

 

##매인 코드 부분

car1 = RacingCar("H자동차")       

car2 = RacingCar("K자동차")

car3 = RacingCar("D자동차")

 

car1.runCar()

car2.runCar()

car3.runCar()

 

#thread_car01.py

#CPU하나가 순서대로 진행한 것이다.

import time

import threading

 

class RacingCar:

    def __init__(self,name):

        self.carName = name

    def runCar(self):

        for i in range(0,5):

            carStr = self.carName + '-%d만 달립니다.\n' % (i+1)

            print(carStr,end="")

            time.sleep(0.1)

 

##매인 코드 부분

car1 = RacingCar("H자동차")       

car2 = RacingCar("K자동차")

car3 = RacingCar("D자동차")

 

#객체를 3개 생성한다.

th1 = threading.Thread(target = car1.runCar)

th2 = threading.Thread(target = car2.runCar)

th3 = threading.Thread(target = car3.runCar)

 

#스레드 시작 시키는 것

th1.start()

th2.start()

th3.start()

 

#스레드 종료 시키는 것

th1.join()

th2.join()

th3.join()

 

IV. 예외 처리

프로그램을 만들다 보면 수없이 많은 오류를 만나게 됨

오류가 발생하는 이유는 프로그램이 잘못 동작하는 것을 막기 위한 배려임

하지만 이러한 오류를 무시하고 싶을 때가 있는데 try, except를 이용해서 예외적으 로 오류를 처리할 수 있게 해줌

오류는 어떨 때 발생하는가?

오타를 입력했을 때 발생하는 구문 오류

디렉터리 안에 없는 파일을 열려고 시도할 때 발생하는 오류

>>> f = open("나없는파일",'r')

없는 파일을 열려고 시도하면 ‘FileNotFoundError’ 오류가 발생함

 

>>> 4 /0

4 0으로 나누려니까 ‘ZeroDivisionError’ 오류가 발생함

 

리스트에 존재하지 않는 요소를 얻으려고 할 때 발생하는 오류

>>> a= [1,2,3]

>>> a[4]

a[4] a리스트에서 얻을 수 없는 값이므로 ‘IndexError’오류가 발생함

 

=>오류 예외 처리 기법

==> try, except

기본 구조

try 블록 수행 중 오류가 발생하면 except 블록이 수행됨

하지만 try 블록에서 오류가 발생하지 않는다면, except 블록은 수행되지 않음

except 구문의 [ ]기호는 괄호 안의 내용을 생략할 수 있다는 관례 표기법임

1. try, except만 쓰는 방법

오류 종류에 상관없이 오류가 발생하면 except블록을 수행함

2. 발생 오류만 포함한 except

오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행한다는 의미임

3. 발생 오류와 오류 메시지 변수까지 포함한 except

두 번째 경우에서 오류 메시지의 내용까지 알고 싶을 때 사용하는 방법임

try:

    4/0

except ZeroDivisionError as e:

    print(e)

위처럼 4 0으로 나누려고 하면 ZeroDivisionError가 발생하여 except 블록이 실행되고 e라는 오류 메시지를 다음과 같이 출력함

결과 =>

###교재 224페이지

a= [1,2,3]

try:

    a[4]

except IndexError as e:

    print(e)

결과 :

=> try ·· else

try문은 else절을 지원함

else절은 예외가 발생하지 않은 경우에 실행되며 반드시 except절 바로 다음에 위치함

try:

    f = open('foo.txt','r')

except FileNotFoundError as e:

    print(str(e))

else:

    data = f.read()

    print(data)

    f.close()

만약 foo.txt라는 파일이 없다면 except절이 수행되고, 있다면 else절이 수행됨

결과 =>

=> try ·· finally

try문에는 finally절을 사용할 수 있음

finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행됨

보통 finally절은 사용한 리소스를 close해야 할 때에 많이 사용함

foo.txt라는 파일을 쓰기 모드로 연 후에 try문이 수행된 후 예외 발생 여부에 상 관없이 finally절에서 f.close()로 열린 파일을 닫을 수 있음

f = open('foo.txt','w')

try:

    #무언가를 수행함

    print(1)

finally:

    f.close()

결과 =>

 

=>여러 개의 오류 처리하기

0으로 나누는 오류와 인덱싱 오류를 같이 처리한 예:

try:

    a = [1,2]

    print(a[3])

    4/0

except ZeroDivisionError:

    print("0으로 나눌 수 없습니다.")

except IndexError:

    print("인덱싱할 수 없습니다.")

결과 =>

먼저 발생한 오류의 문자열이 출력됨

 

오류 메시지 변수를 사용한 예:

try:

    a = [1,2]

    print(a[3])

    4/0

except ZeroDivisionError as e:

    print(e)

except IndexError as e:

    print(e)

결과 =>

 

ZeroDivisionError IndexError를 함께 처리한 예:

try:

    a = [1,2]

    print(a[3])

    4/0

except (ZeroDivisionError,IndexError) as e:

    print(e)

2개 이상의 오류를 동시에 처리하기 위해 괄호로 묶어 처리함

결과 =>

 

=> 오류 회피하기

프로그래밍을 하다 보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있음

try:

    f = open('나없는파일','r')

except FileNotFoundError:

    pass

try문 안에서 FileNotFoundError가 발생할 경우에 pass를 사용해 오류를 회피함

 

=>오류 일부러 발생시키기 raise

프로그래밍을 하다 보면 오류를 일부러 발생시켜야 할 경우도 생김

raise NotImplementedError

메소드에 오류나 문제 발생시

raise라는 명령어를 이용해 오류를 강제로 발생시킬 수 있음

raise

강제로 오류를 발생시키는 예"

class Bird:

    def fly(self):

        raise NotImplementedError

Bird 클래스를 상속받는 자식 클래스는 반드시 fly라는 함수를 구현해야 한다는 의지를 보여 줌

자식 클래스가 fly 함수를 구현하지 않은 상태로 fly 함수를 호출한다면 어떻게 될까?

class Eagle(Bird):

    pass

 

eagle = Eagle()

eagle.fly()

Eagle 클래스에서 fly 함수를 구현하지 않아서, Bird 클래스의 fly함수가 호출됨

#NotImplementedError

#NameError: name 'NotError' is not defined

raise문에 의해 NotImplemented Error가 발생할 것임

 

NotImplementedError가 발생되지 않게 하려면 Eagle 클래스에 fly 함수 구현해야 함

class Bird1:

    def fly(self):

        raise NotImplementedError

 

class Eagle1(Bird1):

    def fly(self):

        print("very fast")

 

eagle1 = Eagle1()

eagle1.fly()

자식 클래스에 fly함수를 구현한 후 프로그램을 실행하면 오류 없이 출력됨

결과 =>

 

=> 예외 만들기

프로그램 수행 도중 특수한 경우에는 예외를 직접 만들어서 사용함

별명을 출력해 주는 예:

 

class MyError(Exception):

    pass

 

def say_nick(nick):

    if nick == '바보':

        raise MyError()

    print(nick)

   

say_nick('천사')

say_nick('바보')

#raise MyError()

결과 =>

프로그램 실행해 보면천사가 한 번 출력된 후, MyError가 발생함

 

예외 처리 기법을 사용하여 MyError 발생을 예외 처리해 봄:

class MyError(Exception):

    pass

 

def say_nick(nick):

    if nick == '바보':

        raise MyError()

    print(nick)

 

오류 메시지를 사용하고 싶다면 예외 처리해 봄

try:

    say_nick('천사')

    say_nick('바보')

except MyError:

    print("허용되지 않는 별명입니다.")

결과 =>

프로그램 실행해 보면 print(e)로 오류 메시지가 출력되지 않는 것을 확인함

 

오류 클래스에 __str__ 메소드 구현

#myError-> 오류 메시지 만들어 지는 함수

class MyError(Exception):

    def __str__(self):

        return "허용되지 않는 별명입니다."

 

def say_nick(nick):

    if nick == '바보':

        raise MyError()

    print(nick)

 

try:

    say_nick('천사')

    say_nick('바보')

except MyError as e:

    print(e)

결과 =>

__str__ 메소드는 print(e)처럼 오류 메시지를 print문으로 출력하느 메소드임

 

V. 내장 함수

Don’t Reinvent The Wheel, 이미 있는 것을 다시 만드느라 쓸데없이 시간을 낭비하지 말라. 파이썬 내장 함수들은 import 없이 사용할 수 있음

=>abs

abs(x)는 어떤 숫자를 입력을 받았을 때, 그 숫자의 절대값을 돌려주는 함수

>>> abs(3)

3

>>> abs(-3)

3

>>> abs(-1.2)

1.2

 

=> all

all(x)는 반복 가능한 자료형 x를 입력 인수로 받으며 이 x가 모두 참이면 True, 거짓이 하나라도 있으면 False를 돌려줌

>>> all([1,2,3])

True

리스트 자료형[1, 2, 3]은 모든 요소가 참이므로 True를 돌려줌

>>> all([1,2,3,0])

False

리스트 자료형[1, 2, 3, 0]중에서 요소 0은 거짓이므로 False를 돌려줌

 

=> any

any(x) x중 하나라도 참이 있으면 True를 돌려주고, x가 모두 거짓일 때에만 False 를 돌려줌. all(x)의 반대임.

any   all의 반대

>>> any([1,2,3,0])

True

리스트 자료형[1, 2, 3, 0]중에서 1, 2, 3이 참이므로 True를 돌려줌

>>> any([0,""])

False

리스트 자료형[0, “”]의 요소 0 “”은 모두 거짓이므로 False를 돌려줌

 

=> chr

chr(i)는 아스키 코드 값을 입력으로 받아 그 코드에 해당하는 문자를 출력하는 함수

>>> chr(97)

'a'

>>> chr(48)

'0'

>>> chr(13)

'\r'

아스키 코드 97은 소문자 a

아스키 코드 48은 숫자 0

 

#숫자화 한것 아스키 코드  0~ 126

>>> ord('a')

97

>>> ord('b')

98

ort->8진수

 

dir은 객체가 자체적으로 가지고 있는 변수나 함수를 보여줌

>>> dir([1,2,3])

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

>>> dir({'1':'a'})

['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

 

=> divmod

divmod(a, b) 2개 숫자를 입력으로 받아서 a b로 나눈 몫과 나머지를 튜플 형태 로 돌려주는 함수

>>> div = divmod(7,3)

>>> div

(2, 1)

7 나누기 3의 몫은 2, 나머지는 1

>>> div[0]

2

>>> div[1]

1

 

=>enumerate

순서가 있는 자료형(리스트, 튜플, 문자열)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 돌려주는 함수

>>> for i,name in enumerate(['body','foo','bar']):

...     print(i,name)

...

0 body

1 foo

2 bar

>>> names = ['kim','lee','gil']

>>> for i, name in enumerate(names):

...     print('%d: %s' % (i,name))

...

0: kim

1: lee

2: gil

순서 값과 함께 body, foo, bar가 순서대로 출력됨

enumerate for문과 함께 사용하면 자료형의 현재 순서(index)와 그 값을 쉽게 알 수 있음

for문처럼 반복되는 구간에서 객체가 현재 어느 위치에 있는지 알려주는 인덱스 값이 필요할 때 enumerate함수를 사용하면 유용함

 

=>eval

eval(expression)은 실행 가능한 문자열(1+2, ‘hi’ + ‘a’ )을 입력으로 받아 문자열을 실행한 결과값을 돌려주는 함수

eval함수는 문자열을 계산한다.

>>> eval('1+2')

3

>>> eval("'hi'+'a'")

'hia'

>>> eval('divmod(4,3)')

(1, 1)

보통 eval은 입력 받은 문자열로 파이썬 함수나 클래스를 동적으로 실행하고 싶 은 경우에 사용됨

 

 

 

 

=> filter

첫 번째 인수로 함수 이름을, 두 번째 인수로 그 함수에 차례로 들어갈 자료형을 받음

두 번째 인수인 반복 가능한 자료형 요소가 첫 번째 인수인 함수에 입력되었을 때 반 환 값이 참인 것만 걸러내서 돌려줌

positive 함수는 리스트를 입력받아 양수 값을 돌려주는 함수

#positive.py

def positive(l):

    result = []

    for i in l:

        if i > 0:

            result.append(i)

    return result

 

print(positive([1, -3, 2, 0, -5, 6]))

결과 =>

 

filter 함수를 사용하면 앞의 내용을 간략하게 작성할 수 있음

def positive1(x):

    return x >0

 

print(list(filter(positive1,[1, -3, 2, 0, -5, 6])))

결과값 =>

두 번째 인수인 리스트의 요소들이 첫 번째 인수인 positive 함수에 입력되었을 때 리턴값이 참인 것만 묶어서 돌려 줌

 

lambda를 사용하면 더 간략하게 작성할 수 있음

print(list(filter(lambda x:x>0,[1, -3, 2, 0, -5, 6])))

결과값 =>

 

=>hex

hex(x)는 정수 값을 입력받아 16진수(hexadecimal)로 변환하여 돌려주는 함수

>>> hex(234)

'0xea'

>>> hex(3)

'0x3'

 

=> id

id(object)는 객체를 입력 받아 객체의 고유 주소 값(레퍼런스)을 돌려주는 함수

>>> a = 3

>>> id(a)

140722314516192

>>> id(3)

140722314516192

>>> b =  a

>>> id(b)

140722314516192

3, a, b는 모두 같은 객체를 가리킴 같은 고유 주소 값

id(4)라고 입력하면 4 3, a, b와 다른 객체이므로 다른 고유 주소 값이 출력됨

>>> id(4)

140722314516224

 

=>input

input([prompt])은 사용자 입력을 받는 함수

매개변수로 문자열을 주면, 그 문자열은 프롬프트가 됨

>>> a = input()

hi

>>> a

'hi'

>>> b = input("Enter:")

Enter:hi

>>> b

'hi'

Enter: 라는 프롬프트를 띄우고 사용자 입력을 받음

 

=>int

int(x)는 문자열 형태의 숫자나 소수점이 있는 숫자 등을 정수 형태로 돌려주는 함수

>>> int('3')

3

>>> int(3.4)

3

int(x, radix) radix 진수로 표현된 문자열 x 10진수로 변환하여 돌려줌

>>> int('11',2)

3

>>> int('1A',16)

26

 

=>isinstance

isinstance(object, class)는 첫 번째 인수로 인스턴스, 두 번째 인수로 클래스를 받음

인스턴스가 그 클래스의 인스턴스인지 판단해 참이면 True, 거짓이면 False를 돌려줌

>>> class Person:pass

 

>>> a = Person()

>>> isinstance(a, Person)

True

a Person 클래스가 만든 인스턴스이므로 True를 돌려줌

>>> b = 3

>>> isinstance(b,Person)

False

b Person 클래스가 만든 인스턴스가 아니므로 False를 돌려줌

 

=>lambda

lambda는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할을 함

함수를 한 줄로 간결하게 만들 때 사용함

def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 쓰임

[함수명 = ] lambda 매개변수1, 매개변수2, … : 매개변수를 사용한 표현식

리스트 내에 lambda 함수 만들기

>>> myList = [lambda a, b:a+b, lambda a, b:a*b]

>>> myList

[<function <lambda> at 0x000001D423D08E50>, <function <lambda> at 0x000001D423D08EE0>]

>>> myList[0]

<function <lambda> at 0x000001D423D08E50>

>>> myList[0](3,4)

7

리스트의 첫 번째 요소 myList[0] 2개의 입력값을 받아 두 값의 합을 돌려주는 lambda 함수임

>>> myList[1](3,4)

12

리스트의 두 번째 요소 myList[1] 2개의 입력값을 받아 두 값의 곱을 돌려주는 lambda 함수임

 

=> len

len(s)은 입력값 s의 길이(요소의 전체 개수)를 돌려주는 함수

>>> len("python")

6

>>> len([1,2,3])

3

>>> len((1,'a'))

2

 

=> list

list(s)는 반복 가능한 자료형 s를 입력받아 리스트를 돌려주는 함수

>>> list("python")

['p', 'y', 't', 'h', 'o', 'n']

>>> list((1,2,3))

[1, 2, 3]

list 함수에 리스트를 입력으로 주면 똑같은 리스트를 복사하여 돌려 줌

>>> a = [1,2,3]

>>> b = list(a)

>>> b

[1, 2, 3]

 

=> map

map(f, iterable)은 함수(f)와 반복 가능한(iterable) 자료형을 입력으로 받음

map은 입력받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 돌려주는 함수

two_times 함수는 리스트 요소를 입력받아 각 요소에 2를 곱한 결과값을 돌려 줌 #two_times.py

def two_times(numberList):

    result = []

    for number in numberList:

        result.append(number * 2)

    return result

result = two_times([1,2,3,4])

print(result)# [2, 4, 6, 8]

결과 =>

 

==> map 함수를 사용하면 앞의 내용을 간략하게 작성할 수 있음

>>> def two_times(x):return x*2

 

>>> list(map(two_times,[1,2,3,4]))

[2, 4, 6, 8]

 

==> lambda를 사용하면 더 간략하게 작성할 수 있음

>>> list(map(lambda a: a*2, [1,2,3,4]))

[2, 4, 6, 8]

 

=> max

max(iterable)는 인수로 반복 가능한 자료형을 입력받아 최대값을 돌려주는 함수

>>> max([1,2,3])

3

>>> max("python")

'y'

 

=> min

min(iterable)는 인수로 반복 가능한 자료형을 입력받아 최소값을 돌려주는 함수

>>> min([1,2,3])

1

>>> min("python")

'h'

 

=> oct

oct(x)는 정수 형태의 숫자를 8진수 문자열로 바꾸어 돌려주는 함수

>>> oct(34)

'0o42'

>>> oct(12345)

'0o30071'

 

=>open

b 바이너리 모드로 파일 열기

open(filename, [mode])파일 이름읽기 방법을 입력받아 파일 객체를 돌려주는 함수

읽기 방법(mode)을 생략하면 기본값인 읽기 전용 모드(r)로 파일 객체를 만들어 돌려줌

b w, r, a와 함께 사용됨

>>> f = open("binary_fil", "rb")

rb바이너리 읽기 모드를 의미함

>>> fread = open("read_mode.txt", "r")

>>> fread2 = open("read_mode.txt")

fread fread2는 동일한 방법임

, 모드 부분이 생략되면 기본값으로 읽기 모드인 r을 갖게 됨

>>> fappend = open("append_mode.txt", "a")

추가 모드(a)로 파일을 여는 예제임

 

=> ord

ord(c)는 문자를 입력으로 받아 아스키 코드 값을 리턴하는 함수

>>> ord('a')

97

>>> ord('0')

48

 

=>pow

pow(x, y) x y제곱한 결과값을 리턴하는 함수

>>> pow(2,4)

16

>>> pow(3,3)

27

 

=> range

range([start,]stop[,step]) for문과 함께 자주 사용되는 함수

입력받은 숫자에 해당하는 범위 값을 반복 가능한 객체로 만들어 돌려줌

==> 인수가 하나일 경우

>>> list(range(5))

[0, 1, 2, 3, 4]

시작 숫자를 지정해 주지 않으면 range 함수는 0부터 시작함

==> 인수가 2개일 경우

>>> list(range(5,10))

[5, 6, 7, 8, 9]

끝 숫자 10은 포함되지 않는다는 것에 주의

입력으로 주어지는 2개의 인수는 시작 숫자와 끝 숫자를 나타냄

==> 인수가 3개일 경우

>>> list(range(1,10,2))

[1, 3, 5, 7, 9]

1부터 9까지, 숫자 사이의 거리는 2

>>> list(range(0,-10,-1))

[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

0부터 -9까지, 숫자 사이의 거리는 -1

세 번째 인수는 숫자 사이의 거리를 의미함

 

=> round

round(number[,ndigits]) 함수는 숫자를 입력받아 반올림해 주는 함수

>>> round(4.6)

5

>>> round(4.2)

4

>>> round(5.678,2)

5.68

실수 5.678을 소수점 2자리까지만 반올림하여 표시

 

=> sorted

sorted(iterable) 함수는 입력값을 정렬한 후 그 결과를 리스트로 돌려주는 함수

객체 자체를 정렬하지 않음

>>> sorted(['a','c','b'])

['a', 'b', 'c']

>>> sorted(['a','c','c'])

['a', 'c', 'c']

>>> sorted("zero")

['e', 'o', 'r', 'z']

>>> a = [3,1,2]

>>> a

[3, 1, 2]

>>> sorted(a)

[1, 2, 3]

>>> a = [3,1,2]

>>> sorted(a,reverse = True)

[3, 2, 1]

>>> sorted([3,1,2])

[1, 2, 3]

>>> sorted(["a","c","b"])

['a', 'b', 'c']

>>> sorted("zero")

['e', 'o', 'r', 'z']

>>> a = [3,1,2]

>>> sorted(a)

[1, 2, 3]

>>> a

[3, 1, 2]

 

=> sort

sort(iterable) 함수는 리스트 객체 그 자체를 정렬할 뿐 정렬된 결과를 돌려주지 않음

sort결과 값은 없고  자체 만 정렬

>>> a = [3,1,2]

>>> result = a.sort() # sort 함수로 a 리스트 정렬

>>> print(result)

None # 반환값이 없기 때문에 None이 출력됨

>>> a

[1, 2, 3]

>>> result = a.sort(reverse = True)

>>> a

[3, 2, 1]

sort 함수는 반환값이 없기 때문에 result 변수에 저장되는 값이 없음

따라서 print(result)를 하면 None이 출력됨

sort 함수를 수행한 후 반환값은 없지만, 리스트 객체 a를 확인하면 [3, 1, 2] [1, 2, 3]으로 정렬됨

 

=> str

str(object)은 문자열 형태로 객체를 반환하여 돌려주는 함수

>>> str(3)

'3'

>>> str('hi')

'hi'

>>> str('hi'.upper())

'HI'

 

=> sum

sum(iterable)은 입력받은 리스트나 튜플의 모든 요소의 합을 돌려주는 함수

>>> sum([1,2,3])

6

>>> sum([4,5,6])

15

 

=> tuple

tuple(iterable)은 반복 가능한 자료형을 입력 받아 튜플 형태로 바꾸어 돌려주는 함수

>>> tuple("abc")

('a', 'b', 'c')

>>> tuple([1,2,3])

(1, 2, 3)

>>> tuple((1,2,3))

(1, 2, 3)

튜플이 입력으로 들어오면 그대로 돌려준다

 

=> type

type(object)은 입력값의 자료형이 무엇인지 알려 주는 함수

>>> type("abc") # abc”는 문자열 자료형

<class 'str'>

>>> type([])  # [ ]는 리스트 자료형

<class 'list'>

>>> type(open("test","w")) # 파일 자료형

<class '_io.TextIOWrapper'>

 

=> zip

>>> list(zip([1,2,3,7],[4,5,6]))

[(1, 4), (2, 5), (3, 6)]

>>> list(zip([1,2,3],[4,5,6]))

[(1, 4), (2, 5), (3, 6)]

>>> list(zip([1,2,3],[4,5,6],[7,8,9]))

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

>>> list(zip("abc","def"))

[('a', 'd'), ('b', 'e'), ('c', 'f')]

 

VI. 외장 함수

전 세계의 파이썬 사용자들이 만든 유용한 프로그램을 모아 놓은 것이 라이브러리임 파이썬 라이브러리는 설치할 때 자동으로 컴퓨터에 설치함

C:\Users\admin\AppData\Local\Programs\Python\Python38\Lib

=>sys

sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 제어할 수 있게 해주는 모듈

명령 행에서 인수 전달하기 - sys.argv

명령 프롬프트 창에서 test.py 뒤에 또 다른 값들을 함께 넣어 주면 sys.argv 리스트에 그 값이 추가됨

# C:/doit/Mymod/argv_test.py

import sys

print(sys.argv)

python 명령어 뒤의 모든 것들이 공백을 기준으로 나뉘어서 sys.argv 리스트의 요소가 됨

 

=> 강제로 스크립트 종료하기 - sys.exit

import sys

>>> sys.exit()

python shell에서 가능하다.

sys.exit [Ctrl+Z] [Ctrl+D]를 눌러서 대화형 인터프리터를 종료하는 것과 같음

프로그램 파일 내에서 사용하면 프로그램을 중단함

 

=> 자신이 만든 모듈 불러와 사용하기 - sys.path

>>> import sys

>>> sys.path

['C:\\doIt\\excersize', 'C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python38\\Lib\\idlelib', 'C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python38\\python38.zip', 'C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python38\\DLLs', 'C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python38\\lib', 'C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python38', 'C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages']

sys.path는 파이썬 모듈들이 저장되어 있는 위치를 나타냄

, 이 위치에 있는 파이썬 모듈들은 경로에 상관없이 어디에서나 불러올 수 있음

는 현재 디렉터리를 의미함

# C:/doit/Mymod/path_append.py

import sys

sys.path.append("C:/doit/Mymod")

위와 같이 파이썬 프로그램 파일에서 sys.path.append를 이용해 경로명을 추가함

이렇게 하고 난 후에는 C:\doit\Mymod 디렉터리에 있는 모듈을 불러와서 사용함

 

=>pickle

pickle->b binary상태만 가능하다.

pickle은 객체의 형태를 그대로 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈

>>> import pickle

>>> f = open("test.txt",'wb')

>>> data = {1:'python',2:'you need'}

>>> pickle.dump(data,f)

>>> f.close()

pickle 모듈의 dump 함수를 이용하여 딕셔너리 객체인 data를 파일에 저장함

>>> import pickle

>>> f = open("test.txt",'rb')

>>> data = pickle.load(f)

>>> print(data)

{1: 'python', 2: 'you need'}

pickle.dump로 저장한 파일을 pickle.load를 이용해서 원래 있던 딕셔너리 객체 (data) 상태 그대로 불러옴

 

=>OS

OS 모듈은 환경 변수나 디렉터리, 파일 등의 OS 자원을 제어할 수 있게 해주는 모듈

=>내 시스템의 환경 변수 값을 알고 싶을 때 - os.environ

>>> import os

>>> os.environ

os.environ은 현재 시스템의 환경 변수에 대한 정보들을 딕셔너리 객체로 돌려줌

객체가 딕셔너리이기 때문에 다음과 같이 호출할 수 있음

>>> os.environ['PATH']

시스템의 PATH 환경 변수에 대한 내용임

 

=> 디렉터리 위치 변경하기 - os.chdir

>>> os.chdir("C:\WINDOWS")

os.chdir을 사용하면 현재 디렉터리의 위치를 변경할 수 있음

 

=>디렉터리 위치 돌려받기 - os.getcwd

>>> os.getcwd()

 

'C:\\doIt\\excersize'

 

=> 시스템 명령어 호출하기 - os.system

>>> os.system("dir")

0

시스템 자체의 프로그램이나 기타 명령어를 파이썬에서 호출할 수 있음

os.system(“명령어”)처럼 사용함

현재 디렉터리에서 시스템 명령어인 dir을 실행하는 예제임

 

os.environ[’PATH’] ->시스템의 PATH 환경 변수에 대한 내용임

os.getcwd() ->current working director

os.chdir(”C:\WINDOWS”)->change director

sys.path.append("")

 

=> 실행한 시스템 명령어의 결과값 리턴 받기 - os.popen

>>> f= os.popen("dir")

os.popen은 시스템 명령어를 실행시킨 결과값을 읽기 모드 형태의 파일 객체로 돌려줌

print(f.read())

읽어 들인 파일 객체의 내용을 보기 위해서는 read()를 사용함

=> 기타 유용한 os관련 함수

 

os.system(”dir”)

os.system("calc")

 

=> shutil

shutil은 파일을 복사해 주는 파이썬 모듈

shutil은 파일을 복사해 주는 파이썬 모듈

파일 복사하기 - shutil.copy(src, dst)

>>> import shutil

>>> shutil.copy("test.txt","dst.txt")

'dst.txt'

src.txt 파일과 동일한 내용의 파일이 dst.txt로 복사되는 것을 확인함

 

=>glob

특정 디렉터리에 있는 파일 이름을 모두 알아야 할 때 사용하는 모듈

디렉터리에 있는 파일들을 리스트로 만들기 - glob(pathname)

>>> import glob

>>> glob.glob("C:\doIt\q*")

[]

glob 모듈은 디렉터리 내의 파일들을 읽어서 돌려줌

*, ? 등 메타 문자를 써서 원하는 파일만 읽어 들일 수 있음

 

=>tempfile

파일을 임시로 만들어서 사용할 때 유용한 모듈

tempfile.mktemp()는 중복되지 않는 임시 파일의 이름을 무작위로 만들어서 돌려줌

>>> import tempfile

>>> filename = tempfile.mktemp()

>>> filename

'C:\\Users\\admin\\AppData\\Local\\Temp\\tmpi8xvs8as'

=> tempfile.TemporaryFile()은 임시 저장 공간으로 사용할 파일 객체를 돌려줌

>>> import tempfile

>>> f = tempfile.TemporaryFile()

>>> f.close()#생성한 임시 파일이 자동으로 삭제됨

이 파일은 기본적으로 바이너리 쓰기 모드(wb)

f.close()가 호출되면 이 파일 객체는 자동으로 사라짐

 

>>> import time

>>> time.time()

1576554477.726312

>>> time.localtime(time.time())

time.struct_time(tm_year=2019, tm_mon=12, tm_mday=17, tm_hour=12, tm_min=48, tm_sec=5, tm_wday=1, tm_yday=351, tm_isdst=0)

 

=> time

==> time.time

>>> import time

>>> time.time()

1578386701.804986

time.time() UTC(Universal Time Coordinated, 협정 세계 표준시)를 사용하여 현재 시간을 실수 형태로 돌려주는 함수

1970 1 1 0 0 0초를 기준으로 지난 시간을 초 단위로 돌려줌

 

=> time.localtime

>>> time.localtime(time.time())

time.struct_time(tm_year=2020, tm_mon=1, tm_mday=7, tm_hour=17, tm_min=45, tm_sec=43, tm_wday=1, tm_yday=7, tm_isdst=0)

time.localtime time.time()에 의해서 반환된 실수값을 이용해서 연도, , , , , , ···의 형태로 바꾸어 주는 함수

 

>>> t = time.localtime(time.time())

>>> t.tm_year

2019

 

=> time.asctime

>>> time.asctime(time.localtime(time.time()))

'Tue Jan  7 17:47:52 2020'

time.localtime에 의해서 반환된 튜플 형태의 값을 인수로 받아서 날짜와 시간을 알아보기 쉬운 형태로 리턴하는 함수

 

=> time.ctime

>>> time.ctime()

'Tue Jan  7 17:48:22 2020'

 

time.strftime

strftime 함수는 시간에 관계된 것을 세밀하게 표현할 수 있는 포맷 코드를 제공

time.strftime(‘출력할 형식 포맷 코드’, time.localtime(time.time()))

시간에 관계된 것을 표현하는 포맷 코드

>>> time.strftime('%y%m%d',time.localtime(time.time()))

'191217'

>>> import time

>>> time.strftime('%x',time.localtime(time.time()))

'01/07/20'

>>> time.strftime('%c',time.localtime(time.time()))

'Tue Jan  7 21:15:17 2020'

time.strftime을 사용한 예제임

 

=>time.sleep

#sleep1.py

import time

for i in range(10):

    print(i)

time.sleep(1)

time.sleep 함수는 주로 루프 안에서 많이 사용됨

이 함수를 사용하면 일정한 시간 간격을 두고 루프를 실행할 수 있음

위의 예는 1초 간격으로 0부터 9까지의 숫자를 출력함

time.sleep 함수의 인수는 실수 형태로 쓸 수 있음

 

=>calendar

carlendar는 파이썬에서 달력을 볼 수 있게 해주는 모듈임

calendar.calendar(연도)로 사용하면 그 해 전체 달력을 볼 수 있음

>>> import calendar

>>> print(calendar.calendar(2020))

calendar.prcal(연도)를 사용해도 위와 같은 결과를 얻을 수 있음

>>> calendar.prcal(2020)

calendar.prmonth(년도,)로 사용하면 그 달의 달력만 보여줌

>>> calendar.prmonth(2020,1)

calendar.weekday(연도, , ) 함수는 그 날짜에 해당하는 요일 정보를 돌려줌

>>> calendar.weekday(2020,1,7)

월요일은 0, 화요일은 1, 수요일은 2, 목요일은 3, 금요일은 4, 토요일은 5,일요일은 6이라는 값을 돌려줌

calendar.monthrange(연도, ) 함수는 입력 받은 달의 1일이 무슨 요일인지와 그 달이 며칠까지 있는지를 튜플 형태로 돌려줌

>>> calendar.monthrange(2020,1)

(2, 31)

2015 12 1일은 화요일이고, 이 달은 31일까지 있다는 것을 보여 줌

 

=> random

random은 난수(규칙이 없는 임의의 수)를 발생시키는 모듈

random.random() 0.0에서 1.0사이의 실수 중에서 난수 값을 돌려줌

>>> import random

>>> random.random()

0.7571404612949787

>>> random.randint(1,10)

6

>>> random.randrange(0,20)

7

random.randint(x, y) x에서 y사이의 정수 중에서 난수 값을 돌려줌

>>> random.randint(1,10)

8

>>> random.randint(1,55)

50

random.randrange(x, y[,z]) x에서 y사이의 정수 중에서 난수 값을 돌려줌

>>> random.randrange(0,29)

1

random 모듈을 이용해서 재미있는 함수를 만들어 봄

 

 

 

 

#random_pop.py

import random

def random_pop(data): #리스트의 요소 중에서 무작위로 하나를 선택하여 꺼내서 돌려줌

    number = random.randint(0,len(data)-1)

    return data.pop(number)

 

if __name__ == "__main__":

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

    while data:

        print(random_pop(data))

결과 =>

random_pop 함수는 random.choice 함수를 사용하면 직관적으로 만들 수 있음

def random_pop(data):

    number = random.choice(data)

    data.remove(number)

    return number

 

if __name__ == "__main__":

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

    while data:

        print(random_pop(data))

결과 =>

random.shuffle는 리스트의 항목을 무작위로 섞고 싶을 때는 사용하는 함수

>>> import random

>>> data = [1,2,3,4,5]

>>> random.shuffle(data)

>>> data

[4, 1, 3, 2, 5]

 

=> webbrowser

webbrowser는 시스템에서 사용하는 기본 웹 브라우저를 자동으로 실행하는 모듈

>>> import webbrowser

>>> webbrowser.open("http://google.com")

True

웹 브라우저를 자동으로 실행시키고, http://google.com으로 가게 해줌

webbrower open 함수는 웹 브라우저가 실행된 상태이면 입력주소로 이동함

>>> webbrowser.open_new("http://google.com")

True

 

스레드를 다루는 thrading모듈

컴퓨터에서 동작하고 있는 프로그램을 프로세스라고 한다.

보통 1개의 프로세스는 한 가지 일만 하지만 스레드를 사용하면 한 프로세스 안에서 2가지 또는 그 이상의 일을 동시에 수행할 수 있다.

#thread_test.py

import time

 

def long_task():#5초의 시간이 걸리는 함수

    for i in range(5):

        time.sleep(1) #1초간 대기한다.

        print("working: %s \n" % i)

 

print("Start")

for i in range(5): #long_task 5회 수행한다.

    long_task()

 

print("End")

# 25초의 시간이 걸린다.

 

#thread_test.py

import time

import threading #스레드를 생성하기 위해서는 threading모듈이 필요하다.

def long_task():#5초의 시간이 걸리는 함수

    for i in range(5):

        time.sleep(1) #1초간 대기한다.

        print("working: %s \n" % i)

print("Start")

 

threads = []

for i in range(5): #long_task 5회 수행한다.

    t = threading.Thread(target = long_task) #스레드를 생성한다.

    threads.append(t)

 

for t in threads:

    t.start() #스레드를 실행한다.

    

 

print("End")

#5초 걸린다.

 

#thread_test.py

import time

import threading #스레드를 생성하기 위해서는 threading모듈이 필요하다.

def long_task():#5초의 시간이 걸리는 함수

    for i in range(5):

        time.sleep(1) #1초간 대기한다.

        print("working: %s \n" % i)

print("Start")

 

threads = []

for i in range(5): #long_task 5회 수행한다.

    t = threading.Thread(target = long_task) #스레드를 생성한다.

    threads.append(t)

 

for t in threads:

    t.start() #스레드를 실행한다.

 

for t in threads:

    t.join() #join으로 스레드가 종료될 때까지 기다린다.

print("End")

 

working: 0

 

working: 1

 

working: 2

 

working: 3

 

working: 4

……..

#join함수는 해당 스레드가 종료될 때 까지 기다리게 한다. 따라서 위와 같이 수정하면

#우리가 원하던 출력을 보게 된다.

스레드가 하나하나 씩 진행된다.

working: 0

working: 0

working: 0

working: 0

working: 0

working: 0

working: 0

working: 0

working: 0

working: 0

 

……

 

 

 

 

연습문제

#262페이지

#1.

class Calculator:

    def __init__(self):

        self.value = 0

 

    def add(self, val):

        self.value += val

 

class UpgrageCalculator(Calculator):

    def minus(self, val):

        self.value -= val

 

cal = UpgrageCalculator()

cal.add(10)

cal.minus(7)

 

print(cal.value) #10에서 7을 뺀 3을 출력

 

#2.

class Calculator:

    def __init__(self):

        self.value = 0

    def add(self, val):

        self.value += val

       

class MaxLimitCalculator(Calculator):

    def add(self, val):

        self.value += val

        if self.value > 100:

            self.value = 100

   

 

cal= MaxLimitCalculator()

cal.add(50)#50 더하기

cal.add(60)#60 더하기

 

print(cal.value)#100출력

 

#3.

>>> all([1,2,abs(-3)-3])

False

>>> chr(ord('a')) == 'a'

True

>>> abs(-3)-3

0

#4.

>>> list(filter(lambda x :x>0 ,[1,-2,3,-5,8,-3]))

[1, 3, 8]

 

#5.

>>> hex(234)

'0xea'

>>> int('0xea',16)

234

 

#6.

>>> list(map(lambda x: x* 3, [1,2,3,4]))

[3, 6, 9, 12]       

 

#7.

>>> max([-8,2,7,5,-3,5,0,1])

7

>>> min([-8,2,7,5,-3,5,0,1])

-8

 

#8.

>>> 17 /3

5.666666666666667

>>> round(17/3,4)

5.6667

 

#9.cmd창에서 호출

import sys

numbers = sys.argv[1:]#파일 이름을 제외한 명령 행의 모든 입력

 

result = 0;

for number in numbers:

    result += number

print(result)

 

#10.

import os

os.chdir("c:\doIt")

 

result = os.popen("dir")

 

print(result.read())

 

#11.

>>> import glob

>>> glob.glob("c:\doit\*.py")

[]

 

#12.

>>> import time

>>> time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(time.time()))

'2020/01/07 22:11:15'

 

#13.

import random

result = []

 

while len(result) < 6:

    num = random.randint(1,45)

    if num not in result:

        result.append(num)

 

print(result)

결과 =>

반응형

'Study > Python' 카테고리의 다른 글

Python-7  (0) 2020.09.12
python-6  (0) 2020.09.10
python-4  (0) 2020.09.08
python-3  (0) 2020.09.08
python-2  (0) 2020.09.07
반응형

 

4. 프로그램 입력과 출력

 

I. 함수

함수(function)는 입력 값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓은 것

함수를 사용하는 이유는 무엇일까? 

동일한 내용을 반복해서 작성할 때 한 번만 코딩해 두고 반복해서 사용

프로그램을 함수화하면 프로그램의 흐름을 일목요연하게 볼 수 있음

=> 함수의 구조

def는 함수를 만들 때 사용하는 예약어임

함수이름은 함수를 만드는 사람이 임의로 만들 수 있음

매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수임

함수를 정의한 다음, 함수에서 수행할 문장들을 입력함

return은 함수의 결과값을 돌려주는 명령어임

def add(a,b):

    return a + b

함수이름은 add이고, 입력으로 2개의 값을 받으며, 결과값은 2개의 입력 값을 더한 값임

>>> def add(a,b):

    return a + b

 

>>> a = 3

>>> b = 4

>>> c = add(a,b)

>>> c

 

=>매개변수와 인수

매개변수 : 함수에 입력으로 전달된 값을 받는 변수

인수 : 함수를 호출할 때 전달하는 입력 값

def add(a,b):    <------- a,b는 매개변수

    return a+b

 

print(add(3,4))   <------- 3,4는 인수

=>입력값과 결과값에 따른 함수의 형태

함수는 들어온 입력값을 받아 어떤 처리를 하여 적절한 결과값을 돌려줌

함수의 형태는 입력값과 결과값의 존재 유무에 따라 4가지 유형으로 나뉨

1. 일반적인 함수

입력값이 있고 결과값이 있는 함수가 일반적인 함수임

일반적인 함수의 예:

>>> def add(a, b):

           result = a+b

           return result

>>> a = add(3, 4)

>>> print(a)

입력값과 결과값이 있는 일반적인 함수의 사용법

결과값을 받을 변수 = 함수이름(입력인수 1, 입력인수 2, ···)

 

2. 입력값이 없는 함수

매개변수 부분을 나타내는 함수이름 뒤의 괄호 안이 비어 있는 함수의 예

입력값이 없는 함수의 사용 예:

>>> def say():

           return 'Hi'

>>> a = say()

>>> print(a)

 

입력값이 없고 결과값만 있는 함수의 사용법

결과값을 받을 변수 = 함수명()

 

3. 결과값이 없는 함수

>>> def add(a,b):

    print("%d , %d 의 합은 %d입니다." % (a,b, a + b))

>>> add(3,4)

결과값이 없는 함수의 사용법

함수이름(입력인수1, 입력인수2, ···)

 

결과값이 없는지 확인하기 위한 예:

>>> a = add(3,4)

>>> print(a)

add 함수처럼 결과값이 없을 때, 리턴값으로 a 변수에 None을 돌려 줌

 

4. 입력값도 결과값도 없는 함수

입력값과 결과값이 없는 함수의 예:

>>> def say():

           print('Hi')

 

>>> say()

입력값도 결과값도 없는 함수의 사용법

함수명()

 

=>매개변수 지정하여 호출하기

함수를 호출할 때 매개변수를 지정할 수 있음

>>> def add(a,b):

           return a+b

 

>>> result = add(a = 3, b = 7)

>>> result

매개변수를 지정하면 순서에 상관없이 사용할 수 있다는 장점이 있음

>>> result = add(b = 7, a = 3)

>>> result

 

def는 변수명으로 사용불가

예약어는 변수로 사용 불가한다.

결과값은 무조건 하나만 리턴한다.

함수에 전달하는 값을 인수라고 한다.

함수 쪽에 있는 것은 매개변수 변수에 저장이 되서 함수 내에서 사용한다.

함수를 호출 할 때 값을 전달 하는 것을 인수라고 한다.

=> 입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?

 

1. 여러 개의 입력값을 받는 함수 만들기

*args입력값 여러개 튜를로

>>> def add_many(*args):

    result = 0

    for i in args:

        result += i

    return result

*args처럼 매개변수 이름 앞에 *을 붙이면 입력값을 튜플로 만들어 주기 때문에 add_many 함수는 입력값이 몇 개이든 상관이 없음

*args는 임의로 정한 변수명임

여러 개의 입력값을 받는 함수 사용 예:

>>> result = add_many(1,2,3)

>>> result

>>> result = add_many(1,2,3,4,5,6,7,8,9,10) )#튜플이라는 자료형

>>> result

 

2. 다양한 종류의 매개변수를 받는 함수 만들기

>>> def add_mul(choice, *args):

    if choice == "add":

        result = 0

        for i in args:

            result += i

    elif choice == "mul":

        result = 1

        for i in args:

            result *= i

    return result

 

다양한 종류의 매개변수를 받는 함수 사용 예

>>> result = add_mul('add',1,2,3,4,5)

>>> result

>>> result = add_mul('mul',1,2,3,4,5)

>>> result

 

=>키워드 파라미터

키워드 파라미터를 사용할 때는 매개변수 앞에 별 두 개(**)를 붙임

dic **kwargs

>>> def print_kwargs(**kwargs):

    print(kwargs)

 

키워드 파라미터 사용 예:

>>> print_kwargs(a = 1)

>>> print_kwargs(name = 'foo', age = 3)

입력값이 모두 딕셔너리로 만들어져서 출력된다는 것을 확인할 수 있음

매개변수 이름 앞에 **을 붙이면 매개변수는 딕셔너리가 되고, 모든 key=value 형태의 결과값이 그 딕셔너리에 저장됨

 

=>함수의 결과값은 언제나 하나이다

2개의 매개변수를 받아 더한 값과 곱한 값을 돌려준다

>>> def add_and_mul(a,b):

    return a+b,a*b

 

>>> result = add_and_mul(3,4)

>>> result

 

결과값은 a+b a*b 2개인데 받아들이는 변수는 result 하나만 쓰였으니 오류가 발생하지 않을까? 의문을 가지나 오류는 발생하지 않음

그 이유는 함수의 결과값은 2개가 아니라 언제나 1개라는 데 있음

add_and_mul 함수의 결과값 a+b a*b는 튜플값 하나인 (a+b, a*b)로 돌려줌

따라서 result 변수는 다음과 같은 값을 갖게 됨

결과값으로 (7, 12)라는 튜플 값을 갖게 되는 것임

하나의 튜플 값을 2개의 결과값처럼 받고 싶다면 다음과 같이 함수를 호출하면 됨

>>> result1,result2 = add_and_mul(3,4)

>>> result1

>>> result2

아래와 같이 return문을 2번 사용하면, 2개의 결과값을 돌려주지 않을까?

>>> def add_and_mul(a,b):

    return a+b

    return a*b

 

>>> result = add_and_mul(2,3)

>>> result

두 번째 return문인 return a*b는 실행되지 않음

함수는 return문을 만나는 순간 결과값을 돌려준 다음 함수를 빠져나가게 됨

 

=> return의 또 다른 쓰임새

특별한 상황일 때 함수를 빠져나가고자 싶다면, return을 단독으로 써서 함수를 즉시 빠져 나갈 수 있음

>>> def say_nick(nick):

    if nick == "바보":

        return

    print("나의 별명은 %s입니다." % nick)

 

   

>>> say_nick('야호')

>>> say_nick('바보')

return으로 함수를 빠져나가는 방법은 실제 프로그래밍에서 자주 사용됨

 

=>매개변수에 초기값 미리 설정하기

>>> def say_myself(name,old, man = True):

    print("나의 이름은 %s 입니다." % name)

    print("나이는 %d살입니다." % old)

    if man:

        print("남자입니다.")

    else:

        print("여자입니다.")

 

위 함수는 매개변수가 name, old, man=True 이렇게 3개임

man=True처럼 매개변수에 미리 값을 넣어주는 것이 함수의 매개변수 초기값을 설정하는 방법임

함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우에는 함수의 초기값 을 미리 설정해 두면 유용함

매개변수에 초기값 설정하는 사용 예:

>>> say_myself("박응용",27)

>>> say_myself("박응용",27,True)

man이라는 변수에는 입력값을 주지 않았지만 초기값인 True를 갖게 됨

위의 예에서 함수를 사용한 2가지 방법은 모두 동일한 결과를 출력함

>>> say_myself("박응용", 27, False)

 

==> 함수의 매개변수에 초기값 설정할 때 주의사항

오류 메시지는 초기값을 설정해 놓은 매개변수 뒤에 초기값을 설정해 놓지 않은 매개변수는 사용할 수 없다는 뜻임

초기화시키고 싶은 매개변수는 항상 뒤쪽에 놓아야 함

 

=> 함수 안에서 선언한 변수의 효력 범위

함수 안에서 사용할 변수의 이름을 함수 밖에서도 동일하게 사용한다면 어떻게 될까?

함수내에 사용하는 것은 지역변수이다.

a = 1    #함수 밖의 변수 a

def vartest(a):     #vartest 함수 선언

    a += 1

vartest(a) #vartest 함수의 입력값으로 a를 줌

print(a)   # a의 값 출력 1

아래의 것은 오류입니다.

#vartest_error.py

 

del a

def vartest(a):

    a += 1

vartest(3)

print(a)# error

함수 안에서 선언된 변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않음

 

=>함수 안에서 함수 밖의 변수를 변경하는 방법

#vartest_return.py

a = 1

def vartest(a):

    a += 1

    return a

a = vartest(a)

print(a)#2

 

#vartest_global.py

#global 명령어 이용하기

a = 1

def vartest():

    global a

    a += 1

vartest()

print(a)#2

 

=>lambda

lambda(람다)는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할을 함

함수를 한 줄로 간결하게 만들 때 사용함

 def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰임

 

lambda 매개변수1, 매개변수2, … : 매개변수를 사용한 표현식

#lambda

add = lambda a,b:a+b

result = add(3,4)

print(result)

 

mul = lambda a,b:a*b

result = mul(3,4)

print(result)

 

sub = lambda a,b:a-b

result = sub(3,4)

print(result)

 

div = lambda a,b:a/b

result = div(3,4)

print(result)

return문이 없다. 자동으로 받는다.

lambda는 함수를 생성할 때 사용하는 예약어로, def와 동일한 역할을 합니다.

이는 def를 사용해야 할 정도로 복잡하지 않거나 def

사용할 수 없는 곳(런타임 또는 익명으로 생성해야 하는 경우)에 주로 쓰입니다.

 

#주어진 자연수가 홀수인지 짝수인지 판별해 주는 함수

def is_odd(number):

    if number%2 != 0:#홀수

        return True

    else:

        return False

 

print(is_odd(1))

print(is_odd(2))

 

is_odd = lambda number:'홀수' if number % 2 != 0 else '짝수'

print(is_odd(1))

print(is_odd(2))

 

 

#입력으로 들어오는 모든 수의 평균값을 계산해 주는 함수를 작성해보자.

def avg_numbers(*args):

    result = 0

    for i in args:

       result += i

    return result/len(args)

 

print(avg_numbers(1,2))

print(avg_numbers(1,2,3,4,5))

 

 

print(avg_numbers(1,2))

print(avg_numbers(1,2,3,4,5))

 

#다음은 두 개의 숫자를 입력받아 더하여 돌려주는 프로그램이다.

input1 = int(input("첫번째 숫자를 입력하세요."))

input2 = int(input("두번째 숫자를 입력하세요."))

 

total = input1+input2

print("두개의 합은 %s 입니다." % total)

 

#4.

print("you" "need" "python")

print("you"+"need"+"python")

print("you","need","python")#결과가 다르다.

print("".join(["you","need","python"]))

 

 

 

 

#파일 생성하기

f = open("새파일.txt", 'w')

f.close()

 

#r 읽기 모드 - 파일을 읽기만 할 때 사용

#w 쓰기 모드 - 파일에 내용을 쓸 때 사용

#a 추가 모드 - 파일의 마지막에 새로운 내용을 추가할 때 사용

 

f = open("C:\doit\새파일.txt", 'w')

f.close()

 

f = open("새파일.txt",'w')

for i in range(1,11):

    data = "%d번째 줄입니다.\n" % i

    f.write(data)

f.close()

 

f = open("새파일.txt","r")

line = f.readline()

print(line)

f.close()

 

f = open("새파일.txt","r")

while True:

   

    line = f.readline()

    if not line:break

    print(line)

f.close()

 

#사용자 입력을 받아서 출력하는 경우와 파일을 읽어서 출력하는 예제를 비교

f = open("새파일1.txt","w")

while 1:

    data = input()

    if not data:break

    print(data)

f.close()

 

#read.py

# readlines() 함수 이용하기

f = open("새파일.txt",'r')

lines = f.readlines()

for line in lines:

    print(line)

f.close()

 

 

#파일 읽고 쓰기

f= open("새파일.txt",'r')

data = f.read()

print(data)

f.close()

 

#adddata

f= open("새파일.txt",'a')

for i in range(11,20):

    data = "%d번때 줄입니다.\n" % i

    f.write(data)

f.close()

 

f= open("foo.txt",'w')

f.write("Life is too short,you need pyhon"_

f.close()

 

with open("foo.txt",'w') as f:

    f.write("Life is too sort, you need python")

 

sys 모듈로 매개변수 주기

명령 프롬프트 명령어 [인수1  인수2  …]

 

#sys1.py

import sys

args = sys.argv[1:]

for i in args:

    print(i)

 C:\doit>python  sys1.py  aaa bbb ccc aaa bbb ccc

 

#7

#파일명 하드코딩하는 방법

f= open('test.txt','r')

body = f.read()

print(body)

f.close()

 

body = body.replace("java","python")

 

f = open('test1.txt','w')

f.write(body)

f.close()

 

#6

user_input = input("저장할 내용을 입력하세요")

f= open('test.text','a')

f.write(usesr_input)

f.write("\n")

f.close()

 

#readline02

#파일명 입력받는 방법#readline02.py

fname = input("파일명을 입력하세요.")

 

f= open("c:\doIt\%s" % fname,'r')

body = f.read()

print(body)

f.close()

 

#파일명 매개변수로 입력받는 방법 readline03.py

#sys 명령프롬프트

 

import sys

 

def fileOpen(i):

    f= open("c:\doIt\%s" % i,'r')

    body = f.read()

    print(body)

    f.close()

   

args = sys.argv[1:]

for i in args:

    f= open("c:\doIt\%s" % i,'r')

    body = f.read()

    print(body)

    f.close()

   

import re

operList = ('+','-','*','/')

def cal(oper, var1, var2):

    #for oper1 in operList:

    #    if oper == operList[0]:

    #        return var1 + var2

    #    elif oper == operList[1]:

    #        return var1 - var2

    #    elif oper == operList[2]:

    #        return var1 * var2

    #    elif oper == operList[3]:

    if oper == "+":

        return var1 + var2

    elif oper == "-":

        return var1 - var2

    elif oper == "*":

        return var1 * var2

    elif oper == "/":

        return var1 / var2

 

    #한줄로 리턴

    return eval(str(var1)+oper+str(var2))

   

#에러메시지  

def errMes(var):

    print('숫자만 입력 가능합니다.'.format(var))

 

#계산 구분 입력 안할 경우 종료

#% 0으로 할경우 종료

while True:

 

    #1.계산 구분 판단

    oper2= ""

    while True:

        oper= input("계산 구분을 입력하세요")

       

        if oper not in operList:

            print("정확한 계산 구분을 입력하여주세요.")

            continue

        else:

            break

           

 

    #숫자입력

    var1 = 0

    while True:

        try:           

            var1= int(input("첫 번째 수를 입력하세요. : "))

        except ValueError :  # 에러 종류

            errMes(var1)

            continue

        break

    var2 = 0  

    while True:

        try:

            var2= int(input("두 번째 수를 입력하세요. : "))

            if oper=="/" and var2== 0:

                print("두번째 수를 확인하여 주십시요. : ")

                continue

            else:

                break

        except ValueError :  # 에러 종류

            errMes(var2)

            continue

        break

   

    result= cal(oper, var1, var2);

    print("계산기 : %d %s %d = %d" % (var1,oper,var2,result))

 

    result = input("enter 눌릴 겨우 종료됩니다.")

 

    if result == '':

        print("계산기 종료합니다.")

        break

    else:

        print("계산기 진행됩니다.")

 

a.isnumeric()

 

반응형

'Study > Python' 카테고리의 다른 글

python-6  (0) 2020.09.10
python-5  (0) 2020.09.09
python-3  (0) 2020.09.08
python-2  (0) 2020.09.07
python-1  (0) 2020.09.06
반응형

 

Python IDLE사용

3. 프로그램 구조, 제어문

I. if

“돈이 있으면 택시를 타고, 돈이 없으면 걸어 간다.”

주어진 조건을 판단하여 해당 조건에 맞는 상황을 수행하는데 if문이 쓰임

>>> money = 1

>>> if money:

           print("택시를 타고 가라")

else:

           print("걸어 가라")

 

=>if문의 기본 구조

if 조건문 뒤에는 반드시 콜론(:)이 붙임

조건문을 테스트해서 참이면 if문 바로 다음의 문장(if 블록)들을 수행하고, 조건문이 거짓이면 else문 다음 문장(else 블록)들을 수행하게 됨

블록은 들여쓰기로 해결함 (다른 언어는 { }로 기호 사용) 

else문은 if문 없이 독립적으로 사용할 수 없음

 

=>들여쓰기

if 조건문:

수행할 문장1

수행할 문장2

수행할 문장3

들여쓰기는 공백(Spacebar) 4개나 탭(Tab)을 사용하며, 2가지를 혼용하지 말 것

>>> money = 1

>>> if money:

           print("택시콜")

print("타고")

>>> money = 1

>>> if money:

           print("택시콜")

           print("타고")

                       print("가자")

 

=>조건문이란 무엇인가?

if 조건문에서조건문이란 참과 거짓을 판단하는 문장을 말함

>>> money = 1

>>> if money:

money 1이기 때문에 참이 되어 if문 다음의 문장을 수행함

 

=>비교연산자

조건문에 비교연산자(<, >, ==, !=, >=, <=)를 쓰는 경우가 많음

>>> x= 3

>>> y =2

>>> x>y

>>> x<y

>>> x == y

>>> x != y

만약 3000원 이상의 돈을 가지고 있으면 택시를 타고 그렇지 않으면 걸어 가라.

>>> money = 2000

>>> if money >= 3000:

           print("택시를 타고 가라")

else:

           print("걸어 가라")

 

=> and, or, not

조건을 판단하기 위해 사용하는 연산자로는 and, or, not이 있

and, or, not 조건을 판단하기 위해 사용하는 연산자로는 and, or, not이 있음->논리 연산자

==> or 연산자의 사용법을 알아봄

돈이 3000원 이상 있거나 카드가 있으면 택시를 타고 그렇지 않으면 걸어 가라.

>>> money = 2000

>>> card = 1

>>> if money >= 3000 or card:

           print("택시를 타고 가라")

else:

           print("걸어 가라")

>>> money = 2000

>>> card = 1

>>> if money >= 3000 and card:

           print("택시를 타고 가라")

else:

           print("걸어 가라")

>>> money = 2000

>>> if money >= 3000:

           print("택시를 타고 가라")

else:

           print("걸어 가라")

money = 2000

if money >= 3000:

    print("택시를 타고 가라")

=>x in s, x not in s

다른 프로그래밍 언어에서 볼 수 없는 조건문들을 제공함

in의 뜻이 ‘~안에라는 것을 생각하면 쉽게 이해될 것임

>>> 1 in [1,2,3]

>>> 1 not in [1,2,3]

 

튜플과 문자열에 적용한 예

>>> 'a' in ('a','b','c')

>>> 'j' not in 'python'

 

=>택시 예제에 in을 적용

만약 주머니에 돈이 있으면 택시를 타고, 없으면 걸어가라.

>>> pocket =['paper','cellphone','money']

>>> if 'money' in pocket:

           print("택시를 타고 가라")

else:

           print("걸어 가라")

 

=>조건문에서 아무 일도 하지 않게 설정하고 싶다면?

주머니에 돈이 있으면 가만히 있고 주머니에 돈이 없으면 카드를 꺼내라.

>>> pocket =['paper','cellphone','money']

>>> if 'money' in pocket:

           pass

else:

           print("카드를 꺼내라")

pocket이라는 리스트 안에 money라는 문자열이 있기 때문에 if문 다음 문장 인 pass가 수행되고 아무런 결과값도 보여 주지 않음

#125페이지

#주머니에 카드가 없다면 걸어가로 , 있다면 버스 타라

>>> pocket = ['paper','cellphone','money']

>>> if 'card' in pocket:

           print("버스 타고 가라")

else:

           print("걸어 가라")

 

=> 다양한 조건을 판단하는 elif

주머니에 돈이 있으면 택시를 타고, 주머니에 돈이 없지만 카드가 있으면 택시를 타고, 돈도 없고 카드도 없으면 걸어 가라.

if else만으로 표현

>>> pocket = ['paper', 'cellphone']

>>> card = 1

>>> if 'money' in pocket:

           print("택시를 타고 가라")

else:

           if card:

                       print("택시를 타고 가라")

           else:

                       print("걸어 가라")

 

복잡함을 해결하기 위해 다중 조건 판단을 가능하게 하는 elif 사용

>>> pocket = ['paper', 'cellphone']

>>> card = True #혹은 1

>>> if 'money' in pocket:

           print("택시를 타고 가라")

elif card:

           print("택시를 타고 가라")

else:

           print("걸어 가라")

 

elif는 이전 조건문이 거짓일 때 수행됨

elif는 개수에 제한 없이 사용할 수 있음

=> if, elif, else를 모두 사용할 때의 기본 구조

=> if문을 한 줄로 작성하기

>>> pocket = ['paper', 'money', 'cellphone']

>>> if 'money' in pocket:

           pass

else:

           print("카드를 꺼내라")

수행할 문장이 한 줄일 때 조금 더 간략하게 코드를 작성하는 방법이 있음

 

>>> pocket = ['paper', 'money', 'cellphone']

>>> if 'money' in pocket:pass

else:print("카드를 꺼내라")

if문 다음 수행할 문장을 콜론(:) 뒤에 적어 주었고, else문도 마찬가지임

 

=> 조건부 표현식

>>> score = 70

>>> if score >= 60:

    message = "success"

else:

    message = "failure"

 

   

>>> message

 

조건부 표현식(conditional expression)을 사용하면 간단히 표현할 수 있음

>>> score = 70

>>> message = "success" if score >= 60 else "failure"

>>> message

 

조건부 표현식 정의

조건문이 참인 경우 if 조건문 else 조건문이 거짓인 경우

가독성에 유리하고 한 줄로 작성할 수 있어 활용성이 좋음

 

=>응용예제01. 학점 세분화 프로그램"

점수를 입력받은 후 90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D,나머지는 F 로 처리하는 프로그램을 구현해 보자

score = int(input("점수를 입력하세요:"))

if score >= 90:

    grade = "A"

elif score >= 80:

    grade = "B"

elif score >= 70:

    score = "C"

elif score >= 60:

    grade = "D"

else:

    grade = "F"

print(f'{score} {grade}학점입니다.')

=>while로 변경하기 ->계속 이력 가능

while True:

    score = int(input("점수를 입력하세요:"))

    if score >= 90:

        grade = "A"

    elif score >= 80:

        grade = "B"

    elif score >= 70:

        score = "C"

    elif score >= 60:

        grade = "D"

    else:

        grade = "F"

        if score == 0:

            break

    print(f'{score} {grade}학점입니다.')

=>while로 변경하되 주석 print방식을 3가지로 확인하기

while True:

    score = int(input("점수를 입력하세요:"))

    if score >= 90:

        grade = "A"

    elif score >= 80:

        grade = "B"

    elif score >= 70:

        score = "C"

    elif score >= 60:

        grade = "D"

    else:

        grade = "F"

        if score == 0:

            break

    print("%d점은 %c학점입니다." % (score,grade))

    print(f'{score} {grade}학점입니다.')

    print("{0}점은 {1}학점입니다.".format(score,grade))

 

II. while

while문의 기본 구조

반복해서 문장을 수행해야 할 경우 while문을 사용함

while문의 기본구조

while문은 조건문이 참인 동안에 while문 아래에 속하는 문장들이 반복해서 수행됨

: ‘열 번 찍어 안 넘어가는 나무 없다는 속담을 while문으로 만든 예

>>> treeHit = 0

>>> while treeHit < 10:

           treeHit += 1

           print("나무를 %d번 찍었습니다." % treeHit)

           if treeHit == 10:

                       print("나무 넘어갑니다.")

 

=> while문이 반복되는 과정을 순서대로 정리한 표

 

 

: treeHit 1일 경우 10번까지 찍기

방안 1:

>>> treeHit = 1

>>> while treeHit <11:

    print("나무를 %d번 찍었습니다." % treeHit)

    treeHit += 1

    if treeHit == 11:

        print("나무 넘어갑니다.")

방안 2:

>>> treeHit = 1

>>> while treeHit < 11:

    print("나무를 %d번 찍었습니다." % treeHit)

    if treeHit == 10:

        print("나무 넘어갑니다.")

    treeHit += 1

방안 2가 더 좋다. 마지막에 값을 추가하는 게 메모리 측면에서 더 좋다.

 

=>while문 만들기

여러 가지 선택지 중 하나를 선택해서 입력 받는 예제

여러 줄의 문자열을 변수에 대입하기 위해 큰따옴표 3(“””)를 이용함

>>> prompt = """

1. Add

2. Del

3. 3.List

4. Quit

Enter number: """

>>> number = 0

>>> while number != 4:

    print(prompt)

    number = int(input())

 

# 결과 화면처럼 사용자가 4라는 값을 입력하지 않으면 계속해서 prompt를 출력함

1. Add

2. Del

3. 3.List

4. Quit

Enter number:

4

 

=> while문 강제로 빠져나가기 (break)

while문은 조건문이 참인 동안 계속해서 while문 안의 내용을 반복적으로 수행하지만 강제로 while문을 빠져나가고 싶을 때 사용하는 것이 break문임

커피 자판기 이야기를 break문으로 만든 예:

>>> coffee = 10

>>> money = 300

>>> while money:

    print("돈을 받았으니 커피를 줍니다.")

    coffee = coffee -1

    print("남의 커피의 양은 %d개입니다."  % coffee)

    if coffee == 0:

        print("커피가 다 떨어졌습니다. 판매를 중지합니다.")

        break

 

=>실제 자판기 작동 과정을 만든 예

coffee = 10

while True:

    money = int(input("돈을 넣어 주세요:"))

    if money == 300:

        print("커피를 줍니다.")

        coffee -= 1

    elif money > 300:

        print("거스름돈 %d를 주고 커피를 줍니다."  % (money - 300))

        coffee -= 1

    else:

        print("돈을 다시 돌려주고 커피를 주지 않습니다.")

        print("남은 커피의 양은 %d개입니다." % coffee)

 

    if coffee == 0:

        print("커피가 다 떨어졌습니다. 판매를 중지합니다.")

        break

=>개선 버전

# PPT_3.2_while_coffee.py

coffee = 10

while True:

    #money,cnt = input("돈과 개수를 넣어 주세요:").split()

    money = int(input("돈을 넣어 주세요:"))

    if money == 300:

        print("커피를 줍니다.")

        coffee -= 1

    elif money > 300:

        #print(money%300)

        #print(money//300)

        maxCnt = money//300

        if maxCnt > coffee:

            maxCnt = coffee

        if maxCnt > 1:

            cnt = int(input(f'%d잔 이하 가능합니다.몇잔 하시겠습니까?' % maxCnt))

        else:

            cnt = maxCnt

        print("거스롬돈 %d를 주고 커피를 줍니다." % (money - 300*cnt ))

        coffee -= cnt

           

    else:

        print("돈을 다시 돌려주고 커피를 주지 않습니다.")

        print("남은 커피의 양은 %d개입니다." % coffee)

 

    if coffee == 0:

        print("커피가 다 떨어졌습니다. 판매를 중지합니다.")

        break   

PPT_3.2_while_coffee.py을 저장한 후 프로그램을 직접 실행 함

입력란에 여러 숫자를 입력해 보면서 결과를 확인함

 

 

논리연산자

dict

 

if -> message = "success" if score >= 60 else "failure"

 

message = "A" if score >= 60 "B" elif score >= 50 else "failure"#SyntaxError: invalid syntax

#실행문이 한줄일 경우 조건문 표현식 오류

 

while

조건문이 안 맞을때 빠져나갈수 있지만

break도 가능하다.

continue는 만나면 처음으로 시작한다. 다음의 것 실행안한다.

 

while 1->참이기 때문에

 

=>while문의 맨 처음으로 돌아가기 (continue)

while문을 빠져나가지 않고, while문의 맨 처음(조건문)으로 다시 돌아가게 만들고 싶을 때 사용하는 것이 continue문임

>>> a = 0

>>> while a < 10:

           a += 1

           if a % 2 == 0:continue

           print(a)

a가 짝수이면 continue 문장을 수행하고, while문의 맨 처음으로 돌아감

교재 136페이지

1부터 10까지의 숫자 중에서 3의 배수를 뺀 나머지 값을 출력해 보자

 

 

=>무한 루프

무한 루프(Loop)란 무한히 반복한다는 의미임

while문의 조건문이 True이면 항상 참이므로, while문 안에 있는 문장들은 무한하게 수행됨

무한 루프의 예:

>>> while True:

           print("CTRL+C를 눌러야 while문을 빠져나갈 수 있습니다.")

 

응용예제01. 로그인 프로그램:

아이디와 패스워드를 입력하였을 때, 등록된 정보와 비교하여 로그인을 승인하는 프로그램을 구현해 보자.

응용예제:

myId = "python"

myPsswd = "1234"

count = 0

 

while True:

    #usrId = input("아이디를 입력하세요.")

    #usrPwd = input("패스워드를 입력하세요.")

    if count >= 5 :

        print("시도 횟수 초과하였습니다.")

        break

    userId, userPwd = input("아이디와 패스워드를 ,로 구분하여 입력하세요").split()

   

    if userId == myId and myPsswd == userPwd:

        print("정상적으로 로그인에 성공했습니다.")

        break

    elif userId != myId and myPsswd == userPwd:

        print("아이디가 틀렸습니다.\n")

    elif userId == myId and myPsswd != userPwd:

        print("패스워드가 틀렸습니다.\n")

    else:

        print("아이디와 패스워드가 틀렸습니다.\n")

    count+=1 #최대한 공간을 줄이기 위해서 마지막에 연다.

2. 별 모양 출력하기

사용자가 숫자를 여러 개 입력하면 별 모양(‘\u2605)을 입력한 숫자만큼 출력하는 프로그램이다.

 

실습

i = 0

while True:

    i += 1

    if i>5:break

    print("\u2605"*i+"\n")

 

#for

#1.

input1 = input("1.숫자를 여러 개 입력하세요 :")

for i in input1:

    print("\u2605"*int(i))

print("="*50)

 

#while

#2.

cnt = 0

input1 = input("2.숫자를 여러 개 입력하세요 :")

while cnt < len(input1):

    print("\u2605"*int(input1[cnt]))

    cnt+=1

print("="*50)

 

#3.

cnt = 0

input1 = input("3.숫자를 여러 개 입력하세요 :")

while input1[cnt:]:

    print("\u2605"*int(input1[cnt]))

    cnt+=1

print("="*50)

 

 

 

 

 

 

#4.

cnt = 0

input1 = input("4.숫자를 여러 개 입력하세요 :")

while input1[cnt]:

    print("\u2605"*int(input1[cnt]))

    cnt+=1

    if len(input1) == cnt:

        break

print("="*50)

 

#5.

input1 = input("5.숫자를 여러 개 입력하세요 :")

for i in range(len(input1)):

    print("\u2605"*int(input1[i]))

print("="*50)

 

#6.

#list내포는 result리스트로 만든다.

input1 = input("6.숫자를 여러 개 입력하세요 :")

result =["\u2605"*int(n) for n in input1]

print(result)

 

III. for

for문의 기본 구조

리스트나 튜플, 문자열의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 수행할 문장들이 수행됨

#변수를 i,j,k를 많이 사용

1. 전형적인 for

>>> test_list = ['one','two','three'] #list 형 자료형

>>> for i in test_list:

    print(i)

 

2. 다양한 for문의 사용

>>> a = [(1,2),(3,4),(5,6)]

>>> for (first,last) in a:

    print(first+last)

 

3. for문의 응용

5명의 학생이 시험을 보았는데 시험 점수가 60점이 넘으면 합격이고 그렇지 않으면 불합격이다. 합격인지 불합격인지 결과를 보여주시오.

우선 학생 5명의 시험 점수를 리스트로 표현함

>>> marks = [90, 25, 67, 45, 80]

 

#marks1.py

marks = [90, 25, 67, 45, 80]

number = 0

for mark in marks:

    number += 1

    if mark >= 60:

        print("%d번 학생은 합격입니다." % number)

    else:

        print("%d번 학생은 불합격입니다." % number)

점수 출력 및 소수점 처리

marks = [95,25,67,45,80]

number = 0

for mark in marks:

    number = number +1

    if mark >= 60:

        print("%d번 학생은 %.2f이여서 합격입니다." % (number,mark))

    else:

        print("%d번 학생은 %.2f이여서 불합격입니다." % (number,mark))

 

=> for문과 continue

for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아감

#marks2.py

marks = [90, 25, 67, 45, 80]

number = 0

for mark in marks:

    number += 1

    if mark < 60 : continue

    print("%d번 학생 축하합니다. 합격입니다." % number)

 

=>for와 함께 자주 사용하는 range함수

>>> a = range(10)

>>> a   <--0, 1, 2, 3, 4, 5, 6, 7, 8, 9

>>> a = range(1,11)

>>> a   <--1, 2, 3, 4, 5, 6, 7, 8, 9, 10

시작 숫자와 끝 숫자를 지정하려면 range(시작 숫자, 끝 숫자) 형태를 사용하는데, 이때 끝 숫자는 포함되지 않음

 

==>range 함수의 예시 살펴보기

for range 함수를 이용하여 1부터 10까지 더하는 것을 구현함

 

>>> add = 0

>>> for i in range(1,11):

    add += i

 

   

>>> add

 

#marks3.py

marks = [90, 25, 67, 45, 80]

for number in range(len(marks)):

    if marks[number] < 60:continue

    print("%d번 학생 축하합니다. 합격입니다. " % (number + 1))

 

 

 

==> for range를 사용한 구구단

>>> for i in range(2,10):

    for j in range(1,10):

        print(i * j , end = " ")

    print('')

 

for i in range(1,10):

    for j in range(1,10):

        print(i*j, end=" ")#출력할 때 다음 줄로 넘기지 않고 그 줄에 계속 출력함

    print(' ')

 

==>실제 수자로 보고싶다.

>>> a= list(range(len(marks)))

>>> a

 

=> 리스트 내포 사용하기

리스트 안에 for문을 포함하는 리스트 내포(List comprehension)를 사용하면 편리함

>>> a = [1,2,3,4]

>>> result=[]

>>> for num in a:

    result.append(num*3)

 

>>> result

리스트 내포를 사용하면 간단히 해결할 수 있음

>>> a = [1, 2, 3, 4]

>>> result = [num * 3 for num in a]

>>> result

>>> [num * 3 for num in a]  ->거짓이면 대입자체가 안되서

 

=> 짝수에만 3을 곱하여 담고 싶다면 리스트 내포 안에 ‘if 조건을 사용함

>>> a = [1,2,3,4]

>>> result = [num * 3 for num in a if num % 2 ==0]

>>> result

 

***리스트 내포의 일반적인 문법

[표현식 for 항목 in 반복 가능 객체 if 조건]

***for문을 여러 개 사용할 때의 문법

 

=> 구구단의 모든 결과를 리스트에 담고 싶다면 리스트 내포를 사용하여 구현함

>>> result = [x*y for x in range(2,10)

                     for y in range(1,10)]

>>> result

 

>>> result = [x*y*z for x in range(2,10)

                for y in range(1,10)

                for z in range(1,10)]

>>> result

 

==>for문을 사용해 1부터 100까지 출력하기

>>> for i in range(100):

    print(i+1,end=" ")

 

==>while문으로 바꾸기

>>> i = 0

>>> while i < 100:

    i+=1

    print(i,end=" ")

 

==>평균점수 구하기

방안 1:

>>> scores = [70,60,55,75,95,90,80,80,85,100]

>>> total = 0

>>> for score in scores:

               total += score

 

              

>>> total/ len(scores)

 

방안 2:

>>> scores = [70,60,55,75,95,90,80,80,85,100]

>>> total = 0

>>> for i in range(len(scores)):

               total += scores[i]

 

              

>>> total/ len(scores)

 

>>> numbers = [1,2,3,4,5]

>>> result = []

>>> for n in numbers:

    if n%2 != 0 :

        result.append(n*2)

 

       

>>> result

 

>>> numbers = [1,2,3,4,5]

>>> result = []

>>> result = [num* 2 for num in numbers if num%2 != 0]

>>> result

 

treeHit=0

for i in range(10):

    treeHit =  i+1

    print("나무를 %d를 찍었습니다" % treeHit)

print("나무 넘어갑니다.")

 

>>> a = [(1,2),(3,4),(5,6)]

>>> for(first,last) in a:

    print(first+last)

 

연습문제 146페이지

1.

>>> a = "Life is too short, you need python"

>>> if "wife" in a: print("wife")

elif "python" in a and "you" not in a: print("python")

elif "shirt" in a: print("shirt")

elif "need" in a: print("need")

else: print("none")

 

2.

>>> result = 0

>>> i = 1

>>> while i <= 1000:

    if i % 3 == 0:

        result += i

    i += 1

 

   

>>> result

 

3.

>>> i = 0

>>> while True:

    i+= 1

    if i > 5 :break

    print("*" * i)

 

4.

>>> for i in range(1,101):

    print(i)

 

5.

A= [70,60,55,75,95,90,80,85,85,100]

total = 0

for score in A:

    total += score

average = total/len(A)

print(average)

 

6.

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

result = []

for n in numbers:

    if n % 2 == 1:

        result.append(n*2)

   

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

result = [n*2 for n in numbers if n % 2 == 1]

print(result)

반응형

'Study > Python' 카테고리의 다른 글

python-6  (0) 2020.09.10
python-5  (0) 2020.09.09
python-4  (0) 2020.09.08
python-2  (0) 2020.09.07
python-1  (0) 2020.09.06
반응형

 

Python IDLE사용

 

2. 프로그래밍의 기초, 자료형

I. 숫자형(numeric)

II. 문자열(string) 자료형

=> 문자열은 1차열 배열이다.

III. 리스트(list) 자료형

=> Python에서 리스트는 숫자나 문자를 모아 놓은 것이다. 수정이 가능하다.

=> R에서 리스트는 2차원 배열이다.

IV. 튜플(tuple) 자료형

=> 튜플은 리스트하고 형태 같은데 수정이 불가하다.

V. 딕셔너리(dictionary) 자료형

=> 딕셔너리는 사전으로 생각하면 된다. key value

VI. 집합(set) 자료형

=> 집합은 특징은 중복이 되면 안되고 순서가 없다. 합집합 교집합 차집합 구할 경우

VII. (bool) 자료형

=> while문에서 자주 사용  참이나 거짓 이나 이런 것 등

VIII.자료형의 값을 저장하는 공간, 변수

=>자료형의 값을 저장하는 공간, 변수 변수를 대입하게 되면 메모리에 저장하게 된다.

 

I. 숫자형

**숫자형(Numeric)이란 숫자 형태로 이루어진 자료형

=>정수형(Integer)이란 정수를 뜻하는 자료형을 말함

>>> a = 123

>>> a = -178

>>> a = 0

=>실수형(Floating-point)은 소수점이 포함된 숫자를 말함

>>> a = 1.2

>>> a = -3.45

 

실수형의 소수점 표현 방식

>>> a = 4.24E10

>>> a = 4.24e-10#뛰여쓰기 없어야 함 아님 오류

컴퓨터식 지수 표현 방식

e E 둘 중 어느 것을 사용해도 무방함

3.4e10->지수를 표현한다.

10 10승등으로 이해하기 어려워서 e를 사용했다

 

=>8진수와 16진수

>>> a = 0o177

8진수(Octal)를 만들기 위해서는 숫자가 0o 또는 0O로 시작함

>>> 0o34 #8진수 34

 

>>> b = 0x5ff

>>> b = 0xABC

>>> 0x2A #16진수

16진수(Hexadecimal)를 만들기 위해서는 0x로 시작함

 

=> 숫자형을 활용하기 위한 연산자

==> 사칙연산(+, -, *, /)

>>> a = 3

>>> b = 4

>>> a + b

>>> a - b

>>> a * b

>>> a / b

==> 대입연산(+=, -=, *=, /=)

>>> a += 1

print(a)

 

=> x y제곱을 나타내는 연산자

>>> a = 3

>>> b = 4

>>> a ** b

=>나눗셈 후 나머지를 반환하는 % 연산자

아래 두 개는 페이지 처리 시 사용한다.

%는 나머지

//은 몫

>>> 7 % 3 #1

>>> 3 % 7 #3

나눗셈 후 몫을 반환하는 // 연산자

>>> 7 // 3

>>> 7 // 4

>>> 7/4  #1.75

 

II. 문자열 자료형

문자열(String)이란 문자, 단어 등으로 구성된 문자들의 집합을 의미

=>문자열 자료형 만드는 4가지 방법

1. 큰따옴표(“)로 양쪽 둘러싸기

>>> "Hello World"

2. 작은따옴표(‘)로 양쪽 둘러싸기

>>> 'python is fun'

3. 큰따옴표 3개를 연속(“””)으로 써서 양쪽 둘러싸기

>>> """Life is too short,You need python"""

4. 작은따옴표 3개를 연속(‘’’)으로 써서 양쪽 둘러싸기

>>> '''Life is too short, You need python'''

=>문자열에 따옴표 포함시키기

1. 문자열에 작은따옴표(‘) 포함시키기

>>> food = "Python's favorite food is perl"

>>> food

큰따옴표(“)가 아닌 작은따옴표(‘)로 문자열을 둘러싼 후 다시 실행함

‘Python’이 문자열로 인식되어 구문 오류(Syntax Error)가 발생함

>>> food = 'Python's favorite food is perl'#오류

2. 문자열에 큰따옴표(“) 포함시키기

>>> say = '"Python is very easy." he says.'

>>> say

3. 백슬래시(\)를 이용해서 작은따옴표(‘)와 큰따옴표(“)를 문자열에 포함시키기

백슬래시(\)를 작은따옴표(‘)나 큰따옴표(“) 앞에 삽입하면 백슬래시(\) 뒤의 작은따옴표(‘)나 큰따옴표(“)는 문자열을 둘러싸는 기호의 의미가 아니라 (‘), (“) 그 자체를 의미함

>>> food = 'Python\'s favorite food is perl'

>>> say = "\"Python is very easy.\" he says."

=> 여러 줄인 문자열을 변수에 대입하고 싶을 때

1. 줄을 바꾸는 이스케이프 코드 ‘\n’ 삽입하기

>>> multiline = "Life is too short\nYou need python"

>>> multiline

[이스케이프 코드]

프로그래밍할 때 사용할 수 있도록 미리 정의해 둔문자 조합이며, 출력물을 보기 좋게 정렬해 줌

코드

설명

\n

문자열 안에서 줄을 바꿀 때 사용

\t

문자열 사이에 탭 간격을 줄 때 사용

\\

문자 \를 그대로 표현할 때 사용

\’

작은따옴표(‘)를 그대로 표현할 때 사용

\”

큰따옴표(“)를 그대로 표현할 때 사용

\r

캐리지 리턴(줄 바꿈 문자,현재 커서를 다음 줄로 이동)

\a

벨 소리(출력할 때 pc 스피커에서 '' 소리가 난다)

\b

백스페이스

\000

널 문자

 

2. 연속된 작은따옴표 3(‘’’) 또는 큰따옴표 3(“””) 이용

>>> multiline = """

Life is too short

You need python

"""

multiline

=> 문자열 연산하기

1. 문자열 더해서 연결하기

>>> head = "Python"

>>> tail = " is fun!"

>>> head + tail

2. 문자열 곱하기

>>> a = "python"

>>> a*2

3. 문자열 곱하기 응용

#multistring.py

>>> print("="* 50)

>>> print("My Program")

>>> print("=" * 50)

4. 문자열 길이 구하기

>>> a = "Life is too short"

>>> len(a)

=> 문자열 인덱싱과 슬라이싱

인덱싱(Indexing)이란 무엇인가를 가리킨다는 의미이고, 슬라이싱(Slicing)은 무엇인가를 잘라낸다는 의미임

==> 문자열 인덱싱이란?

***파이썬은 0부터 숫자를 셈

>>> a = "Life is too short, You need Python"

>>> a[3]

>>> a[0]

>>> a[12]

*** a[-1]은 문자열을 뒤에서부터 읽기 위해서 마이너스(-)를 붙임

>>> a[-1]

*** a[-0] a[0]과 똑같은 값을 보여줌

>>> a[-0]  #0 0은 같다.

>>> a[-2]

>>> a[-5]

==>문자열 슬라이싱이란?

>>> a = "Life is too short, You need Python"

>>> b = a[0] + a[1] + a[2] + a[3]

>>> b

>>> a[0:4]

a[:]

a[시작 번호:끝 번호]에서 시작 번호와 끝 번호를 생략하면 처음부터 끝까지 뽑아냄

0 <= a < 4

==> 문자열을 슬라이싱하는 방법

>>> a[0:5]

>>> a[0:4]

>>> a[0:5]

>>> a[0:2]

>>> a[5:7]

>>> a[12:17]

>>> a[19:]

a[시작 번호:끝 번호]에서 끝 번호 부분을 생략하면 시작 번호부터 그 문자열의 끝까지 뽑아냄

>>> a[:17]

a[시작 번호:끝 번호]에서 시작 번호 부분을 생략하면 처음부터 끝 번호까지 뽑아냄

>>> a[:]

a[시작 번호:끝 번호]에서 시작 번호와 끝 번호를 생략하면 처음부터 끝까지 뽑아냄

a[19:-7]

a[-7]은 포함하지 않음

=> 슬라이싱으로 문자열 나누기

>>> a = "20010331Rainy"

>>> date = a[:8]

>>> weather = a[8:]

>>> date

>>> weather

>>> year = a[:4]

>>> day = a[4:8]

>>> year

>>> day

=> 문자열 바꾸기

>>> a = "Pithon"

>>> a[1]

>>> a[1] = 'y'

>>> a = 'Pithon'

>>> a[:1]

>>> a[2:]

>>> a[:1]+'y' +a[2:]

=> 문자열 포매팅

==> 문자열 포매팅 따라하기

1. 숫자 바로 대입

>>> "I eat %d apples." % 3

 

2. 문자열 바로 대입

>>> "I eat %s apples." % "five"

3. 숫자 값을 나타내는 변수로 대입

>>> number = 3

>>> "I eat %d apples." % number

 

4. 2개 이상의 값 넣기

변수를 대입한다.

>>> number = 10

>>> day = "three"

>>> "I ate %d apples. so I was sick for %s days." % (number,day)

포맷한다 .대입한다.

 

숫자 %d

 

마지막 % 다음 괄호 안에 콤마(,)로 구분하여 각각의 값을 넣어 주면 됨

 

==>문자열 포맷 코드

코드

내용

%s

문자열(String)

%c

문자 1(Character)

%d

정수(Integer)

%f

부동 소수(Floating-point)

%o

8진수

%x

16진수

%%

Literal %(문자 ‘%’ 자체)

%s 포맷 코드는 어떤 형태의 값이든 변환해서 넣을 수 있음

>>> "I eat %s apples." % 3

>>> "rate is %s" % 3.234

문자 %s

==> 포맷팅 연산자 %d %를 같이 쓸 때는 %%를 씀

>>> "Error is %d%." % 98

문자열 포맷팅 코드인 %d %가 문자열 내에 존재하는 경우, %를 나타내려면 반드시 %%로 써야함

>>> "Error is %d%%." % 98

==> 포맷 코드와 숫자 함께 사용하기

1. 정렬과 공백

>>> "%10s" % "hi"  #오른쪽

>>> "%-10s" % "hi"  #왼쪽

>>> "%-10sjane" % "hi"

 

2. 소수점 표현하기

>>> "%0.4f" % 3.42134234

>>> "%10.4f" % 3.42134234

=> format 함수를 사용한 포매팅

좀 더 발전된 스타일로 문자열 포맷을 지정할 수 있음

 

==>숫자 바로 대입하기

>>> "I eat {0} apples".format(3)

==> 문자열 바로 대입하기

>>> "I eat {0} apples".format("five")

==>숫자 값을 가진 변수로 대입하기

>>> number = 3

>>> "I eat {0} apples".format(number)

문자열의 {0} 항목이 number 변수 값인 3으로 바뀜

 

==>2개 이상의 값 넣기

>>> number = 10

>>> day = "three"

>>> "I ate {0} apples.so I was sick for {1} days.".format(number,day)

==>이름으로 넣기

>>> "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)

{0}, {1}과 같은 인덱스 항목 대신 더 편리한 {name} 형태를 사용함

 

==>인덱스와 이름을 혼용해서 넣기

>>> "I ate {day} apples. so I was sick for {number} days.".format(number=10, day=3)

>>> "I ate {0} apples. so I was sick for {day} days.".format(10, day=3)

===>왼쪽 정렬

>>> "{0:<10}".format("hi")

:< 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고, 문자열의 총 자릿수를 10으로 맞춤

 

===>오른쪽 정렬

>>> "{0:>10}".format("hi")

 

===>가운데 정렬

>>> "{0:^10}".format("hi")

 

===>공백 채우기

>>> "{0:=^10}".format("hi")

>>> "{0:!<10}".format("hi")

===>소수점 표현하기

>>> y = 3.42134234

>>> "{0:0.4f}".format(y)

>>> "{0:10.4f}".format(y)

===>{ 또는 } 문자 표현하기

>>> "{{ and }}".format()

 

=>f 문자열 포매팅

파이썬 3.6 버전부터는 f 문자열 포매팅 기능을 사용할 수 있음

 

==>문자열 앞에 f 접두사를 붙여서 사용

>>> name = '홍길동'

>>> age = 30

>>> f'나의 이름은 {name}입니다.나이는 {age}입니다.'

==>표현식 지원

 

==>딕셔너리 사용

>>> d = {'name':'홍길동','age':30}

>>> f'나의 이름은 {d["name"]}입니다. 나이는 {d["age"]}입니다.'

 

==> 정렬

>>> f'{"hi":<10}'  #왼쪽 정렬

>>> f'{"hi":>10}'  #오른쪽 정렬

>>> f'{"hi":^10}'  #가운데 정렬

 

>>> a = "hi"

>>> f'{a:<10}'

>>> f'{a:^10}'

 

==>공백 채우기

>>> f'{"hi":=^10}'

>>> f'{"hi":!<10}'

==>소수점 표현하기

>>> y = 3.42134234

>>> f'{y:0.4f}'

>>> f'{y:10.4f}'

 

==> { 또는 } 문자 표현하기

>>> f'{{ and }}'

 

=> 문자열 관련 함수

문자열 자료형은 자체적으로 문자열 내장 함수를 가지고 있으며, 그것들을 사용하려면 문자열 변수 이름 뒤에 ‘.’를 붙인 다음에 함수 이름을 써주면 됨

 

==> 문자 개수 세기(count)

>>> a = "hobby"

>>> a.count('b')

 

==>위치 알려주기 1(find)

>>> a = "Python is the best choice"

>>> a.find('b')

>>> a.find('k')

 

find -1

index error난다. indexOfbound

 

==> 위치 알려주기 2(index)

>>> a = "Life is too short"

>>> a.index('t')

>>> a.index('k')

==>문자열 삽입(join)

>>> a = ","

>>> a.join('abcd')

>>> a.join(['a','b','c','d'])

 

Python은 대소문자 구분한다.

==>소문자를 대문자로 바꾸기(upper)

>>> a = "hi"

>>> a.upper()

 

 

==>대문자를 소문자로 바꾸기(lower)

>>> a = "HI"

>>> a.lower()

 

==> 왼쪽 공백 지우기(lstrip)

>>> a = "  hi  "

>>> a.lstrip()

 

==> 오른쪽 공백 지우기(rstrip)

>>> a = "  hi  "

>>> a.rstrip()

 

==> 양쪽 공백 지우기(strip)

문자 주위만 없애 준다.

>>> a = "  hi  "

>>> a.strip()

 

==>문자열 바꾸기(replace)

>>> a = "Life is too short"

>>> a.replace("Life","Your leg")

 

==>문자열 나누기(split)

>>> a ="Life is too short"

>>> a.split()

>>> a= "a:b:c:d"

>>> a.split(":")

 

 

III. 리스트 자료형

리스트(List)란 숫자나 문자 모음으로 이루어진 자료형

>>> odd = [1, 3, 5, 7, 9]

리스트명 = [요소1, 요소2, 요소3, ···]

>>> a =[]

>>> b = [1,2,3]

>>> c= ['Life','is','too','short']

>>> d = [1,2,'Life','is']

>>> e  = [1,2,['Life','is']]#중첩리스트

리스트가 3개 겹쳐있으면 3중리스트

e처럼 리스트 자체를 요소 값으로 가질 수 있음

 

=>리스트의 인덱싱과 슬라이싱

==>리스트의 인덱싱

>>> a = [1, 2, 3]

>>> a

>>> a[0]

>>> a[0] + a[2]

>>> a[-1]

>>> b = 'python'

>>> type(b)

>>> a = [1,2,3,['a','b','c']]

>>> a[0]

>>> a[3]

>>> a[-1][0]

>>> a[-1][1]

>>> a[-1][2]

>>> a= [1,2,['a','b',['Life','is']]]

>>> a[2][2][0]

 

==>리스트의 슬라이싱

>>> a = [1, 2, 3, 4, 5]

>>> a[0:2]

>>> a = '12345'

>>> a[0:2]

>>> a = [1,2,3,4,5]

>>> a[2:]

>>> a[:2]

>>> b= a[:2]

>>> b

>>> c = a[2:]

>>> c

 

==>중첩된 리스트에서 슬라이싱하기

>>> a = [1,2,3,['a','b','c'],4,5]

>>> a[2:5]

>>> a[3][:2]

>>> a[3][:]

>>> a[3]

 

=>리스트 연산하기

1. 리스트 더하기(+)

>>> a = [1,2,3]

>>> b = [4,5,6]

>>> a+b

리스트 사이에서 + 기호는 2개의 리스트를 합치는 기능을 함

 

2. 리스트 반복하기(*)

>>> a = [1,2,3]

>>> a * 3

[1, 2, 3] 리스트가 세 번 반복되어 새로운 리스트를 만들어 냄

 

3. 리스트 길이 구하기

>>> a= [1,2,3]

>>> len(a)

 

==>리스트 연산 오류

>>> a = [1,2,3]

>>> a[2]+"hi"

 정수와 문자열은 서로 더할 수 없기 때문에 형(type) 오류가 발생함

 

>>> str(a[2])+"hi"

str 함수는 정수나 실수를 문자열의 형태로 바꾸어 주는 내장 함수임

 

=>리스트의 수정과 삭제

==>리스트에서 값 수정하기

>>> a = [1,2,3]

>>> a[2] = 4

>>> a

각각의 요소이기때문에 가능하다. 하지만  string은 안된다.

 

==>del 함수를 사용해 리스트 요소 삭제하기

>>> a = [1,2,3]

>>> del a[1]

>>> a

>>> del a

>>> a

 

del a[x] x번째 요소값을 삭제함. del 객체는 변수를 삭제함

del a 는 메모리에서 데이터가 삭제된다.

del(a)

>>> a = [1, 2, 3, 4, 5]

>>> del a[2:]

>>> a

 

슬라이싱 기법을 사용하여 리스트의 요소 여러 개를 삭제함

del[x:y] x번째부터 y번째 요소 사이의 값을 삭제함

>>> a = [1, 'a', 'b', 'c', 4]

>>> a[1:3] = [ ]

>>> a

[ ] 사용해 리스트 요소 삭제함

a[1:3] [ ]으로 바꿔 주었기 때문에 [‘a’, ‘b’]가 삭제된 [1, ‘c’, 4]가 됨

 

id(a)를 메모리에 있는 주소를 의미한다.

 

########20191211

20191210 정리

\백스럴시 escape code

문자열%%

\\

문자열은 곱한다는 것은 문자열을 반복한다는 것이다.

slicing은 짜르기 0 <= a <4

%f 실수

문자열 포매팅

r이라는 것이있다.

find 못찾을 경우 -1

sort원자료도 정렬된다.

sorted정렬되지만 원자료는 안바꿔진다.

extend list형태로 값을 줘야 한다.

 

리스트자료형

=>리스트 관련 함수

리스트 변수 이름 뒤에 ‘.’를 붙여서 리스트 관련 함수를 사용할 수 있음

==>리스트에 요소추가

>>> a = [1,2,3]

>>> a.append(4)

>>> a

 

append(x)는 리스트의 맨 마지막에 x를 추가하는 함수임

리스트 안에는 어떤 자료형도 추가할 수 있음

>>> a.append([5,6])

>>> a

리스트에 다시 리스트를 추가한 결과임

 

==>리스트 정렬(sort)

>>> a = [1,4,3,2]

>>> a.sort()

>>> a

 sort 함수는 리스트의 요소를 순서대로 정렬해 줌

>>> a = ['a','c','b']

>>> a.sort()

>>> a

==>리스트 뒤집기(reverse)

>>> a = ['a','b','c']

>>> a.reverse()

>>> a

 

===>desc 정렬하기

방안 1 :

>>> a = ['a','c','d']

>>> a.sort(reverse = True)

>>> a

방안 2:

>>> a = ['a','c','d']

>>> a.sort()

>>> a.reverse()

 

==>위치 반환(index)

>>> a= [1,2,3]

>>> a.index(3)

>>> a.index(1)

>>> a.index(4)

index(x) 함수는 리스트에 x라는 값이 있으면 x의 위치 값을 돌려줌

0이라는 값은 a 리스트에 존재하지 않기 때문에 값 오류가 발생함

 

 

==>리스트에 요소 삽입(insert)

>>> a = [1,2,3]

>>> a.insert(0,4)

>>> a

0번째 자리, 첫 번째 요소(a[0]) 위치에 값 4를 삽입하라는 뜻임

>>> a.insert(3,5)

>>> a

3번째 자리, 네 번째 요소(a[3]) 위치에 값 5를 삽입하라는 뜻임

>>> a.append(6)

>>> a

 

==>리스트에 요소 제거(remove)

remove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수이다.

>>> a = [1, 2, 3, 1, 2, 3]

>>> a.remove(3)

>>> a

a 3이라는 값을 2개 가지고 있을 경우 첫 번째 3만 제거되는 것을 알 수 있다.

>>> a.remove(3)

>>> a

remove(3)을 한 번 더 실행하면 다시 3이 삭제된다.

 

==>리스트 요소 끄집어 내기(pop)s

>>> a= [1,2,3]

>>> a.pop()

>>> a

>>> a = [1,2,3]

>>> a.pop(1)

>>> a

a.pop(1) a[1]의 값을 끄집어 내고 값이 삭제된 것이 확인됨

 

==>리스트에 포함된 요소 x의 개수 세기(count)

>>> a= [1,2,3,1]

>>> a.count(1)

count(x)는 리스트 내에 x개가 몇 개 있는지 조사하여 그 개수를 돌려주는 함수

 

=>리스트 확장(extend)

>>> a =  [1,2,3]

>>> a.extend([4,5])

>>> a

>>> b = [6,7]

>>> a.extend(b)

>>> a

 

extend(x)에서 x에는 리스트만 올 수 있으며, a리스트에 x리스트를 더하게 됨

튜플로 입력하고 더하기 한다

append(),insert(),extend()의 차이점

>>> a.append([8,9])

>>> a

>>> a.append(8,9)

append는 하나에 하나씩 가능하다.

>>> a.insert([(3,5),(5,6)])

insert는 하나에 하나씩 가능하다.

>>> a.insert(1,[2,3])

>>> a

IV. 튜플 자료형

튜플(tuple)은 리스트와 거의 비슷하며 다른 점은 다음과 같음

리스트는 [ ]으로 둘러싸지만, 튜플은 ( )으로 둘러쌈

리스트는 그 값의 생성, 삭제, 수정이 가능하지만, 튜플은 그 값을 바꿀 수 없음

>>> t1 = ()

>>> t2 = (1,)

>>> t3 = (1,2,3)

>>> t4 = 1,2,3

>>> t5 = ('a','b',('ab','cd'))

t2 = (1,)처럼 1개의 요소만을 가질 때는 요소 뒤에 콤마(,)를 반드시 붙여야 함

t4 = 1, 2, 3처럼 괄호( )를 생략해도 무방함

프로그램 실행되는 동안 그 값이 변하지 않기를 바란다면 튜플을 사용하고,수시로 그 값을 변화시켜야 한다면 리스트를 사용함

 

=>튜플의 요소값을 지우거나 변경하려고 하면 어떻게 될까?

==>튜플 요소 값을 삭제하려 할 때

>>> t1 = (1,2,'a','b')

>>> del t1[0]

튜플은 요소를 지우는 행위가 지원되지 않는다는 메시지를 확인할 수 있음

 

==>튜플 요소 값을 변경하려 할 때

>>> t1 = (1,2,'a','b')

>>> t[0] = 'c'

튜플의 요소 값을 변경하려고 해도 오류가 발생하는 것을 확인할 수 있음

튜플은 삭제오 변경이 불가능하다.

 

=>튜플 다루기

==>인덱싱하기

>>> t1 = (1,2,'a','b')

>>> t1[0]

>>> t1[3]

>>> t1[5]

문자열, 리스트와 같이 t1[0], t1[3]처럼 인덱싱이 가능함

index의 반환한 값이 없을 경우 오류난다.

 

==>슬라이싱하기

>>> t1 = (1,2,'a','b')

>>> t1[1:]

>>> t1[1:9]

t1[1]부터 튜플의 마지막 요소까지 슬라이싱 함

 

==>튜플 더하기

>>> t2 = (3,4)

>>> t1+t2

 

==>튜플 곱하기

>>> t2 * 3

 

==>튜플의 길이 구하기

>>> t1= (1,2,'a','b')

>>> len(t1)

 

==>대입문

>>> a = 4

>>> b = a

>>> b

>>> a = 5

>>> a

>>> b

 

#연습문제 87

t1 = (1,2,3)

t2 = (4,)

t1+t2

V. 딕셔너리 자료형

딕셔너리는 단어 그대로 해석하면 사전이라는 뜻이며, 연관 배열(Associative array) 또는 해시(Hash)라고 함

딕셔너리는 리스트나 튜플처럼 순차적으로 해당 요소값을 구하지 않고, Key를 통해 Value를 얻으며 이것이 딕셔너리의 가장 큰 특징임

딕셔너리는 어떻게 만들까?

{Key1:Value1, Key2:Value2, Key3:Value3 ···}

Key Value의 쌍 여러 개가 { }로 둘러싸여 있음

각각의 요소는 Key : Value 형태로 이루어져 있고 쉼표(,)로 구분되어 있음

>>> dic = {'name':'pey','phone':'0119993323','birth':'1118'}

>>> dic

딕셔너리 dic의 정보

 

>>> a = {1:'hi'}

Key로 정수값 1, Value ‘hi’라는 문자열을 사용함

>>> a = {'a':[1,2,3]}

Value에 리스트도 넣을 수 있음

 

=>딕셔너리 쌍 추가하기

1. 딕셔너리 쌍 추가하기

>>> a = {1:'a'}

>>> a[2] = 'b'

>>> a

>>> a['name'] ='pey'

>>> a

>>> a[3] = [1,2,3]

>>> a

Key 3, Value [1, 2, 3]을 가지는 한 쌍이 추가됨

 

2. 딕셔너리 요소 삭제하기

>>> del a[1]

>>> a

>>> del a[1] #다시 실행 할 경우 오류 난다.

 

=>딕셔너리를 사용하는 방법

{“김연아”:”피겨스케이팅“, ”류현진”:”야구“, “박지성“:”축구“, “귀도”:”파이썬”}

==>딕셔너리에서 Key를 사용해 Value 얻기

>>> grade = {'pey':10,'julliet':99}

>>> grade['pey']

>>> grade['julliet']

>>> grade[1] #다시 실행 할 경우 오류 난다.

>>> a = {1:'a', 2:'b'}

>>> a[1]

>>> a[2]

[ ]안의 숫자 1은 두 번째 요소를 뜻하는 것이 아니라, Key에 해당하는 1을 나타냄

>>> a= {'a':1,'b':2}

>>> a['a']

>>> a['b']

딕셔너리 a a[Key]로 입력해서 Key에 해당하는 Value를 얻음

>>> dic = {'name':'pey','phone':'0119993323','birth':'1118'}

>>> dic['name']

>>> dic['phone']

>>> dic['birth']

 

==>딕셔너리를 만들 때 주의할 사항

>>> a = {1:'a', 1:'b'}

>>> a

딕셔너리에서 Key는 고유한 값이므로 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시됨. 마지막 Value가 등록됨

>>> a= {[1,2]:'hi'}

Key에 리스트를 쓸 수 없고, 튜플은 Key로 쓸 수 있음

리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없음

딕셔너리의 Key 값으로 딕셔너리를 사용할 수 없음

Value에는 변하는 값이든 변하지 않는 값이든 상관없이 아무 값이나 넣을 수 있음

 

=>딕셔너리 관련 함수

==>Key 리스트 만들기(keys)

>>> a =  {'name':'pey','phone':'0119993323','birth':'1118'}

>>> a.keys()

a.keys( )는 딕셔너리 a Key만을 모아서 dict_keys라는 객체를 돌려줌

>>> for k in a.keys():

...     print(k)

...

 

dict_keys 객체는 리스트를 사용하는 것과 차이가 없지만, 리스트 고유의 append, insert, pop, remove, sort 함수는 수행할 수 없음

>>> list(a.keys())

>>> d = list(a.keys())

>>> d[1]

 

==>Value 리스트 만들기(values)

>>> a.values()

values 함수는 딕셔너리 a Value만을 모아서 dict_values라는 객체를 돌려줌

a[]이런식으로 하면 오류난다.그래서 get()으로 하면 된다.

 

==>Key, Value 쌍 얻기(items)

>>> a.items()

 

==>Key : Value 쌍 모두 지우기(clear)

>>> a.clear()

>>> a

 

==>Key Value 얻기(get)

>>> a = {'name':'pey','phone':'0119993323','birth':'1118'}

>>> a.get('name')

>>> a.get('phone')

 

>>> print(a.get('nokey'))

>>> print(a['nokey'])

a[‘nokey’]처럼 존재하지 않는 키(nokey)로 값을 가져오려고 할 때 a[‘nokey’] Key 오류를 발생시키고, a.get(‘nokey’) None을 리턴한다는 차이가 있음

>>> a.get('foo','bar')

>>> a

딕셔너리 안에 찾으려는 Key 값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때에는 get(x, ‘디폴트 값‘)을 사용하면 편리함

>>> a.get('foo','bar','ddd')

>>> a.get('foo','bar1')

>>> a.get('foo')

>>> a

 

==>해당 Key가 딕셔너리 안에 있는지 조사하기(in)

>>> a = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}

>>> 'name' in a

>>> 'email' in a

>>> print(a.get('foo'))

VI. 집합 자료형

집합에 관련된 것들을 쉽게 처리하기 위해 만들어진 자료형

집합 자료형은 어떻게 만들까?

집합 자료형은 set 키워드를 이용해 만들 수 있음

중복제거하고 순서없이 해주는 것

중복된것을 없에고 집합을 만든다.

>>> s1 = set([1,2,3])

>>> s1

>>> s2 = set("Hello")

>>> s2

>>> s1 = set([1,2,3,3])

>>> s1

 

집합 자료형의 특징

중복을 허용하지 않음

순서가 없음(Unordered) 

리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있지만, set 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없음

set 자료형에 저장된 값을 인덱싱으로 접근하려면 리스트나 튜플로 변환 후 해야 함

>>> s1 = set([1,2,3])

-------list로 꾸기

>>> l1 = list(s1)

>>> l1

>>> l1[0]

-------tuple로 꾸기

>>> t1= tuple(s1)

>>> t1

>>> t1[0]

=>교집합, 합집합, 차집합 구하기

set 자료형을 유용하게 사용하는 경우는 교집합, 합집합, 차집합을 구할 때임

2개의 set 자료형, s1 1부터 6까지의 값을 가지게 되었고 s2 4부터 9까지의 값을 가지게 되었음

>>> s1 = set([1,2,3,4,5,6])

>>> s2 = set([4,5,6,7,8,9])

 

==>교집합(&)

>>> s1 & s2

‘&’ 기호를 사용하면 교집합을 구할 수 있음

>>> s1.intersection(s2)

==>합집합( | )

>>> s1 | s2

>>> s1.union(s2)

‘|’ 기호나 union 함수를 사용하면 합집합을 구할 수 있음

 

==>차집합( - )

>>> s1-s2

>>> s2-s1

>>> s1.difference(s2)

>>> s2.difference(s1)

빼기(-) 기호나 difference 함수를 사용하면 차집합을 구할 수 있음

 

=>집합 자료형 관련 함수

==> 1개 추가하기(add)

>>> s1 = set([1,2,3])

>>> s1.add(4)

>>> s1

 

이미 만들어진 set 자료형에 값을 추가할 수 있음

 

==>값 여러 개 추가하기(update)

>>> s1 = set([1,2,3])

>>> s1.update([4,5,6])

>>> s1

 

==>특정 값 제거하기(remove)

>>> s1 = set([1,2,3])

>>> s1.remove(2)

>>> s1

VII. 불 자료형

(bool) 자료형이란?

(True)과 거짓(False)을 나타내는 자료형

True :

• False : 거짓

>>> a = True

>>> b = False

 따옴표로 감싸지 않은 True False 예약어를 변수에 지정해서 사용함

>>> type(a)

>>> type(b)

 

=> 비교연산자

>>> 1 ==1

>>> 2 >1

>>> 2 <1

조건문의 반환 값으로도 사용됨

>>> a = 5

>>> a < 6

>>> a > 6

자료형의 참과 거짓

 

문자열, 리스트, 튜플, 딕셔너리 등의 값이 비어 있으면(““, [], (), {}) 거짓이 됨

당연히 비어 있지 않으면 참이 됨

숫자는 그 값이 0일 때 거짓이 됨

FIFO->QUEUE

LIFO->STACK

 

=>참과 거짓이 프로그램에서 쓰이는 사례

>>> a = [1,2,3,4]

>>> while a:

...     a.pop()

...

>>> a

 

a.pop() 함수는 리스트 a의 마지막 요소를 끄집어 내고, 그 요소는 삭제함

[]는 비어있는 리스트로 거짓이므로 False란 문자열이 출력됨

>>> if []:

...     print("True")

... else:

...     print("False")

...

 

 [1, 2, 3]은 요소값이 있는 리스트로 참이므로 True를 출력함

>>> if [1,2,3]:

...     print("True")

... else:

...     print("False")

...

 

=> (bool) 연산

>>> bool('python')

>>> bool('')

>>> bool([1,2,3])

>>> bool([])

>>> bool(0)

>>> bool(3)

 

문제

1.

>>> a = [1,1,1,2,2,3,3,3,4,4,5]

>>> s = set(a)

>>> s

>>> l = list(a)

>>> l

>>> l = list(s)

>>> l

 

2.

>>> a= set([1,1,1,2,2,3,3,3,4,4,5])

>>> a

>>> print(list(a))

 

3.

>>> a= set([1,1,1,2,2,3,3,3,4,4,5])

>>> b= list(set(a))

>>> b

VIII. 자료형의 값을 저장하는 공간, 변수

변수를 만들 때는 =(assignment) 기호를 사용

변수명 = 변수에 저장할 값

변수를 만들 때 자료형을 직접 지정할 필요가 없음

변수에 저장된 값을 스스로 판단하여 자료형을 지정하기 때문에 더 편리함

>>> a = 1

>>> b = "python"

>>> c = [1,2,3]

 

파이썬에서 사용하는 변수는 객체를 가리키는 것

>>> a = [1,2,3]

변수 a [1, 2, 3] 리스트가 저장된 메모리의 주소를 가리키게 됨

>>> a = [1,2,3]

>>> id(a)

 

=> 리스트를 복사할 때

>>> a = [1,2,3]

>>> b = a

>>> id(a)

>>> id(b)

>>> a is b

 

b라는 변수에 a가 가리키는 리스트를 대입하였음

b a와 완전히 동일하다고 할 수 있음

다만 [1, 2, 3] 리스트를 참조하는 변수가 a변수 1개에서 b변수가 추가됨

>>> a[1] = 4

>>> a

>>> b

>>> b[2] = 5

>>> b

>>> a

 

 

>>> a = 4

>>> b = a

>>> a is b

>>> a = 5

>>> a

>>> b

>>> b = 6

>>> a

>>> b

=>변수를 생성할 때 a 변수의 값을 가져오면서 다른 주소를 가리키도록 만드는 방법

1. [:] 이용

리스트 전체를 가리키는 [:]을 이용해서 복사함

>>> a = [1,2,3]

>>> b = a[:]

>>> a[1] = 4

>>> a

>>> b

a 리스트 값을 바꾸더라도 b 리스트에는 영향을 끼치지 않음

 

2. copy 모듈 이용

>>> from copy import copy

>>> a = [1,2,3]

>>> b = copy(a)

>>> a

>>> b

>>> b is a

b a가 가리키는 객체는 서로 다르다는 것을 알 수 있음

 

=>변수를 만드는 여러 가지 방법

>>> a,b = ('python','life')

>>> (a,b) = 'python','life'

>>> [a,b] = ['python','life']

>>> a = b = 'python'

>>> a is b

 

튜플로 a, b에 값을 대입할 수 있음

튜플은 괄호를 생략해도 됨

리스트로 변수를 만들 수 있음

여러 개의 변수에 같은 값을 대입할 수 있음

>>> a = 3

>>> b = 5

>>> a, b = b,a

>>> a

>>> b

>>> a= 3

>>> b = 5

>>> del(a)

>>> del b

연습문제: 112페이지

#1.평균점수

>>> a = 80 #국어

>>> b = 75 #영어

>>> c = 55 #수학

>>> (a+b+c)/3

 

#2.13이 홀수 인지 짝수

>>> a = 13

>>> if a%2 ==0:

           print("짝수")

else:

           print("홀수")

 

#3.

>>> pin = "881120-1068234"

>>> yyyymmdd =pin[:6]

>>> num =pin[7:]

>>> yyyymmdd  #연월일 부분 출력

>>> num          #숫자 부분 출력

 

#4.

>>> pin = "881120-1068234"

>>> pin[7]

 

#5.

>>> a = "a:b:c:d"

>>> b = a.replace(":","#")

>>> b

 

#6.

>>> a = [1,3,5,4,2]

>>> a.sort()

>>> a.reverse()

>>> a

 

#7.

>>> a = ['Life','is','too','short']

>>> a = " ".join(a)

>>> a

 

#8.

>>> a = (1,2,3)

>>> a = a + (4,)

>>> a

 

#9.

>>> a = dict()

>>> a['name'] = 'python'

>>> a

>>> a[('a',)] = 'python'

>>> a

>>> a[[1]] = 'python'

>>> a[250] = 'python'

>>> a

 

#10.

>>> a = {'A':90,'B':80,'C':70}

>>> result = a.pop("B")

>>> a

>>> result

 

#11.

>>> a = [1,1,1,2,2,3,3,3,4,4,5]

>>> aSet = set(a)

>>> b = list(aSet)

>>> b

 

#12.

>>> a = b = [1,2,3]

>>> a[1] = 4

>>> b

>>> a is b

반응형

'Study > Python' 카테고리의 다른 글

python-6  (0) 2020.09.10
python-5  (0) 2020.09.09
python-4  (0) 2020.09.08
python-3  (0) 2020.09.08
python-1  (0) 2020.09.06
반응형

 

RVECTOR자료구조가 더 작다. Python VECTOR보다 더 작다.

R은 함수중심의 언어       Python 은 객체지향

8.9장은 교제에 없다. 9장은 웹 크롤링

interrupt 언어는 한 줄 단위로 해서 바로 바로 보여주는 것 번역하는데 빠르다.

컴파일러 언어는 전체 소스를 한번에 한다. EXEC 생긴다. 컴파일 하는데 늦지만 실행하는데 빠르다.

Python은 데이터를 처리하는데 좋은 소프트프로그램이다.

Python IDLE사용

 

1. Python이란 무엇인가?

I. Python이란?

II. Python의 특징

 Python은 인간다운 언어임

 Python은 문법이 쉬워 빠르게 배울 수 있음

 Python은 무료이지만 강력함

           사용료 걱정 없이 언제 어디서든 Python을 다운로드하여 사용 (Open Source)

 

=>Python은 간결함

(Perl) 프로그램 언어가 100가지 방법으로 하나의 일을 처리할 수 있다면, Python은 가장 좋은 방법 1가지만 이용하는 것을 선호

 

실행이 되게 하려면 꼭 줄을 맞추어야 됨

# simple.py
languages = ['python','perl','c','java']

for lang in languages:
    if lang in ['python','perl']:
        print("%6s need interpreter" % lang)
    elif lang in ['c','java']:
        print("%6s need compilter" % lang)
    else:
        print("should not reach here")

결과 ======>

Python은 프로그래밍을 즐기게 해 줌

Python은 개발 속도가 빠름

 

III. Python으로 무엇을 할 수 있을까?

=>Python으로 할 수 있는 일

시스템 유틸리티 제작

 GUI 프로그래밍

 C/C++와의 결합

프로그래밍

수치 연산 프로그래밍

데이터베이스 프로그래밍

데이터 분석, 사물 인터넷

=>Python으로 할 수 없는 일

시스템과 밀접한 프로그래밍 영역

모바일 프로그래밍

 

IV. Python 설치하기

www.python.org

=>python shell

**주의사항

PATH default로 찾는 위치

=>notepad를 실행하려면 원래는 경로까지 가서 클릭해야 하는데 명령어로 사용하면 직접 열리게끔 하는 것이다.

=>환경변수에 추가된다.

pip 명령어를 어디에서나 사용하게 하기 위해서 설정한다.

 

pip명령이 오류가 발생하는 경우:

=>pip command 없다고 나오는 경우

python 설치되지 않았거나 python명령어   디렉토리가 path 추가되지 않은 경우 입니다.

 

=>windows 경우에는 VC++ 패키지를 만드는 경우가 있는데 이러한 패키지들은 vc++ 재배포 패키지를 설치해야만 설치되는 패키지들이 있습니다.

pip처음 사용시 pip를 업데이트 하라고 한다.

ð  python –m pip install –upgrade pip

 

[Ctrl + Z → Enter눌리면 나간다.

명령어

프로그램을 종료 시

sys.exit()

 

V. Python 둘러보기

=>Python 기초 실습 준비하기

 [시작] 메뉴에서 [모든 프로그램 → Python 3.8 → Python 3.8(64-bit)] 선택

아래의 화면을 대화형 인터프리터라고 함(Python shell)

=>Python 종료:

Python을 종료하려면 [Ctrl + Z → Enter] 또는 아래의 화면과 같이 sys 모듈을 사용하 여 종료할 수 있음

 

=>Python 기초 문법 따라 해보기

==>사칙연산 더하기

 

>>> 1 + 2

결과값 =>

 

==>사칙연산 - 나눗셈과 곱셈

>>> 3 / 2.4

>>> 3 * 9

 

 

==>변수에 숫자 대입하고 계산하기

>>> a = 1

>>> b = 2

>>> a + b

 

 

 

==>변수에 문자 대입하고 출력하기

>>> a = "Python"

>>> print(a)

==>조건문 if 

아래의 예제는 a 1보다 크면 ‘a is greater than 1’이라는 문장 출력

‘…’는 아직 문장이 끝나지 않았음을 의미

>>> a = 3

>>> if a > 1:

>>>     print("a is greater than 1")

 

==>반복문 for

아래의 예제는 for문을 이용하여 [1, 2, 3] 안의 값들을 하나씩 출력

>>> for a in [1,2,3]:

>>>     print(a)

==>반복문 while

아래의 예제는 i 값이 3보다 작은 동안 i = i +1 print(i)를 수행

>>> i = 0

>>> while i < 3:

>>>     i += 1

>>>     print(i)

==>함수

def는 함수를 만들 때 사용하는 예약어임

아래의 예제는 sum(a, b)에서 a, b는 입력값이고, a + b는 결과 값임

3, 4가 입력으로 들어오면 3+4를 수행하고 결과값 7을 돌려

>>> def sum(a,b):

>>>     return a + b

>>> 

>>> print(sum(3,4))

 

메모리의 위치는 변수가 알려준다.

변수를 저장하면 메모리에 데이터 쌓이고 가공하는 것이다.

... 은 더 입력하다 라는 것이다.

VI. Python과 에디터

=>Python IDLE(Intergrated Development and Learning Environment)

파이참(PyCharm)

비주얼 스튜디오 코드

 

IDLEPython 프로그램 작성하기

IDLE(Intergrated Development and Learning Environment)

[시작모든 프로그램 → Python 3.8 → IDLE]을 선택해 Python IDLE을 실행함

 

=>[IDLE 에디터] Python 프로그램 작성하기

#은 주석으로 그 줄 끝까지 프로그램 수행에 전혀 영향을 주지 않음

IDLE은 두 가지 창으로 구성됨

IDLE 셸 창(Shell Window): IDLE 에디터에서 실행한 프로그램의 결과가 표시되 는 창으로 Python 셸과 동일한 기능을 수행함

IDLE 에디터 창(Editor Window): IDLE 에디터가 실행되는 창

 

=>IDLE 셸 창 메뉴에서 [FILE → New File]을 선택해 실행함

IDLE 에디터 창 메뉴에서 [Run → Run Module]을 선택함(단축키:F5)

파일을 저장하면 자동으로 Python 프로그램이 실행됨

 

python idle은 오류에 민감하다.

python idle은 두 번째 줄부터 뛰어 쓰기가 두 번씩 확 가버린다.그래서 코딩하기 불편하다.

그래서 간단한 것은 python한 것은 python shell에서 하고

idle edit에서 작성하고 저장 한 다음 idle shell에서 결과 확인

 

명령 프롬프트 창에서 Python 프로그램 실행하기

[윈도우 키 + R]을 누르고, 빈 칸에 ‘cmd’를 입력하고 [확인]을 선택함

Python 프로그램 실행하기

 

 

여러 줄 주석

“””

‘’’

 

반응형

'Study > Python' 카테고리의 다른 글

python-6  (0) 2020.09.10
python-5  (0) 2020.09.09
python-4  (0) 2020.09.08
python-3  (0) 2020.09.08
python-2  (0) 2020.09.07

+ Recent posts