在python不能用作变量名的是 字典名可以是变量吗?

本教程将向您展示如何使用Python for循环执行确定的迭代

在本入门系列的中,您了解了以下内容:

  • 一遍又一遍地重复执行同一代码块称为迭代
    • 确定迭代,其中重复数是预先明确指定的
    • 不定迭代,其中代码块执行直到满足某些条件
  • 在Python中,使用while循环执行不确定的迭代。

这是本教程将介绍的内容:

  • 您将首先比较编程语言用于实现确定迭代的一些不同范例。

  • 然后,您将学习iterablesiterators ,这两个概念构成了Python中确定迭代的基础。

  • 最后,将所有内容捆绑在一起,并了解Python的for循环。

确定迭代循环通常称为for循环,因为for是几乎所有编程语言(包括Python)中用来引入它们的关键字。

从历史上看,编程语言提供了多种for循环样式。 以下各节简要介绍了这些内容。

最基本的for循环是带有起始值和结束值的简单数字范围语句。 确切的格式取决于语言,但通常看起来像这样:

在此,循环主体执行十次。 可变i假定值1上的第一次迭代, 2在第二,等等。 这种for循环在BASIC,Algol和Pascal语言中使用。

C编程语言流行的另一种形式的for循环包含三个部分:

  • 在每次迭代结束时要执行的动作。

这种类型具有以下形式:

技术说明:在C编程语言中, i++将变量i递增。 它大致等于Python中的i += 1

  • 每次循环迭代后,将i递增1

三种形式的for循环很受欢迎,因为为这三个部分指定的表达式几乎可以是任何东西,因此与上面显示的简单数字范围形式相比,它具有更大的灵活性。 这些for循环在C ++,Java,PHP和Perl语言中也具有特色。

这种类型的循环遍历对象的集合,而不是指定数值或条件:

每次循环时,变量i都会使用<collection>下一个对象的值。 这种类型的for循环可以说是最概括和抽象的。 Perl和PHP也支持这种类型的循环,但是它是由关键字foreach而不是for引入的。

进一步阅读:请参阅 Wikipedia页面,以深入了解跨编程语言的确定迭代的实现。

在上面列出的循环类型中,Python仅实现最后一个:基于集合的迭代。 乍一看,这看起来似乎很原始,但是请放心,Python的确定迭代的实现是如此通用,以至于您最终不会被欺骗!

很快,您将详细研究Python的for循环的精髓。 但是现在,让我们从快速的原型和示例开始,以便结识。

这是一个代表性的例子:

但是到底什么是可迭代的呢? 审前for循环此外,将有利于更深入地钻研什么iterables在Python。

在Python中, 可迭代意味着对象可以在迭代中使用。 该术语用作:

  • 形容词:一个对象可能被描述为可迭代的。
  • 名词:一个对象可以被描述为可迭代的。

如果对象是可迭代的,则可以将其传递给内置的Python函数iter() ,该函数返回称为iterator的内容 是的,术语有点重复。 等一下 一切最终都解决了。

以下示例中的每个对象都是可迭代的,并在传递给iter()时返回某种类型的迭代器:

另一方面,这些对象类型是不可迭代的:

到目前为止,您遇到的所有数据类型都是集合或容器类型,都是可迭代的。 这些类型包括 , , , , 和类型。

但是,这些绝不是您可以迭代的唯一类型。 Python中内置的或模块中定义的许多对象被设计为可迭代的。 例如,在Python中打开文件是可迭代的。 正如您将在有关文件I / O的教程中很快看到的那样,对打开的文件对象进行迭代会从文件中读取数据。

实际上,Python中几乎所有对象都可以变得可迭代。 即使是用户定义的对象,也可以以可以迭代的方式进行设计。 (您将在下一篇有关面向对象编程的文章中找到如何完成此操作的。)

好的,现在您知道对象可迭代的含义,并且知道如何使用iter()从对象中获取迭代器。 一旦有了迭代器,该怎么办?

迭代器本质上是一个值生成器,它从其关联的可迭代对象产生连续值。 内置函数next()用于从迭代器中获取下一个值。

