不使用函数有什么问题:
- 同样的代码需要写多次(冗余)
- 功能发生改变的时候需要修改多出代码
一、函数
1.什么是函数
函数就是对实现某一特定功能的代码块的封装
2.函数的分类
1)系统函数(内置函数) - 系统已经实现的函数(已经造好的机器),程序员只需要调用就行
print函数、input函数、len函数、sum函数、max函数等
2)自定义函数:程序员自己声明的函数(自己造机器)
3.函数的声明(定义) - 造机器
1)语法:
def 函数名(形参列表):
函数说明文档
函数体
2)说明
def - python 声明函数的关键字
函数名 - 和变量名要求一样
见名知义(看见函数名大概知道函数的功能)
() - 固定写法
形参列表 - 变量名1,变量名2,变量名3...(根据情况变量名的个数可以是0个、1个或者多个)
形参的作用是将函数外面的数据传递到函数的里面
: - 固定写法
函数体 - 和def保持一个缩进的一条或者多条语句。(实现函数功能的代码块)
3)初学者声明函数的步骤
第一步:确定函数的功能
第二步:根据功能确定函数名
第三步:确定形参,(看实现函数的功能需不需要从外面传值,如果需要传值需要几个)
第四步:实现函数的功能
第五步:执行完函数体,确定函数返回值
(!!!!)注意:函数声明的时候,函数体不会执行!
写一个函数来求两个数的和
def sum1(num1, num2):
"""
函数说明文档(功能说明)
:param num1: 参数说明
:param num2: 参数说明
:return: 返回值说明
"""
print('求和')
print(num1 + num2)
声明一个函数,实现求1+2+3+..n的功能
def sum2(n):
"""
1+2+3+...+n
:param n: 个数
:return: 和
"""
num4 = 0
for x in range(1,n):
num4 += x
print(num4)
4.函数的调用 - 使用机器
1)语法:
函数名(实参列表)
2)说明
函数名 - 已经声明过的函数
() - 固定写法
实参列表 - 数据1,数据2,数据3,...(实参是用来给形参赋值的)
3)函数的调用过程(特别重要!!!)
第一步:先回到函数声明的位置
第二步:用实参给形参赋值。(这个过程又叫传参,传参要保证每个形参都有值)
第三步:执行函数体
第四步:获取返回值
执行完函数体:函数体执行完、执行过程中遇到return
确定函数返回值:看执行函数过程中有没有遇到return,如果遇到了return后面表达式的值就是函数的返回值
如果没有return,函数的返回值就是None
第五步:回到函数调用的位置,接着往后执行(这个时候函数调用表达式的值就是函数的返回值)
sum1(15, 18)
sum2(99999)
同一个函数可以调用多次
二、参数
1.位置参数和关键字参数
调用函数的时候根据形参的写法分为位置参数和关键字参数
1)位置参数:让实参的顺序和形象一一对应,中间用逗号隔开
2)关键字参数:以‘形参名1 = 值1,形参名2 = 值2...’格式来确定形参
注意:如果既有位置参数,又有关键字参数,位置参数必须在关键字参数的前面
def func1(a, b, c):
# a = 10 , b = 20 , c = 30
print('a', a, 'b', b, 'c', c)
# 位置参数
func1(10, 20, 30)
# 关键字参数
func1(c=30, b=20, a=10)
# 位置参数+关键字参数
func1(10, c=30, b=20)
2.参数默认值
声明函数的时候,可以给形参赋默认值。有默认值的形参,给这个形参赋值
注意:声明的时候有默认值的参数要放在没有默认值的参数后面
def func2(a, b=20, c=30):
print(a, b, c)
func2(100, 200)
func2(100, 200, 300)
# 调用函数只给a和c赋值,b使用默认值
func2(a=100, c=300)
func2(100, c=300)
3.参数的类型说明
python中类型只有说明的作用,没有约束的作用
1)参数赋默认值
2)参数名:类型
def func3(a=0, b=''):
print(a, b)
func3(1, 100)
4.不定长参数
写一个函数,求多个数的和
1)声明函数的时候,在形参的前面加*,那么这个参数就变成了不定长参数,可以同时接收多个实参(将这个参数变成元祖)
2)声明函数的时候,在形参的前面加**,那么这个参数也会变成不定长参数,可以同时接收多个关键字实参(将这个参数变成字典)
注意:不带的参数要放在带参数的前面
def sum1(*nums):
print(nums)
sum1()
sum1(1)
sum1(23, 12)
sum1(21, 431, 32)
sum1(12, 32, 11, 23, 221, 21)
练习:写一个函数,按指定的方式计算多个数字的结果
operation('+', 23, 34, 45, 56) ->求和
operation('-', 23, 34, 45, 56) ->求和
operation('*', 23, 34, 45, 56) ->求和
operation('/', 23, 34, 45, 56) ->求和
def operation(total1 , *nums:int):
ops = {"+": (lambda x, y: x + y), "-": (lambda x, y: x - y), "*":(lambda x, y: x * y), '/':(lambda x, y: x / y)
if total1 == '+' or '-':
n = 0
for index in range(len(nums)):
n = ops[total1](n,nums[index])
print(nums[index-1])
elif total1 == '*' or '/':
n = 1
for index in range(len(nums)):
n = ops[total1](nums[index],n)
print(nums[index-1])
operation('*',1,2,3,4)
def func5(aa,**nums):
print('===================')
print(nums)
func5(aa=100,a=10, b=20, c=30, name='lizhuoran')
def func6(*args, **kwargs):
print('===================')
print(args,kwargs)
func6(12,123,111,a=112,b=233,c=223)
三、返回值
1.什么是函数的返回值
返回值就是return关键字后面表达式的值,就是函数调用表达式的值
1)return
return是函数体中的关键字(只能出现在函数体中)
作用:结束函数,确定函数返回值
def func1():
print('======')
print('aaaaaa')
# return # 提前结束函数
print('hello')
return 100 # 确定函数返回值
func1()
2,什么时候需要返回值(初学者)
指导思想:如果实现函数的功能会产生新的数据,就可以把这个数据作为函数的返回值
return 返回值1,返回值...
def sum1(num1, num2):
return num1 + num2 ,(num2 + num1)/2
n,m = sum1(10,20)
print(n,m)