目录

python回炉重造-函数

函数基础

函数基本使用

函数定义

定义函数格式如下:

1
2
3
4
def 函数名():
    
    函数封装的代码
    ...

1.def是英文define的缩写

2.函数名称 应该能够表达 函数封装代码的功能,方便后续的调用

  1. 函数名称 的名命应该 符合标识符的名命规则
  2. 可以由 字母、下划线和数字组成
  3. 不能以数字开头
  4. 不能与关键字重名

函数调用

调用函数很简单,通过函数名()即可完成对函数的调用。

编写第一个函数

需求:

1.编写一个打招呼say_hello的函数,封装三行打招呼代码

2.在函数下方调用打招呼代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
name = '小明'

# 解释器知道这里定义了一个函数
def say_hello():
    print('hello 1')
    print('hello 2')
    print('hello 3')

# 只有在调用函数时,之前定义的函数才会被执行
# 函数执行完成之后,会重新回到之前的程序中,继续执行后续的代码
say_hello()

print(name)

用 单步执行 F8 和 F7 观察以上代码的执行过程

定义好函数后,只表示这个函数封装了一段代码而已

如果不主动调用函数,函数是不会主动执行的

思考

能否将 函数调用 放在 函数定义的上方?

不能

因为在 使用函数名调用之前,必须要保证 python已经知道函数的存在

否则控制台会提示NameError: name 'say_hello' is not defined(名称错误:say_hello这个名字没有被定义)

pycharm 的调试工具

F8 step over 可以单步执行代码,会把函数调用看作是一行代码直接执行

F7 step into 可以单步执行代码, 如果是函数,会进入函数内部。

函数的文档注释

在开发中,如果希望给函数添加注释,应该在 定义函数 的下方,使用 连续的三对引号

在 连续的三对引号 之间编写对函数的说明文字

在函数调用位置,使用快捷键 ctrl + Q可以查看函数说明信息

注意: 因为 函数体行对比较独立,函数定义的上方,应该和其他代码(包括注释)保留两个空行。

函数参数的使用

在函数名的后面的小括号内部填写 参数

多个参数之间使用,分隔

1
2
3
4
5
6
def sum_2_num(num1, num2):
    res = num1 + num2 
    print("%d + %d = %d" % (num1, num2, res))

sum_2_num(10, 20)
sum_2_num() # 不传参时会报错。TypeError: sum_2_num() missing 2 required positional arguments: 'num1' and 'num2'

参数的作用

函数, 把 具有独立功能的代码块组织为一个小模块,在需要的时候 调用。

函数的参数,增加函数的 通用性,针对 相同的数据处理逻辑,能够使用更多的数据

1.在函数内部,把参数当作 变量 使用,进行需要的数据处理

2.函数调用时,按照函数定义的参数顺序, 把 希望在函数内部处理的数据,通过 参数传递。

函数的返回值

在程序开发中,有时候,会希望 一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续的处理。

返回值 是函数 完成工作后,最后 给调用者的一个结果。

在函数中使用return关键字可以返回结果。

调用函数一方,可以使用变量接收函数的返回结果。

注意:return表示返回,后续代码都不会被执行

1
2
3
4
5
6
7
8
def sum_2_num(num1, num2):
    """对两个数字求和"""

    return num1 + num2 

# 调用函数,并使用 res 变量接收计算结果
res = sum_2_num(10, 20)
print("计算结果是 %d" % res) # 计算结果是 30

多个返回值

1
2
3
4
5
6
7
def divid(a,b):
    shang = a//b
    yushu = a%b
    return shang,yushu
sh,yu = divid(5,2)

print("商: %d, 余数:%d"%(sh,yu))

输出

1
: 2, 余数1

函数的嵌套调用

一个函数里面又调用了另外一个函数test1

如果函数test2中,调用了另外一个函数test1

那么执行到调用test1函数时,会先把函数test1中的任务都执行完

才会回到test2中调用函数test1的位置,继续执行后续的代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def test1():

    print("*" * 50)
    print("test 1")
    print("*" * 50)


def test2():

    print("_" * 50)
    print("test 2")

    test1()

    print("_" * 50)

test2()

结果如下

简单说就是按从上到下的顺序执行。

1
2
3
4
5
6
__________________________________________________
test 2
**************************************************
test 1
**************************************************
__________________________________________________

函数嵌套的演练–打印分割线

体会一下工作中 需求是多变的

需求1

定义一个print_line函数能够打印*组成的 一条分割线

1
2
3
4
def print_line():
    print("*" * 50)

# print_line()

需求2

定义一个可以打印任意字符的分割线函数

1
2
3
4
def print_line_1(char):
    print(char * 50)

# print_line_1("_")

需求3

定义一个函数能够打印任意重复次数的分割线

1
2
3
4
def print_line_2(char, num):
    print(char * num)

# print_line_2("_", 50)

需求4

定义一个函数能够打印5行分割线 分割线要求要符合需求3

1
2
3
4
5
6
def print_line_3(char, num):
    row = 0
    while row < 5:
        print_line_2(char, num)
        row += 1
print_line_3('*', 30)

全局变量和局部变量

全局变量和局部变量相同名字

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
a = 100

def test1():
    a = 300 # 局部变量优先使用
    print("teest1---------修改前: a= %d"%a)
    a = 200
    print("teest1---------修改后: a= %d"%a)

def test2():
    print("teest2---------a= %d"%a) # 没有局部变量,默认使用全局变量

test1()
test2()

输出结果

1
2
3
teest1---------修改前: a= 300
teest1---------修改后: a= 200
teest2---------a= 100

在函数中修改全局变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
a = 100

def test1():
    global a # 声明全局变量在函数中的标识符
    print("teest1---------修改前: a= %d"%a)
    a = 200
    print("teest1---------修改后: a= %d"%a)

def test2():
    print("teest2---------a= %d"%a) # 没有局部变量,默认使用全局变量

test1()
test2()

输出结果

1
2
3
teest1---------修改前: a= 100
teest1---------修改后: a= 200
teest2---------a= 200

使用模块中的函数

模块是python程序架构的一个核心概念

模块好比是工具包,要想使用这个工具包中的工具,就需要 导入import 这个模块

每一个以拓展名py结尾 的python源代码都是一个模块

在模块中定义的 全局变量函数 都是模块额能够提供给外界直接使用的工具

第一个模块使用

步骤

新建mypython模块.py

1
name = "mypython模块"

创建另一个文件imp_mypython模块.py来引入模块mypython模块.py

1
2
import mypython模块
print(mypython模块.name)

执行结果

1
mypython模块

小结

可以在一个python文件中 定义变量 或者函数

然后在另一个文件中使用import导入这个模块

导入之后,就可以使用模块名.变量/模块名.函数的方式,使用这个模块中定义的变量或者函数

模块可以让曾经编写过的代码 方便的被复用!

模块名也是一个标识符

标识符可以由 字母、下划线和数字组成

不能以数字开头

警告
本文最后更新于 July 3, 2022,文中内容可能已过时,请谨慎使用。