0%

3.2 重要关键字

Python 原创基础教程

3.2 与函数有关的重要关键字

3.2.1 lambda表达式

一种函数的简写形式,类似匿名函数

1
2
3
4
5
6
7
8
9
10
11
12
13
func = lambda x:x+1
func(1)
#func为函数名,x为参数, :后是表达式

func2 = lambda x,y,z:x+y+z
func2(1,2,3)

#匿名函数的形式
def f(x):
return lambda y:x+y
a = f(2) # a是一个函数对象
a(22)

3.2.2 global关键字

在编写程序的时候,如果想为一个在函数外的变量重新赋值,并且这个变量会作用于许多函数中时,就需要告诉python这个变量的作用域是全局变量。此时用global语句就可以变成这个任务,也就是说没有用global语句的情况下,是不能修改全局变量的。

1
2
3
4
5
6
7
8
9
10
# coding:utf-8

var = 0
def fun():
global var # 此处是global对var的声明,只有声明后,才可以在这个函数中改变var的值
var = 5
print var # 0
fun()
print var # 5
#如果不加global声明, 第二次打印var还是0

3.2.3 yield关键字(生成器)

迭代器和生成器的概念

1.迭代器协议
  • 对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代

  • 可迭代对象就是:实现了迭代器协议的对象

  • 协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象

  • 通过dir()查看是否实现__iter__即迭代器协议

    2.生成器协议

  • 生成器可以不立即返回全部结果,而是需要的适合逐个返回结果,因此生成器自动实现迭代器协议

  • 生成器函数,通过在函数里添加yield代替return,yield一次返回一个结果

示例

1
2
3
4
5
6
7
8
9
10
11
def g(N):
res=[]
for i in range(N):
res.append(i*i)
rerurn res

for item in g(5)



def g(N)

生成器表达式,类似列表推导,返回一个迭代器,而不是全部结果

1
2
3
squares1 = [x**2 for x in range(5)]#结果,一个列表
squares2 = (x**2 for x in range(5))#生成器
next(squares2)

用yield改写函数

1
2
3
4
5
6
def fab(max): 
   n, a, b = 0, 0, 1
   while n < max:
       print b
       a, b = b, a + b
       n = n + 1
1
2
3
4
5
6
7
def fab(max): 
n, a, b = 0, 0, 1
while n < max:
yield b
# print b
a, b = b, a + b
n = n + 1

a.yield 的作用就是把一个函数变成一个generator,带有yield的函数不再是一个普通函数,Python解释器会将其视为一个generator,调用fab(5)不会执行 fab 函数,而是返回一个 iterable 对象!

b.在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

c.改写fab函数如果通过返回List能满足复用性的要求,但是更有经验的开发者会指出,该函数在运行中占用的内存会随着参数max的增大而增大,如果要控制内存占用,最好不要用List来保存中间结果,而是通过 iterable 对象来迭代。