标签:return generator 高级 特性 next while print range
切片
利用切片操作实现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 |
标签:return,generator,高级,特性,next,while,print,range 来源: https://www.cnblogs.com/waynew/p/12404849.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。