目录

模块

创建模块

导入模块

模块的属性

python在哪查找模块

函数

 函数的定义和调用

函数的参数

 有默认值的参数

传递任意数量的参数

变量域的作用 

使用lambda声明函数


 

Python程序由包(package)、模块(module)、和函数组成。模块是处理某一类问题的集合,模块由函数和类组成。包是由一系列模块组成的集合。

模块

Python的程序是由一个个模块组成的,一个python文件就是一个模块。python模块其实就是包含函数或者类的python脚本。将不同功能的代码放入不同的脚本中,细化其功能,在其他的脚本中以模块的形式去使用细化的功能,对脚本的维护和重用由很大的好处。

创建模块

 模块把一组相关的函数或代码组织到一个文件中。一个文件就是一个模块。

现在我创建一个名为mymodule.py的文件,就是定义了一个名为mymodule的模块。并且在模块中定义一个函数和一个类,在类中定义一个方法。 

# -*- codeing = utf-8 -*-
# @Time : 2022/10/23 19:32
# @Author : 可乐不加糖
# @File : mymodule.py
# @Software: PyCharm
# 定义一个名为mymodule的模块
# 在模块中定义一个名为fun()的函数
def func():
    print("mymodule.func()")
# 在模块中定义一个类
class Mymodule:
# 在类中定义一个名为Func()的方法
    def Func(self):
        print("myclass_mymodule.func()")

现在我创建一个文件去调用刚才创建的模块中的函数和类。

# -*- codeing = utf-8 -*-
# @Time : 2022/10/23 19:34
# @Author : 可乐不加糖
# @File : call_mymodule.py
# @Software: PyCharm
import mymodule # 导入刚才创建的模块
# 调用模块中的函数  这里需要加前缀mymodule,否则python找不到fun()所在的命名空间
mymodule.func()
# 创建类Mymodule的实例a  这里也需要加前缀mymodule调用类
a = mymodule.Mymodule()
# 调用类中的方法
a.Func()

注意:mymodule.py和call_mymodule.py必须放在同一个目录下,或者放在sys.path所列的目录下,否则python解释器找不到自定义模块。 

导入模块

导入模块用import语句,格式如下:

import 模块名

这条语句会导入一个模块,你可以调用模块中的函数和方法,前提是每次调用都必须由模块作为前缀。

如果你不想写前缀,可以使用import 模块名 from *,这条语句直接导入模块下所有的函数和类。

import 模块名 as 新的模块名

同一个文件支持导入多个模块,并且可以把import语句至于代码的任何位置,甚至放到条件语句中。

# -*- codeing = utf-8 -*-
# @Time : 2022/10/23 19:32
# @Author : 可乐不加糖
# @File : mymodule.py
# @Software: PyCharm
def func():
    print("mymodule.func()")

class Mymodule:
    def Func(self):
        print("myclass_mymodule.func()")

count = 0
def add():
    global count
    count = count + 1
    return count
# 第二次导入mymodule模块
import mymodule
print("count=", mymodule.add())
# 给模块mymodule的变量赋值
mymodule.count = 10
print("count=", mymodule.count)
# 第三次导入
import mymodule
print("count=", mymodule.add())

# 将import放到条件语句中
if mymodule.count > 1:
    mymodule.count = 0
else:
    import mymodule
print("count=", mymodule.count)

# 将import放到条件语句中
if mymodule.count > 1:
    mymodule.count = 10
else:
    import mymodule
print("count=", mymodule.count)

模块的属性

模块中有一些内置属性,用于完成特定的任务。如__name__、__doc__。

__doc__通常会输出指定对象中的注释部分。 代码如下:

# -*- codeing = utf-8 -*-
# @Time : 2022/10/23 20:30
# @Author : 可乐不加糖
# @File : module_shuxing.py
# @Software: PyCharm

class Myclass:
    '''
    这是一个注释
    '''
    def test(self):
        '''
        这也是一个注释
        '''
        x = 5
