[python] 함수 예제

2023. 9. 19. 17:51

while 초기값

반복식

 

=> 단점 : 초기값과 증감연산이 무조건 존재해야된다. 

                전처리와 후처리가 꼭 필요했다.

 

 

 

for 순회값

반복식 

 

for  ~  in  -> 파이썬의 for의 문장이 이렇게 생겨먹은 거임.

 

 

파이썬의 꽃  List comprehension

아웃풋 변수를 좌변에 놓고 for를 통해서 어떻게 순회할 것인가의 계획을 세우고

연산에 대한 계획을 넣어서 배열[ ]로 묶는 list comprehesion!

=> 로직이 variety 해진다.

 

 

로직 생각

1. 가위바위보 게임 -> 컴퓨터 vs. 나

2. 업다운 게임 (숫자 하나 발생시켜서 업 다운)

 

셋 컴프리헨션 

def func1(x):
    return x+2

# 리스트 컴프리헨션

# 0~4 까지 각 2를 더한다.
list1 = [2+x for x in range(0,5)]
print(list1)

# 셋 컴프리헨션

# 0~4 까지 각 2를 더한다.
set1 = {2+x for x in range(0,5)}
print(set1)
set1 = {func1(x) for x in range(0,5)}
print(set1)

 

딕셔너리 컴프리헨션

# 딕셔너리 컴프리헨션
std1 = ['철수','영희','길동','순희'] # std1에 리스트를 넣는다.
std1_comp = {st : 0 for st in std1} # std1에 리스트를 가져와서 for문을 돌리고 : 0 을 값으로 넣는다.
print(std1_comp) # std_comp1 출력한다.

std2 = {"철수" : 80, "영희" : 70, "길동" : 60, "순희" : 50, "히히" : 40}
std_part1 = { name : score for name, score in std2.items() if name == "히히"}
# 히히 빼고 출력
# std_part1 = { name : score for name, score in std2.items() if name != '히히'}
print(std_part1)

# 삼항 연산자 조합
# 1. 네임은 pass
# 2. 네임에서 실제 값이 70 이상 값을 나오면 pass를 출력한다.
# 3. std2.items 에서 name, value를 돌린다.
ispass = {name : 'PASS' if value > 70 else 'Fail' for name, value in std2.items()}
print(ispass)

 

 

 

함수

 

반복적으로 실행할 수 있는 코드를 집합적으로 

어떤 기능의 모음 = 집합을 의미한다.

 

파이썬은 함수지향프로그래밍이다.

 

함수 작성법

함수는 변수와 비슷한데...

여기서 코딩컨벤션이 또 나와야한다.

함수는 처음 시작하고자 하는 단어가 동사형으로 들어가야한다. => 이 방식을 고수하면서 코드를 써야한다. 구분을 위해서

ex)

set

do

get .... 

 

왜?

함수는 실제로 하는 애(동사로 시작) 니까!

변수는 무언가(명사로 시작) 이고.

 

 


# <<<<<<<<<<<<<<<<<<함수>>>>>>>>>>>>>>>>>>
# 아무것도 없는 함수
# 매개변수가 있는 함수
# 리턴값이 있는 함수
# 매개변수와 리턴 둘다 있는 함수



# 함수를 선언하기 위해 무조건 필요함
# 괄호는 무조건 줘야함.
def do_something() : # 무엇가를 입련한다.
    print("do_something 함수 호출") # 문자열을 출력하는 함수를 하나 만들었다.
# 함수만으로는 실행이 안된다.
# 해당 기능을 만드는 것까지는 좋았다.
# 다만 호출을 하지 않았기 때문에 발동되지 않음.

# 함수 호출
# 어디서든 필요한 만큼 외부에서 호출하면 된다.
# 함수의 순기능
do_something() # 반드시 () 들어가야함.
do_something() # 반드시 () 들어가야함.
do_something() # 반드시 () 들어가야함.
do_something() # 반드시 () 들어가야함.



