반응형

**함수

1.매개변수가 있는 함수

=>매개변수가 있는 경우 매개변수의 이름만 나열 하면 됩니다.

 

=>매개변수가 있는 함수를 호출할 때는 기본적으로 매개변수를 전부 대입해서 호출해야 합니다.

 

=>매개변수는 순서대로 대입해야 하는데 매개변수 이름과 함꼐 대입하면 순서를 변경해서 대입해도 됩니다.

대다수의 경우 첫번째 매개변수는 핵심이 되는 매개변수일 가능성이 높기 때문에 이름없이 대입하고 두번째 매개변수부터 이름과 함께 대입합니다.

 

#data cnt 만큼 출력하는 함수

def disp(data,cnt):

    for i in range(0,cnt,1):

        print(data)

 

#함수 호출 -매개변수 2개를 순서대로 대입해서 호출

disp('python',3)

 

1)    매개변수를 적게 대입해서 발생하는 예외 : TypeError: disp() missing 1 required positional argument: 'cnt'

2)    매개변수의 자료형이 잘못 된 경우 TypeError: 'str' object cannot be interpreted as an integer

 

데이터 분석할 경우 햇갈리는 것:

numpy array : 값만 있는 것->머신런닝

pandasdataframe  : 통계 시각화 컬럼이름과 데이터

                       예를 들면 평균시 어떤 평균인지 알아야 한다.

둘다 2차원 배열 이다.

 

#disp('python') #매개변수 개수가 부족해서 예외

#disp(3,'python') #자료형 예외

 

#매개변수의 순서를 변경해서 대입

disp(cnt = 3, data = 'Java')

 

=>매개변수에 기본값 부여 가능

매개변수를 만들 때 = 기본값을 설정해주면 됩니다.

기본값이 있는 매개변수는 생략하고 호출이 가능

기본값이 있는 매개변수 뒤에 기본값이 없는 매개변수는 올 수 없습니다

 

=>매개변수 앞에 *을 붙이면 데이터를 몇 개를 대입하던지 이 매개변수가 전부 받습니다.

함수 내에서는 tuple 로 취급합니다.

이 매개변수는 반드시 마지막에 설정되어야 합니다.

 

=>매개변수 앞에 **을 붙이면 dict가 됩니다.

이 매개변수에 데이터를 대입할 때는 key = value형식으로 대입해야 합니다.

**이 붙는 매개변수를 가진 함수를 사용할 때는 document를 잘 읽어보고 사용해야 합니다.

그래프를 그리는 함수들이 이 형태의 매개변수를 가지고 있는 경우가 많습니다.

적절한 옵션들을 찾아서 사용해야 합니다.

#cnt에 기본값이 1이설정된 함수:

#cnt를 생략하면 1

def display(data,cnt=1):

    for i in range(0,cnt,1):

        print(data)

 

display('c++')

 

#sum함수의 도큐먼트 확인

help(sum)

start0이다.

 

#max함수의 도큐먼트 확인

help(max)

몇개를 주던 가장 큰값을 준다.

 

#max함수의 도큐먼트 확인

#help(max) #max 3번째 매개변수는 *이 붙어서 몇개를 대입해도 됩니다

print(max(20,10,40,50))

print(max(20,10,40,50,89,87))

 

# **이 붙은 매개변수는 key = value형태로 여러 개 대입이 가능

def createurl(server, port, file, **param):

    querystring =''

    for key in param:

        querystring = querystring+key +'=' +param[key] +'&'

 

    url = server +':' +port +'/' +file+'?' +querystring

    print(url)

createurl('211.183.6.60' ,'9000' ,'index.html',id='ggangpae1',pw='1234')

 

2. return

=>함수의 수행을 종료하고 호출한 곳으로 돌아가는 명령어

=>return 할 때 데이터르ㄹ 같이 가지고 갈 수 있습니다.

return뒤에 가지고 갈 데이터를 입력하면 데이터를 가지고 돌아값니다.

기본적으로 return1개만 가능합니다.

2개 이상 리턴하고자 하는 경우에는 (튜플),[리스트],{Set이나 DICE} 형태고 묶거나 나중에 나오은 CLASS, INSTANCE를 만들어서 리턴해야 합니다.

