day11学习总结:
1. 函数
-
函数存在的价值:当一个功能需要反复使用的时候,如果没有函数,每次需要这个功能更就必须把实现这个功能的代码写一遍,如果有函数,实现这个功能对应的代码只需要写一遍(封装成函数),然后再每次调用这个功
-
什么是函数:函数就是实现某特定一功能的代码的封装(函数就将实现某一个或者某类功能的代码达成一个包,以后再需要这个包中的这段代码对应的功能的时候不用重新写这段代码,而是使用了封装这段代码的函数)
-
函数的分类:根据这个函数是由谁创建的。
- 系统函数(别人已经造好的机器):由系统创建的函数(python本身就创建好的函数),比如,print,input,type,max,min
- 自定义函数(自己造的机器):由程序员自己创建的函数
-
定义函数
语法: def 函数名(形参列表) 函数说明文档 函数体
-
说明:
-
def - 固定写法
-
函数名 - 程序员自己命名
-
(): - 固定写法
-
形参列表 - 以‘变量名1,变量名2,变量名3…’的形式存在,根据情况变量的数据可以为0(每一个变量就是一个形参)
- 形参的作用:将函数外部的数据传递到函数里面
- 确定形参的方法:看实现函数的功能需不需要额外的数据,需要多少个额外的数据。
-
函数说明文档 - 就是多行注释(相当于说明书)
-
函数体 :
- 结构上,和def保持一个缩进的一条或者多条语句
- 逻辑上,函数体就是实现函数功能的代码
def factorial(num): ''' (功能说明区) :param num: (参数说明) :return: (返回值说明) ''' sum1 = 1 for i in range(1,num+1): sum1 *= i print(sum1) factorial(4) # 24 def get_count(str1): ''' 统计str1对应的字符串中数字字符的个数 :param str1: 指定的字符串 :return: ''' count = 0 for i in str1: if i.isdigit(): count += 1 print(count) get_count("fhifj154") # 3
-
-
-
调用函数(使用函数)
-
语法:函数名(实参列表)
-
说明:
-
函数名 - 需要哪个函数对应的功能,就调用哪个函数;想要调用哪个函数就写哪个函数的函数名。
- 注意:函数名必须是已经定义过的函数的函数名
-
() - 固定写法
-
实参列表 - 以‘数据1,数据2,数据3,…’的形式存在,这儿的每个数据都是一个实参(实参对应的数据可以是任何有结果的表达式),实参是用来给形参赋值的,在提供实参的时候要保证和形参一一对应
-
结论:定义函数不会执行函数体,调用的时候才会执行
def new_list(list1): list2 = [] for i in list1: if i or i == 0: list2.append(i) print(list2) new_list(["",1,2,3,None,[]]) # [1,2,3]
-
-
-
函数调用过程
- 调用函数时,执行步骤:
- 回到函数定义的位置
- 传参(用实参给形参赋值,传参的时候必须保证每个形参都有值)
- 执行函数体
- 确定函数返回值
- 回到函数调用的位置,接着往后执行。
- 调用函数时,执行步骤:
-
位置参数和关键字参数:
-
位置参数:以’实参1,实参2,实参3,…‘的形式存在,让实参和形参从位置上一一对应。
-
关键字参数:以“形参1=实参1,形参2=实参2,…”的形式存在,通过“=”将实参和形参对应。
-
注意:位置参数和关键字参数可以一起用,但必须保证位置参数在关键字参数的前面。
def func1(x,y,z): print(f"x:{x},y:{y},z:{z}") func1(10,20,30) # 位置参数传参 func1(x=10,z=30,y=20) #关键字参数传参 func1(10,y=20,z=30) # 位置参数和关键字参数一起用
-
-
参数默认值
-
定义函数的时候可以通过“形参名=数据”的方式给形参赋默认值;在调用函数的时候,有默认值的参数可以不用传参。
-
注意:定义函数的时候,如果有的参数有默认值,有的参数没有默认值,没有默认值的形参必须在有默认值的形参的前面。
def func2(x=10,z=30,y=20): print(f"x:{x},y:{y},z:{z}") func2(100) # x:100,y:20,z:30 func2(100,200) # x:100,y:20,z:200 func2(z=300) # x:10,y:20,z:300 如果想要跳过前面有默认值的参数,直接给后面的参数赋值,使用关键字传参
-
-
参数的类型
- 参数的类型说明:直接在形参后面加“类型名”。
- 有默认值的参数,默认值数据对应的类型是这个形参的类型。
-
*对应的不定长参数
-
定义函数的时候,如果在某一个形参前面加*,那么这个形参就会变成一个不定长参数,他可以接收多个实参(可以是0个,1个,2个,N个);带*的不定长参数的本质是一个元组,他接收到的所有的实参是这个元组中的元素
def func2(x,*y,z,t) pass func2(10,20,30,40,z=50,t=60) # 10传给x,20,30,40传给y,z,t应该使用关键字传参。
-
定义函数的时候单独使用*
-
如果定义函数的时候,形参列表中有一个独立的*。调用函数的时候,*后面的所有的形参必须用关键字参数传参。
def func1(x,*,y,z) pass func1(10,y=20,z=30) # 10传给x,y,z必须用关键字传参
-
举例:
# 定义函数求多个数的和,至少传两个数 def sumN2(num1,num2,*nums): sum2 = num1+num2 for i in nums: sum2 += i print(sum2) sumN2(10,20) # 30 sumN2(10,20,30,40) # 100 # 定义一个函数收集学生信息 def get_stu_info(name,age,*awards): print(awards) get_stu_info("张三",18) # () get_stu_info("李四",20,"三好学生","优秀干部") # ('三好学生', '优秀干部')
-
-