whatisthis?

Phython. 파이썬 코딩 기초편-06 본문

WEB STUDY/PHYTHON | BACK-END

Phython. 파이썬 코딩 기초편-06

thisisyjin 2021. 9. 15. 13:09

 

<Quiz>

 

당신은 카카오 서비스를 이용하는 택시기사이다.

50명의 승객과 매칭 기회가 있을때, 총 탑승 승객 수를 구하는 프로그램을 작성하시오.

 

 

<조건>

1. 승객별 운행 소요 시간은 5분 ~ 50분 사이 난수로 정해진다.

2. 당신은 소요시간 5분 ~ 15분 사이 승객만 매칭해야 한다.

 

<출력 예시>

[O] 1번째 손님 (소요시간 : 15분)
[  ] 2번쨰 손님 (소요시간 : 50분)
[O] 3번째 손님 (소요시간 : 5분)
...
[  ] 50번째 손님 (소요시간 : 16분)

총 탑승 승객 : 2 분

 

 

 

내가 작성한 코드. 

 

# 50명의 손님 중 탑승 승객 수 구하는 프로그램

from random import *

count = 0;

for matching in range(1, 51):
    time = randint(5, 51)
    if(5 <= time <= 15):
        print("[O] {0}번째 손님 (소요시간 : {1}분)".format(matching, time))
        count += 1
    else:
        print("[ ] {0}번째 손님 (소요시간 : {1}분)".format(matching, time))
print("총 탑승 승객 : " + str(count) + "분")
1. randint(시작,끝) + a 이용
2. int(random() * 끝값 ) + a ) 이용
3. randrange(시작, 끝+1) + a 이용

 

<수정할 것>

randint를 사용했으므로 (5,50)으로 작성해야한다.

randrange의 경우엔 (5,51)이다.

 

 

*** 점점 퀴즈를 풀면서 효율적으로 코드를 작성할 줄 알게 된 것 같다.

강의에서 언급된 모범답안과 정확히 일치했다.

단, randint이므로 끝값+1이 아닌 그냥 끝값만 적으면 된다.

 

 

 


1. 함수

<사용자 함수의 정의>

def 함수명 () :

def = define (v.정의하다)

 

 

예제1.

#함수 정의시 def 함수명():

def open_account():
    print("새로운 계좌가 생성되었습니다.")

open_account()

 

def로 함수를 정의하기만 해선 아무 결과도 나타나지 않는다.

함수명() 과 같이 함수를 불러와야 결과가 시행된다.

 

 

 

 

___

예제 2.

 

#balance = 잔액, money = 입금할 돈

def deposit(balance, money):
    print("입금이 완료되었습니다. 잔액은 {0}원 입니다.".format(balance + money))
    return balance + money

balance = 0
balance = deposit(balance, 1000)
print(balance)

이처럼 함수에 입력값이 있도록 설정할 수도 있다.

(balance, money라는 값)

 

format을 통해 balance와 money를 더한 값을 출력했지만,

balance 변수에 더한 값을 저장하기 위해서는  return 을 통해 저장해주어야한다.

 

return balance + money라는 의미는 balance값에 money를 더한 값을 반환한다는 의미이다.

 

 

___

 

예제 2-(2)

 

def withdraw(balance, money):
    if balance >= money:
        print("출금이 완료되었습니다. 잔액은 {0}원 입니다.".format(balance - money))
        return balance - money
    else:
        print("잔액이 부족합니다. 잔액은 {0}원 입니다.".format(balance))
        return balance

다음과 같이 출금하는 withdraw 함수도 선언한다. 

단, 이때 잔액이 출금하는 돈보다는 커야하므로 if-else문을 이용하여 두가지 경우로 나눈다.

 

balance = 0
balance = deposit(balance, 1000)
balance = withdraw(balance, 2000)

위에서 선언했던 deposit 함수로 balance 변수에 1000원을 더해주고, (입금)

withdraw함수로 balance 변수에서 2000을 빼려고 시도해보면 (출금)

 

if문에서 balance >= money 에 의해 else문이 실행되어 다음과 같은 결과가 나온다.

 

 

 

+) balance = withdraw(balance, 500)으로 바꿔본 결과 정상적으로 if문의 결과가 시행되었다.

 

 

___

 

예제 2-(3)

 

def withdraw_night(balance, money): #저녁에 출금
    commision = 100
    return commision, balance - money - commision

commision, balance = withdraw_night(balance, 500)
print("수수료가 {0}원이며, 잔액은 {1}원 입니다.".format(commision, balance))

이번에는 return에서 두가지 값을 한번에 반환하도록 하는 예제이다.

commision값을 return하고, 잔액인 balance - money - commision 값을 return한다.

 

따라서, 변수 두가지에 대한 값을 반환했으므로

commision, balance = withdraw_night(balance, 500)

과 같이 입력해야한다.

 

 


2. 기본값 설정

 

**참고 : 한 문장이 너무 길때는 역슬래시(\)를 쳐주고 엔터를 치면 두줄을 한줄로 알아서 인식한다.

 

def profile(name, age, main_lang):
    print("이름 : {0}\t나이: {1}\t주 사용 언어: {2}" \
        .format(name, age, main_lang))

