본문 바로가기
국비 교육/파이썬

[파이썬] 함수 - 2

by 육츠 2023. 11. 5.
Contents 접기

Filter()

리스트의 요소 중 조건에 맞는 것만 골라 list 로 리턴

def flunk(s):
    return s < 60 # T F 반환

score = [45,89,72,53,94]
for s in filter(flunk,score):
    print("낙제점수:",s)
# 낙제점수: 45
# 낙제점수: 53

 

Map()

리스트를 변환 함수로 처리한 후 그 결과를 list로 리턴
map(function_name, list_data)

def half(s):
    return s/2
    
data = [45,89,72,53,94]

# map은 주소값을 출력하는 것이기 때문에 원소를 보고 싶으면 list 에 넣어야함
# print(list(map(half,data))) 

for d in map(half,data):
     print(d, end=', ')
# 22.5, 44.5, 36.0, 26.5, 47.0,

 

Reduce()

리스트를 집계함수로 처리 후 그 결과를 단일의 값으로 리턴
집계함수는 두개의 인자를 받는다(누적자, 현재값) 
reduce(function_name, list_data)

from functools import reduce
# import 필요

def sum(a,b): # reduce(누적자, 현재 새로 들어온 값)
    return a + b
# a = a+b 와 같다.

score = [45,89,72,53,94]
print(reduce(sum,score))  # 353

alphabat = ['H','e','l','l','o',' ','P','y','t','h','o','n']
print(reduce(sum,alphabat)) # join과 같다
# Hello Python

 

Lambda()

단일문으로 표현되는 익명 함수. (그러나 코드의 직관성이 떨어지는 편임)
lambda 매개변수 : 리턴할 수식

def myfunc(x,y):
    return x+y
    
result = myfunc(10,20)
print(result) # 30

result2 = lambda x,y : x+y # 주소값을 가짐
print(result2(10,20)) # 30

a = [1,2,3,4,5]
list(map(lambda x : x**2, a))  # a의 원소들을 하나씩 꺼내와 x에 넣어줌
# [1, 4, 9, 16, 25]
x = [1,2,3,4,5]
y = [10,20,30,40,50]

list(map(lambda x1,y1 : x1+y1, x,y))
# [11, 22, 33, 44, 55]

x = [1,2,3,4,5]
reduce(lambda a,b : a+b, x)
# 15

 

[문제] 1~ 10 사이의 연속된 값을 함수를 이용하여 생성한 후 map과 lambda를 이용하여 짝수에 해당하는 값만 제곱한 값만 제곱하고 홀수는 원래 원소로 갖는 리스트를 생성하세요.

# map(함수이름, 연속형 데이터)
# lambda 매개변수: 리턴 식

print(list(map(lambda x : x**2 if not x%2 else x , range(1,11))))
# [1, 4, 3, 16, 5, 36, 7, 64, 9, 100]

 

내부 함수 (지역 함수)

파이썬에서는 함수를 값으로 처리한다. 함수를 다른 변수에 대입할 수 있다. 인수로 전달 가능

내부함수 : 함수안에 정의된 함수. 코드 중복을 피하기 위해 주로 사용한다.
closure : 함수안에 정의된 다른 함수. 내부함수는 외부에서 호출할 수 없다.

# 내부함수
def outer(a,b):
    def inner(c,d):
        return c+d
    return inner(a,b)

print(outer(4,7)) # 11

 

docstring

함수에 대한 설명문. help() 와 __doc__ 를 이용해 출력한다.

def echo(anything):
    'echo retutn its input argument'
    return anything

echo('Hello')

echo.__doc__  # 가볍게 
# 'echo retutn its input argument'

help(echo) # 세부적인 내용까지
# Help on function echo in module __main__:

# echo(anything)
#     echo retutn its input argument

 

표준 모듈

import

- 모듈은 파이썬 코드를 작성해놓은 스크립트 파일. 안에는 함수, 변수, 클래스 등이 정의되어 있다.
- 외부의 모듈을 가져와 사용할때는 import명령을 사용하며 호출할 때에는 함수 앞에 모듈명을 붙인다.
- 특정 함수나 클래스만 import 하는 경우에는 ' from 모듈 import 함수명, 클래스명 작성 '
- 모듈의 모든 함수를 불러올때는 함수명 자리에 * 문자를 사용한다.
- 모듈의 이름이 길고 복잡할때는 as 다음에 별칭 지정이 가능하다. ' import math as m'

 

