Python #2 - 함수

이말감·2021년 4월 22일
0

Python

목록 보기
2/7

함수

: 특정 작업을 수행하는 명령어들의 모음에 이름을 붙인 것

  • 전체적인 구조
    def 함수이름(매개변수1, 매개변수2) :
    	문장1
    	문장2

ex) 소수 찾기

def is_prime(num) :
  if num <=1 :
    print("2 이상의 수를 입력하세요")
    return 0
  j = 0
  for i in range(2, num, 1) :
    if num%i == 0 :
      j+=1
    else :
      continue
  
  if j>0:
    print(num,"은 소수가 아닙니다.")
  else :
    print(num,"은 소수입니다.")

num = int(input())

is_prime(num)
  • 인수와 매개변수
def get_sum(a,b) : # a, b : 매개변수
	return a+b # 반환값

value = get_sum(10,20) #10, 20 : 인수

인수 : 호출 프로그램에 의하여 함수에 전달되는 값
매개 변수 : 이 값을 전달받는 변수
반환값 : 함수가 호출한 곳으로 반환하는 작업의 결과값


예제 풀다가 막혔던 부분

  • 패스워드 생성기
    : 패스워드 생성기는 알파벳 소문자, 숫자를 랜덤하게 조합.
    : 패스워드 길이는 6자리
#처음에 작성한 코드
import random
def genPass() : 
  num = 'abcdefghijklmnopqrstuvwxyz0123456789'
  passw = ""
  for i in range(6) :
    n = len(num)
    index = random.choice(n)
    passw += num[index]
  return passw
print(genPass())

실행결과
TypeError: object of type 'int' has no len()

int가 len() 함수를 가지고 있지 않다는 뜻이길래
엥 num에 숫자가 있어서 그런가 하고 n=len(str(num)) 으로 바꿨는데
또!!!!!!!! 그럼
그래서 어쩔어쩔요 하는 생각으로 이것 저것 바꾸면서 해봤음..
하다가 30분 넘게 잡고있다가 잘 시간 돼서 낼 하자.. 던지고 잔다음
오늘 퇴근하고 또 해도 안되길래 책에 있는 내용 그대로 적어봤더니..
엥 잘됨
............ 잘 읽어보니까 그냥 나의 뻘짓이었던 거임 개웃겨 아니 안웃겨

  • 예제 코드
import random
def genPass() :
  alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
  password = ""
  for i in range(6) :
    index = random.choice(alphabet)
    password = password + index
  return password
print(genPass())

Q. 무엇이 잘못되었나요?

A. random 모듈의 함수를... 멋대로 썼던 게 문제였음

막간을 이용하여 random 모듈 살펴보기

참고 링크 : https://www.daleseo.com/python-random/

문제에서 random 모듈의 randrange() 함수나 choice() 함수를 사용해보라고 적혀있었음.
예제에는 randrange() 함수가 사용됐길래 choice()를 사용해봐야징
하고 검색과 예제를 토대로 작성을 해봤음.

#처음에 작성한 코드
import random
def genPass() : 
  num = 'abcdefghijklmnopqrstuvwxyz0123456789'
  passw = ""
  for i in range(6) :
    n = len(num)
    index = random.choice(n)
    passw += num[index]
  return passw
print(genPass())

choice() 함수를 이용한 이 코드는 무엇이 잘못되었을까요.

먼저 choice() 함수와 randrange() 함수에 대해 알아보자.

  • choice() 함수
    랜덤하게 하나의 원소를 선택합니다.
random.choice('abcdefghij')  # Choose a random element
'c'
  • randrange() 함수
    range(start, stop, step) 함수로 만들어지는 정수 중에 하나를 랜덤하게 리턴합니다.
random.randrange(0, 101, 2)  # Even integer from 0 to 100
26

예시에서는 randrange() 함수를 이용해서
변수 alphabet에 저장된 문자열의 길이 안에서 하나의 숫자를 선택하고,
그 하나의 숫자를 인덱스값
으로 넣어서 패스워드를 하나씩 추가하였다.
근데 choice() 함수는 위에서 보면 알겠지만
함수 안에 문자열을 입력하고 함수가 문자열 안에서 하나의 문자를 선택하는 건데..
아니 냅다 choice() 함수에 숫자를 때려박으면 어쩌라는 건데용디용
물론 오류는 왜 저렇게 나왔는지는 의문임
choice()함수 잘못 사용했으면 이거 때문이라고 말해주시면 되잖아여 !!!
ㄴ 님이 잘못했잔아요

