지금은 잘 모르겠어도 쓰고 사용하다 보면 받아들여진다... 
많이 찾아보고 써보면서 감을 잡는 것이 중요함. 반복숙달!! 
백문이불여일타 : 안 보고 쳐보기 해야 실력이 는다.

​프로그래밍으로 데이터의 용도에 따라 그래프 형태로 전처리 하는 법, 그리는 법, 인공지능 개발하기 좋게 데이터 처리하는 법, 어떤 값을 가지고 학습시킬 것인지 어떤 값을 넣어줄 것인지 등을 진행하게 될 것이다. 

이번 주에는 교재 내용은 다 해서 교재에 없어도 활용하기 좋은 것들, 클래스, 객체지향 라이브러리 만들기 가져오기 등등을 알려드리겠습니다. 하루에 많은 정보를 습득하고 있다. 수업 시간에 한정이 있어서 빨리 진행되니 저얼대 빠지지 마세요... 

지난 주까지는 초급 기초를 진행했다고 할 수 있음
이번 주에는 초~중급으로 기초에서 배운 것들을 확장해 가야 함
함수 모듈 라이브러리 입출력 오브젝트 객체지향 등등


지난 수업 돌아보기
개발 환경 설정 : 사용할 언어 프로그램 설치
적절한 버전으로 설치해야 한다. 기존 프로젝트가 버전이 뭔지 확인하고 설치해야 한다.
설치 매번 하기 어려운데 가상환경!을 설정하면 여러가지 버전을 설치, 프로젝트마다 다르게 사용

VSCode 설치 / VSCode Python Extention 설치
데이터 형태 / 문자형 숫자형 연산자 / 계정 리포지토리 설정
컴퓨터 구조 / 하드웨어 / 입력장치 / 기억 / 연산 / 제어 / 출력
소프트웨어 / 응용소프트웨어 / 시스템소프트웨어 : 하드웨어 제어
데이터 / 비트 / on/off / 이진법 / 바이트
Python / 문자열 데이터 / 연산자 / 인덱스 / 인덱싱 / 슬라이싱 / 함수 / 조건문

비교연산자 : true false 조건에서 확인하는 것 / > 가 보다 크다 / >= 가 보다 크거나 같다.
논리 연산자 : 이었을 때 또는~일 때 아닐 때 and or not
bool 자료형 : true false형
if문 / input() 입력하게 하는 것 / int() 정수형 / list 자료형 [] / append(값) / dictionary / key-value / index[키값, value값 등을 넣어서 찾음] / 반복문 / while 뒤에 조건이 참이거나 거짓인지 / for 리스트에서 가져온 자료를 변수에 넣어서 사용 / mutable / immutable / list, dict / int, float, str, tuple / 튜플 data 변하지 않음 수정 안됨. 새로 만들거나 리스트로 바꿔야 한다.


function 함수

함수는 입력 -> 처리 -> 출력을 진행할 수 있게 만드는 기능을 담은 코드 뭉치
input(입력)을 받아서 특정 작업(처리)을 수행하고 output(출력)을 반환한다. 

​​

built-in function 내장 함수 

파이썬에서 기본적으로 제공해주는 함수들 
지난 시간까지 본 내장 함수들 print() / len() / zip() / int() / float() / str() / list() / range()

abs()

abs(절대값)
bsolute의 약자 
입력한 숫자형 데이터의 절대값을 반환한다. 

print(abs(100)) # 100
print(abs(-100)) # 100
print(abs(3.15)) # 3.15
print(abs(-3.15)) # 3.15



sum() 

sum(리스트)
리스트 안의 숫자를 더한 값을 반환한다. 

print(sum([1, 2, 3, 4, 5])) # 1+2+3+4+5 = 15출력됨

 

max()

max(리스트)
리스트 안에서 최대값을 찾아 반환한다. 

print(max([10, 2, 3, 4, 5])) # 10출력됨

 

 

min()

min(리스트)
리스트 안에서 최소값을 찾아 반환한다. 

print(min([10, 2, 3, 4, 5]))



 

아래 1), 2)번 형식의 차이를 이해해야 한다. 

1)

li_1 = [1, 2, 3]
min(li_1)

2)

li_2.append(0)

 

 

chr()

chr(숫자) 
정수 1개를 입력받고 해당하는 유니코드 문자를 반환한다.
아스키코드 유니코드(문자 표시 규칙) 문자를 숫자로 변환해서 계산해야 할 때가 있다.