# 매개변수 = 실제 호출한 곳에서 받을 수 있도록 만든 변수
# 매개변수는 딕셔너리 패턴으로 저장된다.
# 키로 접근이 가능하다는 얘기네?
# 우리가 넣고자하는 값을 변수에 넣어서 함수를 사용할 수 있게 한다 -> 목적
# 하나의 함수로 굉장히 다양한 variation 결과값을 출력할 수 있다.
def func1(num1):
    print("내가 출력할 숫자는 {} 입니다.".format(num1))

# 매개변수를 통해서 값을 출력할 수 있다.
# variation의 범위가 달라지는 것 -> 함수의 매개변수.
func1(2)
func1(10)
func1(20)
func1(30)
# 아무것도 안넣으면?
# 바로 에러가 난다. 함수가 요구하는 매개변수를 무조건 넣어줘야한다.
# func1()

print("=================================================")
# 매개변수는 복수개의 변수를 설정 가능하다. 원하는 만큼.
# 만약 매개변수가 3개면, 3개의 갯수에 맞춰서 출력값을 호출해야된다.
# 두개의 매개변수 설정하기.
def func2(num1, num2):
    print("내가 출력할 숫자는 {} {} 입니다.".format(num1, num2)) # 두개의 매개변수가 들어간다.

func2(2, 10)

print("=================================================")
# <<<<<<<<<<<Optional Parameter 기능>>>>>>>>>
def func3(num1, num2, num3=4) :
    print("num1 : {}, num2 : {}, num3 : {}".format(num1, num2, num3))

func3(1,2,3)
# 공동 개발시 전역함수의 기능에 대해서 문제가 된다.
# 나는 num3 매개변수가 필요없을 시에는?
# Optional Parameter.
# 데이터가 오지 않을 것을 대비하고, 매개변수에 디폴트로 새로 넣을 수 있다
# 매개변수를 미리 셋팅하는 거임.
func3(9,8) # num1 : 9, num2 : 8, num3 : 4


print("=================================================")
def func4(num1=1, num2=2, num3=3) :
    print("{} {} {}".format(num1, num2, num3))
# 옵셔널 파라미터가 매개변수로 모두 들어가있는 경우에는,
# 아래 처럼 안넣어도된다.
func4()
# 만약 넣으면, 가장 맨앞으로 채워진다.
func4(4)
# 매개변수 이름만으로도 접근이 가능하다.
# 임시메모리형태로 저장이 되니까 반대로 딕셔너리형태인 키로 접근할 수 있다.
# 키 밸류 의 쌍으로 가능하다.
func4(num2=6, num3=7)
# 키를 통해서 접근하기 때문에 매개변수의 순서는 뒤밖여도 상관없다.
func4(num3=7, num2=6)


# <<<<<<<<<<<<<<<<<<<옵셔널 파라미터 특징>>>>>>>>>>>>>>>>>>>>>>>>
# 매개변수에 값을 안넣어서 에러가 난다.
# 강제성 때문에 파이썬 인터프리터가 막는다.
# !!!!!!!!!옵셔널 파라미터를 넣으려면 뒤에서 부터 넣어줘야된다!!!!!!!!!!!!!
# 앞에서부터 넣으면 무조건 에러난다. 파이썬 자체의 금지정책임.
# 아래와 같은 형태는 존재하지 않는다.
# 앞에 있는 것은 강제 해야할 파라미터임.
# 뒤에 있는 것은 선택적인 파라미터임.
# def func5(num1=2, num2=3, num3) :
#     print("asdasddsadas")

def func6(num1, num2, num3=3, num4=4):
    print("{} {} {} {}".format(num1, num2, num3, num4))

func6(4, 7)
# 절대 안됨~!
# func6(num1=4, num3=7)

# 필수 => Named Parameter
# 선택 => Optional Parameter
func6(num1=4, num2=10, num3=7)

 

