python的程序由包(package)、模块(module)和函数组成。模块是处理某一类问题的集合,模块由函数和类组成。包是由一系列模块组成的集合。下图描述了包、模块、类和函数之间的关系。
包就是一个完成特定任务的工具箱,Python提供了许多有用的工具包,如字符串处理、图形用户接口等,使用这些自带的工具包,可以提高程序员的开发效率,减少编程的复杂度,达到代码复用的效果。
这些自带的工具包和模块安装在Python的安装目录下的lib目录中。如下图所示:
除了自带的工具包和模块,还有第三方工具包和模块都存放在了site-packages的目录中。
一、模块
模块是Python中重要的概念,Python程序是由一个个模块组成的,一个python文件就是一个python模块。
1.1 模块的创建
模块把一组组相关的函数或代码组织到一个文件中,一个文件就是一个模块。模块由代码、函数或类组成。创建一个名为myModule.py的文件,即定义了一个名为myModule的模块。在myModule模块中定义一个函数func()和一个类MyClass。MyClass类中定义一个方法myFunc()。
# 自定义模块def func() print("MyModule.func()")class MyClass: def myFunc(self): print("MyNodule.MyClass.myFunc()")
然后在myModule.py所在目录下创建一个call_myModule.py的文件。在该文件中调用myModule模块的类和函数。
# 调用自定义模块的类和函数import myModule # 导入modulemyModule.func()myClass = myModule.MyClass()myClass.myFunc()
1.2 模块的导入
在使用有个模块的函数或类之前,首先要导入该模块。模块的导入使用import语句,模块的导入语句的格式如下所示:
import module_name
这条语句可以直接导入一个模块。调用模块的函数或者类时,需要以模块名作为前缀,其格式如下所示:
module_name.func()
如果不想在程序中使用前缀,可以使用from...import...语句导入。from...import...语句的格式如下所示:
from module_name import func_name # 仅导入模块func_name from module_name import * # 导入该模块下所有的函数
1.3 模块的属性
模块有一些内置属性,用于完成特定的任务,如__name__、__doc__。每一个模块都有一个名称,例如__name__用于判断当前模块是否是程序的入口,如果当前程序正在被使用,__name__的值为“__main__”,通常每个模块都添加一个条件语句,用于单独测试该模块的功能。
例如创建一个模块myModule
if __name__ == '__mian__': print('myModule作为主程序运行')else: print('myModule被另一个模块调用')
单独运行模块myModule时,输出结果如下:
myModule作为主程序运行
创建另外一个模块call_myModule。这个模块导入myModule
import myModuleprint(__doc__)
运行call_myModule时,输出结果:
myModule被另一个模块调用
1.4 模块的内置函数
filter()
对某个序列做过滤处理,判断自定义函数的参数返回结果是否为真,并一次性返回处理结果。
演示代码如下:
def func(x): if x > 0: return xlst = filter(func, range(-9, 10))print(lst)打印结果是一个可迭代对象:0x7f4bd3afa128>print(list(lst))打印结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]
reduce()
对序列中的元素做连续操作,演示代码如下:
def sum(x, y): return x + yfrom functools import reduceprint(reduce(sum, range(0,10)))执行累加计算0+1+2+3+4+5+6+7+8+9返回打印结果:45print(reduce(sum, range(0,10), 10))执行累加计算10+0+1+2+3+4+5+6+7+8+9返回打印结果:55
abs()
abs(x)返回x的绝对值
bool()
bool(x)返回x的布尔值,true或者false
int()
int(x)将字符串类型的数据或者数字转换成整形
float()
float(x)将字符串类型的数据或者数字转换成浮点型
hash()
hash(x)返回一个对象的hash值
input()
接收控制台的输入,并把输入的值转换为数字
eval()
将字符串转成表达式并执行,该方法虽然好用,但是不安全,因为可以利用该函数执行系统命令,删除文件等操作。
help()
帮助说明
len()
返回对象包含的元素个数
range()
返回一个列表
round()
四舍五入函数
set()
返回一个set集合
sum()
返回一个序列的和
type()
返回一个对象的类型
zip()
把n个序列作为列表的元素返回
二、函数
函数的定义非常简单,使用关键字def定义。函数在使用前必须定义,函数的类型即返回值的类型。python函数定义格式如下所示:
def 函数名(参数1,参数2...): ... return 表达式
函数名可以是字母、数字或者下划线组成的字符串,但是不能以数字开头。函数的参数放在一对圆括号中,参数的个数可以有一个或者多个,参数之间以逗号分隔,这种参数称为形式参数,括号后面以冒号结束,冒号下面就是函数的主体。
递归函数
递归函数可以在函数主体内直接或者间接的调用自己,即函数的嵌套是函数本身。递归是一种程序设计方法,使用递归可以减少重复的代码,使程序变的简洁。
下面这段代码用递归实现了阶乘的计算过程。
# 计算阶乘def refunc(n): if n==0 or n==1: return 1 else: return n*refunc(n-1)print(refunc(5))打印返回结果:1*2*3*4*5=120
lambda函数
lambda函数用于创建一个匿名函数,函数名未和标识符进行绑定。使用lambda函数可以返回一些简单的运算结果,lambda函数的格式如下所示:
lambda 变量1 变量2 ... :表达式
其中变量列表用于表达式的计算,lambda属于函数,因此变量列表后需要一个冒号。通常把lambda赋值给一个变量,变量就可以当做函数使用,例如:
func = lambda x : x*xprint(func(10))返回打印结果: 100######################func = lambda x, y : x + yprint(func(10, 20))返回打印结果: 30
习题:如何用一行代码实现将列表lst = [2.3, 4.5, 1.6, 7.9, 1.0, 2.7]根据小数点后面的一位数从小到大排序?
思考一分钟,答案见下文:
print(sorted(lst, key=lambda x: str(x).split(".")[-1]))