>  기사  >  백엔드 개발  >  Python의 함수 매개변수에 대한 자세한 소개(예제 포함)

Python의 함수 매개변수에 대한 자세한 소개(예제 포함)

不言
不言원래의
2018-09-06 17:59:483257검색

이 글은 Python의 함수 매개변수에 대한 자세한 소개를 제공합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

Python의 함수 정의는 비교적 간단하며 def 키워드의 도움으로 구현되지만 매개변수의 유연성은 매우 큽니다. 일반적으로 정의된 필수 매개변수 외에도 기본 매개변수, 변수 매개변수, 키워드 매개변수, 명명된 키워드 매개변수 및 매개변수 조합을 사용할 수 있습니다. 이를 통해 함수에서 정의한 인터페이스가 복잡한 매개변수를 처리할 뿐만 아니라 호출을 단순화할 수 있습니다. 작성자 코드

1. 위치 매개변수

함수 정의 시 매개변수의 위치 순서를 지정합니다. 위치 매개변수는 호출된 함수 정의에서 정확한 순서로 전달되어야 합니다.

예: 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'

2. 기본 매개변수

함수 정의에서 매개변수에 대한 기본값이 미리 정의되어 있습니다. . 함수가 호출될 때 매개변수에 지정된 값이 제공되지 않으면 기본값이 사용됩니다.
예: 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를 함수에 추가하면 함수가 자동으로 참조를 복사합니다. a=2를 실행한 후 id(a)의 메모리 주소가 변경됩니다. 그러나 그것은 외부 a와는 아무런 관련이 없습니다.

함수 매개변수로서의 변수 객체

>>> 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]
변수 a의 유형은 변수 객체인 리스트입니다. 함수의 참조는 변경 가능한 객체를 가리키고 주소는 변경되지 않으므로 함수 작업 후에 내용이 변경됩니다.

따라서 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. 변경 가능한 객체를 기본 매개변수로 사용하지 마세요.

3. 가변 매개변수 *args

가변 매개변수, 즉 전달되는 매개변수의 개수는 0부터 임의의 개별까지 다양합니다. .

매개변수 개수가 불확실하므로 리스트나 튜플을 사용하여 전달할 수 있습니다. 그런 다음 함수가 호출되면 자동으로 튜플로 어셈블됩니다.
예:

def calc(numbers):  # 变量        
    sum = 0               
    for n in numbers:       
        sum = sum + n * n   
    return sum            
>>> calc( [1,2,3] )   # 传入的是一个list
14
변수 매개변수 사용 *args:

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
함수 코드는 전혀 변경되지 않습니다. 그러나 이 함수를 호출할 때 0개의 매개변수를 포함하여 원하는 수의 매개변수가 전달될 수 있습니다.

4. 키워드 매개변수 **kw

키워드 매개변수 **kw는 임의 개수의 매개변수 이름에 0을 전달할 수 있습니다. 키워드 매개변수는 함수 내에서 자동으로 사전으로 조합됩니다. 예:

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'}
키 매개변수는 무엇에 사용됩니까? 기능 기능을 확장할 수 있습니다. 예를 들어 person() 함수에서는 name과 age라는 두 매개변수를 받는 것이 보장됩니다. 그러나 더 많은 매개변수가 제공되면 해당 매개변수도 수신될 수 있습니다. 물론 사전을 먼저 조합한 다음 사전을 키워드 매개변수로 변환하여 전달할 수도 있습니다.

>>> 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'}
[요약] **extra는 사전의 모든 키-값을 전달하는 것을 의미합니다. 키워드 매개변수를 사용하는 추가 dict 함수의 **kw 매개변수를 입력하면 kw가 dict를 얻습니다. kw로 얻은 dict는 extra의 복사본이므로 함수 외부의 extra에는 영향을 미치지 않습니다.

五、命名关键字参数

如果要限制关键字参数的名字,就可以用命名关键字参数。需要一个特殊分隔符“”,“”后面的参数被视为命名关键字参数。如果缺少“*”,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中函数的可变参数

理解Python中函数的参数

위 내용은 Python의 함수 매개변수에 대한 자세한 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.