print(chr(65)) # A출력됨



ord()

ord("문자")
문자 1개를 입력받고 해당하는 정수를 반환한다. 

print(ord('A')) # 65출력됨

​​

round()

round(값)
round(값, 소수 자릿수)
반올림 함수. 축약하는 만큼 정확도가 떨어지지만 필요할 때가 있다. 
ex) 사용자한테 보여줄 값이 너무 긴 수일 때 사용해도 좋다. 

print(round(1.234)) # 1출력됨
print(round(1.234, 2)) # 1.23출력됨
print(round(1.36, 1)) # 1.4출력됨



define function 함수 정의

함수 이름 name
함수 입력값 parameter
함수 결과값 return value

def​ 

함수를 정의하는 명령어 

파이썬에서는 def를 사용하여 "사용자 정의 함수"를 만든다.  

 

def 함수이름(함수입력값parameter) :

    함수기능코드
    return 함수결과값

 

함수 이름도 변수 이름처럼 규칙을 지켜서 지어야 한다. 
    - 영어, 숫자, _만 사용
    - 숫자로 시작하면 안됨
    - 띄어쓰기하면 안됨
    - 키워드(예약된 단어들) 사용하면 안됨
    - 내장함수 기존에 이미 정의된 함수 이름도 뒤에 만든 것이 덮어써버리기 때문에 피하는 것이 좋음
    - 파이썬은 내장함수와 내가 정의한 함수 이름이 같을 때 내가 정의한 함수를 부른다. 
    - 직관적으로 짓는 것이 좋다. print_list 같이 기능을 추측하기 쉽도록. 



ex) 이름 한 줄씩 출력하기 

print_name은 입력값 없는 함수라고 함수를 정의함, return이 없는 함수. 
def에서 정의된 바와 같이 print_names()로 함수를 직접 호출하면 이름들이 한줄씩 출력됨.

def print_names(): 
    print("손흥민")
    print("황희찬")
    print("김민재")
    print("이강인")
print_names()



return이 있는 함수가 있고 없는 함수(return이 None인)를 만들 수는 있는데. 
함수에 return 값이 있어야 다른 함수에서 불러서 사용할 수 있다. 
아래는 return값("유리아")가 있어서 get_name함수가 유리아를 반환하여 출력된다. 

def get_name():
    return "유리아" 

def print_my_name():
    print(get_name())

print_my_name()

a = print_names() 
b = get_name() 

print(a) # 리턴값 없음. None 출력됨
print(b) # 리턴값 있음. 유리아 출력됨

 

 

parameter 파라미터 (매개변수)

함수에 입력하는 값. 함수 이름 옆 괄호 안에 입력하는 값. 
매개변수, argument 혼용

 

 

return 

함수의 반환 

return value 반환값  
return을 만나면 반환값을 반환함과 동시에 종료된다. 
함수의 반환값은 무조건 1개이다. 매우 중요. 

def test_func5():
    print(1)
    print(2)
    return None # None 값을 반환함과 동시에 함수 벗어남 
    print(3)
    print(4)
    print(5)

def test_func6(a, b):
    return a + b
   return a * b # 위에서 끝나서 출력 안됨

def test_func6(a, b):
    return a + b, a * b # 여러 개의 값을 튜플 1개에 담아서 리턴해라 
result = test_func6(1, 2)

res_add, res_mul = test_func6(1, 2) 
res_add, res_mul = (a+b, a*b) # 위 줄과 같은 뜻이다. 

print(result)

 

 

return value 반환값

어떤 동작을 시켰을 때 그 결과로서 돌려받게 되는 값. 예를 들어, 소프트웨어 프로그램에서 함수(function)를 호출(call)하였을 때 그 결과로서 수행 결과나 ‘0’, ‘-1’ 등 미리 지정된 값을 받을 수도 있으며, 그 반환값을 출력하는 대신 하나의 변수에 할당(assign)할 수도 있다. (IT용어사전, 한국정보통신기술협회)


return값이 없는 함수는 그냥 이렇게 함수 이름으로 호출하여 사용합니당 
그냥 함수 실행하면 끝임 나오는 값으로 다음 계산을 한다든지 하는 일을 할 수가 없음  

