본문 바로가기

python

8. 함수, 지역/번역 변수

728x90
반응형

39. (파이썬)함수 이야기 (def)

-> 파이썬 함수를 생성해야 하는 이유?

   내가 만든 스크립트를 다른 사람도 유용하게 사용하게끔

    하고 싶다면

    코드를 함수로 만들면 된다.

 

함수 생성 예제:

def add_number(n1, n2):

    ret=n1+n2

    return ret

print(add_number(10,25) )

 

 

 

 

문제132. 오라클의 initcap 함수를 만들어서 아래와 같이

실행되게 하시오

   

print(initcap('smith'))

결과: Smith

 

def initcap(data):

    ret=data[0].upper()+data[1:].lower()

    return ret

print(initcap('smith'))

 

 

 

문제133. substr 함수를 파이썬으로 생성하시오

print(substr('smith',1,3) )

: smi

 

def substr(data,num1,num2):

ret= data[num1-1:num2]

return ret

print(substr('smith',1,3) )

 

소현답:

def substr(data, x, y):

return data[x-1:x+y-1]

  data[1:3]

print(substr('smith', 1,3,) )

 

 

 

문제134. 오라클의 lpad 함수를 파이썬으로 만드시오

(len 으로 해보시오)

select lpad('smith', 10, '*')

 from dual;

 

 *****smith

설명: 전체 10 자리 잡고 smith 출력하는데

         나머지 남은 왼쪽에 * 채워 넣는다.

 

print( lpad( 'smith' , 10 , '*' ) )

 

rjust:

def lpad(data,a,b):

    return data.rjust(a,b)

 

print(lpad('smith',10,'*'))

-->rjust a에서 data 제외한 나머지만큼 b 왼쪽에 채워라.

 

len:

def lpad(data,num,char):

    return((num-len(data))*char+data)

 

print(lpad('smith',10,'*'))

 

 

 

문제135. 오라클의 rpad 함수를 파이썬으로 만드시오!

 

def rpad(data,num,char):

    ret=data+'*'*(num-len(data))

    return ret

print(rpad('smith',10,'*'))

 

 

 

문제136. 오라클의 instr 함수를 파이썬으로 구현하시오

 

SQL> select instr('smith', 'm')

         from dual;

: 3

>>>>print(instr('smith','m') )

 

 

def instr(data,char):

    num=0        #함수 안에 넣어야 한다

    for i in data:

        num=num+1

        if i == char:

            return num

print(instr('smith','m') ) 

 

 

이해도움:

num=0

for i in 'smith':

    num=num+1

    if i == 't':

        print(num) 

---------------

data='smith'

for i in data:

    print(i)

   

 

 

 

 

 

문제137. 아래와 같이 없는 철자를 입력하면 0

출력되게 하시오!

 

SQL> select instr('smith', 'a')

           from dual;

      : 0

 

print(instr('smith', 'a') )

 

 

def instr(data,char):

    num=0        #함수 안에 넣어야 한다

    for i in 'smith':

        num=num+1

        if i == char:

            count+=num

        elif char != i:

            num=0

         

    return num

print(instr('smith','a' ))

-----------------------------

 

def instr(data,char):

    num=0

    for i in data:

        num+=1

        if i==char:

            return num

    return num-len(data)

print(instr('smith', 'a'))

 

 

 

datetime 패키지

datatime 패키지에서는 날짜와 시간을 함께 저장하는 datetime 클래스, 날짜만 저장하는 date 클래스, 시간만 저장하는 time 클래스, 시간 구간 정보를 저장하는 timedelta 클래스 등을 제공한다.

 

 

 

문제139. 오늘 날짜를 출력하시오

SQL> select sysdate

        from dual;

:

 

from datetime import date

print(date.today() )

 

 

 

문제140. 파이썬으로 오라클의 add_months 함수를 생성하시오

(오늘부터 3 뒤에 돌아오는 날짜를 출력하시오)

 

SQL> select add_months(sysdate,3)

          from dual;

힌트:

from datetime import date

from dateutil.relativedelta import relativedelta

 

result= date.today()+relativedelta(months =+3)

print(result)

 

구현결과:

>>>>>>>print(add_months('2018-11-22', 3) )

 

 

:

def add_months(a,b):

    import datetime

    from dateutil.relativedelta import relativedelta

    a1=datetime.datetime.strptime(a,'%Y-%m-%d')

    result= a1+relativedelta(months=+int(b))

    return result

print(add_months('2018-11-22',3))

 

a=> '2018-11-22'

 


 


 

 

