python 面试题总结

生成器函数

生成器有两种,分别是生成器函数和生成器表达式

生成器函数 - yield

  1. 定义 :含有yield语句的函数为生成器,该函数被调用会返回一个生成器对象。
  2. 表达式 : yield 表达式
  3. 用法 :
  • yield表达式用于def函数中,目的是将此函数作为生成器使用。
def myinteger(n):
  i = 0
  while i < n:
      yield i
      i += 1
      return i

for x in myinteger(3):
  print(x) #结果为012
  • 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()方法获取匹配到的内容

猜你喜欢

转载自blog.csdn.net/weixin_43359547/article/details/83586585