笔记由廖雪峰官网和菜鸟教程整理
高级特效
切片
取一个list或tuple的部分元素是非常常见的操作。
tuple操作得到的也是tuple不可更改
字符串是特殊的list,切片操作得到的也是字符串
#用range函数创建0-99的list
>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]
#取前十个
>>> L[:10][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#取后十个,注意倒数第一个是L[-1]
>>> L[-10:][90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
#10-20的数中每隔两个取一个
>>> L[10:20:2]
[0, 2, 4, 6, 8]
#对所有数每隔5个取一个
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
#复制一个list
>>>L[:]
#字符串是特殊的list,切片得到的也是list
>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'
利用切片去除字符串中的空格
def myTrim(s):
while s[:1]==' ':
s=s[1:]
while s[-1:]==' ':
s=s[:-1]
return s
迭代
- for 迭代
可用于遍历list或者tuple、字符串、dict
判断是否能迭代,可以使用isinstance判断。
list输出下标元素可以使用enumerate函数
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代True
#list迭代
>>> d=['a','b','c','d']
>>> for n in d:
print(n)
a
b
c
d
#list输出下标和元素,用enumerate函数
>>> for i,value in enumerate(d):
print(i,value)
0 a
1 b
2 c
3 d
>>> d={'a':1,'b':2,'c':3}
#dict 迭代输出key
>>> for key in d:
print(key)
a
b
c
#dict迭代输出value
>>> for key in d:
print(d.get(key))
1
2
3
#str迭代
>>> for ch in 'JJL':
print(ch)
J
J
L
返回最大最小值及索引
- list
min(l)——max(l) 最大最小值
l.index(min(l))——l.index(max(l)) 最大最小值的索引
但是index只能显示第一个出现的min值的索引 - dict
列表生成式
[x for x in list if x%2==0]
- 使用[],将要生成的元素放在最前面,后面加for循环即可创建list,中间不用逗号隔开
- 可以在for循环后加if判断
- 可以使用两层循环
- 函数
range函数
list(range(1,11)) 生成[1,2,3,4,5,6,7,8,9,10]
注意range生成的范围,用‘,’间隔两参数,list后用括号
lower
s.lower() 将字符串小写
isinstance
isinstance(s,str)判断s是否是str,返回True或者False
#循环
>>> L = []
>>> for x in range(1, 11):
... L.append(x * x)
...
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#列表生成式
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#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']
#for循环两个变量
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]#+号可以拼接字符串
['y=B', 'x=A', 'z=C']
#列出当前目录所有文件名
>>> import os # 导入os模块
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']
生成器
#列表生成式 list
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#生成器 generator
>>> g = (x * x for x in range(10))
>>> g
- 生成器 generator用()表示
- 可以用next()指向下一个返回值(有点像C++指针),每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
- 通常不使用next(),而是用循环for n in g: 来得到generator的元素
- generator和函数
yield可以代替print来显示生成器,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。
generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
还不太懂! 调用时首先生成一个generator对象,再用next()不断获得下一个值。一般用循环来调用generator函数,在循环过程中不断调用yield,就会不断中断。当然要给循环设置一个条件来退出循环,必须捕获StopIteration错误,返回值包含在StopIteration的value中。
#定义斐波那契函数
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b#yield表示指向generator元素,相当于print(b),但b在这里是generator
a, b = b, a + b
n = n + 1
return 'done'
#调用generator函数
>>> g = fib(6)
>>> while True:
... try:
... x = next(g)
... print('g:', x)
#捕获StopIteration错误,返回值循环中包含在StopIteration的value
... except StopIteration as e:
... print('Generator return value:', e.value)
... break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done
generator生成杨辉三角
#每一行的list都是由上一行的list分别头尾加0后生成的两个list对应位置元素之和,利用zip函数计算。
# -*- coding: utf-8 -*-
def triangles():
L=[1]
while True:
yield L
#list可以用+号添加元素
#如果没有zip(generator对应元素相加,返回tuple),则序列 [1,2,3]+[4,5,6]=[1,2,3,4,5,6]
L=[sum(i) for i in zip([0]+L,L+[0])]
#方法二:三角每一行首位都是1,中间是上一行两两相加
def triangles():
L=[1]
while True:
yield L
L=[1]+[L[x]+L[x+1] for x in range(len(L)-1)]+[1]
#输出的
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
for t in results:
print(t)
迭代器
总结
1、可作用于for循环的对象都是Iterable
2、可作用于next()的对象都是Iterator
3、list、dict、str都是iterable都不是Iterator,可以用iter()转变。
4、生成器generator既可以for也可以next
- Iterable(可循环迭代)
可直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象。
可以使用isinstance() 判断一个对象是否是Iterable对象
>>> from collections import Iterable
>>> isinstance([], Iterable)#list
True
>>> isinstance({}, Iterable)#dict
True
>>> isinstance('abc', Iterable)#string
True
>>> isinstance((x for x in range(10)), Iterable)#生成器
True>
>> isinstance(100, Iterable)#int
False
- 迭代器Iterator
可以被next()调用并不断返回下一个值的对象,生成器generator是Iterator对象。
Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。
用isinstance()判断,第二参数是Iterator
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)#生成器
True>
>> isinstance([], Iterator)#list
False
>>> isinstance({}, Iterator)#dict
False
>>> isinstance('abc', Iterator)#string
False
- Iterable转化Iterator
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True