def add(a, b): # 매개변수 괄호 안에 매개 변수를 입력해 줘라! 라고 정의함
    return a + b
result = add(1, 2) # return 있는 함수라서 값이 3 나옴 
print(result)



순서에 유의할 것. 
먼저 print_add 함수 정의된 곳 def print_add(a, b): 으로 가서 실행 print(a + b)
그 다음 result 변수로 할당되고 result = print_add(1, 2)  할당된 result 값을 출력해보면 print(result) 
return값이 없는 함수이므로 None이 결과로 출력된다. 

def print_add(a, b): 
    print(a + b)
result = print_add(1, 2) 
print(result) # None 
파라미터 값을 입력하여 함수와 직접 호출해야 값이 나옴 
return값이 같은 위치에 대응하여 전달받음 

def print_add(a, b): 
    print(a + b)

print_add("안녕", 1) # error can only concatenate str not "int") to str
print_add(1, 2) # 3
print_add("안녕", "하세요") # 안녕하세요
print_add("하세요", "안녕") # 하세요안녕
print_add(b="하세요", a="안녕") # 안녕하세요


variable 

사용 범위가 다른 변수가 있다 : 전역변수 global variable, 지역변수 local variable
함수 안의 a, b 변수와 바깥의 a, b 변수는 다르다. 이름이 똑같아도 다른 변수다. 구분 잘 해야 됨. 다른 언어에도 다 있음. 차이를 잘 알아 두어야 합니다. 굉장히 중요합니다. 꼭 보셔야 합니다. 

gloval variable 함수 바깥 전역 변수 

local variable 함수 안에서만 사용되는 지역 변수  
def swap_number(a, b):
    temp = a
    a = b
    b = temp
    print(a, b) # 스왑된 숫자를 
    return a, b
a = 1
b = 2
print("함수 호출 전", a, b)
a, b = swap_number(a, b)
print("함수 호출 후", a, b)



다음 함수를 정의하세요. 

함수 이름 : mul

함수 입력값 : 정수 2개
함수 출력값 : 정수 2개의 곱

n = int(input("숫자1: "))
m = int(input("숫자2: "))

def mul(n, m):
   return n * m

result = mul(n, m)
print("답: ", result)


파이썬은 인기가 많다. 인기가 많다는 것은 점유율이 높다는 것이고, 점유율이 높을 수록 좋은 자료도 많고 가져다 쓸 수 있는 것이 많아서 개발시간도 단축시킬 수 있다. 하지만 다른 사람 코드를 가져와서 쓰려고 할 때 에러가 많이 난다. 어디서 에러가 났는지 거슬러 올라가서 함수의 정의 부분을 찾아가서 살펴봐야 함. 



debug 디버그

프로그램의 개발 마지막 단계에서, 프로그램의 오류를 발견하고 그 원인을 밝히는 작업 또는 그 프로그램을 말한다. 오류 수정 작업은 디버깅(debugging), 오류 수정 소프트웨어는 디버거(debugger)라고 한다. 

버그(bug)는 벌레를 뜻하며, 디버그(debug)는 원래 '해충을 잡다'라는 뜻이며, 프로그램의 오류를 벌레에 비유하여 오류를 찾아 수정하는 일이라는 의미로 쓰인다. 프로그램 개발공정의 마지막 단계에서 이루어진다. 주로 디버그가 오류수정 프로그램과 그 작업을 통칭하는 반면 작업에 중점을 둔 어휘는 디버깅(debugging)을 쓰며, 오류수정 소프트웨어를 가리킬 때는 디버거(debugger)라는 말을 쓴다.

​방법은 프로그래머가 직접 손으로 해보고 눈으로 확인하는 테이블 디버깅과 디버깅 소프트웨어를 이용하는 컴퓨터 디버깅이 있다.

테이블 디버깅은 프로그램 리스트에서 오류의 원인을 추적하는 방법으로 원시프로그램을 읽어가며 분석하는 코드리뷰(code review) 방식, 오류가 발생한 데이터를 사용하여 원시프로그램을 추적하는 워크스루(walk-through) 방식으로 나뉜다.

​컴퓨터 디버깅은 프로그래머가 제공하는 각종 정보와 소프트웨어를 이용하여 누구든지 디버깅을 할 수 있는 방식이다. 여기에는 디버거 방식과 디버그행(行) 방식, 그리고 기계어 방식이 있다.

