Python 基础学习笔记 3 —— 函数、模块、包的简单用法


一、函数

1.1 无参函数用法举例

定义一个名为 hello_func 的函数,用于打印出 Hello Funcion! ,然后调用它。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

#函数的定义
def hello_func():
    print("Hello Funcion!")

#函数的调用
hello_func()

运行结果

Hello Funcion!

1.2 含参函数用法举例

定义一个名为 jianfa 的函数,用于计算两个数的差。然后让用户输入任意的两个数来进行计算(请留意下 input() 函数的用法)。

用法 1
函数执行完成后,不返回参数。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

#函数的定义
def jianfa(a,b):    #定义形参
    c=a-b           #进行减法计算
    print("a-b={}-{}={}".format(a,b,c)) #直接在函数体内打印计算结果

#为a、b赋值
a=int(input("Please input a value of a: ")) #在Python3中,需要强制将输入的数据转换为整型
b=int(input("Please input a value of b: "))

#函数的调用
jianfa(a,b) #向函数内传递参数

用法 2
函数执行完成后,返回参数。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

#函数的定义
def jianfa(a,b):    #定义形参
    return a-b      #向外部返回计算结果

#为a、b赋值
a=int(input("Please input a value of a: "))
b=int(input("Please input a value of b: "))

#函数的调用
c=jianfa(a,b)   #c的值是函数的返回值
print("a-b={}-{}={}".format(a,b,c)) #打印计算结果

运行结果

Please input a value of a: 10   #输入10回车
Please input a value of b: 3    #输入3回车
a-b=10-3=7

1.3 变量的作用域

1.3.1 局部变量和全局变量

执行以下程序,看在函数体内定义或修改的变量值在函数体外能否生效。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

def mod_a():
    a=30
    b=20
    print("正在执行函数")
    print("在函数体内修改a的值为:{}".format(a))
    print("在函数体内定义b的值为:{}".format(b))
    print("函数执行完毕")
a=10
print("执行函数之前,a的值为:{}".format(a))
mod_a()
print("执行函数之后,a的值为:{}".format(a))
print("执行函数之后,b的值为:{}".format(b))

运行结果

执行函数之前,a的值为:10
正在执行函数
在函数体内修改a的值为:30
在函数体内定义b的值为:20
函数执行完毕
执行函数之后,a的值为:10
...
NameError: name 'b' is not defined

很显然,在函数体内定义或修改的变量只能在函数体内生效。我们可以将其称之为局部变量

在函数体外定义的变量可以在整个程序中生效。我们可以将其称之为全局变量

1.3.2 局部变量转全局变量

如果我们想让函数体内的变量在函数体外也能生效,我们可以在局部变量定义之前用 global 语句来把函数体内的局部变量转换为全局变量。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

def mod_a():
    a=30
    global b        #把b转换为全局变量
    b=20
    print("正在执行函数")
    print("在函数体内修改a的值为:{}".format(a))
    print("在函数体内定义b的值为:{}".format(b))
    print("函数执行完毕")
a=10
print("执行函数之前,a的值为:{}".format(a))
mod_a()
print("执行函数之后,a的值为:{}".format(a))
print("执行函数之后,b的值为:{}".format(b))

运行结果

执行函数之前,a的值为:10
正在执行函数
在函数体内修改a的值为:30
在函数体内定义b的值为:20
函数执行完毕
执行函数之后,a的值为:10
执行函数之后,b的值为:20

1.4 空函数

如果需要定义一个空函数,我们只需要在函数体内加入 pass 语句即可。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

def empty_a():
    pass

二、模块

2.1 模块的定义

模块就是把各种常用的函数、变量、类等封装成一个文件,需要时直接指定这个文件然后调用里面的函数以及变量即可。

模块化是 Python 的优点之一。除了系统自带的模块之外,用户可以随意地添加第三方模块,也可以自己编写一个模块。

2.2 使用一个模块

2.2.1 导入整个模块用法举例

下面我们要在 Python 中运行 shell 命令,然后打印出 shell 命令的返回值。我们需要导入系统自带的 subprocess 模块,然后使用里面的 call() 函数。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import subprocess #导入整个模块