※설명:

 a1=datetime.datetime.strptime(a,'%Y-%m-%d')



 

같은 알파벳 이라도 /소문자가 다르다

m :

M :

 

 

last_day 함수 생성하기: monthrange

select last_day(sysdate)

 from dual;

->이번달 마지막 날짜 출력.(2018-11-30)

 

문제141. 올해 2월의 마지막 날짜를 출력하시오

:

from calendar import monthrange

print(monthrange(2018,2) )

 

 


    

요일  달의 날짜 카운트

 

※설명:

28 : 뽑고자 하는 달의 날짜

3 : 달의 1일의 요일(2018.02.01 목요일)

                

     0   1    2   3   4    5   6

 

 

 

문제142. 위의 결과에서 28 출력하시오!

 

from calendar import monthrange

print(monthrange(2018,2)[1] )

 


 

 

문제143. 아래의 날짜에서 년도만 추출하시오!

'2018-07-18'

 

from datetime import datetime

a='2018-07-18'

b=datetime.strptime(a, '%Y-%m-%d').year

print(b)

 

 

 

 

 

문제144. 아래의 날짜에서 달만 추출하시오

 

from datetime import datetime

a='2018-07-18'

b=datetime.strptime(a, '%Y-%m-%d').month

print(b)

 


 

날짜만 뽑으면???

from datetime import datetime

a='2018-07-18'

b=datetime.strptime(a, '%Y-%m-%d').day

print(b)

 

 

 

 

 

문제145.(오늘의 마지막 문제)

위의 함수들을 이용해서 오라클 last_day 함수를 아래와 같이

생성하시오!

 

print(last_day('2018-07-18') )

출력할 :   2018-07-31

 

 

###################################

 

 

아래의 것들을 이용하시오

import datetime

a1=datetime.datetime.strptime('2018-11-22','%Y-%m-%d').year

                                                                                                         .month

                                                                    .day

 

def last_day(a,b):

    import datetime

    from dateutil.relativedelta import relativedelta

    a1=datetime.datetime.strptime(a,'%Y-%m-%d')

    result= a1+relativedelta(months=+int(b))

    return result

print(last_day('2018-12-31',-5)) 

 

from calendar import monthrange

print(monthrange(2018,7)[1]) #31

 

 

#################################################

 

 

 

 

 

:

def last_day(a):

    from datetime import datetime

    from calendar import monthrange

    year = datetime.strptime(a, '%Y-%m-%d').year

    month = datetime.strptime(a, '%Y-%m-%d').month

    day = monthrange(year,month)[1]

    return str(year) + '-' + str(month) + '-' + str(day)

 

print(last_day('2018-07-18'))

    ||

def last_day(a):

    result=''

    from datetime import datetime

    from calendar import monthrange

    y=datetime.strptime(a,'%Y-%m-%d').year

    m=datetime.strptime(a,'%Y-%m-%d').month

    result=str(y)+'-'+str(m)+'-'+str(monthrange(y,m)[1])

    return result

print(last_day('2018-07-18'))

   

 

 

사용자지정 함수

**이거아니다! 변수2 써야 하잖아.

 근데 값은 나옴.

def last_day(a,b):

    import datetime

    from dateutil.relativedelta import relativedelta

    a1=datetime.datetime.strptime(a,'%Y-%m-%d')

    result= a1+relativedelta(months=+int(b))

    return result

print(last_day('2018-12-31',-5))

 

 

from datetime import datetime 이용

(노가다 버젼)

from datetime import datetime

a='2018-07-18'

b1=datetime.strptime(a, '%Y-%m-%d').year

 

from datetime import datetime

a='2018-7-18'

b2=datetime.strptime(a, '%Y-%m-%d').month

 

from datetime import datetime

a='2018-07-31'

b3=datetime.strptime(a, '%Y-%m-%d').day

 

print(b1,'-',b2,'-',b3)

 

문제140. 파이썬으로 오라클의 add_months 함수를 생성하시오

(오늘부터 3 뒤에 돌아오는 날짜를 출력하시오)

오늘날짜에서 add_month

 

SQL> select add_months(sysdate,3)

          from dual;

힌트:

from datetime import date

from dateutil.relativedelta import relativedelta

 

result= date.today()+relativedelta(months =+3)

                   # .sort() 처럼 파이썬 메소드

                   # .today  : 오늘날짜 갖고오라는 함수.

                   # relativedelta(months/years/days 가능)

print(result)

 

구현결과:

>>>>>>>print(add_months('2018-11-22', 3) )

 

 

