我最近阅读了建议不要在支持它的语言中使用 switch-case 语句的问题。就 Python 而言,我已经看到了许多 switch case 替换,例如:
鉴于选项的多样性,我在决定对特定代码段执行什么操作时有些困难。我想了解在一般情况下选择其中一种方法而不是另一种方法的标准。此外,如果我无法做出决定(附上对选择的解释),我将不胜感激有关如何处理的建议。
具体问题如下:
(1)
def _setCurrentCurve(self, curve):
if curve == "sine":
self.currentCurve = SineCurve(startAngle = 0, endAngle = 14,
lineColor = (0.0, 0.0, 0.0), expansionFactor = 1,
centerPos = (0.0, 0.0))
elif curve == "quadratic":
self.currentCurve = QuadraticCurve(lineColor = (0.0, 0.0, 0.0))
qt-slot 调用此方法以响应选择从菜单中绘制曲线。一旦申请完成,上述方法将包含总共 4-7 条曲线。在这种情况下使用一次性字典是否合理?由于最明显的方法是 if-elif-else,我应该坚持吗?我还考虑在这里使用 **kargs(在 friend 的帮助下),因为所有曲线类都使用 **kargs...
(2)
第二段代码是一个 qt-slot,当用户更改曲线的属性时会调用它。基本上,插槽从 gui (spinBox) 中获取数据并将其放入适当曲线类的实例变量中。在这种情况下,我又遇到了同样的问题——我应该使用字典吗?
这是前面提到的槽-
def propertyChanged(self, name, value):
"""A Qt slot, to react to changes of SineCurve's properties."""
if name == "amplitude":
self.amplitude = value
elif name == "expansionFactor":
self.expansionFactor = value
elif name == "startAngle":
self.startAngle = value
elif name == "endAngle":
self.endAngle = value
供引用,这里是连接到上述插槽的代码 -
def _connectToPage(self, page):
for connectionData in page.getConnectibles():
self.connect(connectionData["object"],
SIGNAL(connectionData["signal"]),
lambda value, name = connectionData["property"]:\
self.currentCurve.propertyChanged(name, value))
self.connect(connectionData["object"],
SIGNAL(connectionData["signal"]),
self.hackedDisplayArea.update)
注意 - self.endAngle 等在构造函数中初始化。
据我所知,选择 dict 的原因是为了快速查找。什么时候有保证?当我有 100 个或更多案例时?每次调用函数时继续构建和丢弃字典是个好主意吗?如果我在函数之外为此目的构建一个字典,我应该检查是否在其他地方需要它?如果其他地方不需要它会怎样?
我的问题是最好的做法是什么?做事最好/最优雅的方式是什么?换句话说,什么时候使用 if-elif-else,什么时候使用其他选项?
最佳答案
叹息。对问题的错误部分过多地绞尽脑汁。 switch 语句不是问题。有许多表达“另类”的方式不添加意义。
问题在于意义——而不是技术声明选择。
共有三种常见模式。
将键映射到对象。如果字典几乎是完全静态的,并且您在一个简单的键和另一个更复杂的东西之间有一个映射,请使用它。每次需要时都在运行中构建字典是愚蠢的。如果是意思,您可以使用它:您的“条件”是映射到对象的简单静态键值。
子类之间的变体行为。使用多态而不是类型检查对象。正确的。如果您在多个具有不同行为的类中有类似的对象,它们应该是多态的。尽可能多地使用它。
其他变体行为。使用 if-elif-else 阶梯。当您没有大量静态的键值映射时使用它。当条件复杂或您指过程而非对象时使用此选项。
其他一切都只是可以达到类似结果的棘手代码。
使用元组。这只是没有映射的字典。这需要搜索,并且应尽可能避免搜索。不要这样做,效率低下。使用字典。
使用函数装饰器 (http://code.activestate.com/recipes/440499/)。恶心。这隐藏了您正在解决的问题的 if-elif-elif 本质。不要这样做,选择是排他性的并不明显。使用其他任何东西。
甚至有人推荐了 Visitor 模式。当您有一个遵循 Composite 设计模式的对象时使用它。这取决于多态性的工作,所以它并不是一个真正不同的解决方案。
关于python - 在 Python 中选择不同的 switch-case 替换 - 字典还是 if-elif-else?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/594442/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
假设我在Ruby中有这个each循环。@list.each{|i|putsiifi>10breakend}我想循环遍历列表直到满足条件。这让我感到“不像Ruby”,因为我是Ruby的新手,是否有Ruby方法可以做到这一点? 最佳答案 您可以使用Enumerable#detect或Enumerable#take_while,取决于您想要的结果。@list.detect{|i|putsii>10}#Returnsthefirstelementgreaterthan10,ornil.正如其他人所指出的,更好的风格是先进行子选择,然后再对其
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem