일부 기능 장식 파이썬베이스

첫째, 장식

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)
게시 31 개 원래 기사 · 원 찬양 4 · 조회수 3518

추천

출처blog.csdn.net/qq_29074261/article/details/80016724