​먼저 디버거 방식은 프로그램을 시험할 때 디버깅 모드로 컴파일하여 디버거 기능을 포함시켜 사용하면서 오류에 관한 각종 정보를 수집하는 방식이다. 이 방식은 원시프로그램을 수정하는 일이 없이 정보를 수집할 수 있는 장점이 있으나, 디버거에만 의존해야 하므로 정보를 수집할 수 있는 범위가 한정되어 완벽하게 디버깅할 수 없다는 단점이 있다.

​디버그행 방식은 수집하고 싶은 정보를 출력하기 위한 디버깅용 명령을 미리 프로그램 곳곳에 삽입하여 실행시키는 방식으로, 프로그램이 각 지점을 정상적으로 통과하는지 확인하는 방법이다. 이 방식은 세밀한 정보수집에 유용하나 디버깅을 완료하고나서 원시프로그램을 수정해야 하는 번거로움이 있다.

​기계어 방식은 정보를 수집하고자 하는 장소의 주소와 범위를 기계어 수준으로 지정하고, 운영체제의 디버깅 기능을 사용하여 정보를 수집하는 방식이다. 이 방식은 운영체제가 서비스하는 프로그램을 그대로 사용할 수 있다는 장점이 있으나, 정보수집 및 분석에 시간이 걸리는 것이 단점이다.
(두산백과 두피디아, 두산백과)



변수 표기 방법들

각 변수에 숫자 하나씩 할당한 상황 
파이썬에서는 이런 다양한 표기가 가능하다. 

a = 1
b = 2
c = 3

a, b, c = 1, 2, 3 # tuple 
d, e, f = [4, 5, 6] # list
g, h, i = (7, 8, 9) # tuple

 

 

Default value parameter 기본값 매개변수

기본값 매개 변수, 자주 쓰인다, 매우 중요합니다. 

아래와 같이 값을 지정해서 정의할 수 있다. 
함수 호출 시 n2에 입력된 값이 없으면 기본값 사용

def mul2(n1, n2=1):
    return n1 * n2

print(mul2(1, 2))
print(mul2(1))



비어있는 리스트를 매개변수에 할당. 

절대 리스트를 기본값으로 사용하지 말 것 

def test_func(x, test=[]):  # test.append(x)
    print(x, test)



list는 mutable 지역변수인데도 전역변수로 호출됨. 다시 호출할 때마다 값이 누적된다.

test_func(1) # [1]
test_func(2) # [1, 2]



기본값이 immutable이라 변하지 않는다.

def test_func(x, test=5):  
    test = test
    print(x, test)
test_func(1) # 5
test_func(2) # 5

 



기본값이 None일 때 리스트로 만들어 준다.

def test_func(x, test=None): 
    if test == None: 
        test = []
    test.append(x)
    print(x, test)

 

 

default argument 기본값

기본값이 있는 매개변수는 기본값이 없는 매개변수보다 뒤에 위치해야 함

def sub(n1, n2=0, n3): # non-default argument follows default argument
    print(n1 - n2 - n3)

def sub(n1, n3, n2=0): # 이래야 에러가 안 남
    print(n1 - n2 - n3)

sub(10, 3) # sub함수 호출 7 출력



keyword arguments 키워드 매개변수

*args

*를 사용한 매개변수 args는 바꿀 수 있지만 관용적으로 사용되는 이름이어서 이렇게 쓰는 게 좋다. 
입력값이 몇 개가 될 지 모를 때(안 정해졌을 때) 사용한다. 튜플처럼 사용하며, 인덱싱과 슬라이싱 가능하다.  

1 ~ 10까지 더한다 (다시 확인)

def add_many(*args):
    for i in args:
         result = i
         result += i
    return result

result1 = add_many(1, 2, 3, 4, 5, 6)
result2 = add_many(3, 2, 9, 4, 5)
result3 = add_many(1, 2)

print(result1)
print(result2)
print(result3)
def calc_many(n1, *args): # 순서 바꿔도 됨
    result = n1
    for i in args:
        result += 1
    return result

a = calc_many(5, 3, 23, 4, 5)
print(a)



**kwargs

딕셔너리로 사용할 수 있게 변수를 받아온다. 
유동적인 데이터를 입력할 때 사용함. 최근에는 덜 사용하지만 알아둬야 함

def print_kewargs(**kwargs):
    print(kwargs)