클래스 : 같은 유형 함수들 모아놓은거

메소드 : 클래스에 있는 함수( 함수.( )  <<이게 메소드 )

 

 

>>>특정날짜에서  add_months 하고 싶으면???

:

def add_months(a,b):

    import datetime  #내장함수(패키지 함수 갖고와도 상관없음)

    from dateutil.relativedelta import relativedelta  #패키지

    a1=datetime.datetime.strptime(a,'%Y-%m-%d')  #여기서 패키지 바로갖다쓰는거 가능

                            # .strptime(  , ) :datetime이라는 클래스에 있는 data 날짜화 시켜주는 메소드.

    result= a1+relativedelta(months=+int(b))

    return result

print(add_months('2018-11-22',3))

 

a=> '2018-11-22'

 


 

 

 

오늘날짜 함수를 사용하면

def add_months(data,num):

    from datetime import date

    from dateutil.relativedelta import relativedelta

    result=date.today()+relativedelta(months=+3)

    return result

       

print(add_months('2018-11-22',3))

 

결과:  2019-02-24

***내가 입력한 날짜랑 상관없이

   오늘날짜에다가 +3months 해서.

   (현재날짜 2018-11-24)

 

 

 

import 대한 설명(파이썬 200 45. 99페이지)

 

                    functions.py 가져오겠다.

                       

import common.functions

             

     common 이라는 패키지(폴더선택)

 

실습: 카톡으로 받은 파일을

common.zip 압축을 해제하는데 압축을 해제해서

   common 이라는 폴더가 생성되는지 확인을 하고

   common 폴더안에 여러개의 .py 파일중에

   functions.py 있는지 확인하시오.

 

워드패드를 통해 functions.py 열어서 내용 확인

 

 

  def  add_number(n1,n2):

      ret = n1 + n2

      return  ret

함수를 functions.py 워드패드에 넣고 저장

 

스파이더 있는 위치 찾아가서

위치에 common 폴더 저장

 

from common import functions

print(functions.add_number(10,20))

실행해보면

 


 

 

from common import functions as f

--->common패키지에 있는 functions 갖고와라(f= 알리어스)

print(f.add_number(10,20))

 

 

lib -> site-pakage 저장하면 all success.

 

 


 

 

*모듈:

이미 만들어져 있고 안정성이 검증된 함수들을

성격에 맞게 하나의 파이썬 파일에 묶어 만들어 놓은 .

 

외부 모듈 있는 함수들을 활용하려면

모듈을 먼저 우리 코드 가져와서

자유롭게 사용할 있도록 해야 하는데

이런 일을 파이썬에서는 '모듈을 임포트import 한다' .

 

 

 

1. 파이썬 내장 모듈

예제: 파이썬에 내장 모듈이 있는지 확인하는 방법

import sys

print(sys.builtin_module_names)


C:\Users\itwill\Anaconda3\Lib

이렇게 위치 뒤져보면 나온다. 

2번의 예제를 통해 일일이 찾아보면 확실히 있다.

 

 

 

2. sys.path 정의 되어있는 디렉토리

예제: sys.path 내용을 프린트하시오

import sys

for path in sys.path:

    print(path)

 

여기서  site-packages 위치를 확인하라

common 같은 함수를 사용하고 싶으면

site-packages 저장하면 무조건 돌아간다.

 

 

site-packages ?

site-packages 파이썬의 기본 라이브러리 패키지외에

추가적인 패키지를 설치하는 디렉토리.

site-packages 디렉토리에 여러가지 소프트웨어가 사용할

공통 모듈 넣어두면 물리적인 장소에 구애받지 않고

모듈에 접근하여 반입 있다.

 

 

:

C:\Users\itwill\Anaconda3\Lib\site-packages

-> 위치에 functions.py 두면 물리적인 장소에 구애받지 않고

모듈에 접근하여 반입할 있다.

**common 폴더를 갖다놓는게 아니라( 돌아감)

  functions.py 갖다둬야 돌아감.

 

 

 

 

문제146. oracle_func.py 라는 이름으로 메모장을 열고

안에 어제 만들었던 오라클 함수들을 저장하시오

 



 

어제 def 만들었던 함수들을 메모장에 저장.

저장할 '모든파일'-> oracle_funcs.py 저장

 

import oracle_funcs as o

                      

             함수 이름

print (o.initcap('smith'))

 



 

 

오라클의 next_day 함수를 파이썬으로 생성하기

 