这是使用与上面相同的列表的示例:

在此示例中, a是一个可迭代的列表,并且itr是使用iter()获得的关联迭代器。 每个next(itr)调用都从itr获得下一个值。

注意迭代器如何在内部保留其状态。 它知道已经获得了哪些值,因此当您调用next() ,它知道接下来要返回什么值。

当迭代器的值用完时会发生什么? 让我们在上面的迭代器上再进行一次next()调用:

如果已经返回了迭代器的所有值,则后续的next()调用将引发StopIteration异常。 从迭代器获取值的任何进一步尝试都将失败。

您只能从一个方向的迭代器获取值。 你不能后退。 没有prev()函数。 但是您可以在同一个可迭代对象上定义两个独立的迭代器:

即使迭代器itr1已经在列表的末尾, itr2仍然在列表的开始。 每个迭代器都维护自己的内部状态,彼此独立。

如果要一次从迭代器中获取所有值,则可以使用内置的list()函数。 在其他可能的用法中, list()将迭代器作为其参数,并返回一个由迭代器产生的所有值组成的列表:

同样,内置的tuple()set()函数从迭代器产生的所有值中分别返回一个元组和一个集合:

不一定要养成这种习惯。 迭代器的部分优雅之处在于它们是“懒惰的”。 这意味着,当您创建迭代器时,它不会生成当时可以产生的所有项。 它一直等到您通过next()要求它们。 除非请求,否则不会创建项目。

当使用list()tuple()或类似方法时,您将强制迭代器立即生成其所有值,以便可以将它们全部返回。 如果迭代器返回的对象总数很大,则可能需要很长时间。

实际上,可以在Python中创建一个迭代器,该迭代器返回一系列无穷的对象。 (您将在即将到来的有关生成器函数和itertools教程中学习如何执行此操作。)如果尝试一次从一个无限的迭代器中获取所有值,则该程序将 。

现在,向您介绍了充分了解Python的for循环工作原理所需的所有概念。 在继续之前,让我们回顾一下相关条款:

遍历集合中的对象或项目的过程
可以迭代的对象(或用于描述对象的形容词)
从其关联的可迭代对象产生连续项或值的对象
用于从可迭代对象获得迭代器的内置函数

现在,再次考虑本教程开始时介绍的简单for循环:

该循环可以完全按照您刚刚了解的概念来描述。 为了执行此for循环描述的迭代,Python执行以下操作:

  • 调用iter()以获得一个迭代a
  • 重复调用next()依次从迭代器中获取每个项目

对于每个项next()返回,循环体都会执行一次,循环变量i设置为每次迭代的给定项。

下图中总结了事件的顺序:

也许这似乎是很多不必要的猴子生意,但好处却是可观的。 Python完全以这种方式对待遍历所有可迭代对象,在Python中,可迭代对象和迭代器比比皆是:

  • 许多内置对象和库对象都是可迭代的。

  • 有一个称为itertools的标准库模块,其中包含许多返回可迭代对象的函数。

  • 使用Python的面向对象功能创建的用户定义对象可以使其可迭代。

  • Python具有称为生成器的构造,可让您以简单,直接的方式创建自己的迭代器。

在本系列中,您将发现有关以上所有内容的更多信息。 它们都可以成为for循环的目标,并且语法完全相同。 它以其简单而优雅而出众。

您之前已经看到可以使用iter()从字典中获得迭代器,因此您知道字典必须是可迭代的。 当您浏览字典时会发生什么? 让我们来看看:

如您所见,当for循环遍历字典时,循环变量将分配给字典的键。

要在循环中访问字典值,您可以像往常一样使用键来引用字典:

您还可以使用.values()直接遍历字典的值:

实际上,您可以同时遍历字典的键和值。 这是因为for循环的循环变量不仅限于单个变量。 它也可以是一个元组,在这种情况下,分配是使用打包和拆包从可迭代项中进行的,就像分配语句一样:

如有关Python 的教程所述,字典方法.items()有效地将键/值对的列表作为元组返回:

因此,Python遍历字典访问键和值的方式如下所示:

