美文网首页
Python 切片、迭代、遍历

Python 切片、迭代、遍历

作者: 李霖弢 | 来源:发表于2022-06-08 10:50 被阅读0次

迭代 Iterable

listtuplestrbytesdictrangegeneratorset

判断是否为可迭代对象
from collections.abc import Iterable
isinstance([1,2,3], Iterable)
切片
  • 可迭代对象均可切片,返回类型和原来相同
  • 取出从m项开始的n个元素,每s个取一个
  • 省略m则为0,省略n则为到最后一个为止,省略:s
  • 若全省略则L[:],等于拷贝
newL=L[m:n(:s)]

x=[1,2,3,4,5]
x[1]#2
x[1:3]#[2,3]
x[:3]#[1,2,3]
x[1:]#[2,3,4,5]
x[:]#[1,2,3,4,5]
len

len()函数可以获得可迭代对象的长度,如list/tuple元素的个数、dict键值对的个数、str字符数、bytes字节数

range

返回一个可迭代对象,通常配合for in使用
可以通过list把range对象转化为列表

range(stop)
range(start, stop[, step])

for in

可使用for...in对可迭代对象进行迭代
不同于js的for...offor...in,python的for...in根据迭代对象不同,有不同的迭代结果:

  • listtuplerange默认迭代的是value
    如果要迭代下标,可以用enumerate()
for item in list:
    pass
for index,value in enumerate(list):
    pass
for value in range(len(list)):
    pass
  • dict默认迭代的是key
    对象本身不支持迭代,可通过obj.__dict__转为字典,或dir(obj)方法取得属性列表,再进行迭代
for key in dict:
    pass
for value in dict.values():
    pass
for key,value in dict.items():
    pass
# 本质上为解构赋值,如下
for x, y in [(1, 1), (2, 4), (3, 9)]:
    print(x, y)
推导式(列表、字典、集合)

书写方便,且执行效率远远高于通过循环生成列表/字典/集合
注意元组没有解析式,当使用()时会生成generator

l = [i+1 for i in range(1,11) if i<5]
#[2, 3, 4, 5]

d = {i: j.upper() for i, j in zip(range(1, 3), 'abc')}
#{1: 'A', 2: 'B', 3: 'C'}

s = {x * x for x in range(10)}
#{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
  • zip
    把传入的参数打包成一个个元组,然后返回由这些元组组成的对象,以节约内存。可以使用 list() 转换zip对象以输出列表。
>>>list(zip(range(1, 3), 'abc'))
[(1,''a'),(2,'b'),(3,'c')]

while循环

Python中for只能对可迭代集合进行循环,复杂条件循环应使用while

while <条件语句>:
    pass

break

退出循环

continue

提前结束本轮循环,直接开始下一轮循环


生成列表

range

range(num)range(startNum,endNum,[step])(有头无尾)生成range类型,再通过list()转换成列表

列表生成式
[<执行操作> for x in <可迭代对象> (<逻辑判断>)]

[x * x for x in range(1, 11) if x % 2 == 0]
#[4, 16, 36, 64, 100]
生成器 generator
  • 通过next()for循环执行
  • 超出长度继续执行时会报StopIteration错误
  • 既属于Iterable又属于Iterator
  1. 直接定义
    类似列表生成式的方式,[]改为()
g = (x * x for x in range(10))
#print(next(g))
for n in g:
    print(n)
  1. 通过函数定义
    存在yield的函数视为generator函数,函数执行时仅返回一个generator对象,每次用next()调用该generator对象时执行函数,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
#next(fib(6))
for n in fib(6):
    print(n)

等同于ES6

function* fib(max) {
  var n = 0, a = 0, b = 1;
  while (n < max) {
    yield b;
    ({ a, b } = { a: b, b: a + b });
    n = n + 1;
  }

  return 'done'
}

//fib(6).next()
for (item of fib(6)) {
  console.log(item)
}

return值可通过捕获StopIteration中的value获得

g = fib(6)
while True:
    try:
        x = next(g)
        print('g:', x)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break

迭代器 Iterator

  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
  • Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算,因此节约内存空间,甚至可以表示一个无限大的数字流(如全体自然数)
  • 使用iter()函数为listdictstrIterable添加Iterator
myIter=iter('abc')
print(next(myIter),next(myIter),next(myIter))#a b c

Python的for循环本质上就是通过先转换成Iterator再不断调用next()函数实现

  • 通过list()等可以把Iterator转化回非Iterator

处理Iterable的方法

不同于JS中只有数组可以使用,Python中Iterable均可使用以下方法

map

map将传入的函数依次作用到Iterable的每个元素,并把整体结果作为新的Iterator返回。

r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
list(r)//[1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce

reduce把结果继续和Iterable的下一个元素做累积计算

from functools import reduce
def fn(x, y):
    return x * 10 + y
reduce(fn, [1, 3, 5, 7, 9])
# 13579

filter

filter把传入的函数依次作用于每个元素,根据返回值是True或False决定保留还是丢弃该元素,并把整体结果作为新的Iterator返回。

def is_odd(n):
    return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# [1, 5, 9, 15]

sorted

python2中可以使用cmp自定义排序规则,python3中已经废弃

  • key
    只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse
    排序规则,reverse = True 降序 , reverse = False 升序(默认)。
sorted(iterable, key=None, reverse=False)  
L=[('b',2),('a',1),('c',3),('d',4)]
sorted(L, key=lambda x:x[1])

相关文章

  • Python 切片、迭代、遍历

    迭代 Iterable list、tuple、str、bytes、dict、range、generator、set...

  • python基础知识(拓展篇--"怎样更python")

    切片[起始位置:结束位置:间隔数]//一般使用切片截取某一片段的数字。 迭代//迭代一般用于遍历,python中的...

  • Python的高级特性

    切片 list切片 tuple切片 str切片 迭代 在Python中迭代是通过for ... in ...来实现...

  • Python -- 切片、迭代

    切片 1、取一个list或tuple的部分元素,采用切片方式:L[0:3]:表示从索引0开始取,直到索引3为止,但...

  • Python之高级特性

    Python中的五种特性:切片,迭代,列表生成式,生成器,迭代器。 切片 切片就相当于其他语言中的截断函数,取部分...

  • Python:4.高级特性

    切片 迭代 列表生成式 生成器 迭代器 参考 廖雪峰的Python教程

  • Python入门基础二(高级特性)

    概述 所说高级特性包括切片、迭代、列表生成式、迭代器、生成器。 切片 Python学习一(基础)中列表和元组的基本...

  • 19.Python的迭代工具

    为了配合for循环,使迭代更加方便,Python提供很多迭代工具(迭代是实现遍历的方式,遍历是迭代的其中一个用途)...

  • Python:数据操作

    切片 切片就是用于截取集合,字符串的工具。下面是如何使用: 迭代 我们都知道,可以使用 for in这个循环来遍历...

  • Python高级特性

    一、切片(适用list,tuple,str) 二、迭代(Iterable) Python中,只要是可迭代对象就可以...

网友评论

      本文标题:Python 切片、迭代、遍历

      本文链接:https://www.haomeiwen.com/subject/pccumrtx.html