01. 函数的快速体验
1.1 快速体验
-
所谓函数,就是把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用
-
函数的使用包含两个步骤:
-
定义函数 —— 封装 独立的功能
-
调用函数 —— 享受 封装 的成果
-
-
函数的作用,在开发程序时,使用函数可以提高编写的效率以及代码的 重用
演练步骤
-
新建
04_函数
项目 -
复制之前完成的 乘法表 文件
-
修改文件,增加函数定义
multiple_table():
-
新建另外一个文件,使用
import
导入并且调用函数
02. 函数基本使用
2.1 函数的定义
定义函数的格式如下:
def 函数名():
函数封装的代码
……
-
def
是英文define
的缩写 -
函数名称 应该能够表达 函数封装代码 的功能,方便后续的调用
-
函数名称 的命名应该 符合 标识符的命名规则
-
可以由 字母、下划线 和 数字 组成
-
不能以数字开头
-
不能与关键字重名
-
2.2 函数调用
调用函数很简单的,通过 函数名()
即可完成对函数的调用
2.3 第一个函数演练
name = "小明" # 解释器知道这里定义了一个函数 def say_hello(): print("hello 1") print("hello 2") print("hello 3") print(name) # 只有在调用函数时,之前定义的函数才会被执行 # 函数执行完成之后,会重新回到之前的程序中,继续执行后续的代码 say_hello() print(name)
2.4 PyCharm 的调试工具
-
F8 Step Over 可以单步执行代码,会把函数调用看作是一行代码直接执行
-
F7 Step Into 可以单步执行代码,如果是函数,会进入函数内部
2.5 函数的文档注释
-
在开发中,如果希望给函数添加注释,应该在 定义函数 的下方,使用 连续的三对引号
-
在 连续的三对引号 之间编写对函数的说明文字
-
在 函数调用 位置,使用快捷键
CTRL + Q
可以查看函数的说明信息
注意:因为 函数体相对比较独立,函数定义的上方,应该和其他代码(包括注释)保留 两个空行
03. 函数的参数
演练需求
-
开发一个
sum_2_num
的函数 -
函数能够实现 两个数字的求和 功能
演练代码如下:
def sum_2_num(): num1 = 10 num2 = 20 result = num1 + num2 print("%d + %d = %d" % (num1, num2, result)) sum_2_num()
-
在函数名的后面的小括号内部填写 参数
-
def sum_2_num(num1, num2): result = num1 + num2 print("%d + %d = %d" % (num1, num2, result)) sum_2_num(50, 20)
3.2 参数的作用
-
函数,把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用
-
函数的参数,增加函数的 通用性,针对 相同的数据处理逻辑,能够 适应更多的数据
-
在函数 内部,把参数当做 变量 使用,进行需要的数据处理
-
函数调用时,按照函数定义的参数顺序,把 希望在函数内部处理的数据,通过参数 传递
-
# 定义一个函数 # 定义形参时,可以为形参指定默认值 # 指定了默认值以后,如果用户传递了参数则默认值没有任何作用 # 如果用户没有传递,则默认值就会生效 def fn(a = 5 , b = 10 , c = 20): print('a =',a) print('b =',b) print('c =',c) fn(1 , 2 , 3) fn(1 , 2) fn()
3.3 形参和实参
-
形参:定义 函数时,小括号中的参数,是用来接收参数用的,在函数内部 作为变量使用
-
实参:调用 函数时,小括号中的参数,是用来把数据传递到 函数内部 用的
def fn4(a):
# 在函数中对形参进行重新赋值,不会影响其他的变量
# a = 20
# a是一个列表,尝试修改列表中的元素
# 如果形参执行的是一个对象,当我们通过形参去修改对象时
# 会影响到所有指向该对象的变量
a[0] = 30
print('a =',a,id(a))
c = 10
c = [1,2,3]
fn4(c)
fn4(c.copy())
fn4(c[:])
print('c =',c,id(c))
3.4 不定长参数
# 不定长的参数 # 定义一个函数,可以求任意个数字的和 def sum(*nums): # 定义一个变量,来保存结果 result = 0 # 遍历元组,并将元组中的数进行累加 for n in nums : result += n print(result) sum(123,456,789,10,20,30,40)
# 带星号的形参只能有一个 # 带星号的参数,可以和其他参数配合使用 # 第一个参数给a,第二个参数给b,剩下的都保存到c的元组中 def fn21(a,b,*c): print('a =',a) print('b =',b) print('c =',c) # 可变参数不是必须写在最后,但是注意,带*的参数后的所有参数,必须以关键字参数的形式传递 # 第一个参数给a,剩下的位置参数给b的元组,c必须使用关键字参数 def fn22(a,*b,c): print('a =',a) print('b =',b) print('c =',c) # 所有的位置参数都给a,b和c必须使用关键字参数 def fn23(*a,b,c): print('a =',a) print('b =',b) print('c =',c) # 如果在形参的开头直接写一个*,则要求我们的所有的参数必须以关键字参数的形式传递 def fn24(*,a,b,c): print('a =',a) print('b =',b) print('c =',c) fn21(1,2,3,4,5,6) fn22(1,2,3,4,5,c=6) fn23(1,2,3,4,b=5,c=6) fn24(a=1,c=2,b=3)
E:PyScriptspython.exe E:/PyWorkSpace/venv/ccc.py a = 1 b = 2 c = (3, 4, 5, 6) a = 1 b = (2, 3, 4, 5) c = 6 a = (1, 2, 3, 4) b = 5 c = 6 a = 1 b = 3 c = 2 Process finished with exit code 0
# **形参可以接收其他的关键字参数,它会将这些参数统一保存到一个字典中 # 字典的key就是参数的名字,字典的value就是参数的值 # **形参只能有一个,并且必须写在所有参数的最后 def fn3(b,c,**a) : print('a =',a,type(a)) print('b =',b) print('c =',c) fn3(b=1,d=2,c=3,e=10,f=20)
# 参数的解包(拆包) def fn4(a,b,c): print('a =',a) print('b =',b) print('c =',c) # 创建一个元组 t = (10,20,30) # 传递实参时,也可以在序列类型的参数前添加星号,这样他会自动将序列中的元素依次作为参数传递 # 这里要求序列中元素的个数必须和形参的个数的一致 fn4(*t) # 创建一个字典 d = {'a':100,'b':200,'c':300} # 通过 **来对一个字典进行解包操作 fn4(**d)
04. 函数的返回值
-
在程序开发中,有时候,会希望 一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续的处理
-
返回值 是函数 完成工作后,最后 给调用者的 一个结果
-
在函数中使用
return
关键字可以返回结果 -
调用函数一方,可以 使用变量 来 接收 函数的返回结果
注意:
return
表示返回,后续的代码都不会被执行
def sum_2_num(num1, num2): """对两个数字的求和""" return num1 + num2 # 调用函数,并使用 result 变量接收计算结果 result = sum_2_num(10, 20) print("计算结果是 %d" % result)
def fn4(): for i in range(5): if i == 3: # break 用来退出当前循环 # continue 用来跳过当次循环 return # return 用来结束函数 print(i) print('循环执行完毕!')
05. 函数的嵌套调用
-
一个函数里面 又调用 了 另外一个函数,这就是 函数嵌套调用
-
如果函数
test2
中,调用了另外一个函数test1
-
那么执行到调用
test1
函数时,会先把函数test1
中的任务都执行完 -
才会回到
test2
中调用函数test1
的位置,继续执行后续的代码
-
def test1(): print("*" * 50) print("test 1") print("*" * 50) def test2(): print("-" * 50) print("test 2") test1() print("-" * 50) test2()