【Python 4】列表与元组slice切片 迭代 列表生成式 生成器generator 迭代器Iterator对象

这篇具有很好参考价值的文章主要介绍了【Python 4】列表与元组slice切片 迭代 列表生成式 生成器generator 迭代器Iterator对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

L = []
n = 1
while n < 100:
	L.append(n)
	n = n + 2

在Python中,代码不是越多越好,而是越少越好


取一个list或tuple的部分元素是非常常见的操作

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
r = []
n = 3
for i in range(n):
	r.append(L[i])

r # ['Michael', 'Sarah', 'Tracy']

对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
L[0:3]
# ['Michael', 'Sarah', 'Tracy']
L[:3]
# ['Michael', 'Sarah', 'Tracy']
L[1:3]
# ['Sarah', 'Tracy']

L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3
如果第一个索引是0,还可以省略
也可以从索引1开始,取出2个元素出来

类似的,既然Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
>>> L[-2:]
['Bob', 'Jack']
>>> L[-2:-1]
['Bob']

记住倒数第一个元素的索引是-1

切片操作十分有用
可以通过切片轻松取出某一段数列
比如前10个数
后10个数
前11-20个数
前10个数,每两个取一个
所有数,每5个取一个
甚至什么都不写,只写[:]就可以原样复制一个list

L = list(range(100))
L # [0, 1, 2, 3, ..., 99]

L[:10]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

L[-10:]
# [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

L[10:20]
# [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

L[:10:2]
# [0, 2, 4, 6, 8]

L[::5]
# [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

L[:]
# [0, 1, 2, 3, ..., 99]

tuple也是一种list,唯一区别是tuple不可变
因此,tuple也可以用切片操作,只是操作的结果仍是tuple

(0, 1, 2, 3, 4, 5)[:3]
# (0, 1, 2)

字符串’xxx’也可以看成是一种list,每个元素就是一个字符
因此,字符串也可以用切片操作,只是操作结果仍是字符串:

>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'

在很多编程语言中,针对字符串提供了很多各种截取函数(例如,substring),其实目的就是对字符串切片
Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单


如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)
在Python中,迭代是通过for … in来完成的,而很多语言比如C语言,迭代list是通过下标完成的,比如C代码

