Python의 7개 매개변수를 실제로 마스터하셨나요?

왜 인터넷에서 사람들은 파이썬에 매개변수 유형이 4~5개 있다고 항상 말하지만, 실제로 7가지 유형이 있다는 사실은 모르는지 모르겠습니다. Python의 7개 매개변수는  기본 매개변수 , 위치 매개 변수 , 키워드 매개변수, 가변 길이 위치 매개변수 , 가변 길이 키워드 매개 변수 , 위치 전용 매개변수  및  키워드 전용 매개변수입니다 . 초보자들은 "가변 길이 매개변수"를 본 적이 없을 수도 있지만, 대부분의 사람들은 "매개변수 전용"을 본 적이 없을 것입니다. "매개변수 전용"은 일반적으로 모듈 개발 시에만 사용되는 것인데 왜 알까요? 추측해 보세요... 자세히 말씀드리겠습니다.

먼저 코드를 살펴보겠습니다. 대부분의 사람들은 이를 이해하지 못합니다.

def function(a, /, b, c=1, *, d=2, **e) -> None: ...

위 코드는 정상적으로 실행될 수 있으며, 거의 모든 매개변수 유형을 반영하지만 완전히 반영하지는 않습니다. 왜냐하면 서로 공존할 수 없는 여러 매개변수 유형이 있기 때문입니다.

1. 기본 매개변수

기본 매개변수는 단순하고 리터럴이며, 값을 주지 않으면 기본값을 가지게 되는데, 특정 값을 전달하지 않으면 기본값이 되는 경우도 있기 때문에 기본 매개변수라고도 합니다.

def function(default_parameter: int = 1) -> int:
    return default_parameter

위 함수는 값을 전달하지 않으면 기본적으로 1을 반환하고, 값을 전달하면 전달한 값을 반환합니다. 간단하지 않은가? 그렇게 생각한다면 완전히 틀린 생각입니다 .다음 코드의 출력은 무엇이라고 생각하시나요?

def function(default_parameter=[1]) -> None:
    print(default_parameter)
    default_parameter.append(default_parameter[-1] + 1)

function()
function()
function()

출력은 다음과 같습니다.

[1]
[1, 2]
[1, 2, 3]

자세한 설명은 (링크된 기사의 일곱 번째 항목): Python 오류가 발생하기 쉬운 지점의 대규모 컬렉션을 참조하세요.

이것이 기본 매개변수의 가장 흔한 함정입니다. 대부분의 사람들이 여기에 빠지게 됩니다. 한 회사에서 비즈니스 코드에 치명적인 실수를 하여 목록이 비정상적으로 커져 서버가 다운되는 직접적인 원인이 되었습니다.

2. 위치 매개변수

위치 매개변수는 우리가 매일 사용하는 것입니다. 우리는 이에 대해 듣는 것을 좋아하며 모두가 사용하는 매개변수입니다.

def function(a: int, b: float, c: str) -> None:
    print(a + b, c)

소위 "위치"는 매개변수가 위치별로 전달된다는 의미입니다. 위치 매개변수의 위치는 꼭 필요한 것은 아닙니다. 매개변수를 키워드 매개변수처럼 전달할 수 있습니다. 예를 들면 다음과 같습니다.

def function(a: int, b: int) -> None:
    print(a, b)

function(1, 2)
function(b=2, a=1)

 위의 두 가지 호출 메서드의 출력 결과는 1과 2 모두 동일합니다. 실제로 위치 매개변수의 본질은 튜플을 사용하여 매개변수를 전달하는 것입니다. 이에 대해서는 나중에 자세히 설명하겠습니다.

3. 키워드 매개변수

키워드 매개변수는 문자 그대로 이해해도 되는데, "key"이고 매개변수를 전달하기 위해서는 반드시 이름을 명시해야 한다는 것만큼 간단하다.

위에서 위치 매개변수에 대해 이야기할 때 키워드 매개변수에 대해서도 이야기했는데, 키워드 매개변수는 매개변수 이름만 명시하면 매개변수의 위치에 상관이 없습니다. 키워드 매개변수는 위치 매개변수와 유사하며 실제로 매개변수를 전달하기 위해 사전을 사용하는데, 사전의 키는 문자열 형식의 매개변수 이름이고 값은 해당 매개변수의 값이다.

