本章节我们揭开Python进阶部分的高级特性,详细讲解枚举、闭包,并对函数式编程做出介绍

一、 枚举其实是一个类
  1. from enum import Enum
  2.  
  3. #枚举类
  4. class VIP(Enum):
  5. YELLOW = 1 #大写
  6. GREEN = 2
  7. BLACK = 3
  8. RED = 4
  9.  
  10. print(VIP.YELLOW) # VIP.YELLOW
二、枚举和普通类相比有什么优势
 
1.不可变
2.去相同值
三、枚举类型、枚举名称与枚举值
  1. from enum import Enum
  2.  
  3. #枚举类
  4. class VIP(Enum):
  5. YELLOW = 1
  6. GREEN = 2
  7. BLACK = 3
  8. RED = 4
  9.  
  10. # 枚举类型、枚举名字、枚举值
  11. print(VIP.GREEN.value) # 2 枚举值
  12. print(VIP.GREEN) # VIP.GREEN 枚举类型
  13. print(VIP.GREEN.name) # GREEN 枚举名称
  14.  
  15. print(VIP['GREEN']) # VIP.GREEN
  16. print(type(VIP['GREEN'])) # <enum 'VIP'>
  17.  
  18. print(type(VIP.GREEN)) # <enum 'VIP'>
  19. print(type(VIP.GREEN.name)) # <class 'str'>
  20.  
  21. # 遍历
  22.  
  23. for v in VIP:
  24. print(v)
  25.  
  26. # VIP.YELLOW
  27. # VIP.GREEN
  28. # VIP.BLACK
  29. # VIP.RED
四、枚举的比较运算
 
  1. from enum import Enum
  2.  
  3. #枚举类
  4. class VIP(Enum):
  5. YELLOW = 1
  6. GREEN = 2
  7. BLACK = 3
  8. RED = 4
  9.  
  10. # 枚举比较
  11. r = VIP.GREEN == VIP.GREEN
  12. print(r) # True
  13.  
  14. r = VIP.GREEN is VIP.GREEN
  15. print(r) # True
  16.  
  17. # 枚举不可以做大小比较 不可以不同的枚举进行比较
五、枚举注意事项
 
枚举不可以相同的标签
 
值一样的话 枚举会把后面的当作前面的一个别名
  1. from enum import Enum
  2.  
  3. #枚举类
  4. class VIP(Enum):
  5. YELLOW = 1
  6. GREEN = 1
  7. BLACK = 3
  8. RED = 4
  9.  
  10. print(VIP.GREEN) # VIP.YELLOW
  11.  
  12. for v in VIP:
  13. print(v)
  14.  
  15. # VIP.YELLOW
  16. # VIP.BLACK
  17. # VIP.RED
  18.  
  19. for v in VIP.__members__:
  20. print(v)
  21.  
  22. # YELLOW
  23. # GREEN
  24. # BLACK
  25. # RED
  26.  
  27. for v in VIP.__members__.items():
  28. print(v)
  29.  
  30. # ('YELLOW', <VIP.YELLOW: 1>)
  31. # ('GREEN', <VIP.YELLOW: 1>)
  32. # ('BLACK', <VIP.BLACK: 3>)
  33. # ('RED', <VIP.RED: 4>)
六、枚举转换
 
  1. from enum import Enum
  2.  
  3. #枚举类
  4. class VIP(Enum):
  5. YELLOW = 1
  6. GREEN = 1
  7. BLACK = 3
  8. RED = 4
  9.  
  10. a = 1
  11. print(VIP(a)) # VIP.YELLOW
七、枚举小结
 
  1. from enum import Enum
  2. from enum import IntEnum,unique
  3.  
  4. #枚举类
  5.  
  6. @unique # 装饰器 不允许值相同 IntEnum 枚举值仅仅为int
  7. class VIP(IntEnum):
  8. YELLOW = 1
  9. GREEN = 2
  10. BLACK = 3
  11. RED = 4
# 23种设计模式 单例模式

八、进阶内容开场白
业务逻辑的开发者, 不考虑的太多的封装性
包、类库的开发者
九、一切皆对象
# 函数式编程
函数 是一个类
 
  1. def a():
  2. pass
  3.  
  4. print(type(a)) # <class 'function'>
十、什么是闭包
  1. #函数式编程
  2. # 闭包 = 函数 + 环境变量
  3. # 现场
  4.  
  5. def curve_pre():
  6. a=25 # 环境变量
  7. def curve(x): # 函数
  8. return a*x*x
  9. return curve
  10.  
  11. a=10
  12. f = curve_pre()
  13. print(f.__closure__) #(<cell at 0x00000210502553D8: int object at 0x000000005E5C6F40>,)
  14. print(f.__closure__[0].cell_contents) #
  15. print(f(2)) #
十一、一个事例看看闭包
  1. def f1():
  2. a = 10
  3. def f2():
  4. a = 20 # 被认为是一个局部变量 所以不是闭包
  5. print(a)
  6. print(a) #
  7. f2() #
  8. print(a) #
  9.  
  10. f1()
  11.  
  12. #
  13. #
  14. #
十二、闭包的经典误区
十三、出个题,用闭包解决!
 
 
十四、我先用非闭包解决一下
  1. origin = 0
  2.  
  3. def go(step):
  4. global origin
  5. new_pos = origin + step
  6. origin = new_pos
  7. return origin
  8.  
  9. print(go(2))
  10. print(go(3))
  11. print(go(6))
  12.  
  13. 结果:
  14. 2
  15. 5
  16. 11
