关于生成器
生成器与迭代器的关系:1.生成器是一种特殊的迭代器(迭代器抽象层次更高);2.生成器具有迭代器的所有特性(惰性计算数据以节省内存;能够记录状态,并使用相关函数访问下一个状态;具备可迭代特性);3.迭代器创建比较复杂,生成器容易创建 生成器的创建:创建方式有两种,第一是创建表达式--将列表推导式中的[]改为()即可,即l=(num for num in range(1,9) if num % 2 == 0);第二是生成器函数--函数中包含yield语句,而该函数执行的结果就是一个生成器,需要注意的是,1.调用生成器函数时,函数不会有任何执行操作,只是创建了一个生成器而已,直到使用该生成器时,才会执行该函数的内容;2.函数中的yield语句能够起到阻断后续代码运行的作用,即函数执行到yield语句时,会返回其后的数据,然后就会停止函数执行,直到访问下一状态时,两个状态中间的代码才会被执行 生成器的遍历:遍历方式有三种,第一是使用next()函数,第二是使用__next__()方法访问,第三是使用for in循环遍历,需要注意的是,在生成器函数中,使用前两者时不能得到最后一个状态之后的执行内容,可以继续访问下一个状态来获取执行内容,但会报错,因为没有下一个状态,而使用for in则可以得到函数中所有代码执行的结果 生成器的send()方法和close()方法:send()中有一个参数,指上一次挂起的yield语句的返回值,即在生成器函数中,函数执行到一个yield语句时,就会停止执行,从而将函数在此处挂起,直到访问下一个状态时继续执行。yield语句返回值是None,如果使用send()方法,则可以给其传递一个返回值,这里需要注意的是,send()方法跟__next__()方法一样,也可以直接启动生成器函数,但第一次使用send()时,其参数一定是None,即不传值。close()方法即关闭生成器,在生成器函数中任何位置都可以使用,程序执行到此就会停止,如果继续会报错 注意事项:1.执行生成器函数时,只要碰到return语句就会立即停止;2.与迭代器一样,一个生成器只能遍历使用一次
关于递归函数
递归函数包含传递和回归两个部分,缺一不可。并且在写递归函数时的原则是,知道确定的值则直接返回,不知道确切的值则分解往下传递 如下是阶乘函数代码:
def jc(n):
if n == 1:
return 1
else:
return n * jc(n - 1)
print(jc(5))
关于作用域(重点)
python中作用域分为四个,即LEGB,分别指local函数内的命名空间、enclosing function locals外部嵌套函数的命名空间、globle全局命名空间、builtin内建模块命名空间 命名空间的查找顺序是由内而外按照LEGB顺序,这里的由内是指自己所在的命名空间,不会去找比自己更小的空间,只会往外找,例如函数内的变量在函数外不能访问 如果在小的命名空间中想改变大的命名空间中变量值,需要使用nonlocal(只适用于闭包)和globle(适用于在函数中修改全局变量)语句,查看所有全局变量和局不变量可以分别使用globles()和local()函数 关于命名空间需要注意的是,在python中没有if和while这两种命名空间,即写在if语句和while语句中的资源,外界是可以使用的,这不同于函数等其他命名空间(重点)