- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章使用 Python 实现简单的 switch/case 语句的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的Python玩家不得不承认,的确如此.
但今天我们还是来看看如果一定要用Python来Switch / Case,可以怎么玩.
语法约束 。
我们先定义一下Switch/Case应该怎么表达,为了简单我们可以让它长成这样.
1
2
3
4
5
6
7
|
def
cn():
print
(
'cn'
)
def
us():
print
(
'us'
)
switch(lang).case(
'cn'
,cn)
truetruetrue.case(
'us'
,us)
.default(us)
|
类实现一 。
通过以上约束,我们可以把switch当成一个类来实现,传入的参数在构造函数里处理,然后再分别实现case和default方法即可.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class
switch(
object
):
def
__init__(
self
, case_path):
self
.switch_to
=
case_path
self
._invoked
=
False
def
case(
self
, key, method):
if
self
.switch_to
=
=
key
and
not
self
._invoked:
self
._invoked
=
True
method()
return
self
def
default(
self
, method):
if
not
self
._invoked:
self
._invoked
=
True
method()
|
在构造函数中我们记住了 case_path 和执行状态 _invoked ,在 case() 里如果当前的 key 和 switch_to 匹配并且函数没有被执行过,那么就更新 _invoked 并执行对应的方法。在 default() 里检查一下 _invoked ,如果从没执行过,那么就调用 default 分支的函数.
看上去还不错,我们来试用一下.
1
2
3
4
5
6
7
8
|
switch(
'cn'
).case(
'cn'
,cn).case(
'us'
,us).default(fail)
>>> cn
switch(
'us'
).case(
'cn'
,cn).case(
'us'
,us).default(fail)
>>> cn
switch(
'jp'
).case(
'cn'
,cn).case(
'us'
,us).default(fail)
>>> fail
switch(
'cn'
).case(
'cn'
,cn).case(
'us'
,us)
>>> cn
|
让我们来看几个奇葩一点的case.
1
2
3
4
5
6
7
8
9
|
# duplicate case
switch(
'us'
).case(
'us'
,cn).case(
'us'
,us).default(fail)
>>> cn
def
cn()
return
'cn'
def
us()
return
'us'
# return value
result
=
switch(
'cn'
).case(
'cn'
,cn).case(
'us'
,us)
result
>>> <python_switch_case.switch
object
at
0x11034fb70
>
|
发现了没有,上面的实现不会处理重复的case,当然你可以加强一下case方法,最好是抛出异常,其他编程语言通常都这样做.
第二个问题,你希望从case里拿到返回值,像上面的写法是没希望了,因为扔掉了。我们可以考虑在switch类里加一个result的变量来保存执行结果.
1
2
3
4
5
6
7
8
|
class
switch(
object
):
def
__init__(
self
, case_path):
...
self
.result
=
None
def
case(
self
, key, method):
...
self
.result
=
method()
...
|
在调用结束后,就可以通过 result 拿到结果了.
1
2
3
|
_
=
switch(
'cn'
).case(
'cn'
,cn).case(
'us'
,us)
_.result
>>> cn
|
类实现二 。
我大概在网上搜了一下,你还可以参考 Brian Beck 通过类来实现Swich/Case.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
class
switch(
object
):
def
__init__(
self
, value):
self
.value
=
value
self
.fall
=
False
def
__iter__(
self
):
"""Return the match method once, then stop"""
yield
self
.match
raise
StopIteration
def
match(
self
,
*
args):
"""Indicate whether or not to enter a case suite"""
if
self
.fall
or
not
args:
return
True
elif
self
.value
in
args:
self
.fall
=
True
return
True
else
:
return
False
c
=
'z'
for
case
in
switch(c):
if
case(
'a'
):
pass
# only necessary if the rest of the suite is empty
if
case(
'c'
):
pass
# ...
if
case(
'y'
):
pass
if
case(
'z'
):
print
(
"c is lowercase!"
)
break
if
case(
'A'
):
pass
# ...
if
case(
'Z'
):
print
(
"c is uppercase!"
)
break
if
case():
# default
print
(
"I dunno what c was!"
)
|
这种实现相对复杂一点,而且用起来也不是很舒服,又需要for又需要if(还不如直接if/else痛快)。当然也有好处,就是可以把相同结果的case放一起,而且case里可以写更多东西,不仅仅是一个方法名.
写在最后 。
最后我们还是回到Python推崇的方法来处理switch/case问题,一般我们可以通过字典来处理这种多分支的问题,举例说明.
1
2
3
4
5
6
|
MAPPING
=
{
'cn'
: cn,
'us'
: us
}
lang
=
'cn'
result
=
MAPPING.get(lang, default
=
us)
|
是不是一目了然,不仅易于阅读也易于维护。在字典中key是唯一的,value可以是任意类型的数据,可以是类或者是方法,所以足够灵活.
下面通过代码再次学习python语言switch-case 。
初学python语言,竟然很久才发现python没有switch-case语句,查看官方文档说是可以用if-elseif-elseif。。。。代替.
讲真,这都不是问题。不就是一个条件判断吗。用if-elseif-.......肯定没问题,同时也用其他的解决方案,比较简单的就是利用 。
字典来实现同样的功能。写一个字典,每个key对应的值是一个方法。如switch = 。
{"valueA":functionA,"valueB":functionB,"valueC":functionC} 。
调用时可以像这样 。
1
2
3
|
try
:
switch[
"value"
]()
#执行相应的方法。
except
KeyError as e:
|
pass 或 functionX #执行default部分 。
简单代码如下:
1
2
3
4
5
6
7
8
9
|
switch
=
{
"a"
:
lambda
x:x
*
2
,
"b"
:
lambda
x:x
*
3
,
"c"
:
lambda
x:x
*
*
x
}
try
:
swtich[
"c"
](
6
)
except
KeyError as e:
pass
|
如果不嫌麻烦自己写一个swtich类来实现也没问题......不过真有这个必要吗 。
总结 。
以上所述是小编给大家介绍的使用 Python 实现简单的 switch/case 语句的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:https://betacat.online/posts/2018-09-16/python-switch-case 。
最后此篇关于使用 Python 实现简单的 switch/case 语句的方法的文章就讲到这里了,如果你想了解更多关于使用 Python 实现简单的 switch/case 语句的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
是否有使用 switch 语句检查数字 0-9 的简单方法?我正在编写一个程序来检查某些字符和数字。就像检查“\0”、“F”或“f”一样,想知道是否还有一种方法可以以类似的方式检查 0-9。我知道我可
我有一些数据需要转换,为此我需要一个超过 50 个案例的切换条件,我需要 3 次相同的案例,但在第三次我需要 50 个案例和一些更多,我不想写两次相同的代码。也许有可能做这样的事情。 switch (
我遇到这种情况,我必须检查两个 GET 变量。在检查语句内的第一个 switch 语句后,必须在第一个 case 循环内的第二个 switch 语句中检查第二个变量。 我无法在这里发布确切的代码,但这
如何使用函数指针代替 switch 语句? 最佳答案 与 ars 发布的链接略有不同的方法:您可以将 switch 语句中的值用作函数指针数组中的数组索引。所以不要写 switch (i) {
我必须评估很多条件。就我而言,我必须做这样的事情: switch(id) { case 5: // switch some other cases here case
switch 按钮位于 switch 语句内,但仅在 switch 语句外部时才有效这是我的代码:
我试图在 switch 语句中有一个 case 跳转到不同的 switch 语句。 在实践中,我希望用户在文本框中键入“关闭页面”,并且在浏览器关闭页面之前,我希望询问用户是否确定。输入“yes”将关
(引用java)我试图确定哪个更好,编写更多代码并可能节省一些计算时间,或者编写更少代码但可能牺牲一些计算时间。这就是我好奇的地方这样做会更有效率吗: switch (availability) {
我正在尝试构建一个 Android 应用程序,该应用程序可以访问加速度计传感器,并在单击按钮时将加速度计值(由 <> 包围)输出到串行 USB。当我更新值并尝试在 onClick 命令中调用它时遇到问
如何使用 Dwoo 模板引擎实现 switch case 语法。 最佳答案 {if 3 == 5} never gonna happen {elseif 3 == 3} if you don'
我想知道一个大的 switch 语句和几个小的 switch 语句之间是否有性能差异。 包含数百个案例的大型 switch 语句。 switch(quest){ case 1:
用户在 2 个选择框中进行选择后,我尝试计算出报值(value)。 看起来 1 需要 2 个 switch 语句。这可能吗? (可能的值比下面的值多得多。为了清楚起见,我删除了它们) var wor
我在主 while 循环内有一个开关,它将运行我的游戏。我正在尝试打破我的开关,以便转到不同的案例。下面的例子更好地解释了这一点: int j = 0; While(1){ switch(j){ ca
我用 Java 创建了一个菜单,其中每个选项都有另一个菜单。我想知道是否可以从内部菜单退出回到主菜单。 编辑:添加了主菜单选项 System.out.println("Main Menu");
我有一个计算新分数的方法。下面的方法有效,但问题是代码本身看起来可以被显着清理。我只是不知道什么是最好的方法。我根据 filterString 和枚举 individualScoreState 分配
在 Lisp 中使用字符串切换语句。 (defun switch(value) (case value (("XY") (print "XY"))
我想做这样的事情: int i = 0; switch(difficulty) { case 1: i++; break; case 2: i--; break; defaul
在 Obj-c 中,我做了一个 switch 语句,我曾经使用 UIsplitviewcontroller 在我的 iPad 应用程序中四处移动现在我想快速地做同样的事情……我试了几个小时,现在我唯一
我想写一个结构如下的报告: \begin{document} \input[option=a]{class} \input[option=b]{class} \in
我正在认真阅读 ngSwitch 的 AngularJS API 引用。当我谈到那部分时的指令: place an expression on the on="..." attribute (or t
我是一名优秀的程序员,十分优秀!