야구게임 

from random import *

def do_strike(s1 = 2, s2 = 3, s3 = 4) :
    print("{} {} {}".format(s1, s2, s3))

def do_ball(b1 = 1, b2 = 2, b3 = 3) :
    print("{} {} {}".format(b1, b2, b3))


com= []

while True :
    compute = randint(1, 10)
    com.append(compute)
    print("컴퓨터가 제시한 숫자는 {}".format(compute))
    compute = randint(1, 10)
    com.append(compute)
    print("컴퓨터가 제시한 숫자는 {}".format(compute))
    compute = randint(1, 10)
    com.append(compute)
    print("컴퓨터가 제시한 숫자는 {}".format(compute))
    break

print(com)

print()

numbers = []

while True :
    input_number = int(input("1 부터 10까지 숫자를 입력하세요. : "))
    numbers.append(input_number)
    input_number = int(input("1 부터 10까지 숫자를 입력하세요. : "))
    numbers.append(input_number)
    input_number = int(input("1 부터 10까지 숫자를 입력하세요. : "))
    numbers.append(input_number)
    break

print(numbers)

print()

for i in range(3) :
    if com[i] == numbers[i] :
        print("strike")
    elif com[i] != numbers[i] :
        print("out")








print("===================================================")

from random import *

c = []
while len(c) < 3 :
    s1 = 0
    b1 = 0
    o1 = 1
    cnt1 = 0
    ran1 = randint(2,10)
    if ran1 not in c:
        c.append(ran1)

print("컴퓨터 랜덤 값: {}".format(c))


while s1 != 4 :
    user1 = []
    for i in range(1, 4) :
        user1.append(int(input("{}번째 수를 입력하세요 : ".format(i))))

    for i in range(1, 4) :
        if user1[i] == c[i] :
            s1 += 1
            o1 = 0 # 숫자 하나라도 맞으면 out은 쓸 필요가 없으니까.
        elif user1[i] in c :
            b1 += 1
            o1 = 0

print("{}S {}B {}O".format(s1, b1, o1))

cnt1 += 1


# 반복구간이 끝나게 되었을 시 이닝 종료라는 문구를 출력.
# 몇번에 걸쳐서 3S가 되었는지 출력.
print("{}회 만에 이닝 종료".format(cnt1))






# 로직 -
# - 초기값 설정
# 컴퓨터가 3개의 랜덤한 값을 입력 받아 리스트에 저장한다.
    # 겹치는 숫자가 있을 경우 해당 숫자를 넣지 않고 다시 재굴림.
# 스트라이크, 볼, 아웃을 저장하는 변수가 각각 하나씩 생성

# 로직 실행 -
# 반복구간 시작 -> 3S가 될 때까지
    # 유저가 3개의 값을 입력받는다.
        # 1~9 수를 리스트에 입력받아서 저장

    # 비교해서 결과를 출력
        # 1. 사용자가 입력한 리스트의 각 위치와 숫자를, 컴퓨터의 리스의 숫자와 위치를 비교해서
        # 하나라도 맞으면 스트라이프를 카운트한다.
        # 2. 사용자가 입력한 리스트 내부의 3개의 값 중 하나라도 리스트 안에 들어가 있으면 ball을 카운트한다.
        # 3. 사용자가 입력한 값이 리스트 내에 단 한개도 없다면, out 카운트.
        # 4. 스트라이크 볼 아웃을 출력하고 초기화.
# 반복구간 끝

 

# func1 a - 3, b - 4, c - 5

# 함수 입력 파라미터를 몇개인지 모를 때, *(아스타링크) 을 쓴다.
# <<<<<<<<<<<<<<<<<<<<<<<가변 길이 파라미터>>>>>>>>>>>>>>>>>>>>>>>
def do_sum(*numbers):
    total = 0
    print(numbers)
    for n in numbers : # 리스트 또는 튜플로 들어온다.
        total += n
    print(total)