문제147. 오늘 날짜에서 하루 더한 날짜가 어떻게 되는가?

 

import datetime as d

print(d.datetime.today() + d.timedelta(days=1) )

                                                   

       클래스  메소드(함수)  시간구간정보   하루더한 날짜

**+ 앞에서 하기때문에,

   days 값은 = 처리한다.(2 주고 싶으면 days=2 이렇게.)

datetime 패키지

datatime 패키지에서는 날짜와 시간을 함께 저장하는 datetime 클래스, 날짜만 저장하는 date 클래스, 시간만 저장하는 time 클래스, 시간 구간 정보를 저장하는 timedelta 클래스 등을 제공한다.

 

클래스 라는게, 책장에서 만화책/전공책/소설/에세이 등등

분류화 해서 정리해둔거라고 생각하면 된다.

 

 

 

번외문제:

def next_day(date,num):

    from datetime import datetime   

    import datetime as d

    a=datetime.today().strptime(date,'%Y-%m-%d')

    result=a+d.timedelta(days=int(num))

#timedelta 내장함수 datetime 있는 클래스메소드.

    return result   

print(next_day('2018-11-24',3))   

 

****내장함수 datetime 메소드 timedelta

     days 가능.

여러용도로 활용 가능한 dateutil.relativedelta 패키지의

relativedelta 훨씬 유용하다.

 

 

특정날짜에서 날짜 더하기

1.함수 relativedelta 활용 (from dateutil.relativedelta)

def nextday(date,num):

    from datetime import datetime

    from dateutil.relativedelta import relativedelta

    a=datetime.strptime(date,'%Y-%m-%d')

    result=a+relativedelta(days=+int(num))

    return result

   

print(nextday('2018-11-24',3))   

 

 

2.함수 timedelta 활용(내장함수 datetime 활용)

def nextday(date,num):

    from datetime import datetime

    import datetime as d

    a=datetime.strptime(date,'%Y-%m-%d')

    result=a+d.timedelta(days=int(num))

    return result

print(nextday('2018-11-24',3))

 

 

 

현재 날짜에서 nextday

*힌트: today() 함수는 datetime패키지에 있음

 

1.함수 timedelta 사용해서(내장모듈 datetime)

def nextday(date,num):

    from datetime import datetime as d

    import datetime

    a=d.today().strptime(date,'%Y-%m-%d')

    result=a+datetime.timedelta(days=int(num))

    return result

print(nextday('2018-11-20',2))

 

 

2.함수 relativedelta 사용해서(패키지 dateutil.relativedelta)

def nextday(date,num):

    from datetime import datetime as d

    from dateutil.relativedelta import relativedelta

    import datetime

    a=d.today().strptime(date,'%Y-%m-%d')

    result=a+relativedelta(days=+int(num))

    return result

print(nextday('2018-11-20',2))

 

 

 

 

오라클의 날짜 함수

 months_between

 add_months

 next_day

 last_day

 

 

 

문제148. 아래와 같은 함수를 생성하시오

(내장함수 datetime timedelta 이용)

 

print(next_day('2018-07-18'),2) )

 

def next_day(a,b):

    import datetime as d  #여기의 datetime 내장모듈

    a1=d.datetime.strptime(a,'%Y-%m-%d')

    c=a1+d.timedelta(days=b)

    return c

print(next_day('2018-07-18',2))

 

출력값

 

------다른풀이-----

def nextday(date,num):

    import datetime as d

    from datetime import datetime

    a=datetime.strptime(date, '%Y-%m-%d')

    result=a+d.timedelta(days=int(num))

    return result

print(nextday('2018-07-18',2))

 

 

 

 

 

 

 

문제149.

오늘이 무슨 요일인지 출력하시오

힌트:

datetime 패키지에서

.today()

.weekday()

메소드 갖고와서 사용할 것.

 

 

from datetime import datetime as d

#여기의 datetime datetime패키지 있는거

print(d.today().weekday() )

                       

      메소드    메소드

결과:  4

 

※월           

   0   1    2   3   4    5   6

 

 

 

번외문제:

오늘날짜의 요일을 출력하시오

 

dy=['월요일', '화요일', '수요일', '목요일', '금요일', '토요일', '일요일']

 

def weekday(date):

    from datetime import datetime as d

    a=d.today().strptime(date,'%Y-%m-%d')

    b=d.weekday(a)  # d.weekday(a) = 5

    return dy[b]

 

print(weekday('2018-11-24'))

결과: 토요일

 

 

 

특정날짜의 요일을 출력하시오

 