x = Myclass()
print(x.__doc__)
print(x.test.__doc__)

python 函数模块类的关系 python模块和函数的区别_python 函数模块类的关系

运行结果如上所示,输出结果都是注释内容,print(x.__doc__)输出的是Myclass类中的注释,print(x.test.__doc__)输出的是test(self)函数中的注释内容。

__name__用于判断当前模块是不是程序的入口,如果直接运行当前模块,__name__的值是__main__,而在其他文件导入.py运行时__name__的值就是文件名 。

因此,__name__的作用就是,判断模块时直接运行还是被导入其他文件运行。

# -*- codeing = utf-8 -*-
# @Time : 2022/10/23 20:30
# @Author : 可乐不加糖
# @File : module_shuxing.py
# @Software: PyCharm

if __name__ == '__main__':
    print('主程序')
    print(__name__)
else:
    print('no')
    print(__name__)

python 函数模块类的关系 python模块和函数的区别_pycharm_02

import module_shuxing

python 函数模块类的关系 python模块和函数的区别_pycharm_03

python在哪查找模块

python只能导入可以找到的模块。由于上面编写的模块和调用模块的脚本在同一目录下,因此不需要任何设置或者操作就能被python找到并且导入。 

如果编写好的模块和调用模块的脚本不在同一个目录下,会怎样呢?

python 函数模块类的关系 python模块和函数的区别_作用域_04

模块未找到错误:没有名字为module_shuxing"的模块。也就是说python没有找到module_shuxing模块。那么python是怎样查找模块的呢?我明明写了这个模块,他为什么找不到呢?

 其实,当我们导入模块是,python首先在当前目录中查找模块,如果没找到,python解释器就会从sys模块中path变量指定的目录查找模块,如果还没有找到,就会输出出错信息。

 因为我将调用模块的脚本放在了其他目录下。下面是sys.path输出的python模块查找路径:

python 函数模块类的关系 python模块和函数的区别_作用域_05

不难发现,python模块查找路径中并没有那个目录,因此他是找不到的。

那么,怎样让他可以找的到呢?一种方法就是将模块和调用模块的脚本放在同一个目录下,另外一种方法就是在脚本中向sys.path变量添加模块查找路径。 

上面sys.path 有问题

在java中,通过包将不同的类组织到到一起,实现程序的重用。类似的,python也提供了包的功能,可以使用包来管理多个模块。包其实可以看作是处于同一个目录的模块。

包的每一个目录中都必须有一个“__init__.py”的文件,它可以是一个空文件,仅用于表明该目录是一个包。

python 函数模块类的关系 python模块和函数的区别_开发语言_06

python 函数模块类的关系 python模块和函数的区别_python_07

函数

函数是一组语句的集合,可重复使用的,用来实现特定功能的代码段。 比如说len()函数,可以随时使用它来统计长度,这是为什么呢?因为它是python官方提前写好的函数,可以重复使用,用来实现统计长度这一特定功能的代码段。

函数是为了得到一个针对特定需求、可供重复利用的代码段,提高程序的复用性,减少重复性代码,提高开发效率。

 函数的定义和调用

def 函数名(参数):
    函数体
    return 返回值
# 参数和返回值不是必须的

函数一定要先定义,后调用。参数和返回值都不是必须的,可以省略。

# -*- codeing = utf-8 -*-
# @Time : 2022/10/27 19:33
# @Author : 可乐不加糖
# @File : def_hanshu.py
# @Software: PyCharm
# 定义一个函数
def my_len(x):
    count =0
    for i in x:
        count += 1
    print(count)
list_1 = [1, 2, 3, 4, 4]
# 调用函数
my_len(list_1)

上述代码只声明了一个函数my_len(),并没有指定参数的类型。在python中,声明一个函数,不需要声明函数的类型,也不需要声明参数的类型。

函数的参数

 有默认值的参数

