첫째, 장식
1.1 개요
(데코레이터)은 "장식"이라는 실행 모드에서 코드의 동적 추가,
장식 실제로 폐쇄, 다음 함수는 함수의 대체 버전으로 함수가 반환하는 기능은 본질적으로 그 반환 higher-order 함수
1.2 간단한 장식
또한 함수를 호출 할 수 있도록하여 변수, 함수는 객체 일 수 있고, 목적 함수는 변수에 할당 될 수있다
def now():
ptint("2018-3-18")
f = now
f()
함수 객체가 _NAME_의 속성, 당신은 함수의 이름을 얻을 수 있습니다 :
def now():
print("2018-4-3")
f = now
f()
print(now.__name__)
print(f.__name__)
#结果
'now'
'now'
이제 우리는 함수가 구분 기호를 호출하기 전에 잠시 동안 인쇄와 현재 () 함수의 기능을 강화해야한다.
def log(func):
def wrapper():
print("**********")
return func()
return wrapper
def now():
print("2018-3-18")
#装饰器的调用
f = log(now)
f()
1.3 복잡한 장식
요구 사항 : 나이를 입력하고 그것을 밖으로 인쇄
def getAge(age):
print("Tom age is %d"%age)
getAge(10)
#调用getAge方法得到年龄,但是如果输入的是负数就会得到不符合常理的结果
getAge(-10)
def wrapper(func):
def inner(num):
if num < 0:
num = 0
return func(num)
return inner
newGetAge = wrapper(getAge)
newGetAge(-10)
이러한 방법으로, 우리의 코드는 더 간단하고 별도의 프로세스로 격리 논리적 경계를 확인하고 우리가 확인해야하는 장식의 실시를 통해 응용 프로그램 패키지가된다.
계산 방법 및 경계 값이 같은 목적을 위해 검사 할 수 있지만 부정하지 전에 메소드 호출이 반환의 시작 부분에 의한 방법의 또 다른 목적은, 데코레이터는 우리가 코드 좌표 경계 검사의 최소 금액을 달성 할 수 있습니다 .
1.4 장식 식별자 @
식별자 @ 사용은 장식적인 기능에 적용
python2.4 이상 지원 식별자의 사용 @ 단지 @ 이름과 장식에 필요한 기능을 정의하기 전에 기능에 장식 응용 프로그램,
def logger(func):
def inner(*args,**kwargs):
print("***********")
return func(*args, **kwargs)
return inner
@logger
def myPrint():
print("you are very good")
myPrint()
참고 : 예를 들어, 회사의 실제 개발 과정에서, 당신이 할 수있는, 다른 사람이이 시간에 추가하거나 다른 사람들이 당신을 필요로하면서 특정 기능이 임의로 다른 사람의 기능을 수정하지 않도록되는 특정 기능을 수정하고자하는 함수를 작성가있는 경우 또한 자신의 기능을 추가 할 수 있습니다 다른 사람의 소스 코드를 수정하지 않고, 장식을 사용.
둘째, 부분 함수
파이썬 functools 모듈 중 하나가 일부 기능 (기능 부분)이며, 여러 유용한 기능을 제공한다.
역할 간단히 말해 일부 기능은 더 쉬울 것이다이 새로운 함수를 호출, 새로운 기능을 반환합니다 (기본 값을 설정) 고정의 기능에 몇 가지 매개 변수를 넣어하는 것입니다.
#functools 模块
import functools
#int()函数将字符串转换为整数,默认按十进制转换
#可以设置进制
print(int("100",base = 2))
#结果为4,100是二进制中4的表示
#类似于偏函数的功能
def int2(str, base=2):
return int(str, base)
print(int2("10"))
#functools.partical可以帮助创建偏函数,不用自己定义int2函数
#作用:把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新的函数会更简单。
int3 = functools.partial(int, base=2)
print(int3("100"))
#在创建偏函数的时候,实际上固定了关键字参数base
#结果
4
예 2
import functools
max2 = functools.partical(max, 10)
#实际上会把10作为*args的一部分自动加到左边
max2(5, 6, 7)
相当于
args =(10, 5, 6, 7)
max(args)
운동 :
수입 모듈 조작 요구가 일부 기능은 함수가 필요할 때 ()를 추가하여, 일부 기능의 첨가 설계 (100) 및 추가의 번호를 찾는.
세 변수 범위
3.1 개요
파이썬, 생성, 변경, 변수 이름을 찾을 시간에 진행하는이 프로그램은, 변수 이름은 우리가 네임 스페이스도 범위라고도 부르는 공간에 저장됩니다.
간단히 말하면, 가변 범위가 사용될 수있는 변수의 범위를 말한다
변수가 어떤 위치에서 프로그램에 액세스 할 수 없습니다 액세스가 변수가 할당되는 위치에 따라 달라집니다.
분할 3.2 범위
L (로컬) 로컬 스코프
로컬 변수 : 함수 정의되는 변수에 기재된 키워드 DEF 문장 블록에 포함되는, 함수가 호출 될 때마다 새로운 지역 범위를 생성한다.
참고 :이 함수 내에서 전역 변수를 할당해야하는 경우, 글로벌 문으로 함수 내 전역 변수로 변수를 선언
E (바깥 쪽) 중첩 범위
또한 공지 된 함수 범위 함수의 외측 밀폐 기능
G (글로벌) 전역
모듈 레벨에서 정의 된 변수는 각각의 모듈이 전역 인
참고 : 전역 범위의 범위는 단일 파일 모듈 내에서 제한된다
B (내장) 내장 범위
이러한 소정의 내장 모듈 내에서와 같은 시스템 정의 변수 내에 모듈을 고정.
#查看所有的内置变量
print(vars())
3.3 변수 이름 확인 LEGB 법
우선 검색 변수 이름 : 지역 변수> 중첩 된 범위> 전역> 내장 범위
LEGB 규칙 :
미정 함수의 변수 명을 사용하는 경우, 파이썬은 우선 순위에 따라, 따라서 변수 이름의 중요성을 결정하기 위해 검색 범위 네 하였다한다.
전역 (G) 다음에 중첩 구조 층 (E)의 중첩 범위 DEF 또는 람다 함수이어서 먼저 로컬 검색 범위 (L), 및 최종적으로 구축 범위 (B) .
찾는이 원칙에 따르면, 첫번째 장소에있는 정류장에서 발견, 아무도 찾을 수없는 경우, 나가서 설명하자면 NameError 오류가 발생합니다
def func():
var = 300
print("var",var)
var = 100
func()
print("var", var)
#结果
300
100
3.4 키워드 글로벌
#声明全局变量
global var
var = 200
def func():
# var = 200
print("var_", var)
def fun():
var = 100
print("var", var)
fun()
func()
참고 : 같은하지 않습니다 같은 동안, / 위해 제외 /하려고하면 / 그 밖의 다른 코드 블록의 새로운 범위를 도입하기 전에 파이썬 전용 모듈 (Module1의), 클래스 (클래스)와 기능 (DEF, 람다) 새로운 범위의 도입은 이러한 진술의 변수 정의는 외부에서 사용할 수 있습니다.
if 1:
num = 10
print(num)