python高级特性(分片、迭代、列表生成式、生成器、迭代器)

学习目标:

Python学习七、

python高级特性


学习内容:

1、分片
2、迭代
3、列表生成式
4、生成器
5、迭代器


1、分片

  • 取一个list或tuple的部分元素

用循环取一部分

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

1、用循环就比较繁琐了,现在用分片来实现取列表一部分

分别取前三个名字,当索引从0开始时,可以省略,然后从倒数第二个开始去取到最后一个

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
print(L[0:3])
print(L[:3])
print(L[-2:])
输出:
['Michael', 'Sarah', 'Tracy']
['Michael', 'Sarah', 'Tracy']
['Bob', 'Jack']

还有每5个取一个

p = []
n = 1
while n<= 100:
    p.append(n)
    n+=1
print(p[::5])
print(p[:10:2])
输出:
[1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76, 81, 86, 91, 96]
[1, 3, 5, 7, 9]

2、字符串也可以分片取

a = 'ABCDEFG'
print(a[:3])
print(a[:5:2])
print(a[1:3])
输出:
ABC
ACE
BC

2、迭代

  • 给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代

1、只要是可迭代对象,无论有无下标,都可以迭代,比如:dict

迭代key

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

迭代value

d = {'a': 1, 'b': 2, 'c': 3}
for value in d.value():
  print(value)
输出:
1
2
3

2、判断一个对象是否可以被迭代

from collections import Iterable
isinstance('abc', Iterable)
isinstance(123, Iterable)
输出:
True
False

3、Python内置的enumerate函数可以把一个list变成索引-元素对,可以在for循环中同时迭代索引和元素本身

for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
输出:
0 A
1 B
2 C

3、列表生成式

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

list(range(x, y))

print(list(range(1, 11)))
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

或者

s = 'aasadaDS'
s = [x for x in s]
print(s)
输出:
['a', 'a', 's', 'a', 'd', 'a', 'D', 'S']

2、如果要生成一定的格式
例如:xx+yy…

l = []
for i in range(1,11):
    l.append(i*i)
print(l)
输出:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

3、循环的列表生成式太过复杂,可以用更简单的语句

[i for i in range(x, y)]

print([i for i in range(1,11)])
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

4、在[i for i in range(x, y)]后面和可以加上条件

[i for i in range(x, y) 条件]

print([i for i in range(1,11) if i%2==0])
输出:
[2, 4, 6, 8, 10]

5、生成式还可以用多层循环

[m + n for m in ‘*’ for n in ‘*’]

print([i*j for i in range(1,5) for j in range(1,5)])
输出:
[1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16]

6、for可以迭代两个或者多个变量

例如dict.items

d = {'x': 'A', 'y': 'B', 'z': 'C' }
for k, y in d.items():
    print(k, '=', y)
输出:   
x = A
y = B
z = C

7、把一个list中所有的字符串变成小写

L = ['Hello', 'World', 'IBM', 'Apple']
print([s.lower() for s in L])
输出:
['hello', 'world', 'ibm', 'apple']

8、if…else…也可以用来生成列表,if写在for前面必须加else

if…else…for…:因为

print[x if x % 2 == 0 else -x for x in range(1, 11)])
输出:
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
  • for前面的if … else是表达式,而for后面的if是过滤条件,不能带else
  • for前面的部分是一个表达式,它必须根据x计算出一个结果,当存在if时,必须有else否则无法计算出结果

4、生成器—generator

  • 生成器不同于列表生成式,列表生成式是直接通过一个规则不管多大都会生成一个列表,而生成器是编写一个规则,generator保存的是算法,可以根据这种规则列出想要的结果,生成器可迭代

1、列表生成式与生成器的对比

普通列表生成式

l = [x*x for x in range(11)]
print(l)
输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

生成器

l = (x*x for x in range(11))
print(l)
输出:
<generator object <genexpr> at 0x000001BB131FC820>

2、如果想要输出生成器的元素需要用到next()函数

next()

l = (x*x for x in range(11))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
输出:
0
1
4
9
16
25
36
49
64
81
100

可以用for循环来输出生成器

l = (x*x for x in range(11))
p = []
for i in l:
    if i not in p:
     p.append(i)
print(p)
输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

3、一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

yield

def fid(max):
    a, b, n = 0, 1, 0
    while n < max:
        yield b
        a, b = b, a+b
        n = n+1
    return 'done'
l = []
for i in fid(6):
    if i not in l:
        l.append(i)
print(l)
输出:
[1, 2, 3, 5, 8]

4、想要捕获到最后的那个return

try…except…

def fid(max):
    a, b, n = 0, 1, 0
    while n < max:
        yield b
        a, b = b, a+b
        n = n+1
    return 'done'
o = fid(6)
while True:
    try:
        i = next(o)
        print('o:', i)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break
 输出:
o: 1
o: 1
o: 2
o: 3
o: 5
o: 8
Generator return value: done        

5、迭代器

isinstance()函数: isinstance(变量,数据类型)

  • 可以直接作用于for循环的对象统称为可迭代对象:Iterable
  • 可以使用isinstance()判断一个对象是否是Iterable对象
  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
  • 可以使用isinstance()判断一个对象是否是Iterator对象
  • Iterator的计算是惰性的,Iterator甚至可以表示一个无限大的数据流
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值