=>파이썬은 튜플의 경우는 변수에 나누어서 저장이 가능합니다.

변수나열 = (튜플)

튜플의 데이터를 순서대로 변수에 대입합니다.

변수의 개수와 튜플의 데이터가 개수가 다른 경우에는 마지막 변수에 튜플의 모든 데이터를 대입합니다.

 

python은 튜플 혹은 dict로 많이 준다. 쪼개서 하면 된다.

 

def reg(data):

    slope = 3

    intercept = 7

    #결과를 tuple로 리턴

    return (slope, intercept)

r = reg(10)

#튜플을 한꺼번에 저장

print(r)

print(type(r))#자료형을 확인 하기

#튜플을 나누어서 저장

slope, intercept = reg(10)

print('slope', slope)

print('intercept', intercept)

 

항상 매개변수는 뭐 잇을 가 확인

dir , help, type 등 자주 사용하기

 

3, 재귀함수(recursion)

=>함수가 함수르 호출하는 구조라서 느리고 메모리 사용량도 많지만 코드를 간결하게 만들 수 있는 장점이 있습니다.

 

피보나치 수열

1,1,2,3,5,8,13,...

첫번째와 두번째는 무조건 1

세번쨰 부터는 앞 2개의 합

 

def fibonacci(n):

    if n == 1 or n ==2:

        return 1

    else:

        return fibonacci(n-1) + fibonacci(n-2)

 

print(fibonacci(9))

 

하노이의 탑을 연습하기

감독관 배정

 

4.파이썬에서 함수는 일급 객체

=> 함수를 변수에 저장할 수 있고 리턴할 수 있고 매개변수로 대입할 수 도 있습니다.

함수가 일급 객체 안되는 것이 java 이다.

변수에 저장할 수도 있어니깐 매개변수에 저장할 수 도 있다

=>함수형 프로그래밍을 사용할 때와 closure를 만들기 위해서 사용합니다.

=>함수형 프로그래밍은 데이터의 모임(list,tuple, set, dict)에 하나의 함수를 적용하는 프로그래밍

=>closure는 함수가 함수를 리턴해서 함수 내부의 데이터를 함수 외부에서 변경하도록 하는 프로그래밍

 

5.람다(lambda)

=>파이썬에서는 이름없는 한 줄 짜리 함수

lambda매개변수 나열: 리턴할 내용

def addint(x,y):

    return x+y

 

#위의 함수를 람다 식으로 표현

lambdaadd = lambda x, y : x+y

print(lambdaadd(100,200))

 

 

=>람다 함수도 매개변수의 초기화 가능

=>한줄 짜리 함수라서 변수 선언은 안됩니다.

 

6.함수형 프로그래밍

=>데이터의 모임에 함수를 전부 적용하는 프로그래밍

1)map

=>데이터의 모임과 함수를 매개변수로 받아서 데이터의 모임에 함수를 전부 적용해서 결과를 데이터의 모임으로 리턴해주는 함수

=>대입된느 함수는 1개의 매개변수를 가져야 하고 반드시 데이터를 리턴해야 합니다.

numpy가 이행태로 연산한다.

 

 

#반복문을 사용할 경우

2020-02-18 19:18:05.056642

2020-02-18 19:18:05.068582

 

2020-02-18 19:18:45.946949

2020-02-18 19:18:45.962906

 

#함수형 프로그램의 맵을 사용할 경우

2020-02-18 19:20:24.933999

2020-02-18 19:20:24.937989

 

#10000개의 데이터에 1씩 더한 결과롤 list를 만들기

 

#반복문을 이용한 방법

def inc(x):

    return x+1

 

collection = [i for i in range(0,100000,1)]

 

import datetime

print(datetime.datetime.now())

result = []

for i in collection:

    #result.append(i+1)

    result.append(inc(i))

print(datetime.datetime.now())

 

print()

#함수형 프로그래밍을 이용ㅇ한 방법

print(datetime.datetime.now())

result = list(map(inc,collection))

print(datetime.datetime.now())

 

 

 

2)filter

=>데이터의 모임에서 함수의 수행결과가 true인 데이터만 모아서 리턴해주는 함수

=>대입되는 함수는 매개변수를 1개 받아서 bool을 리턴하는 함수이어야 합니다.