# !!파라미터가 얼마만큼의 숫자를 받을 수 있는지는 모른다.!!
# 하지만 형식만 맞게 만드면, 이런 방식도 가능하다.
do_sum(1,2,3,4,5,6,7,8)
do_sum(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
# 튜플로 출력된다.
# 잘 안쓰이는 방식임.

print("================================================")
# 이방식을 더 사용한다.
# 언패킹 방식
def do_sum2(a,b,c):
    print(a+b+c)
# 리스트 언패킹
x1 = [10, 20, 30]
do_sum2(*x1)   # 각각에 있는 매개변수에 들어가게 한 후 수행시킴.

# 튜플 언패킹
x2 = (10, 20, 30)
do_sum2(*x2)   # 각각에 있는 매개변수에 들어가게 한 후 수행시킴.

 

def get_personal_info(name, age, address):
    print("이름 : ", name)
    print("나이 : ", age)
    print("주소 : ", address)

# set 언패킹
set1 = {"김아무개", 37, "경기도"}
get_personal_info(*set1)

print("================================================")
# 딕셔너리 언패킹 1
dic1 = {"name" : "김아무개", "age" : 40, "address": "서울시"}
get_personal_info(*dic1)


print("================================================")
# 딕셔너리 언패킹 2
# 순서는 책임 안져.
get_personal_info(*dic1.values())

print("================================================")
# 딕셔너리 언패킹 3
# 순서 해결
# ** 두개를 넣으면
# 파라미터의 순서에 맞춰서 알아서 들어감.
# 파라미터의 순서를 신경 쓸 필요가 전혀 없음!!!!!!!!!!!!!!!!!!
dic2 = {"age" : 40, "address": "서울시", "name" : "김아무개"}
get_personal_info(**dic2)

print("================================================")
def get_personal_info2(**kwargs):
    print(kwargs)
    for kw, arg in kwargs.items() :
        print("{} : {}".format(kw, arg))

# dic을 넣으면 되잖아? 근데 **kwargs 를 왜써?

dic3 = {"age" : 50, "address": "울산시", "name" : "이아무개"}
get_personal_info2(**dic3) # 이정도만 써도 아주 굿

# 가변데이터 (원자형) 를 받아서 출력
# 실제 받는 함수는 딕셔너리 형태임.
# 따라서 포맷은 딕셔너리 형태로 출력됨.
# !!!!!!!!!!!!!!!!!재활용성이 좋아진다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
get_personal_info2(name="박아무개", age="55", address="경기도 시흥시")


def func1(a,b,c, **kwargs): # 딕셔너리형태로 매개변수 받기
    print(a)
    print(b)
    print(c)
    print(kwargs)

# 함수의 매개변수와 겹치면 안됨.
dic1 = {"a1":1, "b1":2, "c1":3}
func1(1,2,3, **dic1)

func1(1,2,3, a1="aaa", b1="bbb")


def func2(*args, **kwargs):
    print(*args)
    print(kwargs)

# 리스트 언패킹과 딕셔너리 언패킹을 함께 쓰고 싶을 때.

func2(1,2,3, **dic1)
# 1 2 3
# {'a1': 1, 'b1': 2, 'c1': 3}


print("=====================================================")

# 가변인자와 매개변수를 같이 출력하고 싶을 떄
def func3(a,*args):
    print(a)
    print(*args)

func3(1)
func3(1,2,3)
func3(*[10,20,30])

 

 

'언어 > Python' 카테고리의 다른 글

[Python] init 예제  (0) 2023.09.21
[Python] 클래스 - 접근제어 예제  (0) 2023.09.21
[Python] 클래스 - self  (0) 2023.09.21
[Python] 클래스 예제  (0) 2023.09.21
[python] 사용자 정의 함수  (0) 2023.09.20

+ Recent posts