dy=['월요일', '화요일', '수요일', '목요일', '금요일', '토요일', '일요일']

def weekday(date):

    from datetime import datetime as d

    a=d.strptime(date,'%Y-%m-%d')

    b=d.weekday(a)

    return dy[b]

 

 

print(weekday('2018-11-24'))

결과: 토요일

 

 

 

 

문제150.

문제149번을 다시 수행하는데 숫자 4 나오는게 아니라

금요일 이라고 출력되게 하시오

(def 안씀)

 

:

dy=['월요일', '화요일', '수요일', '목요일', '금요일', '토요일', '일요일']

 

from datetime import datetime as d

print(dy[d.today().weekday()])

 

--------------------

조금더 깔끔하게 변수에 담아서

>>>

dy=['월요일', '화요일', '수요일', '목요일', '금요일', '토요일', '일요일']

 

from datetime import datetime as d

a = d.today().weekday()

print(dy[a])

 

 

 

문제151.(점심시간 문제)

아래의 데이터를 딕셔너리로 만드시오

(딕셔너리 이름: week_dic)

 

   keys             values

월요일   :     0

화요일   :     1

수요일   :     2

목요일   :     3

금요일   :     4

토요일   :     5

일요일   :     6

 

week_dic={}

week_dic['월요일']='0'

week_dic['화요일']='1'

week_dic['수요일']='2'

week_dic['목요일']='3'

week_dic['금요일']='4'

week_dic['토요일']='5'

week_dic['일요일']='6'

 

print(week_dic)

 


 

 

 

 

 

months_between 함수를 파이썬으로 만들기

 

SQL> select months_between(sysdate,hiredate)

        from emp;

설명: 날짜와 날짜 사이의 개월수를 출력

 

예제:

import datetime #내장모듈

d1='2018-07-18'

print(type(d1) )

 

 

문자형으로 나온걸 날짜형으로 !

 

a=datetime.datetime.strptime(d1,'%Y-%m-%d')

     #패키지.패키지.함수       (d1, 년월일)

d1='2018-07-18'

print(type(a))   #날짜형

print(a.year)   # 2018

print(a.month)  #7

 

 

*아래 날짜 사이의 개월 ?

2017-01-01 ~ 2018-07-01

18개월

 

2017-2017=12개월

07-01=6개월

 

 

문제152. months_between 함수를 파이썬으로 구현하시오

 

print(months_between('2017-01-01', '2018-07-01') )

18

 

힌트:

datetime 패키지에서 datetime 함수 갖고와서

strptime 쓰고 year/month/day 골라서 지정할 것.

 

년월일의 차를 뽑은거

def months_between(date1,date2):

    from datetime import datetime

    from dateutil.relativedelta import relativedelta

    d1=datetime.strptime(date1,'%Y-%m-%d')

    d2=datetime.strptime(date2,'%Y-%m-%d')

    x=(d2.year-d1.year)*12

    y=d2.month-d1.month

    result=x+y

    return result

print(months_between('2017-01-01','2018-07-01'))

 

------------------

 

월들만의 차를 뽑은거