def odd(x):

    return x % 2 == 1

 

li =[10,30,21,32, 29]

print(list(filter(odd, li)))

 

3)reduce

=>데이터의 모임과 함수를 가지고 누적 연산을 수행해서 결과를 리턴하는 함수

=>결과가 1

=>대입되는 함수는 매개변수가 2개이고 결과를 리턴하는 함수이어야 합니ㅏㄷ.

매개변수는 처음에는 첫번째와 두번째를 데이터를 가지고 수행을 하고 그 다음부터는 앞 연산의 결과를 가지고 다음 데이터와 연산

앞의 값으로 계산

count하는 것  개수 새는 것

=>python에서는 reduce가 내장함수에서 빠지고 functools패키지의 함수로 변경

 

 

 

 

7,pass

=>클래스나 함수의 내용을 작성하고자 할 때 사용하는 예약어

=>내용이 없는 함수나 클래스를 만들 때 사용합니다.

def addint(x,y):

    return x+y

#reduce는 누적 연산을 해서 결과를 리턴하는 함수

import functools

print(functools.reduce(addint, li))

 

 

8.__doc__

=>함수 내부에 __doc__속성에 문자열을 대입하면 help(함수) 했을 때 출력이 됩니다.

=>파이썬이나R에서 함수를 만들어서 배포하고자 할 때 이 속성에 이 함수의 기능을 설명을 해야 합니다.

배포할 때는 한글로 사용하면 안된다.

 

 

 

 

 

 

 

 

 

반응형

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

Python-14  (0) 2020.11.03
python-13  (0) 2020.10.26
python-11  (0) 2020.10.26
python-10  (0) 2020.10.26
Python-9  (0) 2020.09.12
반응형

 

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
반응형
library(dplyr)
library(ggplot2)
mpg
data1 <- mpg %>% filter(displ <= 4) %>% summarise(mean(hwy))
data1
data2 <- mpg %>% filter(displ >= 5) %>% summarise(mean(hwy))
data2 

data <- mpg %>% filter( displ <= 4 | displ >= 5) %>% mutate(group1 = ifelse(displ <= 4, 'a', ifelse(displ>=5,'b','c'))) %>% group_by(group1) %>% summarise(mean(hwy))
data

mpg %>% filter()

#mpg는 위에  10개만 보여준다.
head(airquality, 20)
head(mpg, 30) #강제로 10개만 보여준다.

#데이터 타입으로 바꾸는것 as.data.frame
airquality <- as_tibble(airquality)
airquality

mpg

mpg %>% filter(manufacturer=='audi' | manufacturer=='ford') %>% group_by(manufacturer) %>% summarise(test=mean(cty)) %>% arrange(desc(test)) 

mpg_new <-mpg %>% mutate(total = (hwy+cty)/2) %>% arrange(desc(total)) %>% head()        
d2 <-mpg %>% mutate(total = (hwy+cty)/2) %>% arrange(desc(total))  %>% head()  
d2 <- as.data.frame(d2)
arrange(d2,desc(total))

mpg_new <- mpg %>% select('class','cty')
mpg_new

mpg_new %>%  filter(class =='suv' | class =='compact') %>% group_by(class) %>% summarise(sum(cty)) 

mpg %>% select('class','cty') %>%  filter(class =='suv' | class =='compact') %>% group_by(class) %>% summarise(mean(cty))  
mpg %>% filter(class =='suv' | class =='compact')  %>% select('class','cty')  %>% group_by(class) %>% summarise(mean(cty)) 

mpg %>% filter(class =='compact') %>% group_by(manufacturer) %>% summarise(tot=n()) %>% arrange(desc(tot))

 

mpg데이터셋 보기
ggplot

str->str(mpg)

tbl_df , tbl and data.frame
tbl data.frame비슷하는데 계산하기 위해서 나오는 것
tbl_df
chr m num, int등으로 되여있다.
열의 이름을 보고 싶으면 names(mpg)
names(mpg)[8] #cty만 뜨게끔 몇번째 명을 지정한다.
str(mpg)
names(mpg)
names(mpg)[8] #cty만 뜨게끔 몇번째 명을 지정한다.

 

