鳕鱼天空

This is Mr Wang's Tech Blog.

Python 枚举

1. 枚举的定义

  1. 首先,定义枚举要导入enum模块。
  2. 枚举定义用class关键字,继承Enum类。
  3. 用于定义枚举的class和定义类的class是有区别【下一篇博文继续分享】。

  示例代码:

复制代码

from enum import Enum
class Color(Enum):
    red = 1
    orange = 2
    yellow = 3
    green = 4
    blue = 5
    indigo = 6
    purple = 7

复制代码

  代码分析:

  1. 上面的代码,我们定义了颜色的枚举Color.
  2. 颜色枚举有7个成员,分别是Color.red、Color.orange、Color.yellow等。
  3. 每一个成员都有它们各自名称和值,Color.red成员的名称是:red,值是:1。
  4. 每个成员的数据类型就是它所属的枚举。【*注:用class定义的类,实际上就是一种类型】
1.1 定义枚举时,成员名称不允许重复   
from enum import Enum
class Color(Enum):
    red = 1
    red = 2

  上面的代码,就无法执行。提示错误:TypeError: Attempted to reuse key: 'red'

 1.2 默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名  

from enum import Enum
class Color(Enum):
    red = 1
    red_alias = 1

  成员Color.red和Color.red_alias具有相同的值,那么成员Color.red_alias的名称red_alias就被视作成员Color.red名称red的别名。

   1.3 如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员

复制代码

from enum import Enum
class Color(Enum):
    red = 1
    red_alias = 1

print(Color(1))

复制代码

  输出结果为:Color.red

 1.4 如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】

复制代码

from enum import Enum, unique


@unique
class Color(Enum):
    red = 1
    red_alias = 1

复制代码

  再执行就会提示错误:ValueError: duplicate values found in <enum 'Color'>: red_alias -> red

 

2. 枚举取值 

 2.1 通过成员的名称来获取成员

Color['red']

 2.2 通过成员值来获取成员

Color(2)

 2.3 通过成员,来获取它的名称和值

red_member = Color.red
red_member.name
red_member.value

 

3. 迭代器

 3.1 枚举支持迭代器,可以遍历枚举成员

for color in Color:
    print(color)

  输出结果是,枚举的所有成员。Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。

 3.2 如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员

复制代码

from enum import Enum


class Color(Enum):
    red = 1
    orange = 2
    yellow = 3
    green = 4
    blue = 5
    indigo = 6
    purple = 7
    red_alias = 1


for color in Color:
    print(color)

复制代码

  输出结果是:Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。但是Color.red_alias并没有出现在输出结果中。

 3.3 如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__

复制代码

from enum import Enum


class Color(Enum):
    red = 1
    orange = 2
    yellow = 3
    green = 4
    blue = 5
    indigo = 6
    purple = 7
    red_alias = 1


for color in Color.__members__.items():
    print(color)

复制代码

  输出结果:('red', <Color.red: 1>)、('orange', <Color.orange: 2>)、('yellow', <Color.yellow: 3>)、('green', <Color.green: 4>)、('blue', <Color.blue: 5>)、

       ('indigo', <Color.indigo: 6>)、('purple', <Color.purple: 7>)、('red_alias', <Color.red: 1>)

 

4. 枚举比较

 4.1 枚举成员可进行同一性比较

Color.red is Color.red

  输出结果是:True

Color.red is not Color.blue

  输出结果是:True

 4.2 枚举成员可进等值比较

Color.blue == Color.red

  输出结果是:False

Color.blue != Color.red

  输出结果是:True

 4.3 枚举成员不能进行大小比较

Color.red < Color.blue

  输出结果出错:TypeError: unorderable types: Color() < Color()

实在要比的话,试试Color.red.value

如何在某.py文件中调用其他.py内的函数

假设名为A.py的文件需要调用B.py文件内的C(x,y)函数(引用类也是相似的)

 

假如在同一目录下,则只需

import B
if __name__ == "__main__":
    B.C(x,y)

 

若只需调用单个函数,也可以

from B import C
if __name__ == "__main__":
    C(x,y)

 

若在子目录里,可以这样

from dir.B import C

 

若A.py和B.py位于不同的目录下,可以用以下方法

(假设B.py位于D盘的根目录下)

 

1.引用所在路径

import sys
sys.path.append('D:/')
import B
if __name__=="__main__":
    print B.pr(x,y)

 

 

2.使用imp

import imp
B=imp.load_source('B','D:/B.py')
import B
if __name__=="__main__":
    print B.pr(x,y)

python产生随机值-random模块

import random
产生随机值的模块

random.random()            #获取一个随机的浮点值;
help(random.random)        #查看随机范围:0-1;
random.uniform(1,10)       #仍然取的是浮点数,只是相比random增加了一个区间;

random.randint(1,7)        #随机1-7

random.randrange(1,10)     #顾头不顾尾

random.choice("")          #可以传入一个序列

random.sample("序列",长度)  #在序列里随机取两位处理;序列可以使字符串,列表;


洗牌功能:

首先由一个有序的列表
a = [1,2,3,4,5,6]
a = random.shuffle(a)
print (a)

得出结果:a列表有序变成无序了。
注意:pycharm出不来效果,用python交互模式即可看效果。

实际应用一:随机数字验证码
import random
auth = ""               #定义全局验证码变量
for i in range(0,4):    #定义循环4次,形成4个验证码
    current_code = random.randint(0,9)      #定义随机数字的范围
    auth += str(current_code)               #将随机数字赋值给 全局变量auth
print auth


实际应用二:随机数字和字母验证码
auth = ""                                           #定义全局验证码变量
for i in range(0,4):                                #定义循环4次,形成4位验证码。
    current = random.randint(0,4)                   #定义一个随机0-4的一个范围,去猜i 的值。
    if current == i:                                #如果current 和i 的值一样
        current_code = random.randint(0,9)          #生成一个随机的数字
    else:                                           #如果current和i 的值不一样
        current_code = chr(random.randint(65,90))   #生成一个随机的字母,这里一定要主义chr()转换一下。
    auth += str(current_code)                       #将每次随机生成的值赋值给auth

print auth                                          #打印随机验证码

【转】解决bs4在Python 3.5下出现“ImportError: cannot import name 'HTMLParseError'”错误

    升级了Python3.5之后,我使用BeautifulSoup4时候出现了ImportError: cannot import name 'HTMLParseError'的错误。在网上搜索好久资料之后得到了解决方法,原因是BeautifulSoup在4.4.0以前的版本不支持Python3.5,所以我们需要把我们的BeautifulSoup升级到4.4.0版本以上,就可以使用了。我看到网上有几个回答都是改用Python3.4,我觉得这种方法容易误导人。

    这里提供两种升级新版BeautifulSoup的方法:

 

1、使用pip升级

在管理员权限下使用命令行输入命令“pip install --upgrade beautifulsoup4”

 

2、使用源码重新安装

卸载原先的BS4=》在http://www.crummy.com/software/BeautifulSoup/bs4/download/下找到你需要下载的版本下载=》解压文件=》找到根目录下的setup.py=》以管理员权限打开命令行输入“python setup.py install”

 

转自:https://blog.csdn.net/sinat_26599509/article/details/50609646