Python-enum&函数式编程

枚举enum

# -*- coding:utf-8 -*- 

from enum import Enum

"""
    python的枚举是类的形式展现
    大写表示常量
    枚举类下的常量无法改变值,一般类下的变量可以改变其值
    枚举类型不支持大小的比较,可以做等值比较,不同枚举类型不可以做等值比较
"""
class VIP(Enum):
    YELLOW = 1
    GREEN = 2
    BLACK = 3
    RED = 4

print(VIP.YELLOW)
"""
    VIP.YELLOW
    print(type(VIP.YELLOW))
    <enum 'VIP'> : 类型
"""
print(VIP.YELLOW.value)
"""
    1
    print(type(VIP.YELLOW.value))
    <class 'str'> : 字符串类型
"""
print(VIP.YELLOW.name)
"""
    YELLOW
"""

#------------------------>遍历枚举类
for v in VIP.__members__:
    print(v)
"""
    YELLOW
    GREEN
    BLACK
    RED
"""

#------------------------>对比,枚举类和常用类
class Common():
    YELLOW = 1

print(Common.YELLOW)
"""
    1
"""

函数式编程

函数式编程(全新的思维领域,可以添加到项目中,不建议全部改为此思维):

map
reduce
filter
lambda

命令式编程:

def
if else
for


    函数式编程:(优势)不用调用全局变量
    闭包:           (闭包的概念 , 面试)
        a = 1
        a = '2'
        a = def
        int a = 1
        另外一个函数的参数,传递到另外的函数里
        把一个函数当做另外一个函数的返回结果

    函数:只是一段可执行的代码,并不是对象,不可实例化
    在python中一切皆对象,对象可以实例化

闭包

被封装函数+内部环境变量,返回函数形成闭包

def curve_pre():
    a = 3
    def curve(x):
        return a*x*x
    #返回一个函数,所以f也为函数
    return curve

#a = 25 此处给a赋值无效,函数内的变量a作用域只在函数内
#函数curve与curve_pre形成闭包后做了封闭,不受外部变量的影响
f = curve_pre()
print(f(2))

"""
    使用闭包要注意一些什么
"""
def f1():
    a = 10
    def f2():
        #被认为局部变量,此时不是闭包了,内部函数需要去引用外部函数的变量才是闭包
        a = 20
        print(a)    #20
    print(a)    #10
    f2()
    #内部函数变量为局部变量,不会影响外部变量
    print(a)    #10
    return f2

#由于函数内部没有返回值,所以f为空值
f = f1()
print(f())
"""
    None
"""


def f1():
    a = 10
    def f2():
        #内部函数需要引用外部函数的变量才能形成闭包     
        return a
    return f2

f = f1()
print(f.__closure__)
"""
    (<cell at 0x7f6196e20cc8: int object at 0xe4a080>,) 输出值表明此实例为闭包
"""

"""
    闭包案例:旅行者行程的叠加
    关键字global 让函数内部变量定义为全局变量
"""

#非闭包的函数方法实现案例
origin = 0
def Distance(step):
    #未定义会报错,下一句的origin变量未定义
    global origin
    new_pos = origin + step
    origin = new_pos
    return new_pos
print(Distance(2))
print(Distance(3))
print(Distance(5))



#闭包的函数方法实现案例
origin = 0

def factory(pos):
    def go(step):
        #关键字nonlocal强制声明pos不是一个局部变量
        nonlocal pos
        new_pos = pos + step
        pos = new_pos
        return new_pos
    return go

tourist = factory(origin)
print(tourist(2))
print(tourist.__closure__[0].cell_contents)
print(tourist(3))
print(tourist.__closure__[0].cell_contents)
print(tourist(5))
print(tourist.__closure__[0].cell_contents)

"""
    2
    2
    5
    5
    10
    10
"""
"""
    print(tourist.__closure__[0].cell_contents):从闭包中获取pos的值
    输出结果表明确实是闭包起了作用
"""

函数式编程-匿名函数

"""一般函数"""
def add(x,y):
    return x+y

"""
    匿名函数:
    lambda parameter _list: expression
                        lambda: 声明匿名函数的关键字
                        parameter _list 对应匿名函数的参数
                        expression 对应函数内容
                        :后面不能添加表达式  eg:  : a=x+y 是错的
"""
f = lambda x,y: x+y
print(f(1,2))


"""
    三元表达式:
             条件为真时返回的结果  if  条件判断   else   条件为假时的返回结果
"""
x = 2
y = 3
r = x if x>y else y
print(r)

函数式编程-map()

list_x = [1,2,3,4,5,6,7,8,9,10]

def square(x):
    return x * x

"""
    map类将列表的每一个元素映射到函数中
    相当于执行for循环
"""
r = map(square,list_x)
print(list(r))
"""
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
"""

list_x = [1,2,3,4,5,6,7,8,9,10]
r = map(lambda x: x*x,list_x)
print(list(r))
"""
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
"""

#------------------------->

list_x = [1,2,3,4,5,6,7,8]
list_y = [1,2,3,4,5,6,7,8]
r = map(lambda x,y : x*x+y,list_x,list_y)
print(list(r))
"""
    [2, 6, 12, 20, 30, 42, 56, 72]
"""

函数式编程-reduce()

"""
    和map类不同的是,reduce是一个函数
    reduce连续计算,连续调用lambda
    reduce调用过程:
                    1. ((((((1+2)+3)+4)+5)+6)+7)+8
                    2. 第一次调用x=1 y=2
                    3. 第二次调用x=(1+2) y=3
                    4. 一次类推
    reduce是做连续计算的,而非连续相加或相乘
"""
from functools import reduce
list_x = [1,2,3,4,5,6,7,8]
r = reduce(lambda x,y : x+y,list_x)
print(r)


"""
    reduce用法,使用的应用场景
    行走者,计算总路程
    (x,y)
    (0,0)坐标0,0开始
    [(1,3),(2,-2),(-2,3)......]
"""

"""
    reduce()第三个参数的问题

"""
list_x = ['1','2','3','4','5']
r = reduce(lambda x,y : x+y,list_x,'aaa')
print(r)
"""执行结果:aaa12345"""

函数式编程-filter()

"""
    filter()过滤器
    如果结果为True则保留,如果为False则剔除
"""
list_a = [1,0,1,0,0,1]
r = filter(lambda x : True if x==1 else False,list_a)
print(list(r))
"""执行结果:[1, 1, 1]"""

"""
    filter应用,例如判断一个句子是否以指定字母开头等等
"""


猜你喜欢

转载自blog.csdn.net/qq_39469688/article/details/81384233