所谓函数,就是把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用
函数的使用包含两个步骤:
函数的作用: 在开发程序时,使用函数可以提高编写的效率以及代码的 重用
定义函数的格式如下:
def 函数名():
函数封装的代码
……
def
是英文 define
的缩写调用函数很简单的,通过 函数名()
即可完成对函数的调用
需求
say_hello
的函数,封装三行打招呼的代码#!/usr/bin/python3
# -*- coding:utf-8 -*-
name = "hui"
# 解释器知道这里定义了一个函数
def say_hello():
print("hello 1")
print("hello 2")
print("hello 3")
print(name)
say_hello()
print(name)
运行结果如下:
hui
hello 1
hello 2
hello 3
hui
只有在调用函数时,之前定义的函数才会被执行
函数执行完成之后,会重新回到之前的程序中,继续执行后续的代码
定义好函数之后,只表示这个函数封装了一段代码而已 如果不主动调用函数,函数是不会主动执行的
Q:
能否将 函数调用 放在 函数定义 的上方?
A:
Python
已经知道函数的存在NameError: name 'say_hello' is not defined
(名称错误:say_hello 这个名字没有被定义)Python
文件,在弹出的菜单项选择 Debug
或 点击右上角绿色的 小虫子,就可开启调试。
F8 Step Over
可以单步执行代码,会把函数调用看作是一行代码直接执行
F7 Step Into
可以单步执行代码,如果是函数,会进入函数内部
CTRL + Q
可以查看函数的说明信息注意:因为 函数体相对比较独立,函数定义的上方 应该和其他代码(包括注释)保留 两个空行
演练需求
sum_2_num
的函数演练代码如下:
#!/usr/bin/python3
# -*- coding:utf-8 -*-
def sum_2_num():
num1 = 10
num2 = 20
result = num1 + num2
print("%d + %d = %d" % (num1, num2, result))
sum_2_num() # 10 + 20 = 30
思考一下存在什么问题
函数只能处理 固定数值 的相加
如何解决?
,
分隔#!/usr/bin/python3
# -*- coding:utf-8 -*-
def sum_2_num(num1, num2):
result = num1 + num2
print("%d + %d = %d" % (num1, num2, result))
sum_2_num(50, 20) # 50 + 20 = 70
函数,把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用
函数的参数,增加函数的 通用性,针对 相同的数据处理逻辑,能够 适应更多的数据
形参:定义 函数时,小括号中的参数,是用来接收参数用的,在函数内部 作为变量使用
实参:调用 函数时,小括号中的参数,是用来把数据传递到 函数内部 用的
return
关键字可以返回结果注意:
return
表示返回,后续的代码都不会被执行
#!/usr/bin/python3
# -*- coding:utf-8 -*-
def sum_2_num(num1, num2):
"""对两个数字的求和"""
return num1 + num2
# 调用函数,并使用 result 变量接收计算结果
result = sum_2_num(10, 20)
print("计算结果是 %d" % result) # 30
test2
中,调用了另外一个函数 test1
test1
函数时,会先把函数 test1
中的任务都执行完test2
中调用函数 test1
的位置,继续执行后续的代码#!/usr/bin/python3
# -*- coding:utf-8 -*-
def test1():
print("*" * 50)
print("test 1")
print("*" * 50)
def test2():
print("-" * 50)
print("test 2")
test1()
print("-" * 50)
test2()
运行结果如下:
--------------------------------------------------
test 2
**************************************************
test 1
**************************************************
--------------------------------------------------
体会一下工作中 需求是多变 的
需求 1
print_line
函数能够打印 *
组成的 一条分隔线def print_line(char):
print("*" * 50)
需求 2
def print_line(char):
print(char * 50)
需求 3
def print_line(char, times):
"""
打印分割线
:param char: 分割线组成的字符
:param times: 字符的数量
"""
print(char * times)
需求 4
工作中针对需求的变化,应该冷静思考,不要轻易修改之前已经完成的,能够正常执行的函数!
def print_line(char, times):
"""
打印分割线
:param char: 分割线组成的字符
:param times: 字符的数量
"""
print(char * times)
def print_lines(char, times, row):
"""
打印指定行数的分割线
:param char: 分割线组成的字符
:param times: 字符的数量
:param row: 指定的行数
"""
line = 0
while line < row:
print_line(char, times)
line += 1
# 函数调用
print_lines(char='-*-', times=20, row=2)
print('测试分割线')
print_lines(char='-*-', times=20, row=2)
运行结果如下:
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
测试分割线
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-