8.16 使用自己开发的模块

python模块主要就是使用其中的函数,尤其是自定义函数。函数的好处是可以反复调用,当多个函数组合在一起就构成了一个模块,多个模块就可以构成一个python库。所以,学习python自定义函数是开发模块的基础。

1 自定义函数

在python中自定义函数使用def关键字,然后函数名,函数名最好不要不系统关键字重复,会造成不必要的干扰。然后是选项参数,选项也叫作实参(argument),参数为形参(parameter)。参数可以设置默认值。接下来是冒号。

接下来是一段文档字符串,这段不是必须的,但最好加上用来说明函数的作用,可以通过”.doc”方法来获取。然后就是函数体,里面可以包含各种计算,包括读写文件和循环判断语句。

最后是一个返回值,函数一般都是处理数据,处理结束之后要有返回值。python函数返回值通过return函数输出。python自定义函数的结构如下所示:

# 自定义函数
# def关键字定义函数名add_total,里面包含两个参数x,y;
def add_total(x,y):
    # 一段文档字符串
    """ add x and y, return total number """
    # function statement
    total= x+y
    # returen final value
    return(total)
# run function
print(add_total(1, 2))

2 实参和形参

函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多:既可以使用位置实参,这要求实参的顺序与形参的顺序相同;也可以使用关键字实参,其中每个实参都由变量名和值组成;还可以使用列表和字典。

# 位置实参
def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

print(describe_pet('hamster','harry'))

关键字实参是传递给函数的名值对(name-value pair)。这样会直接在实参中将名称和值关联

起来,因此向函数传递实时就不会混淆了。关键字实参不仅让你无须考虑函数调用中的实参顺序,而清楚地指出了函数调用中各个值的用途。

# 关键字实参
def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

print(describe_pet(animal_type='hamster', pet_name='harry'))

在编写函数时,也可以给每个形参指定默认值。

# 关键字实参
def describe_pet(pet_name, animal_type = 'dog', ):
    """显示宠物的信息"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

print(describe_pet(pet_name='hamster'))

3 自定义函数箭头

在最新版本的python代码中,经常可以看到自定义函数后多了一个箭头指示。这是函数注释的一部分,表示函数返回值的类型,有个专门的名词叫 type hint, 即类型提示。

可以通过函数的 “.annotations “查看。

# 指定数据类型
def add(a:int, b:int) -> int:
  return a+b

4 main()函数

一些编程语言将main函数作为程序的执行入口,比如C/C++、C#、Java、Go、Rust等等。python中main函数并不是必须的。在pycharm创建项目时main函数也是可选的。在运行python程序之前,Python 解释器将 python 模块的名称分配给一个名为__name__. 根据您是通过命令行执行程序还是将模块导入另一个模块,分配__name__将有所不同。

也就是当开发一个项目是,可以通过main函数来调用和管理不同的子程序。

5 导入模块

python的模块就是一个文件,导入模块直接导入文件名即可,不要加py扩展名,如果主程序与模块在同一目录下,可以直接导入。这是因为当前目录在sys.path的列表中优先级最高。导入之后就可以直接调用模块中的函数。

#从当前目录下导入pizza文件
import pizza as p
print(p.make_pizza(16, 'peperoni'))

如果模块不在当前目录下,则需要将模块所在目录添加到sys.path中。

# 建模块所在目录添加到python模块路径中
sys.path.append(r'C:\Users\genome\Desktop\pythonmodule')