十五、再用闭包解决一下_
 
  1. #闭包的环境变量 可以记忆 上一次调用的状态
  2.  
  3. origin = 0
  4.  
  5. def factory(pos):
  6. def go(step):
  7. nonlocal pos # 不是本地的 局部变量
  8. new_pos = pos + step
  9. pos = new_pos
  10. return new_pos
  11. return go
  12.  
  13. f = factory(origin)
  14.  
  15. print(f(2))
  16. print(f(3))
  17. print(f(5))
  18.  
  19. 结果:
  20. 2
  21. 5
  22. 10
十六、小谈函数式编程
适合自己,函数式编程也不是高大上。

Python(九) Python的高级语法与用法的更多相关文章

  1. 十一、python的高级语法与用法

    一.枚举其实是一个类 现实世界中的“类型”,在计算机世界中如何描述? 常见的 1)用1.2.3..等数字表示类型 2)较好的做法是用字典表示 3)最好的是使用枚举 # coding=utf-8 fro ...

  2. 12.Python的高级语法和用法

    # from enum import Enum # 枚举 # class VIP(Enum): # YELLOW = # YELLOW_ALIAS = # 别名 # GREEN = # BLACK = ...

  3. Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

    本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.   ...

  4. Python高级语法之:一篇文章了解yield与Generator生成器

    Python高级语法中,由一个yield关键词生成的generator生成器,是精髓中的精髓.它虽然比装饰器.魔法方法更难懂,但是它强大到我们难以想象的地步:小到简单的for loop循环,大到代替多 ...

  5. Python的 5 种高级用法,效率提升没毛病!

    任何编程语言的高级特征通常都是通过大量的使用经验才发现的.比如你在编写一个复杂的项目,并在 stackoverflow 上寻找某个问题的答案.然后你突然发现了一个非常优雅的解决方案,它使用了你从不知道 ...

  6. Python高级语法总结

    1.Python面向对象 创建类 使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,如下实例: class ClassName: '类的帮助信息' #类文档字符串 class_s ...

  7. python九周周末总结

    python九周周末总结 UDP协议 udp协议的交互模式服务端不需要考虑客户端是否退出,你发多少那么他就会按照你发的东西直接去传输给客户端不存在黏包现象 服务端: import socket ser ...

  8. python基础入门一(语法基础)

    作为自己正式接触并应用的第一门编程语言,在Alex和武sir两位大王的要求下,开始了写博客总结的日子.学习编程语言是很有趣的一件事情,但有2点请一定要谨记:1.做人靠自己,码代码也必须靠自己.能不能成 ...

  9. Python中用format函数格式化字符串的用法

    这篇文章主要介绍了Python中用format函数格式化字符串的用法,格式化字符串是Python学习当中的基础知识,本文主要针对Python2.7.x版本,需要的朋友可以参考下   自python2. ...

随机推荐

  1. pandas 4 处理缺失数据nan

    from __future__ import print_function import pandas as pd import numpy as np np.random.seed(1) dates ...

  2. collections模块-namedtuple

    namedtuple -> 命名元组 这里的命名指的是对元组中元素的命名. 通过一个例子来看 import collections Person = collections.namedtuple ...

  3. 洛谷—— P2701 [USACO5.3]巨大的牛棚Big Barn

    https://www.luogu.org/problem/show?pid=2701 题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的 ...

  4. Qt之QTimer

    简述 QTimer类提供了重复和单次触发信号的定时器. QTimer类为定时器提供了一个高级别的编程接口.很容易使用:首先,创建一个QTimer,连接timeout()信号到适当的槽函数,并调用sta ...

  5. js 压缩图片 H5

    原理 用 canvas的 toDataURI (type , int )  如果type参数的值为image/jpeg或image/webp,则第二个参数的值如果在0.0和1.0之间的话,会被看作是图 ...

  6. QT跟VC++结合来进行插件的验证机制(遍历vtable,保证虚函数的个数一致,也可使用Q_INVOKABLE宏定义)

    由于最近公司要开发一个以C++插件机制为主的,主要有一个问题就是C++的二进制兼容性的问题.一旦类使用虚函数,只要随便改动下增删查改下头文件的虚函数,就会导致程序在跑的时候进行乱跳,因为这个时候exe ...

  7. 如何在阿里云服务器里配置iis 搭建web服务

    IIS,互联网信息服务,一种Web服务组件,利用它,我们可以打开asp.php这些搭建网页所用的文件.   工具/原料   域名 服务器 方法/步骤     登录服务器.   点击开始—>服务器 ...

  8. Consolidate data by using multiple page fields

    Consolidate data by using multiple page fields https://support.office.com/en-us/article/Consolidate- ...

  9. 详细图解mongodb下载、安装、配置与使用

    记得在管理员模式下运行CMD,否则服务将启动失败 转载:http://blog.csdn.net/boby16/article/details/51221474 详细图解,记录 win7 64 安装m ...

  10. SharePoint InfoPath 保存无法发布问题

    设计完表单以后提示以下错误 错误描述 InfoPath无法保存下列表单:******* 此文档库已被重命名或删除,或者网络问题导致文件无法保存.如果此问题持续存在,请于网络管理员联系. 可参考网站 & ...