subprocess.call('echo test',shell=True) #调用模块内的函数,格式为:模块名.函数名(函数参数)

也可以使用以下方法,但是不推荐。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from subprocess import * #导入整个模块内除双下划线开头的函数以及变量,该语句一般在一个程序内只能使用一次,而且容易造成名称冲突,所以不推荐使用

call('echo test',shell=True)    #直接使用函数名来调用模块中的函数,不用指定模块名

运行结果

0   #shell命令执行成功

2.2.2 导入模块中的一部分用法举例

同样的,下面我们要在 Python 中运行 shell 命令,然后打印出 shell 命令的返回值。这次我们直接指定导入系统自带的 subprocess 模块中的 call() 函数。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from subprocess import call #从 subprocess 模块中单独导入 call() 函数,这里函数名或者变量名后面不用加括号

call('echo test',shell=True)    #直接使用函数名来调用模块中的函数,不用指定模块名

运行结果

0   #shell命令执行成功

2.3 使用 pip 安装第三方模块

我们可以使用 Python 自带的包管理器 pip 就可以从指定源上下载第三方模块了,而且模块之间的依赖关系也会自动解决,非常方便!

命令用法

pip install <模块名>

用法举例

安装 html 模块

pip install html

执行完以上命令之后,稍等一会模块就安装好了。

Collecting html
 Downloading html-1.16.tar.gz
Building wheels for collected packages: html
 Running setup.py bdist_wheel for html ... done
 Stored in directory: /Users/zenandidi/Library/Caches/pip/wheels/3d/ef/10/e6a6f5cb45503eb9760788fc13d7f4c387d7cb8d6abc515b50
Successfully built html
Installing collected packages: html
Successfully installed html-1.16

2.4 模块存放的位置

Python 模块通常存放在固定的几个位置中。而这些位置由 sys.path 变量指定。

当需要导入一个模块时,Python 解释器会在这几个固定的位置中搜索指定名字的模块文件,然后导入它。

下面通过一个简单的程序来看一下模块可以存放的位置。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import sys

sys.path

运行结果

['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']

返回一个数组,数组里面的这些路径都可以存放模块。

请注意一下数组上面的第一个元素 '' ,这里表示当前启动 IDLE 时系统所在路径。

就比如说您是在 ~ 中启动的 IDLE ,自己写的 .py 文件就可以直接放到 ~ 下面直接调用。

2.5 自定义模块

自定义模块就是把自己写的代码保存为一个 .py 文件,然后把它放在 sys.path 中的任意一个路径中,然后就可以导入使用了。

请注意一下,导入自定义模块的时候模块名不能加入 .py 后缀。

用法举例

假设当前 IDLE 是在 ~ 中启动的。我们创建一个名为 mod_test 的模块,模块内容如下:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

# 模块文件位置:~/mod_test.py

def f1():
    print("This is f1.")

f2 = 111
f3 = 'aaa'

# 以下指定直接运行该模块时的行为
if __name__=='__main__':    
    print("You run this file directly.")

然后我们在 IDLE 中调用并使用它。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import mod_test

mod_test.f1()

print('f2=',mod_test.f2,'f3=',mod_test.f3)

运行结果

This is f1.
f2= 111 f3= aaa

然后我们试一下通过 Python 程序直接运行。

python3.6 ~/mod_test.py

运行结果

You run this file directly.

可以看到,只有在直接运行该模块的时候才会出现这个字符串。


三、包

简单来说,包就是包含了 __init__.py 这个文件的一个目录。

Python 解释器一旦检测到一个目录内包含 __init__.py 这个文件,就会认为这个目录内含有模块。

包是可以嵌套使用的。

用法举例

有一个 Python 包,目录结构如下:

proc
├── __init__.py
├── aa
    ├── __init__.py
    ├── aa1.py
    └── aa2.py
└──  bb.py

如果 bb.py 需要调用 aa1.py ,则需要如下语句:

import proc.aa.aa1

如果 bb.py 需要调用 aa2.py 中的 test() 函数,则需要如下语句:

from proc.aa.aa2 import test

如果 aa1.py 需要调用 aa2.py ,则需要如下语句:

import aa2

发表评论

电子邮件地址不会被公开。