print(months_between('2017-07-01','2107-01-01)

파이썬:

def months_between(date1,date2):

    from datetime import datetime

    from dateutil.relativedelta import relativedelta

    d1=datetime.strptime(date1,'%Y-%m-%d').month

    d2=datetime.strptime(date2,'%Y-%m-%d').month

    result=d2-d1

    return result

 

print(months_between('2018-11-15','2018-12-15'))

||

def months_between(date1,date2):

    from datetime import datetime

    from dateutil.relativedelta import relativedelta

    d1=datetime.strptime(date1,'%Y-%m-%d')

    d2=datetime.strptime(date2,'%Y-%m-%d')

    result=d2.month-d1.month

    return result

print(months_between('2018-11-15','2018-12-15'))

 

 

 

 

일반함수

1. nvl

2. decode

 

문제153. 오라클의 nvl 함수를 파이썬으로 구현하시오

SQL> select ename,nvl(comm, 0)

          from emp;

 

파이썬

 print( emp_list[1], nvl( emp_list[6], 0) )

 

def nvl(x,y):

    if x is '':

        x=y

        return y

    return x

 

import  csv

file = open("d:\\csv\\emp_comm.csv","r")

emp_csv = csv.reader(file)

for  emp_list in  emp_csv:

    print( emp_list[1], nvl( emp_list[6], 0) )

---->다른방법

def nvl(a,b):

    if a == '':

        return b

    else:

        return a

 

 

문제154.

오라클의 decode 함수를 파이썬으로 구현하시오

SQL> select ename, sal, deptno,

                decode(deptno,10,sal*0.1,0) as "bonus"

          from epm;

 

:

def decode(a,b,c,d):

    if a==str(b):

        return c

    return d 

   

import csv

file=open("d:\\csv\\emp_comm.csv",'r')

emp_csv=csv.reader(file)

for emp_list in emp_csv:

print(emp_list[1], emp_list[5], \

decode(emp_list[7],10,int(emp_list[5])*0.1, 0 ) )

 

 

 

몬테카를로 알고리즘

 " 많은 노가다를 통해서 답을 알아내는 "

 

1. 강화학습     : 컴퓨터가 하나의 게임을 스스로 수차례 수행 하면서

                      게임을 배워나가는 방법

2. 데이터 분석 : 6 조은성 학생이 지금 강남에 삼성생명에서

                    데이터분석 프로젝트를 하고있는데

                    몬테카를로 알고리즘으로 수행

:

 삼성생명에서 금융사고가 났을 때를 대비해서

 평상시에 가지고 있어야 자금이 어떻게 되는지를 예측

 

 컴퓨터로 수많은 금융사고를 랜덤으로 일으켜서

 대비해야할 금액을 알아냄

 

 

 

*수학을 이용하여 원하는 부위에 찍기

      


 

컴퓨터에게 파란색 부분에만 점을 찍도록 명령내리고 싶다.

-빨간색 사각형을 100 이라 하면

  파란색 원이 갖는 값은 

X / 100

                        이다.

-빨간색 사각형의 넓이는 1x1 = 1

-파란색 원의 넓인은 1x1xpi(파이)x 1/4 = 1/4pi  ( / :모두 분수 표시)

  **원의 넓이 구하는 공식? 반지름*반지름*3.14

 

-빨간색 사각형안에 1000개의 점을 찍었다고 가정하면

 x=파란색의 1/4원에 찍히는 점의 개수        


      

-x개수가 정확히 파란색 원에 찍히도록 하려면

 **원의 방정식: x제곱 + y제곱 = 원의 반지름 제곱

        


 

0.5제곱 + 0.5제곱 <= 반지름제곱(=1)

0.9제곱 + 0.9제곱 >= 반지름제곱(=1)

 

즉,

x제곱+y제곱 <= 원의 반지름 제곱

충족시키는 값으로 지정해주면

파란원 안에 점이 찍히게 있다.

 

 

 

문제155.

0에서 1 사이의 숫자를 랜덤으로 생성해보시오

import random   #내장모듈/내장함수 random

#메소드 uniform(숫자1 ,숫자2 )=숫자1~숫자2 범위지정

x= random.uniform(0,1)  #0~1사이값 랜덤으로 갖고와라.

y=random.uniform(0,1)

print(x)

print(y)

 

실행시킬 마다 1이하의  소수값이

랜덤으로 나온다.

 


 


 

 

문제156. 위의 코드를 for loop문을 이용해서

10000 반복시키시오

(편의상 10 하겠음)

 

import random

for i in range(0,10):

    x=random.uniform(0,1)

    y=random.uniform(0,1)

    print(x)

    print(y)

 

 

문제157.

x**2 + y**2 <= 1 보다 작으면 부채꼴 안에 들어가는 점이므로

공식을 이용해서

pi(파이) 구하시오

                      ?         <--------부채꼴 안에 들어가는 점의 갯수

pi =--------------------------------- x 4

                   10000

 

:

import random

cnt = 0

 

for i in range(0,10000):

    x = random.uniform(0, 1)

    y = random.uniform(0, 1)

    if x**2 + y**2 <= 1:

        cnt += 1  # if 충족시키면 카운트해라(=점찍어라)

        pi = cnt*(1/10000)*4

print(pi)

 

 

 

 

문제158. 위의 정사각형 안에 찍을 점의 갯수를 물어보겠금

코드를 수정하시오

>>1/4원의 점의 갯수

 

정사각형 안에 들어갈 점의 갯수를 입력하세요~ 100000000

파이(pi) 3.14583545

 

inp_dot=int(input('정사각형 안에 들어갈 점의 갯수 입력'))

 

import random

cnt = 0

 

for i in range(0,10000):

    x = random.uniform(0, 1)

    y = random.uniform(0, 1)

    if x**2 + y**2 <= 1:

        cnt += 1

        pi = cnt*(1/inp_dot)*4

print('파이는',pi,'입니다')

 

 

 

 

40. 함수 인자(매개변수) 이해하기

예제:

 def add_txt(t1, t2='파이썬'):

print(t1+'  :  ' + t2)

add_txt('베스트')  # t 1,2 지정 안해주면 t1으로 알아서 감.

add_Txt(t2='대한민국', t1='1')

 


 


 

***add_txt 변수 바꿀 있다.

 

def add_txt(t1='쉬운', t2='파이썬'):

print(t1+' : '+t2)

add_txt('베스트','자바')

add_txt()

 


 


 

 

 

def add_txt(t1='쉬운', t2='파이썬'):

print(t1+' : '+t2)

add_txt('베스트','자바')

add_txt('kkkk') #위치 안정해준건 t1으로 간다.

 


 

 

 

가변형 매개변수?

문자열, format() 함수처럼 매개변수의

 유동적인 함수를 만들고 싶을 사용하는 변수

 

함수를 실행할 매개변수를 10, 20개를 입력해도

제대로 동작한다.

예제:

def merge_string(*text_list):

result=''

for s in text_list:

result=result+s+' '

return result

print(merge_string('he','goes','kitcheon','but','he','hates','blacknoodle'))

 

 


 


 

 

 

문제159. 지난번 최대공약수 문제를

def 함수써서 다시 실행하시오

 

def maxyaksu(a,b):

    x=min(a,b)

   

    while x>=1:

        if a%x==0 and b%x==0:

            result=x

            break      #이거 안해주면 result 여러 나옴.

        else:

            x-=1

    return result

 

print(maxyaksu(24,18))

 

 

 

문제161. (오늘의 마지막 문제)

가변 매개변수를 사용해서

아래와 같이 실행해도 최대 공약수가 나오게 하시오

 

print(maxyaksu(16, 24) )

8

 

print(maxyaksu(24, 16, 8))

8

 

print(maxyaksu(24, 16, 8, 12))

4

 

내가 만든 오답:

최대공약수

def maxyaksu(*n):

    a=[]

    n=list(*n)

    n.sort()  #n=[3,6,12,30]

    for i in n:

        a.append(i) #a=[3,6]

        b=a[0] #b=[3]

        while len(a)==2 and b>=1:

            if a[0]%b==0 and a[1]%b==0:

                a=b  <<<<<<--------이러면 a list 벗겨지고 a=3 되버림.

                                for 문에서 append 먹질 못함.

                return a

            else:

                b-=1

 

data=[30,12,6,4]

print(maxyaksu(data))

 

다시고침

def maxyaksu(*n):

    a = []

   

    n=list(*n)

    for i in n:

        a.append(i)

        b = a[0]

        while len(a) == 2 and b >= 1:

            if a[0] % b == 0 and a[1] % b == 0:

                a[0] = b

                a.remove(a[1])

                break

            else:

                b -= 1

        b = []

    return a

data = [24, 18, 55, 45, 3]

print(maxyaksu(data))

 

풀면서 알게된

  1. n=list(*n)  

   n 값이 튜플로 받아진다.

 ex) *n= 1,2,3,4

      n=list(*n) --->  n=(1,2,3,4)

 

 2. 튜플을 for 문에 넣으면 list 씌워짐

 ex) n=(1,2,3,4)

     for i in n:

       ->>> i = [1,2,3,4]

               그래서 for 하나씩 돌고(리스트로 묶여 있어서)

                  1,2,3,4 한번 돌고 끝남.

 

 