time 모듈

날짜와 시간 관련 기능 제공 

import time

t= time.time()
print(t) # 초단위의 시간
print(time.ctime()) # 초단위를 -> 날짜 시간 형식으로 출력
# 1699120823.8401725
# Sun Nov  5 03:00:23 2023

import time

start = time.time()
sum = 0
for i in range(1,100000001): # 1~1억
    sum += i
end = time.time()
print("1~1억까지 합계 계산 총 소요시간: %.2f초" %(end- start))
# 1~1억까지 합계 계산 총 소요시간: 8.11초

import time

# print(time.localtime()) # 지역 정보 기반 시간에 대한 정보
now = time.localtime()  # 로컬타임 객체

print(f"{now.tm_year}년 {now.tm_mon}월 {now.tm_mday}일")
print(f"{now.tm_hour}시 {now.tm_min}분 {now.tm_sec}초")
# 2023년 11월 5일
# 3시 1분 27초

import time

print ('이 문장은')
time.sleep(2) # 매개변수 전달된 초 만큼 프로그램의 실행을 잠시 중단
print('2초 단위로')
time.sleep(2)
print('출력됩니다.')

 

random 모듈

난수를 생성하는 기능 제공

import random

# 컴퓨터의 난수는 컴퓨터 시스템 시간을 기준(seed value)으로 발생
# 따라서 기준값을 고정해 놓으면 항상 동일한 난수 값이 발생된다.
random.seed(0)

for i in range(5):
    print(random.randint(1,10)) # end 포함

import random

food= ['짜장면',"짬뽕","탕수육","군만두"]
random.shuffle(food) # 그냥 섞기만함. 섞은 결과를 반환하지 않는다ㅏ
print(food)

import random

food= ['짜장면',"짬뽕","탕수육","군만두"]
print(random.choice(food)) # 1개를 랜덤으로 뽑음

 

[문제] 로또 번호 생성기

1 ~ 45 사이의 숫자 6개를 랜덤하게 뽑기. 단, 숫자뽑을때 중복된 숫자는 활용할 수 없다.
결과는 오름차순으로 정렬해서 출력한다.

import random

#1)
lotto = set() # 원소의 중복을 허용하지 않음
while True:
    lotto.add(random.randint(1,45))
    if len(lotto) == 6: break
        
print(sorted(lotto,reverse=False))
print(sorted(list(lotto))) # 정렬된 결과를 반환

import random

# 2)
lotto = list()
while True:
    num = random.randint(1,45)
    if num not in lotto:
        lotto.append(num)
    if len(lotto) ==6: break

lotto.sort() # 정렬된 결과를 반환하지 않는다. 정렬은 해줌
print(lotto)

import random

# 3) 제일 간단

lotto = random.sample(range(1,46),6)
print(sorted(lotto))

 

[문제] 숫자 맞추기 게임

1 ~ 100 사이의 난수를 맞추는 게임. 입력값과 생성값을 비교하여 어떤 값이 더 큰지 힌트를 알려준다.
정답을 맞추면 시도 횟수 출력과 함께 게임을 종료한다.

import random

random = random.randint(1,100)
cnt = 0 

while True:
    num = int(input("입력(00 종료):"))
    cnt+=1
    if num > random:
        print(f"{num} > random : 더 작은 숫자를 입력")

    elif num < random:
        print(f"{num} < random: 더 큰 숫자 입력")

    else:
        print("정답! 횟수가",cnt,"번 반복되었습니다.")
        break

# 교수님
import random

num= random.randint(1,100)
cnt = 0 
while True:
    guess = int(input("숫자를 입력하세요:"))
    cnt += 1
    if num == guess:
        print(f"{cnt}번 만에 맞췄습니다.")
        break
    elif guess > num:
        print("입력한 숫자보다 더 작습니다")
    else:
        print("입력한 숫자보다 더 큽니다")

 

sys 모듈

파이썬 해석기가 실행되는 환경과 해석기의 여러기능을 조회하고 관리하는 모듈

sys.exit(0) : 프로그램 강제 종료

'국비 교육 > 파이썬' 카테고리의 다른 글

[파이썬] 예외(Exception)  (0) 2023.12.28
[파이썬] File I/O , File 과 Directory  (0) 2023.11.05
[파이썬] 함수 -1  (0) 2023.11.05
[파이썬] Comprehension, zip(), enumerate()  (0) 2023.11.05