이 글은 Python의 함수 매개변수에 대한 자세한 소개를 제공합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
Python의 함수 정의는 비교적 간단하며 def 키워드의 도움으로 구현되지만 매개변수의 유연성은 매우 큽니다. 일반적으로 정의된 필수 매개변수 외에도 기본 매개변수, 변수 매개변수, 키워드 매개변수, 명명된 키워드 매개변수 및 매개변수 조합을 사용할 수 있습니다. 이를 통해 함수에서 정의한 인터페이스가 복잡한 매개변수를 처리할 뿐만 아니라 호출을 단순화할 수 있습니다. 작성자 코드
함수 정의 시 매개변수의 위치 순서를 지정합니다. 위치 매개변수는 호출된 함수 정의에서 정확한 순서로 전달되어야 합니다.
예: x의 n제곱을 계산합니다.
def powern(x,n): s = 1 while n >0: s = s * x n = n -1 return s
두 매개변수 x와 n은 모두 위치 매개변수입니다. 함수를 호출할 때 전달된 두 값을 매개변수 x, n에 위치순으로 전달하고 할당해야 하며, 기본적으로 생략하면 오류가 발생합니다. 예:
>>> powern(5) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: powern() missing 1 required positional argument: 'n'
함수 정의에서 매개변수에 대한 기본값이 미리 정의되어 있습니다. . 함수가 호출될 때 매개변수에 지정된 값이 제공되지 않으면 기본값이 사용됩니다.
예: x의 n제곱을 계속 구하지만 기본값은 x의 3제곱입니다.
def powern( x,n = 3): s = 1 while n >0: s = s * x n = n -1 return s
실행: powern(2), 이는 powern(2,3)을 호출하는 것과 같습니다
2의 4제곱이 필요한 경우 다음을 실행해야 합니다. powern(2,4 )#🎜🎜 #
기본 매개변수를 설정하면 어떤 이점이 있나요? 기본 매개변수는 함수 호출을 단순화하고 함수 호출의 어려움을 줄일 수 있습니다. 단순한 호출이든 복잡한 호출이든 하나의 함수만 정의하면 됩니다.
예를 들어 위의 powern() 예시에서 n의 다른 값이 전달되면 x의 다른 n제곱이 구현될 수 있습니다.
불변 매개변수로서의 함수 매개변수
>>> a = 1 >>> def func(a): ... print('func_id:',id(a)) ... a = 2 ... print('after_func_id:',id(a),'id(2):',id(2)) ... >>> print('out_of_func_id:',id(a),'id(1):',id(1)) out_of_func_id: 501962480 id(1): 501962480 # 全局变量a的id >>> func(a) # 将全局参数a传入函数 func_id: 501962480 # a=1 的id after_func_id: 501962496 id(2): 501962496 >>> print(a) # 退出函数,a的值仍为1 1
함수 매개변수로서의 변수 객체
>>> a = [] >>> def func2(a): ... print('func2_id:',id(a)) ... a.append(1) ... >>> print('out_of_func2_id',id(a)) out_of_func2_id 59694296 >>> func2(a) func2_id: 59694296 >>> print(a) [1]
따라서 func2(a) 함수를 다시 실행하면 예상과 다른 결과가 생성됩니다.
>>> func2(a) func2_id: 59694296 # a地址不变 >>> print(a) [1, 1] # 因为第一次执行func2(a)时,已经修改了a=[1],再次调用时,在[1]里新增
def add_end( L=[] ): # 设置为一个list变量L(对象可变) L.append('end') return L >>> add_end( ) ['end'] >>> add_end() ['end', 'end']
파이썬 함수가 정의되면 기본 매개변수 L의 값, 즉 []가 계산됩니다. L 역시 함수가 호출될 때마다 L의 내용이 변경되면 다음 호출 시 기본 매개변수의 내용이 변경되어 더 이상 개체 []를 가리키는 변수입니다. 함수가 정의된 경우의 []입니다.
은 다음과 같이 변경할 수 있습니다.
def add_end( L=None ): # L为不变对象 if L is None: L = [] L.append('end') return L
그러므로 기본 매개변수를 정의할 때 명심해야 할 한 가지 사항이 있습니다:
기본 매개변수는 불변 객체를 가리켜야 합니다! 불변 객체가 생성되면 객체 내부의 데이터를 수정할 수 없기 때문에 데이터 수정으로 인해 발생하는 오류가 줄어듭니다. 또한 객체가 변경되지 않기 때문에 멀티 태스킹 환경에서 객체를 동시에 읽을 때 잠금이 필요하지 않습니다.
기본 매개변수 설정 시 주의사항이 몇 가지 있습니다 1. 필수 매개변수가 먼저 오고 기본 매개변수가 마지막에 옵니다. 그렇지 않으면 Python 인터프리터가 오류를 보고합니다.
2. 기본 매개변수를 설정하는 방법은 무엇입니까? 함수에 여러 개의 매개변수가 있는 경우 변경사항이 큰 매개변수를 앞에 배치하고 변경사항이 작은 매개변수를 뒤에 배치합니다. 작은 변화가 있는 매개변수를 기본 매개변수로 사용할 수 있습니다.
3. 변경 가능한 객체를 기본 매개변수로 사용하지 마세요.
매개변수 개수가 불확실하므로 리스트나 튜플을 사용하여 전달할 수 있습니다. 그런 다음 함수가 호출되면 자동으로 튜플로 어셈블됩니다.
예:
def calc(numbers): # 变量 sum = 0 for n in numbers: sum = sum + n * n return sum >>> calc( [1,2,3] ) # 传入的是一个list 14
def calc( *numbers ): sum = 0 for n in numbers: # 在函数内部,numbers组装成一个tuple sum = sum + n * n return sum >>> calc( ) # 0个参数 0 >>> calc( 1,3,5,7 ) # 多个参数 84 >>> num = [1,2,3] # list >>> calc( *num ) # *list –> tuple 14 >>> t = (1,3,5) >>> calc( t ) # tuple(错误) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in calc TypeError: can't multiply sequence by non-int of type 'tuple' >>> calc( *t ) 35
def person(name , age , **kw ): print('name:',name,'age:',age,'other:',kw) >>> person('xiong',18) name: xiong age: 18 other: {} >>> person('xiong',18,city = 'SH') # city是原本没有的参数,但是因为有**kw name: xiong age: 18 other: {'city': 'SH'}
>>> extra ={'city':'shanghai','job':'SET'} # dict的定义 >>> person('xiong',18,city = extra['city'],job=extra['job']) # dict的使用 name: xiong age: 18 other: {'city': 'shanghai', 'job': 'SET'} # dict的内容 >>> person('xiong',18,**extra) name: xiong age: 18 other: {'city': 'shanghai', 'job': 'SET'}
如果要限制关键字参数的名字,就可以用命名关键字参数。需要一个特殊分隔符“”,“”后面的参数被视为命名关键字参数。如果缺少“*”,Python解释器则无法识别位置参数和命名关键字参数。在调用时,必须指定参数名字与参数值。
例如,只接收city和job作为关键字参数,可以使用如下定义:
def person( name ,age,*,city,job): print(name , age , city , job ) >>> person('xiong', 18, city='shanghai', job='tester') xiong 18 shanghai tester
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
>>> def person( name,age,*args,city,job ): # 此处city和job也是命名关键字参数 ... print(name, age, city, job)
命名关键字参数必须传入参数名,如果没有传入参数名,调用将会报错:
>>> person('xlp',18,'shanghai','tester') # 错误调用 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: person() missing 2 required keyword-only arguments: 'city' and 'job' >>> person('xlp',18,city='shanghai',job='tester') # 正确调用 xlp 18 shanghai tester
命名关键字参数可以有缺省值,从而简化调用:
>>> def person1(name,age,*,city='shanghai',job): ... print(name,age,city,job) ... >>> person1('xlp',18,job='engineer') xlp 18 shanghai engineer
在Python中定义函数,可以用位置参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。
但是要注意,参数定义的顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数。
(1)定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个list、tuple;
**kw是关键字参数,kw接收的是一个dict;
(2)调用函数时如何传入可变参数和关键字参数的语法:
可变参数直接传入:func(1,2,3)
可变参数间接传入:先组装成list或tuple,l=(1,2,3),再通过args传入,func(l)
关键字参数直接传入:func(a=1,b=2)
关键字参数间接传入:先组装成dict,d={‘a’:1,’b’:2},再通过kw传入,func(d)
(3)命名关键字参数 是为了限制调用者可以传入的参数名,同时可以提供默认值。
(4)定义命名的关键字参数在没有可变参数的情况下,不要忘记写分隔符*,否则定义的将是位置参数
相关推荐:
위 내용은 Python의 함수 매개변수에 대한 자세한 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!