函数(2)
特殊变量
Python解释器提供了一些以两个下划线开头和结尾命名的变量,它们具有特别意义,比如_doc_ (获得文件里面的注释内容) _file_ ,表示当前脚本路径等,这也是为什么文件命名要尽量避免以两个下划线开头和结尾
递归函数(Recursive Function)
自己调用自己的函数,编写递归函数要重点把握两点:递推关系和递归结束条件
每次调用函数都需要分配一块栈区空间,用于储存函数的参数以及内部定义的局部变量等数据,在函数执行结束返回后,它对应的栈区空间会被释放(归还给系统),里面的数据将不复存在,如果不停地调用函数,并且函数都没有返回,那么栈区空间迟早会被耗尽,导致无法继续调用函数
递归思想在解决某些复杂问题时可能会意想不到的简单!
def f():
f()
f()
递归调用的深度不能太深,函数调用会耗费时间和内存空间,函数里的参数和变量存在栈区空间,还会存放函数执行的位置,而区栈空间是有限的,一般只有两兆的空间 ,所以此函数调用会失败
匿名函数(Lambda)
Lambda表达式,主要用于Python函数式编程中,或临时使用函数的场合,我们不想费神去定义一个函数名,使用lambda关键字定义
模块(Module)和包(Package)
模块就是Python源文件,可以直接运行,也可以被导入其他模块(使用import关键字,以调用它里面定义的全局变量、函数、类等,并能解决变量、函数和类的命名冲突问题 不同模块中可以冲突)
包就是存放若干个模块的文件夹,可以解决模块的命名冲突问题(在不同包中的模块可以同名),为了和普通文件夹有所区别,标准的做法是在包下面创建一个__init__.py文件,这个文件夹可以为空
注意import和from...import的用法区别
import Module # 引入模块
from Module import Other # 引入模块中的类、函数或者变量
from Module import * # 引入模块中的所有‘公开’成员
PS:当有一个包名为pname时,其内部 .py 文件的模块名就是 pname. 也就是说模块名中包含了 Package包 这个概念。
其区别就是:
第一个:引入的模块(假如是 mdemo )会自动生成一个‘对象‘以模块名命名,然后就可以通过这 个‘对象’(mdemo)获取该模块里面的类、函数或变量等..
第二个:引入模块中的Other(这里的Other就是模块中定义的成员)成员, 调用时就可以省略 模块名。
第三个:这种情况如果上面的第二个弄懂的话就不难理解了, 其意思就是引入模块中所有'公开'的成员。
标准库(不需要下载,直接可以使用)和第三方库
第三方库在使用时需要先下载,通常使用pip这个包管理器,其常用用法如下:
安装第三方库: pip install 包名 [-i https://pypi.douban.com/simple]
卸载第三方库:pip uninstall 包名
显示所有已安装的包:pip list
扩展
1.哲学:存在即合理
2.tuple的访问效率比list快一些,能用tuple的地方就不用list
3.tuple和list里面可以为任意数据类型
4.函数调用的变量一般使用两个即可,如果非要使用则顺序为:未知,默认,可变,命名,关键字
作业
1.解决汉诺塔问题
2.解决八皇后问题
3.实现一个二维码生成器
调用各种模块