:

def maxyaksu(*n):

    result=[]

    for i in n:

        result.append(i)

        x=result[0]

        while x>=1 and len(result)==2:

            if result[0]%x==0 and result[1]%x==0:

                result[1]=x

                result.remove(result[0])

            else:

                x=x-1

    return x     

print(maxyaksu(24,18,10,3))

--->이건 애초에 값을 list=[24.18,10,13] 으로 안해줌

 

 

--------------------------------------------

유클리드 호제법

 

def gcd(a,b):

    if b==0:

        return a

    return gcd(b,a%b)

 

print(gcd(60,24))

return  gcd 함수를 써줬기 때문에

결국 if b==0

          return a

할때까지 계속 나누고, 변수값이 바뀐다.

return 으로 반복주기 가능한 !!!!

 

과정보기

 

def gcd(a,b):

    print("gcd",a,b)

    if b==0:

        return a

    return gcd(b,a%b)

 

print(gcd(60,24))

 

 



 

 

 

 

우용답:

def maxyaksu(a,b):

    i=1

    k=2

    if b==0:

        return a

    else:

        while k<=a and k<=b:

            if a%k==0 and b%k==0:

                i=k

            k=k+1

    return i   

 

 

def maxyaksu2(*n):

    num=0

    for i in n:

        num=maxyaksu(i,num)

    return num