4. 가변 길이 위치 매개변수

 가변 길이 위치 매개변수 또는 가변 길이 위치 매개변수라고도 불리는 가변 길이 위치 매개변수는 일반적으로 *args로 표기합니다. args는 영어 단어인 Argument의 복수형의 약어입니다. "가변 길이"는 매개변수는 불확실합니다. 즉, 매개변수 수에 제한이 없습니다.

def function(*args: int) -> tuple[int]:
    for arg in args:
        print(arg)
    return args

function(1)
function(1, 2)
function(1, 2, 3)

위 함수는 튜플을 반환합니다. 즉, args는 실제로 튜플입니다. 이는 위치 매개변수가 튜플에 전달된다는 사실과 관련이 있습니다.

실제로 위의 코드는 다음과 같이 작성할 수도 있습니다.

def function(*args: int) -> tuple[int]:
    print(*args)
    return args

누군가 *args가 무엇을 의미하는지 궁금합니다. 여기에는 Python의 시퀀스 언패킹에 대한 지식이 포함됩니다. (이것을 다시 들어본 적이 없습니까?) 자세한 내용은 Python 별표의 멋진 사용 - 유연한 시퀀스 언패킹을 참조하세요.

print 함수는 가변 길이 매개변수를 사용하는 Python의 가장 일반적인 함수로, 함수 프로토타입은 다음과 같습니다(2개의 오버로드):

def print(
    *values: object,
    sep: str | None = " ",
    end: str | None = "\n",
    file: SupportsWrite[str] | None = None,
    flush: Literal[False] = False,
) -> None: ...

def print(
    *values: object,
    sep: str | None = " ",
    end: str | None = "\n",
    file: _SupportsWriteAndFlush[str] | None = None,
    flush: bool
) -> None: ...

 *values는 가변 길이 매개변수입니다. 실제로 위치 매개변수는 가변 길이 위치 매개변수 시퀀스가 ​​압축 해제된 후에 전달되는 반면, 가변 길이 위치 매개변수는 전체 튜플을 통해 직접 전달됩니다.

그럼 조금 확장해 보겠습니다. Python 함수가 여러 개의 반환 값을 가질 수 있다는 것을 인터넷에서 항상 보셨나요? 이거 진짜야? 이건 잘못된 인식이에요! 실제로 Python의 함수는 여전히 하나의 값만 반환합니다. 여러 값을 쓸 때 Python은 자동으로 이를 튜플로 변환합니다. 다음 코드를 확인할 수 있습니다.

def function():
    a = 1
    b = 2
    return a, b

c = 1, 2

print(type(c))
print(type(function()))

출력 결과는 모두 튜플입니다. 

5. 가변 길이 키워드 매개변수

가변길이 키워드 매개변수는 가변길이 위치 매개변수와 비교가 가능하며, 튜플을 딕셔너리로 ​​교체하기만 하면 되고 나머지는 모두 동일하므로 여기서는 자세히 설명하지 않겠습니다.

6. 위치 전용 매개변수

자, 드디어 본론으로 들어왔습니다. 위치 매개변수를 보기 전에 먼저 형제를 소개하겠습니다. 슬래시 (/) 입니다 . 파이썬에서는 나누기를 의미할 뿐만 아니라 의미도 있고, 특수 이름입니다. 위치 전용 인수 구분 기호 라고 합니다 . 이 형제를 아는 사람이 몇 명이나 될까요?

매개변수 목록에 슬래시를 직접 쓰면 앞의 매개변수가 위치 매개변수가 되고 키워드 매개변수를 사용하여 전달할 수 없습니다!

Python의 내장 함수 isinstance에 나타납니다.

def isinstance(
    __obj: object,
    __class_or_tuple: _ClassInfo,
    /  # 这里!这里!这儿出现了仅位置参数分隔符!
) -> bool

또한 int에서는:

class int(
    __x: str | ReadableBuffer | SupportsInt | SupportsIndex | SupportsTrunc = ...,
    /  # 这里!这里!这儿有仅位置参数分隔符!
)

이것에 대한 나의 이해는 (비공식 이해)입니다. 이 것의 목적은 일반적으로 일반 사람들이 코드를 이해하지 못하는 것을 방지하는 것입니다. 매개 변수 이름과 같은 일부 사항은 관례적이어서 의도적으로 작성할 필요가 없습니다. 결국, 당신은 전에 본 적이 있습니다.. int를 사용할 때 누가 이런 글을 쓰나요? ? ?

int(__x=1)

