函数基础
一.函数的作用
没有函数的问题:
1.明明是同样的功能同样的代码需要多少次就要写多少遍 (冗余、重复)
2.如果功能发生改变,所有使用过这个功能的位置都需要修改
解决办法: 使用函数
二.函数基础
1.什么是函数?
1)概念:函数就是对实现某一特定功能的代码段的封装(机器)
2)分类(谁定义的)
① 系统函数 - 系统已经定义了,程序可以直接使用的函数;比如:print、input、type、ord、chr、bin、len、id等等。(别人造好的机器)
②自定义函数 - 程序员自己定义使用的函数。(自己造的机器)
# 举个简单的例子 同样是计算阶乘,我们分别使用循环和函数解决
# 循环解决:
n = 10
sum1 = 1
for x in range(1, n+1):
sum1 *= x
print(sum1)
# 计算10的阶乘
n = 20
sum1 = 1
for x in range(1,n+1)
sun1 *= x
print(sum1)
# 计算20的阶乘
# 这里单是计算10的阶乘和20的阶乘我们就写了两遍循环的代码 (没有必要,冗余)
# 函数解决:
def jiecheng(n):
sum1 = 1
for x in range(1, n+1):
sum1 *= x
print(sum1)
jiecheng(10)
jiecheng(20)
jiecheng(5)
# 这里我们直接调用函数就可以计算阶乘,除了10和20 我们还可以计算其他想计算的值(简单,方便)
2.函数的定义(自己造机器)
语法:
def 函数名(形参列表):
函数说明文档
函数体
说明:
def - python 定义函数的关键字.固定写法
函数名 - 程序员自己命名:
标识符,不是关键字(要求)
所有的字母都小写,多个单词之间用下划线隔开;
不能用系统提供的函数名、类名
见名知义(看到函数名大概知道函数的功能是什么)
(): - 固定写法
形参列表 - 格式: 变量名1, 变量名2, 变量名3, ... (变量可以是没有定义过的变量)
形参的作用是将函数外面的数据传递到函数里面
函数说明文档 - 和def保持一个缩进的三个双引号引起来的注释 (说明书)
函数体 - 和def保持一个缩进的一条或者多条语句;实现函数功能的一条或者多条语句
注意:函数在定义的时候不会执行函数体
简单来说我们可以将定义函数分为以下几个步骤
第一步:确定函数的功能
第二步:根据函数的功能确定函数名
第三步:确定函数的参数(看实现函数的功能需不需要额外的数据,需要几个)
第四步:实现函数功能
(第五步: 确定函数返回值)
第六步:写函数说明文档
现在我们做两个简单的练习:
# 需求: 定义一个函数实现求任意两个数的和的功能
def get_sum(num1, num2):
"""
求两个数的和(功能说明部分)
:param num1: 第一个数
:param num2: 第二个数
:return: None(返回值说明)
"""
print(num1 + num2)
# 需求:定义一个函数,打印指定字符串中大写字母的个数
def upper_count(string):
"""
统计指定字符串中大写字母的个数
:param string: 被统计的字符串
:return: None
"""
count = 0
for x in string:
if 'A' <= x <= 'Z':
count += 1
print(f'{string} 中大写字母的个数:{count}')
3.函数的调用(使用机器)
语法: 函数名(实参列表)
说明: 函数名 - 需要调用的函数的名字(函数名必须是已经定义过的函数的函数名)
() - 固定写法
实参列表 - 格式: 数据1, 数据2, 数据3, ... (实参的个数和形参的个数保持一致)
- 作用:用来给形参赋值的。(真正传递到函数中使用的数据)
调用函数会执行函数的函数体
# 调用上面用到的函数
get_sum(20,30) # 50
get_sum(7,10) # 17
upper_count('hjAjj') # 1
三.函数的参数
1.位置参数和关键字参数(实参分类)
① 位置参数
实参直接写(直接将多个数据用逗号隔开),让实参和形参从位置上一一对应
def func1(a, b, c):
print(f'a:{a}, b:{b}, c:{c}')
# 单独使用位置参数传参
func1(20, 30, 40)
② 关键字参数
以: 形参名1 = 值1 , 形参名2 = 值2 ,… 的形式传参
注意:要保证每个参数都有值
def func1(a, b, c):
print(f'a:{a}, b:{b}, c:{c}')
# 单独使用关键字参数传参
func1(a=20, b=30, c=40)
func1(b=30, c=40, a=20)
③位置参数和关键字参数混合
要求:位置参数必须在关键字参数的前面
func1(10, c=30, b=20) # a:10, b:20, c:30
func1(10, 20, c=30) # a:10, b:20, c:30
# func1(a=10, 20, 30) # SyntaxError: positional argument follows keyword argument
2.参数默认值(形参)
定义函数的时候可以以: 形参名=值 的形式给参数赋默认值, 调用函数的时候有默认值的参数可以不用传参
注意: 没有默认值的参数必须放在有默认值参数的前面
# 所有的参数都有默认值
def func2(x=10, y=20, z=30):
print(f'x:{x}, y:{y}, z:{z}')
func2() # x:10, y:20, z:30
func2(100) # x:100, y:20, z:30
func2(y=200) # x:10, y:200, z:30
def func3(y, x=10, z=30):
print(f'x:{x}, y:{y}, z:{z}')
3.不定长参数(定义)
定义参数的时候参数个数不确定就可以使用不定长参数
① 在形参前加 *
带一个*的形参,本质就是一个元组,对应的实参会作为这个元组的元素。
这种不定长参数的函数只能用位置参数传参
②在形参前加 **
带两个*的形参,本质就是一个字典,对应的形参会作为这个字典的值
这种不定长参数的函数只能用关键字参数传参
# 例子:定义一个函数可以求多个数的和
def get_sum(*num):
sum1 = 0
for x in num:
sum1 += x
print(sum1)
get_sum(1)
get_sum(10, 20)
get_sum(1, 2, 3, 4, 5)
def get_sum2(**num):
print(num)
get_sum(a=10,b=20)