高级特性
切片
利用切片操作实现trim()函数,去除字符串首尾空格,不能使用str的strip()方法
def trim(s):
while s[-1]==' ':
s = s[:-1]
while s[0]==' ':
s = s[1:]
return s
当s为空字符串''时,上述代码出错,index out of range
def trim(s):
while s[-1:]==' ':
s = s[:-1]
while s[:1]==' ':
s = s[1:]
return s
迭代
判断一个是否是可迭代对象
from collections import Iterable
#True
isinstance([1,2,3], Iterable)
#False
isinstance(123, Iterable)
下标循环
for i, val in enumerate(['a','b','c']):
print(i, val)
列表生成式
列出当前目录下的所有文件和目录名
import os
[d for d in os.listdir('.')]
列表生成式也可以使用两个变量来生成list
d = {'x':'1','y':'2','z':'3'}
print([key+'='+val for key,val in d.items()])
把一个list中的所有字符串变成小写
lst = ['Hello','World']
print([s.lower() for s in lst])
[x for x in range(100) if x%2==0]
[x if x%2==0 else -x for x in range(100)]
if跟在for后面表示筛选条件,不能再加else,若if在for的前面,if后面要有else,因为for前面要为一个表达式,只有if不能根据x计算出结果
生成器
通过列表生成式直接创建列表,当列表元素非常多时,会占用很大的存储空间。而python中有一种机制,列表元素可以通过算法推算出来,一边循环一边计算,即generator
#list
L = [i for i in range(100)]
#generator,生成generator对象
L = (i for i in range(100))
#通过next()方法访问
next(L)
当到最后一个元素,没有更多元素时,抛出StopIteration异常
可以使用for循环,避免一直调用next()方法以及StopIteration异常
L = (i for i in range(100))
for i in L:
print(i)
把斐波那契数列函数fib()转为generator,只需加yield关键字
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
n = n + 1
a, b = b, a + b
return 'done'
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
n = n + 1
a, b = b, a + b
return 'done'
generator和函数不同的是,函数顺序执行,遇到return语句或最后一条语句返回,而generator调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句后继续执行
#把函数改为generator后,由于每次都要通过next()调用很繁琐,所以可以选择使用for循环
for i in fib(6):
print(i)
但使用for循环得不到generator的return语句的返回值,可以通过捕获StopIteration错误得到返回值
g = fib(6)
while True:
try:
x = next(g)
print('g: ', x)
except StopIteration as e:
print('Generator return value: ', e.value)
break
迭代器
| for循环 | for循环,next() | |
|---|---|---|
| Iterable | dic,set,str,tuple,list | generator和带yield的generator function |
| Iterator | iter(dic),iter(set)... | generator |

浙公网安备 33010602011771号