python书写风格出现了什么体_关于python:以下代码的更好的书写风格

我想知道是否有人可以告诉我pythonic方式来检查以下内容。

我有一个6位二进制数,并想检查其十进制值。 使用数学函数是一种方法,但仍然需要我写2 ** 6如果构造。

所以我想知道是否有更简单的陈述来写它。

还假设我们说它不是二进制的,那么在python中检查2 ** 6值的更好方法是什么。

if(a==1):

....

else:

if(a==2)

.....

一种方法是将它保存在列表中并使用索引进行检查但仍然需要许多if-else我猜.....

谢谢 ....

那些.....有什么共同之处吗?

它只是意味着一次又一次地为剩下的值写一个相同的东西a == 3,a == 4等等......

什么是"二进制数"?数字是一个数字,此上下文中的"二进制"只是您将其转换为字符串时使用的表示形式。

a是什么?它从何而来?它的类型是什么?怎么用?

第一个问题是,你会为每个不同的案件做些什么?如果a == 3,你会做一件事吗,如果a == 4,你会做点别的吗?如果你真的需要做2 ** 6个不同的事情,那么也许你确实需要if构造....但我不太相信。也许你可以提供更多的背景?

采取的行动如何取决于a?。这就是KennyTM所要求的。不同的案例有什么共同之处。如果它是32种不同的结果,则它是32种不同的if或dict条目。否则,你可以减少很多工作。你想做什么?!

你的意思是你需要检查各个位的值吗?如果是这样,en.wikipedia.org/wiki/Bitwise_operation将帮助您开始使用一般概念。

a只是一个数字。伙计们不仅仅修改代码。它只是一个简单的问题,如果我必须检查一个值为2 ** 6的变量的值,我必须编写那么多if-else或者是否有一些小行代码可以在python中执行这个技巧...并且它们对于不同的值是完全不同的功能......

@user你可以做elif而不是嵌套的if。但是如果没有更多的细节,我必须投票结束并不是一个真正的问题。您可以使用dict,更高阶函数,某种组合。我打赌你可能会削减任何明显的分支。但你做的事情取决于目标。

"检查2 ** 6"值是什么意思?就像if(a> 0和a <2 ** 6)那样:......就足够了?

@aaronasterling它只是我为a = 1,a = 2到a = 64的不同值执行不同的函数,我在想写这么多elif没有意义。如果没有别的,我想我将不得不写所有的elif ....

@用户。写这么多elif语句没有意义。你是对的。什么也没有意义的是没有向我们展示您想要运行并期望我们能够解决问题的这些功能的示例。这不是一个真正的问题。

我没有表现出来因为我直到现在还没有写出来......我希望你能回答我的问题,所以我在这里努力做到最好。我这样问是因为我在想一个菜单驱动的值,我只是想如果在python中有一些更好的开关构造或if-else。数字64也不是随机的,因为我必须在一个程序中为所有这些值提供64种不同的功能....

问题是甚至不清楚地知道在这64个案件中意味着什么。重复aaronasterling,你想做什么?!可以有多种方式来实现,针对不同问题的各种完全不同的理想解决方案。

使用字典将值映射到结果(可以是Python中的函数)。

例如:

d = {}

d[0] = ....

d[1] = ....

d[2] = ....

outcome = d[a]

当然,这是如何工作的取决于你的....,但这种结构可以非常灵活。此方法最重要的特性是可以通过编程方式填充此字典,并且您无需编写大量手动分配。它当然也比使用嵌套的if语句(或elsif)遍历许多值更有效率

+1正在考虑同样的解决方案:-)

值得指出的是,函数和其他可调用对象是Python中的第一类对象。因此,为字典键指定的值可以是函数或函数和参数或部分参数列表或咖喱等的函数。

要添加其他人的响应,您应该阅读PEP 8中推荐的Python样式。

对于if版本,括号是不合需要的并且间距是可取的:

if a == 1:

pass

elif a == 2:

pass

elif a == 3:

pass

else:

pass

我会使用装饰器映射到基于字典的调度:

_dispatch_table = {}

def dispatch_on(*values):

def dec(f):

_dispatch_table.update((v, f) for v in values)

return f

return dec

@dispatch_on(0, 2, 47)

def one():

foo()

bar()

@dispatch_on(2, 23, 89)

def two():

bar()

baz()

x = some_number

_dispatch_table[x]()

我个人更喜欢if / elif,如果我理解你的...

所以你的:

if(a==1):

....

else:

if(a==2)

.....

如果您使用if elif阶梯,请成为此项:

if a==1:

....

elif a==2:

.....

else:

default

您还可以将Python的条件表达式用于简单梯形图:

def one():

print("option 1 it is

")

def two():

print("option 2 it is

")

def three():

print("not one or two

")

one() if a==1 else two() if a==2 else three()

甚至是字典:

def one():

print("option 1 it is

")

def two():

print("option 2 it is

")

def three():

print("not one or two

")

options = {1:one,

2:two,

3:three,

}

options[2]()

在这篇SO帖子中,对于switch-case的Python形式进行了很好的讨论。

根据问题中有些模糊的信息以及我从OP的评论中收集的内容,我的猜测是:

def func1(): pass

def func2(): pass

def func3(): pass

#     ...

def func62(): pass

def func63(): pass

if 0 < a < 64:

globals()['func'+str(a)]()

else:

print 'a is out of range'

基于字典的调度表是比这更好的解决方案,特别是如果某些情况具有共享行为。

@Russell Borogove:我认为这是一种不公平的评估。 FWIW,这是一个基于字典的调度,代表了一种低成本的解决方案。我认为OP还不知道是否有任何"共享行为"。即使事后证明有一些,这种方法可以轻松地容纳它至少几种不同的方式,就像单独的调度字典或列表一样。最初只是做"可能有效的最简单的事情"是一个完全有效的策略,无需尝试优化您尚未编写的代码。

将其转换为使用指定的dict而不是将其全部转储到全局命名空间中,这将是微不足道的,同样简单。

@detly:同样地将它转换为使用一个后来的必要和/或值得付出的努力。如果所有内容都放置了自己的模块,并且如图所示使用了内置的dict,那么显式优势并没有明显优势......只需要额外的努力和工作。

@martineau - 它不是"同样"微不足道的,因为它将是OP做的,而不是你,他们显然不知道如何。

@detly:也许到那时他们会更熟练地使用Python。无论如何,到目前为止,你和其他任何批评我的答案的人都没有明确说明有一个单独的调度机制有任何明显的优势。另一方面,设计和实施一个前端肯定需要更多的时间和精力。我的答案只是利用默认存在的映射,无论如何基本上有两行代码。我认为,在获得更多信息或更熟练之前,先放下某些设计决策,这是一个更聪明的工作,而不是比他们需要的更难。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值