函数
写程序的时候会出现这样的情况:有一个功能需要在多个地方使用,如果没有函数需要在每次使用这个功能的时候把实现这个功能的代码写一遍;如果有函数可以提前将实现指定功能的代码封装成函数,然后在所有需要这个功能的位置调用函数
概念
函数就是实现某一特定功能的代码的封装。(函数就是将实现某一个功能的所有代码打成一个包(封装起来),那以后在需要这段代码对应的功能的时候就不需要重复写这段代码了,而是直接调用函数。)
看案例:左打方向盘n次,右打方向盘m次
def left():
print('----------------左移-----------------')
print('打左转向灯')
print('向左打方向盘')
# print('踩油门')
print('回正方向盘')
def right():
print('----------------右移-----------------')
print('打右转向灯')
print('向右打方向盘')
print('踩油门')
print('回正方向盘')
left()
left()
right()
right()
right()
left()
left()
left()
right()
right()
right()
分类
根据函数由谁创建的可以将函数分为:系统函数和自定义函数
- 系统函数 - 由系统创建好的函数: print、input、type、chr、ord、max、sum等
- 自定义函数 - 由程序员自己创建的函数
- 定义函数(创建函数 - 造机器)
"""
语法:
def 函数名(形参列表):
函数说明文档
函数体
初学者定义函数的步骤:
1.确定函数功能
2.确定函数名 (根据功能来)
3.确定形参列表 - 看实现函数的功能的时候需不需要额外的数据,需要几个额外的数据
4.使用函数体实现函数功能(实现函数的功能的时候需要将形参当成对应的数据来使用)
"""
1)函数名:名字由程序员自己决定
- 两个要求:是标识符;不能是关键字
- 三个规范:
- 见名知义(看到函数名就大概知道这个函数的功能是什么);
- 字母都小写多个单词之间使用下划线隔开;
- 不使用系统函数名、类名或者模块名
2)(): :固定写法
3)形参列表:
- 以’变量名1, 变量名2, 变量名3,…'的形式存在,这儿的每一个变量就对应一个形参(形参可以没有也可以有多个);形参可以将函数外部的数据传递到函数的内部;
- 定义函数的时候需不需要形参需要几个形参就看实现函数的功能的时候需不需要额外的数据,需要几个额外的数据
4)函数说明文档:本质就是和def保持一个缩进的多行注释
5)函数体:结构上就是和def保持一个缩进的一条或者多条语句(至少一条);逻辑上函数体就是实现函数功能的代码。
案例1:定义一个函数求任意两个数的和
def sum2(num1, num2):
"""
(功能说明)求和两个数的和
:param num1: (参数说明)数字1
:param num2: 数字2
:return: (返回值说明)None
"""
print(num1 + num2)
案例2:定义一个函数统计任意一个列表中数字的个数
def count_num(list1):
count = 0
for x in list1:
if type(x) in (int, float):
count += 1
print(count)
list2 = ['ashdjf', 23, 2.3, True, {1, 2}, 100]
count_num(list2)
调用函数
"""
定义函数的时候不会执行函数体,调用函数的时候才会执行函数体(调用多少次就执行多少次)
语法:
函数名(实参列表)
说明:
函数名 - 任何已经定义过的函数的函数名
() - 固定写法
实参列表 - 以"数据1, 数据2, 数据3,..."的形式存在,这儿的每一个数据就是一个实参。
实参是用来给形参赋值(实参才是真正从函数外部传递到函数内部的数据),实参必须和形参一一对应
"""
- 使用机器
def func1():
# print(10 + 'a')
print('======')
print('------')
print('++++++')
func1()
def func2(x, y, z):
print(x, y, z)
func2(10, 20, 30)
2.函数调用过程
第一步:回到函数定义的位置
第二步:传参(用实参给形参赋值)
第三步:执行函数体
第四步:确定函数返回值
第五步:回到函数调用的位置,接着往后执行
def sum2(num1, num2):
# num1 = 100, num2 = 200
print(num1 + num2)
sum2(100, 200) #300