函数基础
函数基本使用
函数定义
定义函数格式如下:
1
2
3
4
| def 函数名():
函数封装的代码
...
|
1.def
是英文define
的缩写
2.函数名称 应该能够表达 函数封装代码的功能,方便后续的调用
- 函数名称 的名命应该 符合标识符的名命规则
- 可以由 字母、下划线和数字组成
- 不能以数字开头
- 不能与关键字重名
函数调用
调用函数很简单,通过函数名()
即可完成对函数的调用。
编写第一个函数
需求:
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))
|
输出
函数的嵌套调用
一个函数里面又调用了另外一个函数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
创建另一个文件imp_mypython模块.py
来引入模块mypython模块.py
。
1
2
| import mypython模块
print(mypython模块.name)
|
执行结果
小结
可以在一个python文件中 定义变量 或者函数
然后在另一个文件中使用import
导入这个模块
导入之后,就可以使用模块名.变量
/模块名.函数
的方式,使用这个模块中定义的变量或者函数
模块可以让曾经编写过的代码 方便的被复用!
模块名也是一个标识符
标识符可以由 字母、下划线和数字组成
不能以数字开头
警告
本文最后更新于 July 3, 2022,文中内容可能已过时,请谨慎使用。