Python学习笔记 - 高级特性
根据廖雪峰的Python教程做成的笔记,其中不包含全部知识点,仅是重点或是容易发生混淆或者忘记的部分。
1.切片(Slice)
基本形态
L = [0,1,2,3,4,5,6,7,8,9]
S = L[m:n]
示例
- 一般方法
# 定义list或tuple
L = ['Michael', 'Tom', 'Tracy', 'Bob', 'Jack']
L = ('Michael', 'Tom', 'Tracy', 'Bob', 'Jack')
# 取得前三个元素('Michael', 'Tom', 'Tracy')
L1 = L[0:3]
# 取得第2到第4个元素('Tom', 'Tracy', 'Bob')
L2 = L[1:4]
# 取得倒数第二个到最后的元素('Bob', 'Jack')
L3 = L[-2:]
- 高阶方法
# 生成包含数字0 ~ 99的一个list或tuple
L = list(range(100))
L = tuple(range(100))
# 前10个数,每2个取一个
L1 = L[:10:2]
# 所有数,每5个取一个
L2 = L[::5]
# 复制一个list
L3 = L[:]
- 字符串操作
字符串也可以当做一个list,每个元素就是一个字符,可以进行切片操作。
s = 'ABCDEFG'
s1 = s[::2] # s1 = 'ACEG'
2.迭代
迭代dict
- 只迭代key
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print(key)
- 只迭代value
d = {'a': 1, 'b': 2, 'c': 3}
for value in d.values():
print(value)
- 同时迭代key和value
d = {'a': 1, 'b': 2, 'c': 3}
for k,v in d.items():
print(k,v)
迭代字符串
s = 'ABCD'
for ch in s:
print(ch)
可以用下面的方法判断对象是否可迭代:
from collections import Iterable
# 可迭代返回True,不可迭代返回False
isable = isinstance('abc', Iterable)
可以使用Python内置的
enumerate
函数把一个list变成索引-元素对,这样就可以再for循环中同时迭代索引和元素本身。
- 利用前:
sum = 0
L = list(range(100))
for v in L:
print(v)
- 利用后:
sum = 0
L = list(range(100))
for i, v in L:
print(i, v)
3.列表生成式
示例
例1:生成一个list [1x1, 2x2, 3x3, …, 10x10]
L = [x * x for x in range(1, 11)]
例2:生成一个list,元素为1~10数字中偶数的平方
L = [x * x for x in range(1, 11) if x % 2 == 0]
例3:使用双层for循环
L = [m + n for m in 'ABC' for n in 'XYZ']
# ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
4.生成器(generator)
一边循环一边计算的机制,成为生成器。适用于list中元素很多(意味着占用内存空间非常大),且元素可以通过某种算法推算出来的场景,通过生成器,不用创建完整的list,节省了大量的空间。
创建生成器
- 方法一:
语法结构与列表生成式相同,仅把[]
变成()
g = (x * x for x in range(10))
- 方法二:
复杂推算算法的场合用方法一可能无法生成,则可使用函数生成。存在关键字yield
的函数就变成了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'
5.迭代器
- 凡是可作用于
for
循环的对象都是Iterable
类型。 - 凡是可作用于
next()
函数的对象都是Iterator
类型,他们表示一个惰性的计算序列。 - 集合数据
list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。