Python_grammar_3

coh·2022년 5월 19일
0

python

목록 보기
3/8

functions in python

>>> def absolute(num):
	if num > 0:
		return num
	else:
		return -num

>>> absolute(-3)
3
>>> absolute(2)
2

함수의 선언은 object가 아니라 HDD에 저장된다. 따라서 호출을 했을 때 code와 code와 함께 동작하는 함수들을 같이 메모리에 올라가면 그제서야 객체가 된다.
추가적인 함수들로는

__call__

과 같은 함수들이 있다. call함수는 absolute함수가 호출되었을 때 code를 한 줄씩 실행시켜주는 역할을 한다. 나머지 함수들은 dir 명령어로 확인 가능하다.

a = absolute
a(-3)
a(2)

absolute 이름이 absolute함수의 객체를 가리키기 때문에 a에는 reference주소가 copy된다. 그래서 a를 똑같은 기능으로 쓸 수 있다.
마찬가지로 parameter에 전달되는 인자 또한 reference가 전달되는 것이기 때문에 shallow copy가 필요하다.

>>> def absolute(num):
	if num > 0:
		return num
	else:
		return -num

>>> absolute(-3)
3
>>> absolute(2)
2
>>> def list1(a):
	a.append(9)
	print("inside the function: ", a)

	
>>> b = [1, 2,3]
>>> list1(b)
inside the function:  [1, 2, 3, 9]
>>> b
[1, 2, 3, 9]

따라서 이를 해결하기 위해

lsit1(b[:])

이렇게 argument를 전달하면 b의 원본을 변화시키지 않고 data전달이 가능하다.
추가적인 내용으로는
python에서는 return 값을 여러 개 전달 가능.
왠만하면 전역변수 사용 x.
변수이름은 왠만하면 다르게 설정.

lambda function

A lambda function is a small anonymous function object.
It can have many parameters, but can have only one expression.

>>> x = lambda a, b: a+b
>>> x(3,4)
7
>>> def base(n):
	return lambda a: a*n

>>> double = base(2)
>>> triple = base(3)
>>> double(11)
22
>>> triple(11)
33

가볍게 lambda function 예제를 적어보았어요. 람다함수는 기본적으로 한 줄만 적을 수 있구요 parameter 갯수에는 제한이 없어요. 주로 한 줄짜리 간단한 함수를 lambda function으로 많이 대체해서 사용합니다!!

def base(n) 에 대해 간단히 설명하자면 return 으로 lambda함수를 전달하는데 base를 호출하면은 base는 parameter인 n과 code를 함수와 함께 묶은 object를 가리키고 있는 reference variable이라고 봐야겠죠?
따라서 base(2)와 같이 호출하고 그것의 return 값을 double에 assign한다면 double은 parameter a와 a*2인 code를 함수와 함께 묶은 object를 가리키게 됩니다. 따라서 double(11) 와 같은 연산이 가능한 거죠!

Map
map() function applies a given function for each item of an iterable. map(function, iterable)

>>> a = [1,2,3,4]
>>> b = list(map(int, a))
>>> b
[1, 2, 3, 4]
>>> b = map(lambda a: a*2, a)
>>> list(b)
[2, 4, 6, 8]
>>> line = '1 2 3 4'
>>> b = list(map(int, line.split()))
>>> b
[1, 2, 3, 4]

이런식으로 given function에다가 iterable한 object의 인자들을 하나씩 적용해서 map object로 반환하는 것이 map함수입니다!

return & yield

return은 모든 작업을 저장한 후 반환하는 것이고 yield는 어떤 동작을 수행하고 바로 반환하게 됩니다. yield로 반환할 수 있다면 속도나 공간복잡도 측면에서 훨씬 유리합니다.

>>> def simple_list():
	temp=[]
	for n in range(4):
		temp.append(n+1)
	return temp

>>> for i in simple_list():
	print(i, end= ' ')

	
1 2 3 4 

이 경우는 함수가 종료되면 list object가 반환되게 됩니다. 반환이 되면은 anonymous object로 사라지긴 하겠지만 메모리를 사용하게 되겠죠. 또한 list를 만들기 위한 for loop의 시간이 들 것입니다. return은 그래서 함수의 최종 결과를 반환하는 keyword입니다!

yield sends back one by one over time on demand.

>>> def simple_generator():
	for n in range(4):
		yield n+1

		
>>> for i in simple_generator():
	print(i, end= ' ')

	
1 2 3 4

계산 결과가 함수 loop에서 나올 때마다 반환할 수 있습니다. keyword가 for loop 내에 있는 것을 알 수 있죠. list의 갯수가 10만개 같이 엄청 클 때 쓰면 좋아요!!

Input : keyboard로 부터 입력을 받아요.

>>> a = input()
Hello!
>>> a
'Hello!'
>>> a, b = map(int, input().split())
12 32
>>> a
12
>>> b
32

Input from a file

>>> f = open('input.txt', 'r')
>>> a = f.readline()
>>> a
'1 4 3 5 6\n'
>>> b = list(map(int, f.readline().split()))
>>> b
[6, 7, 8, 9, 0]
>>> f.close()

간단하게 c:\ananconda3\Lib\idlelib\input.txt 로 file하나 만들어서 실행시켰어요. file은 쓰면 꼭 닫아주어야 합니다!
f는 file object를 가리키는 reference variable이겠네요.
readline()는 한 줄을 읽어서 string으로 반환하는데 input()과는 다르게 \n를 포함해서 반환합니다. 물론 split은 white space를 지워줄 수 있기 때문에 split과 함께 활용하면 됩니다!!

input from stdin 표준입력을 재지정.
원래는 keyboard인데 이제 file을 표준 입력으로 지정해볼거예요.

>>> import sys
>>> sys.stdin = open('input.txt', 'r')
>>> a = list(map(int, input().split()))
>>> a
[1, 4, 3, 5, 6]
>>> a = input().split()
>>> a
['6', '7', '8', '9', '0']
>>> sys.stdin = open('input.txt', 'r')
>>> a = list(map(int, sys.stdin.readline().split()))
>>> a
[1, 4, 3, 5, 6]

더 이상 표준입력이 키보드가 아니기 때문에 input()을 기다리지 않고 file에서 바로 읽게 됩니다. 다른 방법으론 sys.stdin이 가리키고 있는 것이 file object이므로 readline()를 쓸 수도 있습니다. 일반적으로 input()보다 readline()이 속도가 더 빠릅니다!! 읽는 data가 많은 경우 readline()을 써야 속도가 좋습니다.

profile
Written by coh

0개의 댓글