全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域称为局部变量,定义在函数外的拥有全局作用域称为全局变量。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。

当全局变量与局部变量同名时,在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用

python函数补充、生成器、迭代器

如果想在全局作用域调用局部变量可以使用global

python函数补充、生成器、迭代器

未声明全局变量之前

python函数补充、生成器、迭代器

声明全局变量之后

注意:虽然python提供这种方法可以从局部作用域中声明全局变量,但是不建议这样使用,全局变量只在全局作用域中定义

嵌套函数

顾名思义,嵌套函数就是指,函数内部套函数

python函数补充、生成器、迭代器

递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

python函数补充、生成器、迭代器

使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出,所以递归必须有一个明确的结束条件

高阶函数

python函数补充、生成器、迭代器

变量可以指向函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

python函数补充、生成器、迭代器

把abs作为参数传入sum

匿名函数

当我们在传入函数时,有些时候,不需要显式地定义函数,匿名函数就是不需要显式的指定函数。

python函数补充、生成器、迭代器

第一种函数换成匿名函数的定义方法

关键字lambda表示匿名函数,冒号前面的n表示函数参数。匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。

列表生成式

列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式

举个例子,要生成list[1,2,3,4,5,6,7,8,9]可以使用list(range(1,10))。

但如果要生成[1x1, 2x2, 3x3, ..., 10x10],可以使用循环,但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list

python函数补充、生成器、迭代器

生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量是有限的。所以,如果列表元素可以按照某种算法推算出来,在Python中,这种一边循环一边计算的机制,称为生成器:generator。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改为()

python函数补充、生成器、迭代器

生成器(generator)可以通过next()函数获取返回值,或者__next__()内置方法

python函数补充、生成器、迭代器

获取生成器元素的方法

generator保存的是算法,每次调用next(),就会获取下一个元素,直到计算到最后一个元素,没有更多的元素时

python函数补充、生成器、迭代器

StopIteration错误

我们创建了一个generator后,基本上永远不会调用next()而是通过for循环来迭代它,并且不需要关心StopIteration错误,因为generator也是可迭代对象。

python函数补充、生成器、迭代器

第二种方法

python函数补充、生成器、迭代器

这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator,generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

迭代器

可以直接作用于for循环的数据一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function,这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象

python函数补充、生成器、迭代器

而可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator