함수를 호출하려면 하나의 매개변수를 받는 절대값 함수 abs 등 함수의 이름과 매개변수를 알아야 합니다.
Python의 공식 웹사이트에서 직접 문서를 볼 수 있습니다:
http://docs.python.org/2/library/functions.html#abs
다음을 수행할 수 있습니다. 또한 대화형 명령줄에서는 help(abs)를 사용하여 abs 함수의 도움말 정보를 봅니다.
abs 함수 호출:
>>>abs(100)
100
>>>abs(-20)
20
>>> abs(12.34)
12.34
함수를 호출할 때 전달된 매개변수 개수가 올바르지 않으면 TypeError가 보고되고 Python은 명확하게 알려주세요: abs()에는 매개변수가 하나만 있지만 두 개가 제공됩니다:
>>> abs(1, 2)
추적(가장 최근 호출 마지막):
File "
TypeError: abs()는 정확히 하나의 인수를 사용합니다(2개 제공)
전달된 인수 수가 올바른 경우 함수에서 매개변수 유형을 허용할 수 없으며 TypeError 오류가 보고되고 오류 메시지가 표시됩니다. str은 잘못된 매개변수 유형입니다:
>>>
추적(가장 최근 호출 마지막):
파일 "
TypeError: abs()에 대한 잘못된 피연산자 유형: 'str'
비교 함수 cmp(x, y)에는 두 개의 매개변수가 필요합니다. x
>>>cmp(1, 2)
-1
>>cmp(2, 1)
1
>> )
0
Python에 내장되어 일반적으로 사용되는 함수에는 다른 데이터 유형을 정수로 변환할 수 있는 int() 함수와 같은 데이터 유형 변환 함수도 포함되어 있습니다.
>> ;> int('123')
123
>>> int(12.34)
12
str() 함수는 다른 유형을 str:
>>> str(123)
'123'
>>>str(1.23)
'1.23'
함수 작성:
Python에서 함수를 정의하려면 def 문을 사용하고 함수 이름, 괄호, 괄호 안의 매개변수, 콜론:을 쓴 다음 들여쓰기 안에 block 함수 본문을 작성하고 return 문을 사용하여 함수의 반환 값을 반환합니다.
절대값을 찾는 my_abs 함수를 사용자 정의하는 예를 들어보겠습니다.
def my_abs(x):
if x >= 0:
return x else:
Return -x
함수 본문 안의 명령문이 실행될 때 return이 실행되면 함수가 실행되고 결과가 반환된다는 점에 유의하세요. 따라서 조건부 판단과 루프를 통해 매우 복잡한 로직을 함수 내부에서 구현할 수 있습니다.
return 문이 없으면 함수 실행 후 결과가 반환되지만 결과는 None이 됩니다.
return None은 return으로 축약될 수 없습니다.
여러 값 반환:
함수가 여러 값을 반환할 수 있나요? 대답은 '예'입니다.
예를 들어 게임에서 한 지점에서 다른 지점으로 이동해야 하는 경우가 종종 있습니다. 좌표, 변위 및 각도가 주어지면 새 좌표를 계산할 수 있습니다.
# 수학 패키지는 sin을 제공합니다. ( ) 및 cos() 함수를 사용하려면 먼저 import:
import math
def move(x, y, step, angle):
nx = x + step * math.cos로 참조합니다. ( angle)
ny = y - step * math.sin(angle)
return nx, ny
이 방법으로 동시에 반환 값을 얻을 수 있습니다.
> >> 사실 이것은 단지 환상일 뿐입니다.
>>> r = move(100, 100, 60, math .pi / 6)
>> ;> print r
print를 사용하여 반환 결과를 인쇄합니다. 튜플!
그러나 구문적으로는 튜플을 반환할 때 괄호를 생략할 수 있으며, 여러 변수가 동시에 튜플을 받아 위치에 따라 해당 값을 할당할 수 있으므로 Python의 함수는 여러 값을 반환합니다. 실제로는 튜플을 반환하지만 작성하는 것이 더 편리합니다.
if n==1:
return n *fact(n - 1)
재귀 함수의 장점은 정의된다는 것입니다. 간단하고 명확한 논리. 이론적으로 모든 재귀 함수는 루프로 작성할 수 있지만 루프의 논리는 재귀만큼 명확하지 않습니다.
재귀 함수를 사용할 때 스택 오버플로를 방지하도록 주의하세요. 컴퓨터에서 함수 호출은 스택의 데이터 구조를 통해 구현됩니다. 함수 호출이 입력될 때마다 스택 프레임이 스택에 추가됩니다. 스택 크기는 무한하지 않기 때문에 재귀 호출이 너무 많으면 스택 오버플로가 발생합니다. Fact(10000)를 계산해 볼 수 있습니다.
move(n, a, b, c) 함수의 정의는 b를 사용하여 n개의 디스크를 a에서 c로 이동하는 것입니다.
참조 코드:
def move(n, a, b, c):
if n ==1:
print a, '-->', c
return
move(n-1, a, c, b)
인쇄 a, '-->', c
move(n-1, b, a, c)
move(4, 'A', 'B', 'C')
재귀 호출 스택 오버플로를 해결하는 방법은 실제로 꼬리 재귀 최적화를 통해서입니다. 꼬리 재귀와 루프 효과는 동일하므로 루프를 특별한 꼬리 재귀 함수로 간주하는 것도 가능합니다.
꼬리 재귀는 함수가 반환될 때 자신을 호출하며 return 문에는 표현식을 포함할 수 없음을 의미합니다. 이런 방식으로 컴파일러나 인터프리터는 꼬리 재귀를 최적화하여 재귀 자체가 호출 횟수에 관계없이 하나의 스택 프레임만 차지하고 스택 오버플로가 발생하지 않도록 할 수 있습니다.
위의 Fact(n) 함수는 n * Fact(n - 1)을 반환하므로 곱셈 표현식을 도입하므로 꼬리 재귀가 아닙니다. 꼬리 재귀로 변경하려면 주로 각 단계의 곱을 재귀 함수에 전달하기 위해 약간 더 많은 코드가 필요합니다.
def Fact(n):
return Fact_iter(n, 1)def Fact_iter (num, product):
if num == 1: return product returnfact_iter(num - 1, num * product)
보시다시피, returnfact_iter(num - 1, num) * product)는 재귀 함수 자체만 반환하며 num * product는 함수가 호출되기 전에 계산되며 함수 호출에 영향을 주지 않습니다.
fact(5)에 해당하는 Fact_iter(5, 1) 호출은 다음과 같습니다.
===> Fact_iter(4, 5)
===> Fact_iter(3, 20)
===> Fact_iter(2, 60)
===> Fact_iter(1, 120) >== => 120
tail recursive 호출을 할 때 최적화를 하면 스택이 커지지 않기 때문에 아무리 호출해도 스택 오버플로가 발생하지 않습니다.
안타깝게도 대부분의 프로그래밍 언어는 꼬리 재귀에 최적화되어 있지 않으며 Python 인터프리터도 최적화되어 있지 않습니다. 따라서 위의 Fact(n) 함수를 꼬리 재귀로 변경하더라도 오류가 발생합니다. 스택 오버플로.
기본 매개변수 정의:
함수를 정의할 때 기본 매개변수를 사용할 수도 있습니다.
예를 들어 Python과 함께 제공되는 int() 함수에는 실제로 두 개의 매개변수가 있습니다.
>>> )
123>>> int('123', 8)
83
int() 함수의 두 번째 매개변수는 변환 Base입니다. 전달되지 않으면 기본값은 10진수(기본=10)입니다. 전달된 매개변수가 사용됩니다.
호출을 단순화하기 위해 함수의 기본 매개변수를 사용하는 것을 볼 수 있습니다. 필요한 매개변수만 전달하면 됩니다. 그러나 필요한 경우 추가 매개변수를 전달하여 기본 매개변수 값을 재정의할 수 있습니다.
> n = n - 1
s = s * xreturn s를 계산하는 함수를 정의해 보겠습니다.
제곱의 개수가 가장 많이 계산된다고 가정합니다. , n의 기본값을 2로 설정할 수 있습니다:
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
return s
이런 방식으로 제곱을 계산하기 위해 두 개의 매개변수를 전달할 필요가 없습니다.
>> ;> power(5)
25
pass# 오류:def fn2(a=1, b):
pass
먼저 정의 함수, 목록에 전달하고 END를 추가하고 반환:
def add_end(L=[]):
L.append('END') return L
기본 매개변수로 호출하면, 초기 결과도 정확합니다.
>> ;> add_end()['END']
그러나 add_end()를 다시 호출하면 결과가 잘못됩니다. :
>>> add_end()[ 'END', 'END']>> add_end()['END', 'END', 'END']
많은 초보자들이 헷갈려하는 것이 기본 매개변수가 []인데, 함수는 지난번에 'END'를 추가한 후 목록을 "기억"하는 것 같습니다.
이유는 다음과 같이 설명된다.
파이썬 함수를 정의할 때 기본 매개변수 L의 값, 즉 []가 계산되는데, 이는 기본 매개변수 L도 a이기 때문이다. 객체 [ ]를 가리키는 변수는 함수가 호출될 때마다 L의 내용이 변경되면 다음에 호출할 때 기본 매개변수의 내용이 변경되고, 함수가 정의되었습니다.
따라서 기본 매개변수를 정의할 때 명심해야 할 한 가지 사항이 있습니다. 기본 매개변수는 불변 객체를 가리켜야 한다는 것입니다!
위의 예를 수정하려면 불변 객체 None을 사용할 수 있습니다.
def add_end(L=None):
L이 None인 경우:
L = []
L.append('END') return L
이제 몇 번 호출해도 문제가 없습니다.
>>> add_end ()['END']>>> add_end()['END']
str 및 None과 같은 불변 객체를 디자인해야 하는 이유는 무엇입니까? 불변 객체가 생성되면 객체 내부의 데이터를 수정할 수 없기 때문에 데이터 수정으로 인해 발생하는 오류가 줄어듭니다. 또한, 객체가 그대로 유지되기 때문에 멀티태스킹 환경에서 동시에 읽을 때 객체를 잠글 필요가 없고, 동시에 읽어도 전혀 문제가 없습니다. 프로그램을 작성할 때 불변 객체를 설계할 수 있다면 그것을 불변 객체로 설계해 보십시오.
변수 매개변수 정의:
함수가 임의 개수의 매개변수를 허용하도록 하려면 가변 매개변수를 정의할 수 있습니다.
def fn(*args):
print args
변수 매개변수 이름 앞에 *가 있으며 0개, 1개 이상의 매개변수를 전달할 수 있습니다. 변수 매개변수: 🎜>>>> fn('a', 'b')
('a', 'b')>>> ', ' c')
('a', 'b', 'c')
Python 인터프리터는 들어오는 매개변수 세트를 튜플로 조합합니다. 변수 매개변수가 주어지면 함수 내에서 변수 args를 튜플로 처리합니다.
키워드 매개변수:
변수 매개변수를 사용하면 0개 또는 임의 개수의 매개변수를 전달할 수 있습니다. 이러한 변수 매개변수는 함수가 호출될 때 자동으로 튜플로 결합됩니다. 키워드 매개변수를 사용하면 매개변수 이름이 포함된 매개변수를 0개 또는 원하는 수만큼 전달할 수 있습니다. 이러한 키워드 매개변수는 함수 내에서 자동으로 사전으로 조합됩니다. 예를 참조하세요:
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)필수 매개변수인 name 및 age 외에도 함수 person은 키워드 매개변수 kw도 허용합니다. 이 함수를 호출할 때 필수 매개변수만 전달할 수 있습니다:
>>> person('Michael', 30)
name: Michael age: 30 other: {}
또한 원하는 만큼의 키워드 매개변수를 전달할 수 있습니다:
>>> person('Bob', 35, city='Beijing')
name: Bob age : 35 기타: {'도시': '베이징'}>>> 사람('아담', 45, 성별='M', 직업='엔지니어')
이름: 아담 나이: 45 기타: {'gender': 'M', 'job': 'Engineer'}
명명된 키워드 매개변수:
키워드 매개변수의 경우 함수 호출자는 무제한의 키워드 매개변수를 전달할 수 있습니다. 전달된 내용은 함수 내부에서 kw 검사를 통과해야 합니다.
계속 person() 함수를 예로 들어 도시와 직업 매개변수가 있는지 확인하고 싶습니다.
def person(name, age, **kw):
if 'city' In KW:# i CITY 매개변수PASS
if 'job' in kw:# Job 매개변수가 있음PASS
인쇄('이름:', 이름: ', Age, ' Other, 'Other,' Other :', kw)
그러나 호출자는 여전히 무제한 키워드 인수를 전달할 수 있습니다.
>>> , 24, city ='Beijing', addr='Chaoyang', zipcode=123456)
print(이름, 나이, 도시, 직업)
키워드 매개변수 **kw와 달리 명명된 키워드 매개변수에는 특수 구분 기호 *가 필요하며, * 뒤의 매개변수는 명명된 키워드 매개변수로 간주됩니다.
전화 방법은 다음과 같습니다.
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
네임드 키워드 매개변수는 위치 매개변수와는 다른 매개변수 이름으로 전달되어야 합니다. 매개변수 이름이 전달되지 않으면 호출에서 오류를 보고합니다.
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback(최근 마지막 호출):
파일 "
매개변수 누락으로 인해 를 호출할 때 city 및 job의 이름을 지정하면 Python 인터프리터는 이 4개의 매개변수를 위치 매개변수로 처리하지만 person() 함수는 2개의 위치 매개변수만 허용합니다.
이름이 지정된 키워드 인수는 기본값을 가질 수 있어 호출을 단순화합니다.
def person(name, age, *, city='Beijing', job):
print(name , age, city, job)
명명된 키워드 매개변수 city에는 기본값이 있으므로 다음을 호출할 때 city 매개변수를 전달할 필요가 없습니다.
>>> (' Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
네임드 키워드 매개변수를 사용할 때 *는 매개변수가 아니라, 특수 구분 기호. *가 없으면 Python 인터프리터는 위치 인수와 명명된 키워드 인수를 인식하지 못합니다:
def person(name, age, city, job):
# *가 없으면 도시와 직업은 다음과 같이 처리됩니다. position 매개변수
pass
매개변수 조합:
Python에서 함수를 정의합니다. 필수 매개변수, 기본 매개변수, 변수 매개변수, 키워드 매개변수 및 명명된 키워드 매개변수를 사용할 수 있습니다. 이 5가지 변수 매개변수는 명명된 키워드 매개변수와 혼합될 수 없다는 점을 제외하고 매개변수는 조합하여 사용할 수 있습니다. 그러나 매개변수 정의의 순서는 필수 매개변수, 기본 매개변수, 가변 매개변수/이름이 지정된 키워드 매개변수, 키워드 매개변수여야 합니다.
예를 들어 위의 매개변수가 포함된 함수를 정의합니다.
def f1(a, b, c=0, *args, **kw):
print('a = ', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)def f2(a, b, c=0, *, d, ** kw ):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
함수가 호출되면 Python 인터프리터는 매개변수 위치와 매개변수 이름에 따라 해당 매개변수를 자동으로 전달합니다.
>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}>>> c=3)
a = 1 b = 2 c = 3 args = () kw = {}>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 인수 3개 = ('a', 'b') kw = {}>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 인수 = ('a', 'b') kw = {'x': 99}>>> f2(1, 2, d=99, ext=없음 )
a = 1 b = 2 c = 0 d = 99 kw = {'ext': 없음}
가장 놀라운 점은 튜플과 딕셔너리를 통해 호출할 수도 있다는 것입니다. 위 함수 :
>>> args = (1, 2, 3, 4)>>> kw = {'d': 99, 'x': '#'} >> ;> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'} >>>args = (1, 2, 3)>>> kw = {'d': 88, 'x': '#'}>>f2(*args, * *kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
따라서 어떤 함수에 대해서도 func와 같은 것을 전달할 수 있습니다. (*args, **kw), 해당 인수가 정의된 방식에 관계없이.
요약
Python의 함수는 매우 유연한 매개변수 형태를 갖고 있어 간단한 호출을 구현할 수 있을 뿐만 아니라 매우 복잡한 매개변수도 전달할 수 있습니다.
기본 매개변수는 변경 불가능한 객체를 사용해야 합니다. 변경 가능한 객체인 경우 프로그램 실행 시 논리 오류가 발생합니다!
변수 매개변수와 키워드 매개변수를 정의하는 구문에 주의하세요.
*args는 변수 매개변수이고 args는 튜플을 받습니다.
**kw는 키입니다. 단어 매개변수, kw는 dict를 받습니다.
그리고 함수 호출 시 변수 매개변수와 키워드 매개변수를 전달하는 방법에 대한 구문:
변수 매개변수는 직접 전달할 수 있습니다: func(1, 2, 3) 또는 먼저 Assemble 목록 또는 튜플을 가져온 다음 *args를 통해 전달합니다. func(*(1, 2, 3))
키워드 매개변수를 직접 전달할 수 있습니다: func(a=1, b=2) , 사전을 먼저 어셈블한 다음 **kw: func(**{'a': 1, 'b': 2})를 통해 전달할 수도 있습니다.
*args와 **kw를 사용하는 것은 Python의 관용어입니다. 물론 다른 매개변수 이름을 사용할 수도 있지만 관용구를 사용하는 것이 가장 좋습니다.
이름이 지정된 키워드 매개변수는 호출자가 전달할 수 있는 매개변수 이름을 제한하고 기본값을 제공하는 데 사용됩니다.
이름이 지정된 키워드 매개변수를 정의할 때 구분 기호 *를 쓰는 것을 잊지 마세요. 그렇지 않으면 위치 매개변수가 정의됩니다.