在python中,可以在声明函数时,给参数设置一个默认值。当我们调用函数时,如果没有传递参数,函数就会使用声明函数时的默认值。

def hanshu(x = 2):
   a = x ** 2
   return a
print(hanshu())# 当没有传递参数时,使用默认值
print(hanshu(3))

如果一个函数有多个参数并且都有默认值,在调用函数时,只想给最后一个参数传递值,怎么办呢?

第一种方法:

def add_a(x=None, y=None, z=None):
    if x == None: # 判断x的值是否为None,如果是,就给x赋值1
        x = 1
    if y == None: # 判断y的值是否为None,如果是,就给x赋值2
        y = 2
    if z == None: # 判断z的值是否为None,如果是,就给x赋值3
        z = 3
    return x + y +z
print(add_a())
print(add_a( None, None, 0))

第二种方法:按参数名传递值

def add_a(x, y, z):
    return x + y +z

print(add_a(x=1, z=3, y=2))

按参数名传递参数的方式在调用函数时,要在调用函数名后面的括号里面为函数的所有参数赋值,赋值的顺序可以与定义函数时的参数顺序不同。

顺序传递参数和按参数名传递参数可以同时使用,但是顺序传递参数必须在按参数名传递参数之前,而且不能有重复的情况,不然会报错。

def add_a(x, y, z):
    return x + y +z

print(add_a(1, z=3, y=2))

传递任意数量的参数

在python中,函数可以具有任意数量的参数,并且不必在声明函数时对所有的参数进行定义。声明函数时,在参数名前加一个星号,则表示该参数是一个可变长参数。可变长参数的函数,在使用时,其所有参数都保存在一个元组里,在函数中可以使用for循环处理。

# -*- codeing = utf-8 -*-
# @Time : 2022/10/27 19:33
# @Author : 可乐不加糖
# @File : def_hanshu.py
# @Software: PyCharm
def list_1(*list):
    list_a = []
    for i in list:
        list_a.append(i) 
    return list_a
list_aa = [1, 2, 3, 4, 5]
list_aaa = [6, 7, 8, 9, 10]
list_aaaa = [11, 12, 13, 14, 15]
list_aaaaa = ['q']
print(list_1(list_aa, list_aaa))
print(list_1(list_aa,list_aaa,list_aaaaa,list_aaaa))

变量域的作用 

 在python中,作用域分为内置作用域、全局作用域和局部作用域。内置作用域是python预先定义的,全局作用域是编写的整个脚本,局部作用域是某个函数的内部范围。局部作用域内变量的改变不会影响全局作用域内的变量,除非通过引用的形式传递参数。

如果要在函数中使用函数外的变量,需要在变量名前使用global关键字。

def jj(x):
    global a # 使用global关键字声明全局变量
    return a + x
a = 5
print(jj(2))
a = 0
print(jj(2))

使用lambda声明函数

lambda是LISP语言,使用lambda可以声明一个匿名函数,所谓匿名函数就是指所声明的函数没有函数名。lambda表达式就是一个简单的函数,使用lambda声明的函数可以返回一个值,在调用函数时直接使用lambda表达式的返回值。

# -*- codeing = utf-8 -*-
# @Time : 2022/10/27 19:33
# @Author : 可乐不加糖
# @File : def_hanshu.py
# @Software: PyCharm
fun=lambda x: x * x
print(fun(3))
print(fun) # fun实际指向lambda定义的函数地址

python 函数模块类的关系 python模块和函数的区别_作用域_08

 

lambda适用于定义小型函数。使用lambda定义的函数,在函数中仅能包含单一的参数表达式,不能包含其他的语句。在lambda中也可以调用其他的函数。不能在lambda中使用print语句。

# -*- codeing = utf-8 -*-
# @Time : 2022/10/27 19:33
# @Author : 可乐不加糖
# @File : def_hanshu.py
# @Software: PyCharm
def show(): #定义一个show函数
    print("lambda")
a = lambda : show() # 在lambda中调用show函数
print(a())