Python基础3——高级特性

目录

1. 切片

2. 迭代

2.1 迭代的定义

2.2 如何判断一个对象是可迭代对象

3. 列表生成式

4. 生成器

5. 迭代器


1. 切片

指定索引范围内的元素,使用切片能大大简化操作。

>>> L=['Tom','Jack','Bob']
>>> L[0:2]  # 取前两个元素,即从索引0开始,直到索引2为止,但不包括索引2
['Tom', 'Jack']

# 也可省略0,如:
>>> L[:2]
['Tom', 'Jack']

# 从索引1开始,索引2为止
>>> L[1:2]
['Jack']

# 索引支持从倒数开始
>>> L[-2:]
['Jack', 'Bob']
>>> L[-2:-1]
['Jack']

# 前10个数每两个取1个
>>> L=list(range(100))
>>> L[:10:2]
[0, 2, 4, 6, 8]

# tuple也可用切片操作,只是操作的结果仍是tuple
>>> (0,1,2,3,4,5)[:3]
(0, 1, 2)

# 字符串也可用切片操作,只是操作的结果仍是字符串
>>> 'ABCDEFG'[::2]
'ACEG'

2. 迭代

2.1 迭代的定义

给定一个 list 或 tuple ,通过 for 循环来遍历这个 list 或 tuple ,这种遍历称为迭代,例如:

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

dict 的存储并不是按照 list 的方式顺序排列,所以迭代出的结果顺序有时会不一样。

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

如果要对 list 实现类似 Java 那样的下标循环,可用 enumerate 函数:

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

2.2 如何判断一个对象是可迭代对象

可直接作用于 for 循环的对象统称为可迭代对象: Iterable

可通过 collections.abc 模块的 Iterable 类型判断一个对象是否为可迭代对象:

>>> from collections.abc import Iterable
>>> isinstance('abc',Iterable)   # 判断str是否可迭代

3. 列表生成式

# 计算1~10以内的数字平方和
>>> [x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

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

# 可加if判断
>>> [x*x for x in range(1,11) if x%2==0]
[4, 16, 36, 64, 100]

# 可使用两层循环生成全排列
>>> [m+n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

# 可使用两个变量来生成list
>>> d={'x':'A','y':'B','z':'C'}
>>> [k+'='+v for k,v in d.items()]
['x=A', 'y=B', 'z=C']

# 可把一个list中所有的字符串变成小写
>>> L=['Hello','WORLD']
>>> [s.lower() for s in L]
['hello', 'world']

 !在一个列表生成式中, for 前面的 if ... else 表达式,而 for 后面的 if 过滤条件,不能带 else 。

4. 生成器

在循环过程中不断推算出后续的元素。这种一边循环一边计算的机制,称为生成器:  generator 

要创建一个 generator 有很多方法,其中最简单的一种是把一个列表生成式的 [ ] 改成 () ,就创建了一个 generator ,generator 函数的调用实际返回一个 generator 对象

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

# 如果要一个个打印出来,可用循环迭代出来
>>> for n in g:
...     print(n)
...
0
1
4
9
16
25
36
49
64
81

如果推算的算法比较复杂,用循环无法实现时,可用函数来实现。如斐波拉契数列,除第一个和第二个数外,任意一个数都可由前2个数相加得到:

>>> def fib(max):
...     n,a,b=0,0,1
...     while n<max:
...           print(b)
...           a,b=b,a+b
...           n=n+1
...     return 'done'
...
>>> fib(6)
1
1
2
3
5
8
'done'

 要把 fib 函数变成 generator 函数,只需把 print(b) 改为 yield b 就可以了。然后用循环依次迭代出数列。

>>> def fib(max):
...     n,a,b=0,0,1
...     while n<max:
...           yield b
...           a,b=b,a+b
...           n=n+1
...     return 'done'
...
>>> for n in fib(6):
...     print(n)
...
1
1
2
3
5
8

 然而用 for 循环发现拿不到 generator 的返回值,这就需要捕获错误,至于如何捕获错误,我会在后续的章节里提到!

5. 迭代器

可以被 next() 函数调用并不断返回下一个值的对象称为迭代器: Iterator ,可表示为一个无限大的数据流。

可用 isinstance() 判断一个对象是否是 Iterator 对象:

>>> from collections.abc import Iterator
>>> isinstance([],Iterator)
False

* 生成器都是 Iterator 对象,list 、dict 、str 虽然是 Iterable ,却不是 Iterator 。

把 list 、dict 、str 等 Iterable 变成 Iterator 可使用 iter() 函数:

>>> isinstance(iter([]),Iterator)
True

 

Python高级特性的学习就先到这里了,我们下期见!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值