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

一、 枚举其实是一个类
from enum import Enum

#枚举类
class VIP(Enum):
YELLOW = 1 #大写
GREEN = 2
BLACK = 3
RED = 4 print(VIP.YELLOW) # VIP.YELLOW
二、枚举和普通类相比有什么优势
 
1.不可变
2.去相同值
三、枚举类型、枚举名称与枚举值
from enum import Enum

#枚举类
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4 # 枚举类型、枚举名字、枚举值
print(VIP.GREEN.value) # 2 枚举值
print(VIP.GREEN) # VIP.GREEN 枚举类型
print(VIP.GREEN.name) # GREEN 枚举名称 print(VIP['GREEN']) # VIP.GREEN
print(type(VIP['GREEN'])) # <enum 'VIP'> print(type(VIP.GREEN)) # <enum 'VIP'>
print(type(VIP.GREEN.name)) # <class 'str'> # 遍历 for v in VIP:
print(v) # VIP.YELLOW
# VIP.GREEN
# VIP.BLACK
# VIP.RED
四、枚举的比较运算
 
from enum import Enum

#枚举类
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4 # 枚举比较
r = VIP.GREEN == VIP.GREEN
print(r) # True r = VIP.GREEN is VIP.GREEN
print(r) # True # 枚举不可以做大小比较 不可以不同的枚举进行比较
五、枚举注意事项
 
枚举不可以相同的标签
 
值一样的话 枚举会把后面的当作前面的一个别名
from enum import Enum

#枚举类
class VIP(Enum):
YELLOW = 1
GREEN = 1
BLACK = 3
RED = 4 print(VIP.GREEN) # VIP.YELLOW for v in VIP:
print(v) # VIP.YELLOW
# VIP.BLACK
# VIP.RED for v in VIP.__members__:
print(v) # YELLOW
# GREEN
# BLACK
# RED for v in VIP.__members__.items():
print(v) # ('YELLOW', <VIP.YELLOW: 1>)
# ('GREEN', <VIP.YELLOW: 1>)
# ('BLACK', <VIP.BLACK: 3>)
# ('RED', <VIP.RED: 4>)
六、枚举转换
 
from enum import Enum

#枚举类
class VIP(Enum):
YELLOW = 1
GREEN = 1
BLACK = 3
RED = 4 a = 1
print(VIP(a)) # VIP.YELLOW
七、枚举小结
 
from enum import Enum
from enum import IntEnum,unique #枚举类 @unique # 装饰器 不允许值相同 IntEnum 枚举值仅仅为int
class VIP(IntEnum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
# 23种设计模式 单例模式

八、进阶内容开场白
业务逻辑的开发者, 不考虑的太多的封装性
包、类库的开发者
九、一切皆对象
# 函数式编程
函数 是一个类
 
def a():
pass print(type(a)) # <class 'function'>
十、什么是闭包
#函数式编程
# 闭包 = 函数 + 环境变量
# 现场 def curve_pre():
a=25 # 环境变量
def curve(x): # 函数
return a*x*x
return curve a=10
f = curve_pre()
print(f.__closure__) #(<cell at 0x00000210502553D8: int object at 0x000000005E5C6F40>,)
print(f.__closure__[0].cell_contents) #
print(f(2)) #
十一、一个事例看看闭包
def f1():
a = 10
def f2():
a = 20 # 被认为是一个局部变量 所以不是闭包
print(a)
print(a) #
f2() #
print(a) # f1() #
#
#
十二、闭包的经典误区
十三、出个题,用闭包解决!
 
 
十四、我先用非闭包解决一下
origin = 0

def go(step):
global origin
new_pos = origin + step
origin = new_pos
return origin print(go(2))
print(go(3))
print(go(6)) 结果:
2
5
11
十五、再用闭包解决一下_
 
#闭包的环境变量 可以记忆 上一次调用的状态

origin = 0

def factory(pos):
def go(step):
nonlocal pos # 不是本地的 局部变量
new_pos = pos + step
pos = new_pos
return new_pos
return go f = factory(origin) print(f(2))
print(f(3))
print(f(5)) 结果:
2
5
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. React 中组件间通信的几种方式

    在使用 React 的过程中,不可避免的需要组件间进行消息传递(通信),组件间通信大体有下面几种情况: 父组件向子组件通信 子组件向父组件通信 非嵌套组件间通信 跨级组件之间通信 1.父组件向子组件通 ...

  2. 紫书 例题8-6 UVa 1606(扫描法)

    这道题目用扫描法 扫描法:在枚举的过程中维护一些重要的量, 从而简化计算 这道题用到了极角, 叉积, 高一的我表示一脸懵逼 不过自己去百度了一下好像大概看得懂. 这道题我还有一些疑问, 先这样吧 #i ...

  3. 解决jquery动态增加元素后children值没有变的问题

    html代码如下: <ul id="attr_input_panel"> <li> <div class="attr_input_item& ...

  4. Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程

    2.Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程 2014-12-07 23:39 2623人阅读 评论(0) ...

  5. Qt之手动布局

    简述 手动布局,可以实现和水平布局.垂直布局.网格布局等相同的效果,也可实现属于自己的自定义布局,当窗体缩放时,控件可以随之变化. 其对于坐标系的建立有严格要求,纯代码思维,使用复杂,不易维护,所以一 ...

  6. A题之变态青蛙跳

    一仅仅青蛙一次能够跳上1级台阶,也能够跳上2级--它也能够跳上n级. 求该青蛙跳上一个n级的台阶总共同拥有多少种跳法. 分析: 这是一个斐波拉契数列的引申问题,先来看看斐波拉契数列: n<=1, ...

  7. Node.js使用cnpm

    npm是Node.js中维护第三方库.模块的工具,可是国外的速度非常悲剧,这里有一个中国的源cnpm. http://cnpmjs.org/ 须要在命令行中执行 npm install -g cnpm ...

  8. UVA 11020 - Efficient Solutions(set)

    UVA 11020 - Efficient Solutions 题目链接 题意:每个人有两个属性值(x, y).对于每个人(x,y)而言,当有还有一个人(x', y'),假设他们的属性值满足x' &l ...

  9. 设置Webdriver启动chrome为默认用户的配置信息

    Webdriver 启动Chrome浏览器时,默认是打开一个新用户,而非默认用户.即新用户没有我们安装扩展程序.但在实际应用中,我们会须要 默认用户安装的一些扩展程序,比方对于某些js或者css样式. ...

  10. UTF8有很明显的特征:如果最高字节为0,则表示一个英文字符(与ASCII完全相同)。如果有2个以上1,表示是首个字节。如果最高位是10,则表示一个中间字节。

    摘自<Qt中的C++技术.pdf> page 33