위 코드는 잘못된 코드입니다! 매개변수 이름은 실제로 __x이지만 위치 매개변수 구분 기호만 이를 위치 매개변수로 강제하고 __x는 쓸 수 없습니다(키워드 매개변수로 쓰기)! 그리고 그것을 글로 쓰면 오해의 소지가 있고 읽기 어려울 뿐입니다!

7. 키워드 전용 매개변수

마찬가지로 키워드 전용 매개변수를 살펴보기 전에 별표(*) 인 형제에 대해 소개하겠습니다. 파이썬에서는 곱셈과 시퀀스 언패킹을 의미할 뿐만 아니라 또 다른 의미도 있습니다. 특별한 이름은 키워드( Keyword) 라고 합니다. -유일한 인수 구분 기호입니다 . 이 형제를 아는 사람이 몇 명이나 될까요?

매개변수 목록에 별표를 직접 작성하면 뒤에 있는 매개변수가 키워드 매개변수로 강제되고 매개변수는 위치 매개변수를 사용하여 전달될 수 없습니다!

이에 대한 내 이해(비공식 이해)는 모듈 및 프로젝트 수정이 매우 편리하고 다른 버전과의 호환성이 좋다는 것입니다. 위치 매개변수와 달리 매개변수 하나가 중간에 누락되거나 추가되면 이후의 모든 매개변수가 잘못 정렬됩니다. 예측할 수 없는 문제로 이어집니다. 이 키워드 전용 매개변수 구분 기호를 작성한 후에는 매개변수 정렬 오류를 방지하기 위해 함수를 사용할 때 다른 사람들이 이를 키워드 매개변수 형식으로 전달하도록 강제할 수 있습니다. 이는 일반적으로 매개변수가 많을 때 사용됩니다. 예를 들어 Python 내장 모듈 tkinter에는 일부 제어 클래스에 대해 터무니없는 수의 초기화 매개변수가 있습니다.

def __init__(
    self: Canvas,
    master: Misc | None = None,
    cnf: dict[str, Any] | None = {},
    *,  # 这里!这里!这儿有个仅关键字参数分隔符!
    background: str = ...,
    bd: _ScreenUnits = ...,
    bg: str = ...,
    border: _ScreenUnits = ...,
    borderwidth: _ScreenUnits = ...,
    closeenough: float = ...,
    confine: bool = ...,
    cursor: _Cursor = ...,
    height: _ScreenUnits = ...,
    highlightbackground: str = ...,
    highlightcolor: str = ...,
    highlightthickness: _ScreenUnits = ...,
    insertbackground: str = ...,
    insertborderwidth: _ScreenUnits = ...,
    insertofftime: int = ...,
    insertontime: int = ...,
    insertwidth: _ScreenUnits = ...,
    name: str = ...,
    offset: ... = ...,
    relief: _Relief = ...,
    scrollregion: tuple[_ScreenUnits, _ScreenUnits, _ScreenUnits, _ScreenUnits] | tuple[()] = ...,
    selectbackground: str = ...,
    selectborderwidth: _ScreenUnits = ...,
    selectforeground: str = ...,
    state: Literal['normal', 'disabled'] = ...,
    takefocus: _TakeFocusValue = ...,
    width: _ScreenUnits = ...,
    xscrollcommand: _XYScrollCommand = ...,
    xscrollincrement: _ScreenUnits = ...,
    yscrollcommand: _XYScrollCommand = ...,
    yscrollincrement: _ScreenUnits = ...
) -> None

그럼 이제 궁금한게 있는데, 이 지식을 읽고 처음의 코드를 다시 보면 어떤 매개변수 유형이 서로 충돌하여 공존할 수 없는지 알 수 있나요? 답변을 댓글란에 남겨주세요. (답변은 적지 않겠습니다 [doge]) 


제가 주로 모듈 코드를 직접 작성해서 잘 알고 있는데, 모두 Python 프로그래밍 도구입니다! 이 지식도 모두 숙달해두시는 것이 좋습니다~ 비록 쓸모는 없을지 몰라도 스킬이 많기 때문에 부담스럽지는 않습니다!

이걸 보니 지식이 좀 쌓이셨는지 궁금하네요. 마음에 든다면  좋아요를 누르고 모아서 전달  하는  것이  어떨까요 ? 팔로우 해주시면 더욱 좋을 것 같아요! ! !

이 글은 칼럼으로 구성되어 있으며 칼럼은 글 상단에서 보실 수 있습니다.이 글에는 여러분을 위한 더 놀라운 Python 지식이 담겨 있습니다!

추천

출처blog.csdn.net/weixin_62651706/article/details/132353749