热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonforbreakelse_关于python:Python3:forloopbreak和else(if语句)

背景信息:嘿,我想做以下的事情:我有一个字典,其中ID作为键,列表中有各种各样的东西作为值。值的其中一项是字符

背景信息:

嘿,我想做以下的事情:我有一个字典,其中ID作为键,列表中有各种各样的东西作为值。值的其中一项是字符串。我要检查列表是否包含此字符串。我想把字典里的所有键都记下来。

如果列表包含字符串,我要打印"字符串有效"

如果列表不包含字符串,我要打印"字符串无效"

到目前为止,一切都很好。

此外,我想要检查的列表依赖于用户的一个控制台输入,它指定了应该检查哪个列表。控制台输入为"数字"。

我的想法是用嵌套的for循环迭代我的字典和列表,并比较,如果字符串(值的项)等于任何列表项。如果是的话,我想打破这个循环。如果在列表中找不到该字符串,我希望执行else语句以打印"string is not valid"消息。代码片段:

def validationHelper(myDict, myList):

for key in myDict:

for value in myDict[key][0]:

for item in myList:

if value==item:

validationHelper.true="String is valid"

break

else:

validationHelper.true="Warning: String is NOT valid"

def validation(anyList,helperfunc):

if anyList=="one":

return helperfunc(finalDict,myList1)

if anyList=="two":

return helperfunc(finalDict,myList2)

if anyList=="three":

return helperfunc(finalDict,myList3)

validation(number, validationHelper)

print(validationHelper.true)

问题:

我正在运行这个,但是无论字符串是否在列表中,我总是得到else语句的打印输出。那么,我想我在for循环中的推理有错误吗?或者,我根本不理解循环?!我用else语句尝试了不同的缩进,但无法解决我的问题。

记住,这里有三个嵌套的循环;break只会从最里面的循环中断。

哦,伙计,@danielroseman,我自己就知道了。现在,让我把我的"思考"用词来表达:我在列表中找到字符串,并打破内部循环。我回到循环中,"在我的dict[key][0]中寻找值",然后搜索下一个键等。我的打印将是最后一件事,它将被写入validationhelper.true,对吗?为了在找到匹配项时完全终止所有循环,我将添加break语句,对吗?

其他答案对如何突破多个循环给出了很好的解释。但是,您也可以通过使用Python的内置函数和列表理解来简化代码,如下所示:

def validationHelper(myDict, myList):

if any(v in myList for val in myDict.values() for v in val[0]):

validationHelper.true="String is valid"

else:

validationHelper.true="Warning: String is NOT valid"

def validation(anyList,helperfunc):

if anyList=="one":

return helperfunc(finalDict,myList1)

if anyList=="two":

return helperfunc(finalDict,myList2)

if anyList=="three":

return helperfunc(finalDict,myList3)

validation(number, validationHelper)

print(validationHelper.true)

这应该和您的代码一样有效,因为any在第一次匹配时会短路。它的可读性可能会提高一点。(请注意,多级列表理解与常规for循环的顺序相同。)

使用"返回"中断所有循环。如果没有任何if语句作为开头,则不需要使用else语句。

def validationHelper(myDict, myList):

for item in myList:

if item in myDict.values():

return ("String is valid")

return ("String is NOT valid")

def validation(anyList,helperfunc):

if anyList=="one":

return helperfunc(finalDict,myList1)

elif anyList=="two":

return helperfunc(finalDict,myList2)

elif anyList=="three":

return helperfunc(finalDict,myList3)

validation(number, validationHelper)

print(validationHelper.true)

使用elif而不是多个if是一个更好的实践。下次小心缩进。

另外,您可能还需要检查.keys()和.values()。

您可以替换:

for key in myDict:

for value in myDict[key][0]:

用:

for value in myDict.values():

然而,我的"else"原本是一个for loop else子句,而不是if/else:book.pythontips.com/en/latest/for_uuuuelse.html的else子句。

那你就不需要别的说法了。让我更新我的答案

我建议您按照以下方式(不改变逻辑)改变您的功能:

def validationHelper(myDict, myList):

for key in myDict:

for value in myDict[key][0]:

for item in myList:

if value==item:

return"String is valid" # Add here to exit

return"Warning: String is NOT valid" # will be returned inf nothing will be found in your 3 loops

def validation(anyList,helperfunc):

if anyList=="one":

return helperfunc(finalDict,myList1)

if anyList=="two":

return helperfunc(finalDict,myList2)

if anyList=="three":

return helperfunc(finalDict,myList3)

validation(number, validationHelper)

print(validationHelper)

这将帮助您退出注释中提到的3个嵌套循环。因为在第一次错误发生的负面情况下,您不需要检查任何其他内容。

返回值不应该代替中断值,而不是在其他情况下?

那么,返回的意思是"结束所有循环",基本上是这样工作的?因为,如果我以这种方式调整代码并尝试打印(validationhelper.true),我会得到以下错误:print(validationhelper.true)attributeError:'function'对象没有属性'true'

@Lukesmith当然,抱歉,更新了

@如果字典中第一个键出现负的情况,我想继续使用第二个键。所以我需要继续检查,只是我有了一个新的字符串,来对照同一个列表进行检查。

@Shushiro很抱歉误读了你的问题,请查看我最新的答案。返回意味着"停止执行这个函数"并返回一些东西。哦,你需要返回字符串而不是.true。

@阿森尼啊,好吧,不知怎么的,最新的答案刚刚出现

是否需要最里面的循环?我认为in关键字可以使它更易读、更惯用。

@是的,但我的答案并不是要审查代码(我们有专门的网站)。我只想指出问题的基本问题。

这不会打印验证消息。它要么需要打印validation(number, validationHelper)(可能是更好的选择),要么在返回之前将消息存储在validationHelper.true中。



推荐阅读
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
author-avatar
手机用户2502929965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有