names(mpg)[8] <- 'city'
names(mpg)
mpg
names(mpg)[8] <- 'cty'
names(mpg)
mpg

dplyr :: glimpse(mpg)
mpg
names(mpg)[12]
mpg %>% select(c(names(mpg)[12] ))

mpg <- subset( mpg, select = -c(names(mpg)[12] ) )
mpg

mpg <- ggplot2::mpg
mpg
ggplot(data= mpg,aes(x= displ,y=hwy))+geom_point()

ggplot(mpg,aes(displ,hwy,colour = class))+geom_point()

ggplot(mpg, aes(displ,hwy))+geom_point((aes(colour ="blue")))# 바닥에 색갈이 었으면 두개 층이 겹쳐져서 원하는 색갈을 못가진다.레이어가 겁쳐서나오기  overwritting
ggplot(mpg, aes(displ,hwy))+geom_point(colour ="blue")#동급에서 색갈이 먹여지는데 

ggplot(mpg, aes(displ,hwy,colour = class))+geom_point() #색갈갈
ggplot(mpg, aes(displ,hwy,colour = trans))+geom_point()#
ggplot(mpg, aes(displ,hwy,colour = drv))+geom_point()#
ggplot(mpg, aes(displ,hwy,colour = cty))+geom_point()#

#shape도형형
ggplot(mpg, aes(displ,cty, shape=drv))+geom_point()
ggplot(mpg, aes(displ,cty, shape=class))+geom_point()
ggplot(mpg, aes(displ,cty, shape=trans))+geom_point()
ggplot(mpg, aes(displ,cty, shape=cty))+geom_point()#A continuous variable can not be mapped to shape

#size #많을 수록 많아진다.
ggplot(mpg, aes(displ, cty, size= cty)) +geom_point()
ggplot(mpg, aes(displ, cty, size= trans)) +geom_point()

ggplot(mpg, aes(displ, cty, size= cty)) +geom_point(colour ="red")
ggplot(mpg, aes(displ, cty, size= cty)) +geom_point(colour= cty)#객체 'cty'를 찾을 수 없습니다
ggplot(mpg, aes(displ, cty, size= cty)) +geom_point(aes(colour= cty))

#만약 size와 color를 다르게 주면 어떤 그림을 그려 낼까요 
ggplot(mpg, aes(displ ,cty, size = cty , color= drv))+geom_point()

ggplot(mpg,aes(cty,hwy))+geom_point()#점선


str(diamonds)
ggplot(diamonds,aes(carat,price))+geom_point()
ggplot(economics, aes(date, unemploy))+geom_line()#선으로 
ggplot(mpg,aes(cty))
ggplot(mpg,aes(cty))+geom_histogram()#1차원으로 하는 것것


ggplot(mpg,aes(cty))+geom_histogram(bins=10)#더 굵어진다.
ggplot(mpg,aes(cty))+geom_histogram(bins=20)#bins는 막대기 그림림

dia <- diamonds #이름 바꾸기 
class(dia)
dia
#ord order 순서가 정해진다.
#carat 크기 모양

#범주유형으로 색상 하기 
ggplot(diamonds,aes(carat,price, color=cut))+geom_point()
ggplot(diamonds,aes(carat,price, color=color))+geom_point()
ggplot(diamonds,aes(carat,price, color=clarity))+geom_point()

 

#r과 rstudio 속도 관련문제
r은 훨씬 빠르고 부드럽게 된다.

#facetting
#따로따로 보여주는 것
#범주용 데이터에 대하여 

 

ggplot(mpg, aes(displ,hwy))+geom_point()+facet_wrap(~class)

geom_smooth()
ggplot(mpg,aes(displ,hwy))+geom_point()+geom_smooth()#곡선 범위 
ggplot(mpg,aes(displ,hwy))+geom_point()+geom_smooth(method="loess")#곡선 defaule  local지역을 쪼개서 연결하는 상황
ggplot(mpg,aes(displ,hwy))+geom_point()+geom_smooth(method="lm")#직선 범위  lw linear model 선형모델 

geom_boxplot()

#gitter 흩어주는 것인데 geom_violin()더 예쁘지는 것이다. 절반짤라서 
#geom_violin
ggplot(mpg, aes(drv, hwy)) +geom_violin()
ggplot(mpg,aes(drv,hwy))+geom_jitter()
ggplot(data = mpg, aes(x = drv, y = hwy))+
  geom_point(size = 2, position = "jitter")

geom_feqploy()
ggplot(mpg, aes(hwy)) +geom_freqpoly()#histogram그리고 그다음 그리는 것 
ggplot(mpg, aes(hwy)) +geom_freqpoly(bins = 20)#범위가 넓어진다.

geom_histogam()
ggplot(mpg, aes(displ,color= drv)) +geom_histogram(bindwidth= 0.5)#색상이 안된다.
ggplot(mpg, aes(displ,fill= drv)) +geom_histogram(bindwidth= 0.5)#
ggplot(mpg, aes(displ,fill= drv)) +geom_histogram(bindwidth= 0.5,position = "dodge")#한줄에 색사이 하나밖에 없다.


#geom_bar
#자주사용하는 것이다.
ggplot(mpg, aes(displ,fill= drv)) +geom_bar(position = "dodge")
ggplot(mpg, aes(displ,fill= drv)) +geom_bar(position = "fill")

ggplot(mpg, aes(manufacturer))+geom_bar()#변수가 하나일때는 stat안하면 자동으로count로 된다.
drugs <- data.frame(drug = c("a","b","c"), effect = c( 4, 9, 6))
ggplot(drugs, aes(drug, effect))+geom_bar(stat = "identity")#y값이 정해져있다.identity로무조건 설정해야 한다.
ggplot(drugs, aes(drug, effect))+geom_bar()#stat_count() must not be used with a y aesthetic.

ggplot(economics, aes(date, unemploy / pop))+geom_line()#알아서 계싼해서 만들어준다.
ggplot(economics, aes(date, unemploy))+geom_line()

ggplot(mpg, aes(drv, hwy)) +geom_boxplot()#박스가 25%에서 선을 거고 50% 선을 거 위에 25%에 선이 있다. 중앙값 
#잴 위에 있는 것은 이상값 동그라미 


mpg %>% filter(hwy < 20 & drv == 'f') 
mpg %>% filter(hwy < 25 & drv == 'f') %>% arrange(hwy)

 

데이터 프레임 합치기
결측치 not avaliable
데이터 정제하기[결측치] 데이터 비여있기

 

#na이냐 아니냐 
df <- data.frame(sex= c("M","F",NA,"M","F"),score=c(5,4,3,4,NA))
df
is.na(df)
table(is.na(df))

table(is.na((df$sex)))
table(is.na(df$score))

#na빼고 계산하면 안되기때문에 na로 되여있다.
mean(df$score)#[1] NA ->수학계산을 알수없다.
sum(df$score)#[1] NA->수학계산을 알수없다.

df %>% filter(is.na(score))#na인것만 골라낸다.
df %>% filter(!is.na(score))#na가 아닌것을 골라낸다.

#해결법은 아닌것만 모아서 계산하겠다.
df_nomiss <- df %>% filter(!is.na(score)) 
df_nomiss
#평균은 모두합쳐서 ,na빼고 , error
mean(df_nomiss$score) 
sum(df_nomiss$score)

df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex))
df_nomiss
#na.omit생략한다. 지운다. na가보이면 그 행을 지운다. 
#na가 모이면 그 행을 삭제한다. 그래서 사용하면 안된다. 위험한 행위이다.
#다만 데이터가 엄청 많을때 무슨 영향을 미치는 지 알고 있을때 가능하다.
#위험한 행위이다.
df_nomiss2 <- na.omit(df)#모든 변수에 결측치 없는 데이터 추출
df_nomiss2

#아래것은 가장 권장한 결과이다.
#na가  있다는 것을 알고 있기에 원래 데이터가 수정되는 것이 아니여서 안정성이 있다.
mean(df$score, na.rm =  T)#결측치 제외하고 평균산출 
sum(df$score, na.rm = T)#결측치 제외하고 합계 산출
#결론은 어떻게 하냐 ? 입력 is.na na.rm na.omit
#결측치를 지우고 한것이다.

데이터 정제하기 [이상치] 이상한 이상이다.
이상치의 가장대표적인 예는 로또 1등이다. 분포에 끝에 있다는 것이지 나쁘는 것은 아니다.

 

