模块与函数
- python的程序由包(package)、模块(module)和函数组成。模块是处理某一类问题的集合,模块由函数和类组成,而包是由一系列模块组成的集合。
- python自带的工具包和模块均安装在python的安装目录下的Lib子目录中。所有的包必须包含一个__init__.py文件,可以为空,用于识别当前文件夹是个包。每个python文件就是一个模块。当python导入一个模块时(使用import语句导入),首先查找当前路径,然后查找lib目录、site-package目录和环境变量pythonpath设置的目录。可以通过sys.path语句搜索模块的查找路径。
- 导入模块后,调用模块的函数或类时,需要以模块名作为前缀,以下三种方式导入模块:
import module_name #直接导入
module_name.func() # 调用函数时,需要模块名作为前缀
from module_name import function_name # 不用使用模块名作为前缀
from module_name import * # 导入模块下的所有函数和类
注:python的import语句可以置于程序中的任意位置,甚至可以置于条件语句中。
- 模块有一些内置属性,用于完成特定的任务,如__name__,用于判断当前模块是否是程序的入口,如果当前程序正被使用,__name__ 值为“__main__”。
- python提供了一个内联模块,buildin。内联模块定义了一些开发中经常用到的函数,利用这些函数可以实现数据类型的转换、数据的计算、序列的处理等。常用的内置模块的函数如下:
内置模块函数 | 函数的作用描述 |
---|---|
abs(x) | 返回x的绝对值 |
bool([x]) | 把一个值或表达式转换为bool类型,若表达式x为值,返回True,否则返回false |
float() | 把数字或是字符串转换为float类型 |
hash() | 返回一个对象的hash值 |
help() | 返回内置函数的帮助说明 |
id() | 返回一个对象的标识 |
input() | 接受控制台的输入 |
int() | 把数字或是字符串转化为整型 |
len() | 返回对象包含的元素个数 |
range() | 生成一个列表并返回 |
reduce() | 对序列的值进行累计计算 |
round() | 四舍五入函数 |
sorted() | 返回一个排序后的列表 |
sum() | 返回一个序列的和 |
type() | 返回一个对象的类型 |
zip() | 把n个序列作为列表的元素返回 |
- python中的包和java包的作用是相同的,都是为了实现程序的重复使用,把实现一个常用功能的代码组合到一个包中,调用包提供的服务从而实现代码重用。而函数就是一段可以重复多次调用的代码,通过输入的参数,返回需要的结果。
- 函数的定义非常简单,使用关键字def定义,函数在使用前必须定义,函数的类型即是返回值的类型,在调用函数时,实际参数必须与形式参数一一对应,否则会出现错误计算,具有默认值的参数除外。如下:
def 函数名(参数1,参数2,...): #注意冒号不可缺少
...
... # 注意缩进
return 表达式
- python中的参数传递只支持引用传递,python通过名称绑定的机制将实际参数与形式参数的名称绑定在一起,即把形式参数传递到函数所在的局部命名空间中,形式参数和实际参数指向内存中的同一个存储空间。
- 在实际应用中,经常需要传递可变长度的参数,在函数参数前使用标识符‘*’可以实现。python还提供了另一个标识符‘**’,在形式参数前添加‘**’,可以引用一个字典,根据实际参数的赋值表达式生成字典。在定义函数时,‘*’必须写在‘**’的前面,这是语法规定。
- 对于C,java等高级语言,如果函数主体没有使用return语句返回,而在赋值语句中调用函数,程序编译时会出错,python没有这个限制,即使函数没有返回值,仍然可以获得返回值。没有return语句的函数返回None,None是python中的对象,不属于数字也不属于字符串,当return语句不带任何表达式时,返回的结果也是None。
- 函数的嵌套是指在函数的内部调用其他函数,C,C++只允许在函数内部嵌套,而python不仅支持在函数体内嵌套,也支持在函数定义的嵌套。一般函数的嵌套控制在3层以内最好。
- 递归函数可以再函数主体内直接或是间接的调用自己,即函数的嵌套是函数本身,递归的过程分为两个阶段:递推和回归,第一阶段,递归函数在内部调用自己,每一次调用又重新开始执行此函数的代码,直至递归结束。第二阶段,递归函数从后往前返回,递归函数从最后一级开始返回,一直到第一次调用的函数体内。递归函数需要注意递归结束的条件。每次调用递归函数都会复制函数中的所有变量,在执行递归函数,程序需要较多的存储空间,会影响程序的性能。
- lambda函数的格式如下,变量用于表达式的计算,lambda属于函数,所以变量后面需要使用冒号,此外,lambda中只能使用表达式,不能使用判断,循环等多重语句。
lambda 变量1,变量2,... : 表达式 # 定义lambda函数的格式
# 使用示例
def func():
x,y,m,n = (1,2,3,4)
sum = lambda x,y : x+y
sub = lambda m,n : m-n
return sum(x,y)*sub(m,n)
- Generator函数的定义和普通函数定义没什么区别,只要在函数体内使用yield生成数据项即可,Generator函数可以被for循环遍历,而且可以通过next()方法获得yield生成的数据项。注意yield关键字和return关键字的返回值和执行原理都不相同,yield生成值并不会中断程序的执行,返回值后程序继续往后执行,return返回值后,程序将终止执行。
def func(): # 普通函数,return
for i in range(n):
return i
def func2(): # Generator函数,yield
for i in range(n):
yield i
print(func(3)) # 此时只会打印0
f = func2(3)
print(f) # 返回函数func2()的地址
print(f.next()) # 返回0
- Generator函数可以返回元素的值,序列也可以,但是二者之间的差别很大,Generator函数一次只能返回一个数据项,占用更少的内存,数据的访问是通过next()实现的,而序列一次返回所有的数据项,元素的访问是通过索引实现的.