变量的作用域
- 变量作用域就是定义的变量可以使用的代码范围。
- 全局变量:一般直接定义在函数的外部或者用global关键字在函数内部定义,可以被所有的函数访问,除非被删除,否则一直存活到脚本运行结束。
- 局部变量:只能在函数或代码块内部被调用,引用比全局变量速度快,可优先考虑使用。
- 注意:(在函数中使用全局变量时,可以调用全局变量的值,不能直接修改全局变量。如果值是可变的类型,值是可以改变的)
匿名函数
- 语法格式:lambda 参数1,参数2,…,参数n:返回值。
print((lambda x,y,z:x+y+z)(1,2,3))
递归函数
- 程序调用自身的编程技巧称为递归。
**递归函数优缺点:**优点:优点:定义简单,逻辑清楚。
缺点:递归效率不高,因为每一次调用都有相应的数值存放在栈,而栈的空间是有限的
因此在写函数时候要注意不可无限递归或者递归次数非常大,防止栈溢出。
生成器函数
1.一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用。
2.执行了__next__()方法之后才会执行函数体,并且获得返回值。next()内置方法,内部调用生成器函数的__next__()方法。
3.yield和return相同的是可以返回值,但是不同的是yield 不会结束函数
- 当我们处理大量数据时,一个个获取数据,以节省内存空间。
def func():
yield"a"
yield"b"
yield"c"
- 执行生成器函数时,返回生成器对象。
- 只有使用next()函数执行生成器对象或循环生成器对象时,才会一个个返回数据。
g = fun()
for i in g:
print(i)
t = ( i for i in range(10) if i % 2 == 0 )
print(t)
print(next(t))
- 使用生成器实现斐波那契数列(兔子数列)
def fibonacci(n):
a,b = 0,1
while a < n:
yield a
a,b = b,a+b
for i in fibonacci(100):
print(i)