print_kewargs(a=1, b=2) # {'a': 1, 'b': 2}
print_kewargs(name='이름', age=10)  # {'name': '이름', 'age': 10}

 

*args, **kwargs 사용법 검색

def func0(*args, **kwargs):
    for arg in args:
        print(arg)
    for arg1 in kwargs.items():
        print(arg1)    

func0(10, 20, 'a',x=130, y=80, z='b')



ex) 홀수 판별 함수 

# 정수 1개를 입력받고 홀수인지 판별하는 함수
# 함수 이름 : is_odd_number
# 파라미터 : n
# 반환값 : 홀수면 True, 짝수면 False
# 질문처럼 is나 has가 앞에 오면 주로 bool 타입(true/False를 판별하는)의 상수를 반환한다. 

코드가 경제적인지 아닌지 생각해 보자...

def is_odd_number(n):
    if n % 2 == 1:
        return True
    else:
        return False

print(is_odd_number(11))   
def is_odd_number(n):
    if n % 2 == 1:
        return True
    return False

print(is_odd_number(11))
def is_odd_number(n):
    return n % 2 == 1

print(is_odd_number(11))
def is_odd_number(n):
    if n % 2 == 1:
        print("True")
    else:
        print("False")

is_odd_number(132)
n = int(input("홀수 확인 : "))

def is_odd_number(n):
    if n % 2 == 0:
        print("False")
    else:
        print("True")

is_odd_number(n)



ex) 테두리를 출력하는 함수 

# 문자열을 입력받고 print 함수를 이용해 
# 테두리와 함게 문자를 출력한다. 
​# 함수 이름 : get_borderde_str
# 파라미터 : message
# 반환값 : None
# print 예시

******
hello
******

시퀀스형 데이터만 len함수 사용! 숫자는 len으로 못 세기 때문에 글자로 바꿔주어야 한다.  

inf = input("메시지를 입력하세요! ")

def get_borderde_str(message): 
    n = len(message)
    print("*" * n)
    print(message)
    print("*" * n)

get_borderde_str(inf)
inf = str(input("메시지를 입력하세요! "))

def get_borderde_str(message): 
    n = len(message)
    print("*" * n)
    print(message)
    print("*" * n)

get_borderde_str(inf)
def get_borderde_str(message): 
    message = str(message)
    n = len(message)
    print("*" * n)
    print(message)
    print("*" * n)

get_borderde_str("hello")
get_borderde_str(12345)

 

 

ex) m/s단위의 속도가 입력되면 km/h단위의 속도로 변환한다.

# 속도를 변환하는 함수 
# 함수 이름: convert_velocity
# 파라미터: velocity
# km/h로 변환된 속도
# 1km = 1000m 1hour = 3600sec
def convert_velocity(velocity): 
     result = velocity * 3.6
     return result

velocity = convert_velocity(10)
print(velocity)
     # 1m/s * 3600(1시간)
     # 3600m/h / 1000
     # 1m/s 3600 / 
     # 초속 * 3600 / 1000 ==> 시속
     # 초속 * 3.6 = 시속


ex) 별 찍기 함수 

정수를 함수에 입력하여 호출하면 해당 정수 줄의 별을 화면에 출력하라. 
# 함수 이름 : print_stars
# 파라미터 : n
# 반환값 : None
# 출력 결과 n -> 4

* 
**
***
****

 

 

# for문으로도, while문으로도 만들어보고, for문과 while문을 섞어서 만들어 보고 다양하게 짜보는 게 좋다.

def print_stars(n):
    for i in range(1, (n+1)):
        for j in range(1, n+1): 
            print("*")
            for o in range(1, n):
            j += 1
        print("\t")
        i += 1

stars = print_stars(5)
print(stars)

def print_stars(n):
    for i in range(n): # 0 ~ n-1
        for j in range(i+1): # 0 ~ i
            print("*", end="") # 기본값 : end="" 아무것도 안 한다. 
        print() # 빈 프린트. 줄바꿈합니다. 
print_stars(4)
n = 4
for i in range(0, n+1):
    print(i * "*")
n = 4
for i in range(1, n+1):
    print(i * "*")
n = 4
for i in range(n+1):
    print(i * "*")
n = 4
i = 0
while i < n:
    j = 0
    while j < i+1:
        print("*", end="")
        j += 1
    print()
    i += 1

+ Recent posts