for(i = 0; i < length; i++){
	printf('%d', list[i])

可以看出,Python的for循环抽象程度要高于C的for循环,因为Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上

list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> for key in d:
...     print(key)
...
a
c
b

因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样

默认情况下,dict迭代的是key
如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()

由于字符串也是可迭代对象,因此,也可以作用于for循环

>>> for ch in 'ABC':
...     print(ch)
...
A
B
C

所以,当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型

那么,如何判断一个对象是可迭代对象呢?方法是通过collections.abc模块的Iterable类型判断

>>> from collections.abc import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False

如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

for i, value in enumerate(['a', 'b', 'c']):
	print(i, value)

0 A
1 B
2 C

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式

list(range(1, 11))
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

但如果要生成[1x1, 2x2, 3x3, …, 10x10]怎么做?方法一是循环:

L = []
for x in range(1, 11):
	L.append(x * x)

L # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list
[x * x for x in range(1, 11)]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用

for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方

[x * x for x in range(1, 11) if x %2 == 0]
[4, 16, 36, 64, 100]

通过列表生成式,我们可以直接创建一个列表
但是,受到内存限制,列表容量肯定是有限的

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间
在Python中,这种一边循环一边计算的机制,称为生成器:generator

要创建一个generator,有很多种方法
第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator

L = [x * x for x in range(10)]
L # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

g = (x * x for x in range(10)]
g # <generator object <genexpr> at 0x1022ef630>

创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator
可以通过next()函数获得generator的下一个返回值
enerator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误
更正确的方法是使用for循环,因为generator也是可迭代对象

所以,我们创建了一个generator后,基本上永远不会调用next(),而是通过for循环来迭代它,并且不需要关心StopIteration的错误

下面是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator函数,调用一个generator函数将返回一个generator

def fib(max):
	n, a, b = 0, 0, 1
	while n < max:
		yield b
		a, b = b, a + b
		n = n + 1
	return 'done'

f = fib(6)
f # <generator object fib at 0x104feaaa0>

正确的写法是创建一个generator对象,然后不断对这一个generator对象调用next()


我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误li文章来源地址https://www.toymoban.com/news/detail-726602.html

到了这里,关于【Python 4】列表与元组slice切片 迭代 列表生成式 生成器generator 迭代器Iterator对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Python魔法大冒险》010 魔法宝箱:列表与元组的探险

    城堡的大门 随着小鱼和魔法师的深入,他们来到了一个古老的废弃城堡。城堡的大门上挂着一个巨大的锁,而锁的旁边有一排小抽屉,每个抽屉里都有一个物品。 魔法师对小鱼说:“这是一个古老的魔法宝箱,小鱼。为了打开这扇门,我们需要正确地组合这些物品。在Pyth

    2024年02月09日
    浏览(37)
  • 【Python 笔记(二)——基本语句 变量类型 字符串 序列 列表与元组 字典与集合】

    在 Python 中,基本语句可以帮助我们完成一些基本的操作,如控制流程、定义函数等。以下是 Python 中的几种基本语句: if 语句 if 语句用于判断某个条件是否成立,如果条件成立则执行相应的代码块。 for 语句 for 语句用于遍历序列中的元素,依次执行相应的代码块。 while 语

    2024年02月08日
    浏览(50)
  • 08列表(list)与元组(tuple)

    [数据1,数据2,数据3,数据4,......] 列表可以存储多个数据,数据之间的逗号以英文分割而且可以数据是不同类型的数据,列表是可变数据类型。 空列表 list_data = [] 或者 list_data = list() 列表的创建 列表的作用是⼀次性存储多个数据,程序员可以对这些数据进行的操作有:增、删、

    2023年04月12日
    浏览(35)
  • Python中的迭代器与生成器提高性能的秘密武器【第143篇—迭代器与生成器】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程中,迭代器和生成器是提高性能和减少内存消耗的重要工具。它们不仅简化了代码结构,而且在处理大型数据集时具有明显的优势

    2024年03月24日
    浏览(56)
  • python之迭代器和生成器

    当谈到Python中的迭代时,迭代器和生成器是两个很常见的概念。在本教程中,我将帮助您理解Python中迭代器和生成器的工作原理及其实现方式。 迭代器 Python中的迭代器是一种特殊的对象,可以用于遍历可迭代对象中的所有元素。所有的迭代器都实现了 __iter__() 和 __next__() 方

    2023年04月18日
    浏览(57)
  • 3.0 Python 迭代器与生成器

    当我们需要处理一个大量的数据集合时,一次性将其全部读入内存并处理可能会导致内存溢出。此时,我们可以采用迭代器 Iterator 和生成器 Generator 的方法,逐个地处理数据,从而避免内存溢出的问题。 迭代器是一个可以逐个访问元素的对象,它实现了 python 的迭代协议,即

    2024年02月13日
    浏览(42)
  • Python中的迭代器与生成器

    在Python中,迭代器(Iterator)和生成器(Generator)是两种用于处理可迭代对象的重要工具。而可迭代对象包括列表,元组,字典,字符串等。 迭代器和生成器只能迭代一次,通常用于处理大型数据集,因为它们不会一次性加载所有数据到内存中,而是根据需要逐个生成值。

    2024年02月10日
    浏览(47)
  • 8 python的迭代器和生成器

    概述         在上一节,我们介绍了Python的模块和包,包括:什么是模块、导入模块、自定义模块、__name__、什么是包、创建包、导入包等内容。在这一节中,我们将介绍Python的迭代器和生成器。在Python中,迭代器是一个非常重要的概念,它使得我们能够遍历一个序列而无

    2024年02月10日
    浏览(41)
  • python中函数,装饰器,迭代器,生成器

    1.函数可以作为参数进行传递 2.函数可以作为返回值进行返回 3.函数名称可以当成变量一样进行赋值操作 作用:在不改变原有函数调用的情况下,给函数增加新的功能          即可以在函数前面增加新的功能,但不改变原来的代码 可迭代的数据类型都会提供迭代器,即可以

    2024年02月07日
    浏览(44)
  • Python迭代器与生成器研究记录

    迭代器肯定是可迭代对象,但是可迭代对象不一定是迭代器,生成器一定是迭代器,但是迭代器不一定是生成器 生成器是特殊的迭代器,所以生成器一定是迭代器,迭代器一定是可迭代对象 我们平常接触最多的对象中,字符串,字典,列表,集合,元组和open打开的文件对象

    2024年02月05日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包