>>> * x
>>>f
<0x101c6ef28의 함수
>>>
8.4 목록 전달
이름의 이름: 함수에 목록을 전달하는 것이 유용한 경우가 많습니다. 이 목록에는 이름, 숫자 또는 더 복잡한 개체(예: 사전)가 포함될 수 있습니다. 목록이 함수에 전달되면 함수는 해당 내용에 직접 액세스할 수 있습니다. 목록 처리의 효율성을 높이려면 아래 기능을 사용하세요.
8.4.1 함수 내 리스트 수정
1. 리스트를 함수에 전달한 후 함수에서 수정할 수 있습니다. 함수 내에서 이 목록에 대한 모든 수정 사항은 영구적이므로 많은 양의 데이터를 효율적으로 처리할 수 있습니다.
2. 추가 팝업 추가 또는 삭제
3. 함수는 작업을 완료하고, 함수는 서로 호출할 수 있습니다. 유지 관리 및 수정을 용이하게 하기 위해 기능을 최적화합니다.
8.4.2 함수 수정은 금지됩니다
이 문제를 해결하려면 이런 방식으로 원본 대신 목록의 복사본을 함수에 전달할 수 있습니다. 전혀 원본.
function_name(list_name[:]), [:]은 복사와 동일합니다.
8.5 실제 매개변수 전달(가변 매개변수)
때로는 함수가 허용해야 하는 실제 매개변수의 수를 미리 알 수 없습니다. 다행히 Python에서는 함수가 호출 문에서 실제 매개변수를 원하는 만큼 수집할 수 있습니다. .
def make_pizza(*toppings):
매개변수 이름 *toppings의 별표는 Python에게 toppings라는 이름의 빈 튜플을 생성하고 수신된 모든 값을 이 튜플에 캡슐화하도록 지시합니다. 함수 본문의 print 문은 Python이 하나의 값으로 함수 호출을 처리할 수 있을 뿐만 아니라 세 개의 값으로 함수를 호출할 수 있음을 보여주는 출력을 생성합니다. 비슷한 방식으로 다른 호출을 처리합니다. 함수가 단일 값만 수신하는 경우에도 Python은 인수를 튜플로 캡슐화합니다.
8.5.1 위치 인수와 가변 인수 결합
함수가 다양한 유형의 인수를 허용하도록 하려면 함수 정의의 마지막에 임의 개수의 인수를 허용하는 형식 매개변수를 넣어야 합니다. Python은 먼저 위치 인수와 키워드 인수를 일치시킨 다음 나머지 인수를 마지막 형식 매개변수로 수집합니다.
8.5.2 가변 인수 및 키워드 인수 사용
def build_profile(first, last, **user_info):
build_profile() 함수의 정의에는 이름과 성이 필요하며 사용자는 원하는 만큼 제공할 수 있습니다. 이름-값 쌍이 필요합니다. 형식 매개변수 **user_info에 있는 두 개의 별표는 Python에게 user_info라는 빈 사전을 생성하고 이 사전에 수신된 모든 이름-값 쌍을 캡슐화하도록 지시합니다. 이 함수에서 user_info의 이름-값 쌍은 다른 사전처럼 액세스할 수 있습니다.
키의 경우 user_info.items()의 값:
profile[key] = value
user_profile = build_profile('albert', 'einstein', location='princeton', field='physics')
8.5 .3 매개변수 조합 사용
1. Python에서 함수를 정의할 때 필수 매개변수, 기본 매개변수, 변수 매개변수, 키워드 매개변수, 명명된 키워드 매개변수를 조합하여 사용할 수 있습니다. 하지만 매개변수 정의 순서는 필수 매개변수, 기본 매개변수, 변수 매개변수, 명명된 키워드 매개변수, 키워드 매개변수 순이어야 합니다.
2. Python의 함수는 간단한 호출을 구현할 수 있을 뿐만 아니라 매우 복잡한 매개변수를 전달할 수도 있는 매우 유연한 매개변수 형식을 가지고 있습니다.
3. 기본 매개변수는 불변 객체를 사용해야 합니다. 가변 객체인 경우 프로그램 실행 시 논리 오류가 발생합니다!
4. 변수 매개변수와 키워드 매개변수를 정의하는 구문에 주의하세요.
5.*args는 변수 매개변수이고 args는 튜플을 받습니다.
6.**kw는 키워드 매개변수이고 kw receive는 딕셔너리
7. 그리고 함수 호출 시 변수 매개변수와 키워드 매개변수를 전달하는 방법에 대한 구문:
변수 매개변수는 직접 전달할 수 있습니다: func(1, 2, 3) 또는 먼저 목록이나 튜플을 조합할 수 있습니다 , 그리고 *args를 통해 전달: func(*(1, 2, 3));
키워드 매개변수는 직접 전달될 수 있습니다: func(a=1, b=2), 또는 먼저 dict를 조합할 수 있습니다 그런 다음 ** kw를 전달합니다: func(**{'a': 1, 'b': 2}).
*args와 **kw를 사용하는 것은 Python의 관용어입니다. 물론 다른 매개변수 이름을 사용할 수도 있지만 관용구를 사용하는 것이 가장 좋습니다.
8.5.4 재귀 매개변수
함수 내에서 다른 함수를 호출할 수 있습니다. 함수가 내부 에서 자신을 호출하면 해당 함수는 재귀적입니다. 재귀 함수의 장점은 간단한 정의와 명확한 논리입니다. 이론적으로 모든 재귀 함수는 루프로 작성할 수 있지만 루프의 논리는 재귀만큼 명확하지 않습니다.
def 사실(n):
if n==1:
return 1
return n *fact(n - 1)
|
재귀 함수를 사용할 때는 스택 오버플로를 방지하도록 주의해야 합니다. 컴퓨터에서 함수 호출은 스택의 데이터 구조를 통해 구현됩니다. 함수 호출이 입력될 때마다 스택 프레임이 스택에 추가됩니다. 스택 크기는 무한하지 않기 때문에 재귀 호출이 너무 많으면 스택 오버플로가 발생합니다.
하노이 타워의 움직임은 재귀 함수를 사용하여 매우 간단하게 구현할 수 있습니다.
8.6 고차 함수
8.6.1 고차 함수
변수가 함수를 가리킬 수 있고 함수의 매개변수가 변수를 받을 수 있으므로 함수가 다른 함수를 매개변수로 받을 수 있는 것을 이런 종류의 함수라고 합니다. 고차 함수.
def add(x, y, f):
return f(x) + f(y)
|
8.6.2 내장 함수
1. 절대값 찾기 value 함수 abs()에는 매개변수가 하나만 있습니다.
2. 객체 유형을 확인하려면 type() 함수를 사용하세요:
>>> type(123)
>>> ; type( 'str')
>>> type(None)
|
3. 제곱근을 계산합니다. math.sqrt() 함수를 호출합니다.
4.lower()는 소문자 문자열을 반환합니다.
5.__len__ 메소드는 길이를 반환합니다. Python에서 객체의 길이를 가져오기 위해 len() 함수를 호출하면 실제로 len() 함수 내에서 자동으로 객체의 __len__() 메서드를 호출하므로 다음 코드는 동일합니다.
>>> len('ABC')
3
>>'ABC'.__len__()
3
| 6. 최대 기능 ()는 원하는 수의 매개변수를 받을 수 있으며 가장 큰 매개변수를 반환합니다. 7. 객체의 모든 속성과 메소드를 얻으려면 문자열이 포함된 목록을 반환하는 dir() 함수를 사용할 수 있습니다. 예를 들어 str 객체의 모든 속성과 메소드를 얻으려면: 8. Python 내장 hex() 함수는 정수를 16진수 문자열로 변환합니다. 9. 클래스 상속 관계에서는 type()을 사용하는 것이 매우 불편합니다. 클래스 유형을 결정하려면 isinstance() 함수를 사용할 수 있습니다. 매개변수 유형이 확인되며 정수 및 부동 소수점 유형 매개변수만 허용됩니다. 내장 함수 isinstance()를 사용하여 데이터 유형 검사를 구현할 수 있습니다. 내장 isinstance 함수를 사용하여 변수가 문자열인지 확인합니다. 10. getattr(), setattr() 및 hasattr()을 사용하면 객체의 상태를 직접 조작할 수 있습니다.
>>> hasattr(obj, 'x') # 'x' 속성이 있나요? True>>> obj.x9>>> hasattr(obj, 'y') # 'y' 속성이 있나요? False>>> setattr(obj, 'y', 19) # 'y' 속성을 설정합니다>>> hasattr(obj, 'y') # 속성이 'y'입니다. ? True>>> getattr(obj, 'y') # 'y' 속성 가져오기19>>> obj.y # 'y' 속성 가져오기19 | 일련의 내장 함수를 통해 Python 객체를 분석하고 내부 데이터를 얻을 수 있습니다. 객체 정보를 모르는 경우에만 객체 정보를 얻을 수 있다는 점에 유의해야 합니다. 11.Python에는 map() 및 Reduce() 기능이 내장되어 있습니다. map은 전달된 함수를 시퀀스의 각 요소에 차례로 적용하고 결과를 새 Iterator로 반환합니다.
>>> def f(x):... Return x * x...>>> , 3, 4, 5, 6, 7, 8, 9])>>> 목록(r)[1, 4, 9, 16, 25, 36, 49, 64, 81]
| 리듀스 사용법. Reduce는 시퀀스 [x1, x2, x3, ...]에 함수를 적용합니다. 이 함수는 두 개의 매개변수를 받아야 하며 결과를 계속해서 시퀀스의 다음 요소로 누적 계산을 수행합니다.
>>> from functools import Reduce>> def fn(x, y):... x * 10 + y... >>> 축소(fn, [1, 3, 5, 7, 9])13579
|
12.Python의 내장 filter() 함수는 시퀀스를 필터링하는 데 사용됩니다. filter()는 또한 함수와 시퀀스 를 받습니다. map()과 달리 filter()는 전달된 함수를 각 요소에 차례로 적용한 다음 반환 값이 True인지 False인지에 따라 요소를 유지할지 또는 삭제할지 결정합니다. 핵심은 "필터" 기능을 올바르게 구현하는 것입니다. filter() 함수는 지연 시퀀스인 Iterator를 반환하므로 filter()가 계산 결과를 완료하도록 강제하려면 list() 함수를 사용하여 모든 결과를 얻고 목록을 반환해야 합니다.
def is_odd(n):
반환 n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 결과: [1, 5, 9, 15]
|
13. Python에 내장된 sorted() 함수를 사용하면 목록을 정렬할 수 있습니다.
> .sorted() 함수는 절대값 정렬과 같은 사용자 정의 정렬을 구현하는 핵심 함수이기도 합니다. 역방향 정렬을 수행하려면 키 기능을 변경할 필요가 없습니다. 세 번째 매개변수 reverse=True를 전달할 수 있습니다.
| >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', ' Credit', 'bob', 'about']
15. Python의 내장 열거 함수는 목록을 인덱스-요소 쌍으로 변환할 수 있으므로 인덱스와 요소 자체가 동시에 반복될 수 있습니다. for 루프의 시간.
16. round() 함수는 소수점 이하 자릿수를 반환할 수 있습니다.
| 8.6.3 Decorator 코드가 실행되는 동안 동적으로 기능을 추가하는 방식을 "Decorator"라고 합니다. 기본적으로 데코레이터는 함수를 반환하는 고차 함수입니다. Decorator: 기능 자체를 변경하지 않고 새로운 기능을 추가합니다.
함수 객체에는 __name__ 속성이 있으며, 함수 이름을 얻을 수 있습니다:
>>> def now():
... print('2015-3-25' )
...>>> f()
2015-3-25
>>>지금 '
>> 그렇지 않은 경우 isinstance(value, int) :
._score = 값
@property는 클래스 정의에 널리 사용되어 호출자가 매개변수에 대해 필요한 확인을 보장하면서 짧은 코드를 작성할 수 있도록 하여 프로그램이 실행될 때 오류가 발생할 가능성을 줄입니다.
@unique 데코레이터는 중복된 값이 없는지 확인하는 데 도움이 될 수 있습니다.
8.7 모듈에 함수 저장
유지 관리 가능한 코드를 작성하려면 많은 함수를 여러 파일로 그룹화하여 각 파일에 상대적으로 적은 코드가 포함되도록 할 수 있습니다. Python에서는 .py 파일을 모듈(Module)이라고 합니다. 함수의 장점 중 하나는 기본 프로그램에서 코드 블록을 분리할 수 있다는 것입니다. 함수에 설명적인 이름을 지정하면 기본 프로그램을 훨씬 더 쉽게 이해할 수 있습니다. 한 단계 더 나아가 모듈이라는 별도의 파일에 기능을 저장한 다음 모듈을 기본 프로그램으로 가져올 수 있습니다. import 문을 사용하면 모듈의 코드를 현재 실행 중인 프로그램 파일에서 사용할 수 있습니다. 함수를 별도의 파일에 저장하면 프로그램 코드의 세부 사항을 숨기고 프로그램의 상위 수준 논리에 집중할 수 있습니다. 또한 이를 통해 다양한 프로그램에서 기능을 재사용할 수 있습니다. 기능을 별도의 파일에 저장하면 전체 프로그램이 아닌 다른 프로그래머와 해당 파일을 공유할 수 있습니다. 함수를 가져오는 방법을 알면 다른 프로그래머가 작성한 함수 라이브러리를 사용할 수도 있습니다. 모듈 이름 충돌을 피하기 위해 Python에서는 패키지라고 하는 디렉터리별로 모듈을 구성하는 방법을 도입했습니다. 패키지가 도입된 후 최상위 패키지 이름이 다른 패키지 이름과 충돌하지 않는 한 모든 모듈은 다른 모듈과 충돌하지 않습니다. 이제 abc.py의 모듈 이름은 mycompany.abc가 되고, 마찬가지로 xyz.py의 모듈 이름은 mycompany.xyz가 됩니다. 각 패키지 디렉터리 아래에는 __init__.py 파일이 있어야 합니다. 그렇지 않으면 Python은 이 디렉터리를 패키지가 아닌 일반 디렉터리로 처리합니다. __init__.py는 빈 파일이거나 Python 코드를 포함할 수 있습니다. __init__.py 자체가 모듈이고 해당 모듈 이름이 mycompany이기 때문입니다. 8.7.1 전체 모듈 가져오기 함수를 가져오기 가능하게 만들려면 먼저 모듈을 만들어야 합니다. 모듈은 프로그램으로 가져올 코드가 포함된 .py 확장자를 가진 파일입니다.
if __name__=='__main__': Test()
| 모듈을 사용하는 첫 번째 단계는 명령줄에서 hello 모듈 파일을 실행할 때 모듈을 가져오는 것입니다. Python 인터프리터 특수 변수 __name__은 __main__으로 설정되며, hello 모듈을 다른 곳에서 가져오면 if 판단이 실패합니다. 따라서 이 if 테스트를 통해 모듈은 명령줄을 통해 실행할 때 일부 추가 코드를 실행할 수 있습니다. 요점은 테스트를 실행하는 것입니다. 8.7.2 범위 모듈에서는 많은 함수와 변수를 정의할 수 있지만 일부 함수와 변수는 다른 사람이 사용하고 싶고 일부 함수와 변수는 모듈 내부에서만 사용하고 싶습니다. Python에서는 _ 접두사를 통해 이를 수행합니다. 일반 함수 및 변수 이름은 공개되어 abc, x123, PI 등과 같이 직접 참조될 수 있습니다. __xxx__와 같은 변수는 특수 변수이며 직접 참조될 수 있지만 위와 같이 특수한 목적을 갖습니다. __author__ 및 __name__ 특수 변수입니다. hello 모듈에 의해 정의된 문서 주석은 특수 변수 __doc__를 사용하여 액세스할 수도 있습니다. 일반적으로 _xxx 및 __xxx와 같은 변수에는 이 변수 이름을 사용해서는 안 됩니다. _abc, __abc 등과 같이 직접 참조하면 안 됩니다. 개인 함수나 변수는 다른 사람이 참조하면 안 되는데, 그 용도는 무엇인가요? 예를 참조하세요:
def _private_1(이름): return '안녕하세요, %s' % name
def _private_2(이름): return '안녕하세요, %s' % name TDef 인사말(이름): if len(이름) & gt; 3: Return_private_1(이름) else: Return_Private_2(이름)
|
Greeting() 함수를 모듈에 노출시키고 private 함수로 내부 로직을 숨기므로, Greeting() 함수를 호출할 때 내부 private 함수의 세부 사항에 대해 걱정할 필요가 없습니다. 또한 매우 유용한 코드 캡슐화 및 추상화 방법입니다. 즉, 외부에서 참조할 필요가 없는 모든 함수는 비공개로 정의되고, 외부에서 참조해야 하는 함수만 공개로 정의됩니다.
8.7.3 특정 모듈 가져오기
여러 기능을 모듈에 저장하고 쉼표로 구분하여 모듈에서 원하는 만큼의 기능을 가져옵니다.
8.7.4 as를 사용하여 함수의 별칭을 지정하세요
from pizza import make_pizza as mp
가져올 함수 이름이 프로그램의 기존 이름과 충돌할 수 있거나 함수 이름이 다음과 같은 경우 너무 길면 짧고 고유한 별칭을 지정할 수 있습니다. 별명 - 별명과 유사한 기능의 또 다른 이름입니다. 이 특수 별명을 기능에 지정하려면 해당 기능을 가져올 때 지정해야 합니다.
8.7.5 as를 사용하여 모듈의 별칭을 지정하세요
모듈의 별칭을 지정할 수도 있습니다. 모듈에 짧은 별칭을 할당하면(예: 피자 모듈에 별칭 p를 할당) 모듈에서 함수를 더 쉽게 호출할 수 있습니다. pizza.make_pizza()에 비해 p.make_pizza()가 더 간결합니다.
8.7.6 *를 사용하여 모듈의 모든 함수를 가져오세요
별표(*) 연산자를 사용하면 Python이 모듈의 모든 함수를 가져올 수 있습니다.
그러나 직접 작성하지 않은 대규모 모듈을 사용할 때는 이 가져오기 방법을 사용하지 않는 것이 가장 좋습니다. 모듈에 프로젝트에 사용된 것과 동일한 이름을 가진 함수가 있는 경우 예기치 않은 결과가 발생할 수 있습니다. Python에서는 동일한 이름을 가진 여러 함수 또는 변수가 발생할 수 있으므로 모든 함수를 개별적으로 가져오는 대신 함수를 재정의할 수 있습니다.
8.8 함수 작성 가이드
함수를 작성할 때 몇 가지 세부 사항을 염두에 두어야 합니다.
1. 함수에는 설명이 포함된 이름을 지정하고 소문자와 밑줄만 사용해야 합니다. 설명적인 이름은 귀하와 다른 사람들이 코드가 수행하려는 작업을 이해하는 데 도움이 됩니다. 모듈 이름을 지정할 때도 위의 규칙을 따라야 합니다.
2. 각 함수에는 해당 함수를 간략하게 설명하는 주석이 포함되어야 합니다. 이 주석은 함수 정의를 따라야 하며 docstring 형식을 사용해야 합니다. 잘 문서화된 함수를 사용하면 다른 프로그래머가 문서 문자열의 설명을 읽기만 하면 함수를 사용할 수 있습니다. 함수 이름, 필수 인수 및 유형을 알고 있는 한 코드가 설명된 대로 작동할 것이라고 신뢰할 수 있습니다. 반환 값은 자신의 프로그램에서 사용할 수 있습니다.
3.형식 매개변수의 기본값을 지정할 때 등호 양쪽에 공백이 없어야 합니다.
|
|