生成器函数
生成器有两种,分别是生成器函数和生成器表达式
生成器函数 - yield
- 定义 :含有yield语句的函数为生成器,该函数被调用会返回一个生成器对象。
- 表达式 : yield 表达式
- 用法 :
- yield表达式用于def函数中,目的是将此函数作为生成器使用。
def myinteger(n):
i = 0
while i < n:
yield i
i += 1
return i
for x in myinteger(3):
print(x) #结果为0,1,2
- yield用于生成数据,供迭代器的next()函数使用。
与return的区别
- yield与return相似,后边跟返回值。但是不同的是:会保留执行状态,下次调用next()方法继续执行,从yield的下一条语句开始执行。如下代码所示:
#代码1
# 此示例示意用生成器函数生成一定范围内的自然数
def myinteger(n):
i = 0
while i < n:
yield i
i += 1
f = myinteger(3)
print(next(f)) #0
print(next(f)) #1
print(next(f)) #2
print(next(f)) #StopIteration
- return 返回一个值之后,会直接终止程序的执行,终止当前生成器,如果执行next()会报错(若return之后无参数则不能与yield同时出现在一个函数中,否则为非法编程)。如下代码所示:
def myinteger(n):
i = 0
while i < n:
yield i #此时生成器生成自然数0
i += 1
return i #终止生成器生成自然数,终止程序
f = myinteger(3)
print(next(f)) #0 (因生成器中生成自然数0,故可调用)
print(next(f)) #StopIteration 1 (生成器已被Return终止,故会报错)
生成器表达式
语法
(表达式 for 变量 in 可迭代对象 [if 真值表达式 ])
其中if表达式可以省略
作用
用推导式的形式生成一个新的生成器
L = [1,2,3,4]
gen = (i**2 for i in L) #生成新的生成器
L2 = iter(gen) #生成可迭代对象
print(next(L2)) #1
print(next(L2)) #4
正则表达式之match与search区别
match匹配从第一个字符串开始匹配到的内容
import re
obj = re.match(r'foo','foo,food on the table')
print(obj)#<_sre.SRE_Match object; span=(0, 3), match='foo'>
print(obj.group())#foo
search匹配第一个满足表达式的字符串
obj = re.search(r'foo','fo,food on the table')
print(obj)#<_sre.SRE_Match object; span=(3, 6), match='foo'>
print(obj.group())#foo
注意:两者返回的都是match对象,需要通过goup()方法获取匹配到的内容