print(maxyaksu2(24,16,7,12))

 

 

 

41. 지역변수와 전역변수 이해하기 global

"변수는 자신이 생선된 범위 (코드불럭) 안에서만 유효하다.

 함수 안에서 만든 변수는 안에서만 살아있다가

 함수 코드의 실행이 종료되면 생명을 다한다"

 

이것을 지역변수라고 한다

 

이와는 반대로 함수 외부에서 만든 변수는 프로그램이 살아있는 동안에

함께 살아있다가

프로그램이 종료가 되면 같이 소멸된다.

 

이렇게 프로그램 전체를 유효범위로 가지는 변수를 전역변수 라고 한다.

 

예제:

 

strdata='전역변수'

 

def func1():

    strdata='지역변수'

print(func1())

 

 

 

*지역변수를 설명하는 코드

 

param=10

def func2(param):

    param=1

func2(param) 

print(param)   #무엇이 출력될까?

 


 

func2 라는 함수를 밖에서 줬으니

함수 밖에 있는 print 전역변수 영향을 받는다.

 

" 함수 안에서 만든 변수는 함수 안에서만 살아있다가

 함수 코드의 실행이 종료되면 생명을 다한다"

변수를 지역변수라고 한다.

 

 

 

 

param=10

def func3():

    global param 

    param=50

func3()    #return 없이 func3() 실행한다.

print(param)

 



함수내부에서 전역변수를 선언해줬기 때문에

50 출력된다

"전역변수는 함수내부 뿐만 아니라 함수 외부에서도 사용되는

프로그램 변수이다."

 

 

 

*프로그램 이란? 여러가지 기능(함수) 모아놓은 코드

 

어떤 변수를 전역변수로 사용해야 하는가?

프로그램 전체에서 공통적으로 사용되고 변하지 않는

데이터는 전역변수로 사용한다.

 

: pi=3.14568735255564

함수1(기능: 원의 넓이를 구하는 함수):

global pi

print(pi * 반지름 * 반지름)

 

함수2(기능: 두개의 원의 넓이를 구하는 함수):

global pi

print(pi...................)

 

 

 

 

문제162.

위의 예제를 코드로 구현하시오

 

pi=3.145687572

 

함수 두개를 생성

 

pi=3.141592653589793

def cycle_func1(r):

    global pi

    return (pi * r * r)

def cycle_func2(r):

    global pi

    return (2 * (pi * r * r))

print(cycle_func1(5))

print(cycle_func2(5))

 

print(cycle_func1(5) )  # 개의 원의 넓이 출력

78.5

 

print(cycle_func2(5) )  # 개의 원의 넓이 출력

78.5 + 78.5 = 157 157.0

 

 

 

42. 함수 리턴값 이해하기 (return)

"모든 함수는 이름을 갖고 있다.

이름을 불러주면 파이썬은 이름 아래 정의되어 있는

코드를 실행한다

이때 함수를 부르는 행위를 호출이라고 하고

함수를 부르는 코드를 호출자라고 한다.

함수가 호출자에게 결과를 돌려주는 것을 반환(return)이라고 한다."

 

 

예제:

def initcal(val):

    return(val[0].upper()+val[1:].lower() )  #return : 호출

print(initcap('smith')   #호출자

 

 

param=10

def func3():

    global param 

    param=50

func3()    #함수 안에 함수이름쓰면, return 없이 func3() 실행하겠다 라는뜻

print(param)

 

 

param=10

def func3():

    global param 

    param=50

func3()    #함수 안에 함수이름쓰면, return 없이 func3() 로 실행하겠다 라는뜻

print(param)  #무엇이 출력될까?

####

print(abs(-9))  #절대값 뽑는 함수 abs

 

 

문제163. abs 쓰지 말고 if 문으로 my_abs라는 함수를

생성하시오!(무조건 양수로 출력하는 함수)

 

def my_abs(data):

    if data<0:

        return -1*data

    else:

        return data

print(my_abs(9))

 

 

 

 

 

 


728x90
반응형

'python' 카테고리의 다른 글

10. class  (0) 2019.03.25
9. from/import  (0) 2019.03.25
★리스트/함수  (0) 2019.03.25
7. 리스트, 튜플, dictionary  (0) 2019.03.25
6. 문자열, escape  (0) 2019.03.24