outlier <- data.frame(sex= c(1,2,1,3,2,1) , score= c(5,4,3,4,2,26))
outlier

table(outlier$sex)
table(outlier$score)

outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex)#3은 이상치보다 오류이다.
outlier

outlier$score <- ifelse(outlier$score>5 , NA, outlier$score)#16
outlier

outlier <- data.frame(sex= c(1,2,1,3,2,1) , score= c(5,4,3,4,2,26))
boxplot(outlier$score)

outlier %>% filter(!is.na(sex) & !is.na(score)) %>% 
  group_by(sex) %>% 
  summarise(mean_score = mean(score))

정규표현식
함수
인수가 없는 함수 

#함수 ->변수선언할 필요없다.
#함수 ->

Minho <- function(){
  x <- 10
  y <- 20
  return (x*y)#돌려주는 값의 선언
}

ls()
Minho
Minho()

#인수가 있는 함수의 선언
Minho2 <- function(x,y){
  xx <- x
  yy <- y
  return (sum(xx,yy))#돌려주는 값의 선언
  #시스템이 정의한 특정 함수를 이용한 결과를 돌려줌
}

Minho2(2,3)

kaggle 
gitub

Minho3 <- function(x,y){
  x3 <- x+1
  y3 <- y+1
  x4 <- Minho2(x3, y3)#함수에서 함수를 부르는 경우 재귀호출이 가능하다.
  return(x4)
}
Minho3(2,4)

#결과를 화면에 반환하지 않고 변수에 할당
Minho4 <- function(){
  x <-  10
  y <-  10
  return(invisible(x*y)) # 결과값은 보여지지 않지만 변수에는 값이 들어간다.
}
Minho4()
result <- Minho4()
result

#함수 외부의 변수를 조작해야
rm(x)
x <- 70 #시스템 변수 x에 70을할당 
ls()
minho5 <- function(){
  x <- 10#함수내에서 사용하는 변수 
  y <- 20#함수내에서 사용하는 변수 
  
  x <<- 40 #시스템에서 사용하는 변수  x에 40을 할당
  return(x+y)
}
minho5()

minho5 <- function(){
  x <- 20#함수내에서 사용하는 변수 
  y <- 20#함수내에서 사용하는 변수 
  x+y
}

#return이 우선순위고 return이 없으면 마지막으로 된다.
minho5 <- function(){
  x <- 20#함수내에서 사용하는 변수 
  y <- 20#함수내에서 사용하는 변수 
  return(x+y)
  x-y
}

minho5()
minho5

sum1 <- 0 #변수를 설정
for(i in seq(1,10,by =1 )) sum1 <- sum1+i#1에서 10을 1단위로 차례로 넣고 결과 확인
sum1

sum1 <- 0
for(i in 1:5){
  for(j in 1:5){
    sum1 <- sum1 + i*j
  }
}
sum1

sum1 <- 0
for(i in 1:5){
  for(j in 1:5){
    sum1 <- sum1 + i*j
  }
}
sum1

sum1 <- 0 #변수를 설정
for(i in seq(1,10,by =1 )) sum1 <- sum1+i#1에서 10을 1단위로 차례로 넣고 결과 확인
sum1

sum1 <- 0
for(i in 1:5){
  for(j in 1:5){
    sum1 <- sum1 + i*j
  }
}
sum1

while문
sum2 <- 0
i <- 1
while(i <= 10){
  sum2 <- sum2+i;
  i <-i+1
}
sum2

#repeat
sum3 <- 0
i <- 1
repeat{
  sum3 <- sum3+i
  i <- i+1
  if(i>10) break#이 조건에 맞으면 탈출한다.
}
sum3 <- 0
i <- 0
repeat{
  if(i> 5) break
  j <- 0
  repeat{
    if(j > 5)break
    sum3 <- sum3+i*j
    j <- j+1
  }
  i <- i+1
}
sum3

sum1 <- 0
len <- 10
for(i in 1:len){
  sum1 <- sum1 + i
}
sum1

