函数与模块
函数是能够某种特定功能的语句体集合,Python中存在大量的内置函数,调用以实现特定的功能,但是当这些内置函数不能实现我们想要的功能时,就需要自己定义函数实现,这种函数称为自定义函数。
自定义函数
自定义函数以def为标识,后跟函数名和参数列表,最后以return语句返回结果值,如果return语句缺省,则函数返回None值,格式如下:
def 函数名(参数列表)
函数体
[return 返回值]
最后一行调用myfun函数并输出结果,如果位于其他文件的语句需要调用这个自定义函数,则需要在文件开头使用语句 from function01 import myfun 或者 from function01 import * 导入该函数,即可调用此函数myfun。(function01为文件名)
默认参数
自定义函数可以使用默认参数,在自定义此方法时可以给出参数的默认值,在调用函数没给出参数的值时,会自动选择参数的默认值。
当调用myfun函数时给全参数则完整传入,否则a,b取默认值,只给一个参数,则相当于第一个参数。
原则:
1) 普通参数在前,默认参数在后,例如,def myfun(xx,a=3,b=4);否则会抛出异常
2) 调用函数时,未给出实参的默认参数取默认值,例如,myfun(30),a=30,b=4
3) 调用函数时,仅给出部分与默认参数对应的实参时,默认参数依次取得实参值
4) 调用函数时,给出指定默认参数的实参时,默认参数取指定的值,未给出或未指定实参的默认参数取默认值,例如myfun(b=10),a=3,b=10。
可变参数
自定义函数可以使用可变参数,也就是说,可以从形参传入数量可变的实参。
上述实例中,args为可变参数,可以接收若干个实参值,并将接收的值组装为一个元组。
关键字参数
可以给形参传入指定关键字和值的多组参数。
kwargs为关键字参数,可以接收多组键值对,并将他们组装成一个字典。
命名关键字参数
函数只接收指定关键字参数的值,其余值不接收
age和city为命名关键字参数,* 将必选参数与命名关键字参数分开。在调用此函数时传入命名关键字之外的参数会如上抛出异常。
参数组合规则
不同类型的参数进行组合时,参数出现的顺序必须按照必选参数,默认参数,可变参数,命名关键字参数和关键字参数的顺序出现;否则会出现错误。
命名关键字参数d前面为可变参数c因此d前面不能出现分割符* ,关键字参数e的实参由kv提供,不能直接给出。
实参与形参
调用函数时,如果实参使用常量,则对应形参将的到相应的常量的值,如果实参使用变量,则对应形参将引用实参变量,使得形参变量与实参变量共享相同的内存单元值,直到形参重新赋值或者改变简单类型形参值时,才能触发给形参创建独立的内存空间,保存新值的机制。
形参变量与实参变量的值与内存单元的地址完全一致,id()可以取得变量所在内存单元地址。
形参重新赋值或者改变形参值时,形参变量和实参变量所共享的相同内存单元变化实例。
myfun函数给形参x,z重新赋值,使得形参x,z不再与实参a,c共享内存单元,但对y追加元素改变了y的值,未能改变y与b共享内存单元的现状。
递归
递归就是函数可以直接或者间接调用自己
模块
使用python编程时不可避免会使用各种函数,为了对函数进行有效的管理。产生了模块的额概念。一个模块就是一个.py文件,其中包括一个或者多个函数,模块名就是.py不包含后缀的文件名。
这就是一个模块,其中包含三个函数
引入模块的方法通常有两种分别是“import 模块”和“from 模块 import 函数”使用“import 模块”时,会引入模块中的所有函数,调用函数时也需要加上模块名。
使用“from 模块 import 函数” 时,如果函数用* 表示,如“from module01 import * ”,会引入模块中所有的函数;如果指明函数“from module01 import myfun,myfun2”,会引入,module01中的函数myfun,myfun2,而myfun3不会被引入。用该方式引入的函数可直接调用。
如果位于不同函数块的函数具有相同的函数名使用“from 模块 import 函数”形式引入时,后引入模块中的函数才有效,因此如果不同的模块具有相同的函数名时,建议使用import 模块的形式引入。
由于模块就是.py文件,模块名也有可能相同,并且对模块通常需要分门别类的管理,因此产生了包的概念(Package)。一个包就是包含一个或者多个模块的一个文件夹,其中包含文件__init__.py,文件__init__.py 在包被引入时做初始化操作,文件__init__.py可以为空,包也呈倒树状的结构。
引入方法:
例如,module01位于example文件夹中,引入module01的方法为“import example.module01” 或者 “from example.module01 import *” 或者“from example import module01”
使用“import example.module01”引入,调用函数时需加上包名与模块名,如“example.module01.myfun(10,20)”
使用“from example import module01”引入,调用函数需要加模块名与函数名,不需要加包名,如“module01.myfun(10,20)”