python枚举
1. 请教python中枚举线程的问题
python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费你和时间,所以我们直接学习threading 就可以了。
2. python 怎么通过枚举的值
从C系语言过来用Python,好不容易适应了写代码不打花括号,突然有一天发现它居然木有枚举……于是stackoverflow了一把,发现神人的枚举(enum)实现到处都是,于是汉化总结过来。
如果是新版Python用户(Python 3.4 with PEP 435):
from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog')
or
class Animals(Enum):
ant = 1
bee = 2
cat = 3
dog = 4
旧版Python用户可以充分发挥动态语言的优越性来构造枚举,有简单的:
def enum(**enums):
return type('Enum', (), enums)
Numbers = enum(ONE=1, TWO=2, THREE='three')
# Numbers.ONE == 1, Numbers.TWO == 2 and Numbers.THREE == 'three'
有复杂的:
def enum(*sequential, **named):
enums = dict(zip(sequential, range(len(sequential))), **named)
return type('Enum', (), enums)
Numbers = enum('ZERO', 'ONE', 'TWO')
# Numbers.ZERO == 0 and Numbers.ONE == 1
有带值到名称映射的:
def enum(*sequential, **named):
enums = dict(zip(sequential, range(len(sequential))), **named)
reverse = dict((value, key) for key, value in enums.iteritems())
enums['reverse_mapping'] = reverse
return type('Enum', (), enums)
# Numbers.reverse_mapping['three'] == 'THREE'
有用set实现的:
class Enum(set):
def __getattr__(self, name):
if name in self:
return name
raise AttributeError
Animals = Enum(["DOG", "CAT", "HORSE"])
print Animals.DOG
有用range实现的:
dog, cat, rabbit = range(3)
# or
class Stationary:
(Pen, Pencil, Eraser) = range(0, 3)
print Stationary.Pen有用tuple实现的:
class Enum(tuple): __getattr__ = tuple.index
State = Enum(['Unclaimed', 'Claimed'])
print State.Claimed
有用namedtuple实现的:
from collections import namedtuple
def enum(*keys):
return namedtuple('Enum', keys)(*keys)
MyEnum = enum('FOO', 'BAR', 'BAZ')
# 带字符数字映射的,像C/C++
def enum(*keys):
return namedtuple('Enum', keys)(*range(len(keys)))
# 带字典映射的,可以映射出各种类型,不局限于数字
def enum(**kwargs):
return namedtuple('Enum', kwargs.keys())(*kwargs.values())
3. python 枚举类型什么意思
枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、状态等。Python 的原生类型(Built-in types)里并没有专门的枚举类型,但是我们可以通过很多方法来实现它,例如字典、类等:
WEEKDAY = {
'MON': 1,
'TUS': 2,
'WEN': 3,
'THU': 4,
'FRI': 5
}
class Color:
RED = 0
GREEN = 1
BLUE = 2
上面两种方法可以看做是简单的枚举类型的实现,如果只在局部范围内用到了这样的枚举变量是没有问题的,但问题在于它们都是可变的(mutable),也就是说可以在其它地方被修改从而影响其正常使用:
WEEKDAY['MON'] = WEEKDAY['FRI']
print(WEEKDAY)
{'FRI': 5, 'TUS': 2, 'MON': 5, 'WEN': 3, 'THU': 4}
通过类定义的枚举甚至可以实例化,变得不伦不类:
c = Color()
print(c.RED)
Color.RED = 2
print(c.RED)
0
2
当然也可以使用不可变类型(immutable),例如元组,但是这样就失去了枚举类型的本意,将标签退化为无意义的变量:
COLOR = ('R', 'G', 'B')
print(COLOR[0], COLOR[1], COLOR[2])
R G B
为了提供更好的解决方案,Python 通过 PEP 435 在 3.4 版本中添加了 enum 标准库,3.4 之前的版本也可以通过 pip install enum 下载兼容支持的库。enum 提供了 Enum/IntEnum/unique 三个工具,用法也非常简单,可以通过继承 Enum/IntEnum 定义枚举类型,其中 IntEnum 限定枚举成员必须为(或可以转化为)整数类型,而 unique 方法可以作为修饰器限定枚举成员的值不可重复:
from enum import Enum, IntEnum, uniquetry:
@unique
class WEEKDAY(Enum):
MON = 1
TUS = 2
WEN = 3
THU = 4
FRI = 1
except ValueError as e:
print(e)
plicate values found in : FRI -> MON
try:
class Color(IntEnum):
RED = 0
GREEN = 1
BLUE = 'b'
except ValueError as e:
print(e)
invalid literal for int() with base 10: 'b'
4. python的枚举实现中`type,enums`是什么意思
type 这种三个参数的调用,其结果是返回一个“类”,就跟用 class 定义是一样的。
所以, type('Enum', (), {'ONE': 1, 'TWO': 2}) 就相当于:
class Enum(object):
ONE = 1
TWO = 2
5. python 有宏定义,或者枚举么
如果那样就如你所说搞一个"头文件",不过在python中可是一个模块文件,里面定义了常量(其实还是变量):如叫constants.pycomplete=12fail=13使用时import
constants
或from
constants
import
*这样就行了。
6. python里面enumerate是枚举吗
更改的是list元素,name变量并没有改变,你print的是name,可以print names[index]
7. 命名参数可以与Python枚举一起使用吗
虽然不能像枚举那样使用命名参数,但是可以通过namedtuple混音:
from collections import namedtuple
from enum import Enum
Body = namedtuple("Body", ["mass", "radius"])
class Planet(Body, Enum):
MERCURY = Body(mass=3.303e+23, radius=2.4397e6)
VENUS = Body(mass=4.869e+24, radius=6.0518e6)
EARTH = Body(mass=5.976e+24, radius=3.3972e6)
# ... etc.
你不必写一个__init__方法。
示例使用:
>>> Planet.MERCURY
<Planet.MERCURY: Body(mass=3.303e+23, radius=2439700.0)>
>>> Planet.EARTH.mass
5.976e+24
>>> Planet.VENUS.radius
6051800.0
8. python 利用枚举法和二分法求解一元三次方程
第一,用F是为了让你不要搞混,如果错了方便修改
第二 ..{$N+} 是用{}括起来的,在pascal里不进行运行,你用pascal界面打开会发现字的颜色是灰的,这说明了这只起到一个标示作用,去掉也可以
第三 program是用来定义文件名的,在pascal书里有,可以去掉,直接打var
9. python win32api 函数RegEnumValue 枚举注册表报错,错误代码234
具体的代码贴出来看看,你这谁知道什么错误。
10. 如何按行枚举 python enumerate
enumerate()说明
enumerate()是python的内置函数
enumerate在字典上是枚举、列举的意思
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
enumerate多用于在for循环中得到计数
例如对于一个seq,得到:
(0, seq[0]), (1, seq[1]), (2, seq[2])
1
1
enumerate()返回的是一个enumerate对象,例如:
enumerate()使用
如果对一个列表,既要遍历索引又要遍历元素时,首先可以这样写:
list1 = ["这", "是", "一个", "测试"]
for i in range (len(list1)):
print i ,list1[i]123123
上述方法有些累赘,利用enumerate()会更加直接和优美:
list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1):
print index, item
>>>
0 这
1 是
2 一个
3 测试1234567812345678
enumerate还可以接收第二个参数,用于指定索引起始值,如:
list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1, 1):
print index, item
>>>
1 这
2 是
3 一个
4 测试1234567812345678
补充
如果要统计文件的行数,可以这样写:
count = len(open(filepath, 'r').readlines())11
这种方法简单,但是可能比较慢,当文件比较大时甚至不能工作。
可以利用enumerate():
count = -1
for index, line in enumerate(open(filepath,'r')):
count += 1