在本教程的第一部分中,您看到了一种称为的for ,其中指定了起始和结束数值。 尽管这种形式的for循环不是直接构建在Python中,但很容易实现。

例如,如果您要遍历04的值,则只需执行以下操作:

0

当只有几个数字时,此解决方案还不错。 但是,如果数字范围大得多,它将很快变得乏味。

令人高兴的是,Python提供了一个更好的选项-内置range()函数,该函数返回一个可迭代的整数序列。

请注意, range()返回的是class range的对象,而不是值的列表或元组。 由于range对象是可迭代的,因此可以通过使用for循环遍历它们来获取值:

0

您还可以使用list()tuple()一次捕获所有值。 在REPL会话中,这可以是一种快速显示值的便捷方法:

但是,当在较大应用程序中的代码中使用range()时,通常以这种方式使用list()tuple()被认为是较差的做法。 与迭代器一样, range对象也是惰性的-指定范围内的值只有在被请求之前才生成。 range对象上使用list()tuple()强制立即返回所有值。 这很少需要,并且如果列表很长,则会浪费时间和内存。

<stride>表示在值之间跳过的量(类似于用于字符串和列表切片的stride值):

指定给range()所有参数都必须为整数,但其中任何一个都可以为负数。 自然地,如果<begin>大于<end> ,则<stride>必须为负(如果需要任何结果):

技术说明:严格来说, range()并不是一个内置函数。 它被实现为创建不可变序列类型的可调用类。 但是出于实际目的,它的行为类似于内置函数。

在本入门系列的上一教程中,您已经看到了while循环的执行如何被中断, 如何使用修改。 这些功能也可for循环。

使用for循环和while循环以相同的方式breakcontinue工作。 break完全终止循环,并继续执行循环后的第一条语句:

continue终止当前迭代并继续进行下一个迭代:

for循环也可以具有else子句。 解释类似于while循环。 如果循环通过穷尽可迭代终止,则将执行else子句:

如果列表是使用break语句中断的,则else子句不会执行:

本教程介绍了for循环,它是Python中确定迭代的主力。

您还了解了IterablesIterators的内部工作原理,这两个重要的对象类型是确定迭代的基础,但在其他各种Python代码中也占有重要地位。

在这个入门系列的下两个教程中,您将稍作调整,并探索Python程序如何通过键盘输入输出到控制台与用户交互。

为了将字典条目转换成变量,是否有一种Python方式将字典的值分配给它的键?

更新:也许我应该更具体一些:实际上,我可以肯定键值对是正确的,因为以前我曾将它们定义为变量。 然后,我将这些变量存储在字典中(作为键值对),并希望在其他函数中重用它们。 我可以在新函数中重新定义它们,但是由于我可能拥有约20个条目的字典,因此我认为可能会有更有效的方法。


您可以单行执行以下操作:

但是,在使用此技巧时,Python应该如何优化本地/全局访问权限时应谨慎。

我认为像这样编辑locals()通常不是一个好主意。如果您认为globals()是更好的选择,请三思而后行! :-D

相反,我宁愿始终使用名称空间。



您已经有一本非常好的字典。只是使用那个。如果您知道键是什么,并且绝对确定这是一个合理的主意,则可以执行以下操作

但是大多数时候,您应该只使用字典。 (如果使用字典不方便,则可能是您无法很好地组织数据;请寻求帮助来重新组织它。)


考虑一下Python中的"捆绑"解决方案:将字典中的变量加载到名称空间中。您的变量最终将成为新对象的一部分,而不是局部变量,但是您可以将它们视为变量而不是dict条目。




字典的键是,a和b,所以你要用a或b做变量有什么不可以,但是有什么意义
或者你的意思 是用dica['a']做变量,但是dica['a']=‘abc',也就不是用键做变量,而是用值做变量,
所以,你的问题无法理解

抱歉我没有说清楚,我的意思是,比如aa那里输入了 asd,bb那里输入了 zxc,我要怎么才能让字典cc{}里存入 asd:zxc,即cc = {asd:zxc}

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

我要回帖

更多关于 在python不能用作变量名的是 的文章

 

随机推荐