그러니까 choice() 함수 안에는 문자열!!!
randrange() 함수 안에는 숫자 !!!! 인거임

아주..바보셔요..^_*....


  • 참조값에 의한 인수 전달
    : 값에 의한 호출(call-by-value)

ex)

def modify(n) :
	n=n+1
k = 10
print("k=",k)
modify(k)
print("k=",k)
#출력값
k = 10
k = 10

변수 k가 modify() 함수로 전달되었지만 k의 값은 호출 후에도 변경되지 않음
-> 값에 의한 호출
문자열도 마찬가지로 호출 후에도 변수가 변경되지 않는 것을 확인할 수 있다.
이는 숫자나 문자열이 변경 불가능한 객체(immutavle object)이기 때문이다.
숫자나 문자열을 변경하게 되면 새로운 객체가 생성된다.

<-> 변경 가능 객체(mutable object) : 리스트

  • 지역 변수와 전역 변수

1) 지역 변수 : 함수 안에 정의된 변수
-> 함수 안에서만 사용가능, 함수가 호출될 때 생성, 함수 종료 시 소멸
(*파이썬에서 다른 이야기가 없으면 함수 안에서 선언된 변수들은 모두 지역 변수)

ex)

def sub() :
	s = "바나나"
    print(s)
sub()
# 출력값 : 바나나

만약 print(s) 문장이 함수 밖에 있다면

def sub() :
	s = "바나나"
    print(s)
sub()
print(s)
# 오류발생

s가 지역 변수이기 때문에 함수가 종료됨과 동시에 값이 소멸되었으므로 오류가 발생한다.

2) 전역변수 : 함수의 외부에 정의된 변수

ex)

def sub() :
	print(s)
s = "사과"
sub(s)
# 출력값 : 사과

s는 함수의 외부에 정의된 전역 변수이고, sub를 호출하기 전에 정의 되었다.
함수 내부에 지역 변수를 선언하는 문장이 없으므로 전역 변수 s가 사용되었다.

지역 변수와 전역 변수를 함께 사용해보면

def sub():
	s = "바나나"
    	print(s)
s = "사과"
sub(s)
print(s)
# 출력값 :
바나나
사과

지역 변수 : 바나나, 전역 변수 : 사과
sub(s)를 통해 지역 변수인 바나나가 출력되었고,
sub()함수가 끝나고 지역 변수인 바나나는 소멸
print(s)를 통해 지역 변수인 사과가 출력

우리가 함수의 내부에서 변수 s에 값을 저장하면
파이썬은 우리가 지역 변수 s를 정의한 것으로 생각한다.

만약 함수 안에서 변수s의 값을 출력한 후에 변수 s의 값을 변경한다면?

def sub():
	print(s)
	s = "바나나"
    	print(s)
s = "사과"
sub(s)
print(s)
# 오류 발생

함수 안에서 하나의 변수가 전역 변수가 되었다가 지역 변수가 될 수는 없다.

위와 같이 함수 안에서 전역 변수의 값을 변경하려면 global 키워드를 사용!

def sub():
	global s # 함수 안에서 전역 변수 s를 사용하겠다는 의미
	print(s)
	s = "바나나" # 전역 변수가 변경됨
    	print(s)
s = "사과"
sub(s)
print(s)
출력값 : 
사과
바나나
바나나

sub(s)를 통해 함수 내에서 global 키워드를 사용했기 때문에 전역 변수인 사과가 출력된다.
그리고 s="바나나" 로 인해 전역 변수가 바나나로 변경되었고, 바나나가 출력되었다.
마지막으로 print(s)에서 전역 변수가 바나나이기 때문에 바나나가 출력된다.

  • 무명 함수(람다식)
    : 이름은 없고 몸체만 있는 함수. lambda 키워드로 만들어진다.
  • 여러 개의 인수를 가질 수 있으나 반환값은 하나만
  • 무명 함수 안에서는 print()를 호출할 수 없으므로 계산만 가능

전체적인 구조

lambda 인수1, 인수2 : 수식

ex)

sum = lambda x,y : x+y
print(sum(10,20))
# 출력값 : 30
L = [lambda x: x**2, lambda x : x**3, lambda x : x**4]
# 리스트 안에 람다 함수 넣기
for f in L : 
	print(f(3))
# 출력값 
9
27
81
profile
전 척척학사지만 말하는 감자에요

0개의 댓글