서포트 벡터 머신
데이터 성격 이해 ->탐색적 데이터 (ggplot2,baseR graphic,플롯 , 페어)->변수를 피처엔저니어링(필요한것만 추가 파생변수 등 만든다. 뉴테이트 변수를 빼거나 넣거나 하는것 )
->분석(예측,분류,CNN등)
회귀 최소제곱법 찾는 방법
  단순회귀 예측 연속성
  로지스트회귀 양자택 sigmoid함수 ->
  다중회귀
전문가시스템
의사결정에서의 시리즈

kaggle 알고리즘 -> 분석 의사결정시리즈


vector점이라고 생각하면 된다.
중간에는 decition boundary
margin
support vetors
선형분류 문제 ->데이터를 분류하는 선형 결정경계(Decstion boudary)
분류가능하도록 데이터를 변화시킨다.
함수로 해서 변화한다. 변형을 시킨다.
비선형 분류
소프트 마진 
hypperparameter 로 튜닝하다.

playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle&regDataset=reg-plane&learningRate=0.03&regularizationRate=0&noise=0&networkShape=4,2&seed=0.47074&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false

 

Tensorflow — Neural Network Playground

Tinker with a real neural network right here in your browser.

playground.tensorflow.org

playground tensorflow

 

RBF(radial basis function)비선형 분류-> 잘 모르는 RBF
RBF(radial basis function)가우시안 커널
서포트 백터 머신의 장단점
장점
1. 분류문제나 회귀문제 동시에 쓸 수 있다.
2.사용하기 쉽다.
3. 예측의 정확도가 높다
단점
1.커널 hypperparameter 등을 위해 튜닝 과정이 필요하다.
2.선형 회귀/로지스틱 회귀와 다르게 신뢰 구간등을 

svm 지원 library
e1071
kabR
kerlab

신경망은  rgb함수로 
kernel 선형 아니면 마법사처럼 위에 올라갈것인지
분류가지고 예측한다.
데이터

 

#분류

install.packages("RCurl")
# load the library
library(RCurl)
# specify the URL for the Iris data CSV
urlfile <-'http://archive.ics.uci.edu/ml/machine-learning-databases/letter-recognition/letter-recognition.data'
# download the file
downloaded <- getURL(urlfile, ssl.verifypeer=FALSE)
# treat the text data as a steam so we can read from it
connection <- textConnection(downloaded)
# parse the downloaded data as CSV
letters <- read.csv(connection, header=FALSE)
# preview the first 5 rows
colnames(letters)<-c("letter","xbox", "ybox","width","height",
                     "onpix","xbar","ybar","x2bar","y2bar",
                     "xybar","x2ybar","xy2bar","xedge","xedgey",
                     "yedge","yedgex")
View(letters)
str(letters)
head(letters)
write.csv(letters,"letters.csv")
#머신러닝은 기계로 배운다.

 test_split = 0.2
train_size = round((dim(letters)[1] *(1- test_split)))#20000* -0.8 test는 4만계
set.seed(20180621)#seed 값에 따라사  sample을 돈다.
train_index = sample(1:(dim(letters)[1]),train_size) #1~ 20000, 16000

letters_train <- letters[train_index,]
letters_test  <- letters[-train_index,] #train한것 나머지를 구한다.

install.packages("e1071")
library(e1071)#svm 지원하는 것 
#데이터 , 문자로 맞추고 변수는 그 나머지 모든 것
#fitting svm with linear kernel
letters_linear <- svm(letter~. , data = letters_train,kernel ="linear")
summary(letters_linear)

Call:
svm(formula = letter ~ ., data = letters_train, kernel = "linear")


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  linear 
       cost:  1 

Number of Support Vectors:  7147

 ( 225 456 371 133 484 436 213 209 234 183 313 202 239 287 235 298 346 236 240 335 240 196 175 280 458 123 )


Number of Classes:  26 

Levels: 
 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

선형이여서 감마 값이 없다. 얼마나 멀리 있는지 가까이 있는지 
 



Ubuntu ->windows에서 linux사용가능하다.

!hostname
#나를 위해서 만들어진 서버
7f22e97478ea

반응형

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

R-6  (0) 2020.09.05
R-5  (0) 2020.09.05
R-3  (0) 2020.09.05
R -2  (0) 2020.09.05
R-1  (0) 2020.09.02

+ Recent posts