函数基础知识
一、定义函数
1、认识函数
1)什么是函数
函数就是实现某一特定功能的代码的封装(每个函数都有自己的特定的功能)
函数就是吧实现某一个功能的所有的代码打成了一个包,每次需要这个功能的时候不用再重复去写实现这个功能的代码了,而是使用函数。
2)函数的分类
按照函数是由谁创建/定义来进行的分类
系统函数 - 由python创建的函数,这类函数只需要在需要它的功能的时候去调用它。
例如:print、input、type、id、max、min、sum等……
自定义函数 - 由程序员自己创建自己使用的函数
2、定义(创建)函数 - 造机器
语法:
def 函数名(形参列表):
函数说明文档
函数体
说明:
def - 固定写法
函数名 - 程序员自己命名;
两个要求、;是标识符;不是关键字
三个规范:见名知义(看到函数名大概知道函数的功能)、字母都小写多个单词之间用下划线隔开;不使用系统的函数名、类名和模块名
(): - 固定写法
形参列表 - 格式:使用多个变量名用逗号隔开,其中一个变量表示一个形参。(也可以没有形参)
形参的作用:将函数外部的数据传递函数里面
函数说明文档 - 本质就是一个多行注释(机器的说明书)
函数体 - 就是和def保持一个缩进的一条或者多条语句
3、初学者定义函数的基本步骤
**第一步:**确定函数的功能(确定机器造出来是干嘛用的)
**第二步:**根据功能确定函数名(给机器命名)
**第三步:**确定形参;看实现函数的功能需不需要额外的数据,需要几个
**第四步:**利用形参提供的数据实现函数功能
**第五步:**确定返回值(暂时不用关注)
**第六步:**写函数说明文档
4、练习题
**练习1:**定义一个函数求两个数的和
def sum1(num1, num2):
"""
(函数功能说明区)求两个数的和
:param num1:(参数说明)提供第一个求和的数据
:param num2: 提供第二个求和的数据
:return: 两个数之和
"""
return num1 + num2
print(sum1(15, 78))
print(sum1(78, 5))
**练习2:**定义一个函数获取指定整数的个位数
def get_units_digit(num1):
'''
获取指定整数的个位数
:param num1: 提供需要获取个位数的那个整数
:return: 个位数
'''
return num1 % 10
print(get_units_digit(14549))
**练习3:**定义一个函数获取指定字符串中数字字符的个数
def count_num_char(str1):
'''
获取指定字符串中数字字符的个数
:param str1: 提供原始的字符串
:return: 数字字符的个数
'''
count1 = 0
for x in str1:
if '0' <= x <= '9':
count1 += 1
return count1
print(count_num_char('48sd7w3+?,7ert'))
**练习4:**定义一个函数将两个字符串合并成一个字符串,合并方式如下:
‘abc’ 和 ‘123’ 合并为:‘a1b2c3’
‘abcdef’ 和 ‘123’ 合并为:‘a1b2c3def’
‘abc’ 和 ‘12345’ 合并为:‘a1b2c345’
def merge_str(str1, str2):
'''
混合两个字符串
'abc' 和 '123' 合并为:'a1b2c3'
'abcdef' 和 '123' 合并为:'a1b2c3def'
'abc' 和 '12345' 合并为:'a1b2c345'
:param str1:需要拼接的字符串1
:param str2:需要拼接的字符串2
:return:拼接好的新字符串
'''
new_str = ""
len_1 = len(str1)
len_2 = len(str2)
len_min = min(len_1, len_2)
new_str = "".join([str1[x] + str2[x] for x in range(len_min)])
new_str += str1[len_min:] + str2[len_min:]
return new_str
print(merge_str('abc', '12345'))
**练习5:**定义一个函数打印10的阶乘
def factorial_10():
'''
打印10的阶乘
:return: None
'''
ans1 = 1
for x in range(2, 11):
ans1 *= x
print(ans1)
factorial_10()
二、调用函数
1)定义函数不会执行函数体,调用函数才会执行函数体。(调用多少次,函数体就会执行多少次)
2)调用函数的时候,实参的个数由被调用的函数的形参决定。(用实参给形参复制的过程叫传参)
3)函数调用过程(简单版)
当代码执行到函数调用语句的时候,后面的执行过程如下:
第一步:回到函数定义的位置
第二步:传参(用实参给形参赋值)
第三步:执行函数体
第四步:确定返回值(暂且搁置)
第五步:返回函数调用的位置,接着往后执行
语法:
函数名(实参列表)
说明:
函数名 - 需要调用函数的函数名(这个函数名对应的函数必须是已经定义好的函数)
() - 固定写法
实参列表 - 格式:多个数据用逗号隔开
实参是用来给形参复制。(实参就是用过形参传递到函数内容的数据)
三、函数的参数
根据调用函数的时候实参提供方式的不同,将实参分为位置参数和关键字参数两种
1、参数的分类
1)位置参数
直接提供实参对应分数据,让实参和形参在位置上一一对应
2)关键字参数
以’形参1 = 实参1,形参2 = 实参2,…‘的形式传参
3)混用
位置参数和关键字参数可以一起,一起用的时候必须保证位置参数在关键字参数的前面
def func1(a, b, c):
print(f"a:{a},b:{b},c:{c}")
func1(100, 55, 8) # 位置参数
func1(456, 78, 5) # 位置参数
func1(a=78,c=100,b=7) # 关键字参数
func1(10,c=30,b=20 ) # 混用
2、参数默认值
定义函数的时候可以以‘形参名=值’的形式给形参提供默认值;
如果一个参数有默认值,那么在调用函数的时候有默认值的参数可以不用传参
如果定义函数的时候有的参数有默认值,有的参数没有,那么没有默认值的参数必须在有默认值参数的前面。
def func2(a=10, b=20, c=30):
print(f"a:{a},b:{b},c:{c}")
func2()
func2(80)
func2(802,c=78)
3、参数类型说明
有默认值的参数:默认值是什么类型,类型说明就是什么类型。
没有默认值的参数:需要在形参后面加‘:类型名’
def func4(x: int, y=''):
print()
4、不定长参数
1)带*的不定长参数
带*的不定长参数 *如果字啊一个形参前加*,那么这个形参就可以接受任意多个实参。
带*的不定长参数的本质就是一个元组,对应的多个实参是元组中的元素。
注意:a.带*的不定长参数,传参的时候必须使用位置参数
b.如果定长参数在带*的参数后面(有的时候是直接在*的后面),那么后面的定长参数调用的时候必须用关键字参数传参。
2)带**的不定长参数也可以接受多个实参
四、函数的返回值
1、返回值的作用
**定义:**返回值的作用就是将函数内部产生的数据传递到函数外部。
初学者怎么爱额定函数需不需要返回值:看函数的功能有没有产生新的数据,如果有就将新的数据作为返回值返回。
2、确定函数的返回值(怎么将数据作为返回值)
在函数体重通过return 关键字返回函数的返回值:return 数据
**注意:**1)如果执行函数体的时候没有遇到return ,函数的返回值是None
2)return还具有提前结束函数的功能(执行含上述提案的时候再哪儿遇到return,函数在哪儿结束)
3、怎么在函数外获取函数的返回值
获取函数调用表达式的值就是获取函数的返回值。
函数调用表达式 - 调用函数的语句
每一个函数调用语句其实都有一个结果(都是一个数据),这个就说就是这次调用时候函数的返回值
一个函数的返回值是什么,就看调用函数的时候return后面的值时什么,return后面的值时什么,函数外部函数调用表达是的结果就是什么。