profile("김씨", 20, "파이썬")
profile("최씨", 25, "자바")

실행 결과

 

이때, 모든 사람의 나이와 사용 언어가 같다면?

일일히 입력하지 않고 기본값을 설정해주면 된다.

 

#나이와 언어가 같은 사람들의 경우 기본값을 설정해주면 된다.

def profile(name, age=17, main_lang="파이썬"):
    print("이름 : {0}\t나이: {1}\t주 사용 언어: {2}" \
        .format(name, age, main_lang))

profile("김씨")
profile("최씨")

다음과 같이 함수의 3개의 인자중에서 name만 입력해도 된다.

(나머지 age, main_lang에는 기본값이 설정되어있으므로)

 

 

But. 만약 기본값이 설정되어있어도 직접 입력한 경우에는 그 값으로 대신해서 나오게 된다.

profile("정씨",18)

 

 


 

 

3. 키워드값 

def profile(name, age, main_lang):
    print(name, age, main_lang)

profile(name="김씨", main_lang="자바", age=25)
profile(main_lang="파이썬", age=21, name="최씨")

+) 응용

 

profile("김씨")
profile(name="김씨")

profile("김씨",17,"파이썬")
profile( name="김씨", main_lang="파이썬")

응용 ver. 결과

 

 


4. 가변인자

 

def profile(name, age, lang1, lang2, lang3, lang4, lang5):
    print("이름 : {0}\t나이 : {1}\t".format(name, age), end=" ")
    print(lang1, lang2, lang3, lang4, lang5)

profile("김씨", 22, "파이썬", "C", "자바", "C#", "C++")

 

이때, 만약 인자수가 5개가 아니고 6개로 늘어난다면?

또는 사람에 따라서 할줄아는 언어가 3개라면 남은 두칸은 "" 와 같이 빈칸으로 입력해야한다.

 

이를 해결하려면 '가변인자'를 이용하자!

___

 

def profile(name, age, *language):
    print("이름 : {0}\t나이 : {1}\t".format(name, age), end=" ")
    for lang in language:
        print(lang, end=" ")
    print()

profile("김씨", 22, "파이썬", "C", "자바", "C#") 
profile("최씨", 28, "html", "css")

가변인자는 스타키(*)를 변수명 앞에 붙여서 선언한다.

예> *language

 

이는 이에 해당하는 인자수가 1개이든, 100개이든 상관없이 자동으로 크기가 조정이 되는 '가변' 인자이다.

 

위 예제에서도 김씨는 4가지의 언어를, 최씨는 2가지의 언어를 할 수 있는데

다른 "" 을 입력하거나 변수를 추가하는 등의 불편함 없이 자동으로 알아서 가변인자가 해결해준다.

 

 

 

 

** for문을 이용하여 lang, end=" " 를 실행한 이유는 줄바꿈 없이 나열하기 위해서이다.

  for lang in language:     
        print(langend=" ")
    print()                       

+) 마지막줄에 for문 바깥에 print()가 있는 이유 -> 줄바꿈을 위해서!

 

 


5. 지역변수와 전역변수

 

지역변수 = 호출이 끝나면 사라지는 것

전역변수 = 모든 공간에서 부를 수 있는 것

 

 

gun = 10

def checkpoint(soldiers):
    global gun #전역공간에 있는 gun 변수 사용 
    gun = gun - soldiers
    print("[함수 내] 남은 총 : {0}".format(gun))

print("전체 총 : {0}".format(gun))
checkpoint(2) 
print("전체 총 : {0}".format(gun))

 

global 변수명 << 전역변수 사용함.

 

만약, 함수 내에서 gun이라는 변수를 선언해서 사용했다면,

첫번째 줄에 있는 gun, 즉 전역변수인 gun과는 달리

지역변수인 gun으로써 작용했을 것임. (즉, 함수내에서만 쓰이고, 함수 호출이 끝나면 사라짐)

 

 

그러나 전역함수보다는 return값을 이용하는것을 권장.

 

 

 

cf. return값을 사용한 예제

gun = 10 # 이건 함수 밖에서 선언한 gun함수(전역)

def checkpoint_ret(gun, soldiers): # 함수 내에서 gun과 soldiers라는 인자 사용
    gun = gun - soldiers 
    print("[함수 내] 남은 총 : {0}".format(gun))
    return gun # return을 통해 gun값에 출력을 보내버림

print("전체 총 : {0}".format(gun)) # 첫번째 줄에 있는 gun변수 값
gun = checkpoint_ret(gun, 2) # 함수에서 soldeirs를 2로 하여 gun값을 return 받아옴 
print("남은 총 : {0}".format(gun)) # 함수에서 받아온 gun값 출력

 

 


 

<Quiz>

 

표준 체중을 구하는 프로그램을 작성하시오

 

*공식

 

남자 : 키(m) * 키(m) * 22

여자 : 키(m) * 키 (m) * 21

 

<조건>

1. 표준체중은 별도의 함수 내에서 계산

- 함수명 : std_weight / 전달값 : height, gender

 

2. 표준 체중은 소수점 둘쨰자리까지 표기

 

 

 

<출력 예제>

키 175cm 남자의 표준 체중은 67.38kg 입니다.