1. 函数基础概念
1.1 定义: 实现具体功能的一段代码
1.2 格式 : def 函数名(形参):
1.3 作用 : 提高代码复用性,减少重复
1.4 调用 : 函数名() 定义是不会执行,调用时开始执行,执行完成后回到调用行
1.5 文档说明 : 定义函数下一行三引号之间的内容.可使用help(函数名)查看
1.6 获取函数名 : 函数名.__name__
2. 局部变量与全局变量
2.1 内置命名空间 : python解释器一启动就可以使用的名字存储在内置空间中,在启动python解释器时就加载到内存.如print(),input()等等
2.2 局部变量:
a. 定义:在函数内部定义的变量
b. 特点: 只能在函数内部使用,不能在函数外使用
2.3 全局变量:
a.定义: 在函数外定义的变量
b. 特点: 可以在不同的函数内部使用,或在函数外部使用
2.4. 修改全局变量:
a. 使用关键字global声明
b. global关键字本质上是要修改全局变量的内存地址
01: 对于可变类型的数据来说,可在原有内存地址上修改,可以不加global
02: 对于不可变类型的数据来说,无法在原有内存地址上修改,修改时会改变内存地址,必须加global
03: 对于全局变量,无论可变或不可变类型,只要是重新赋值,都需加上global
num2 = 1 # 定义一个全局变量 def func1():
num = 1 # 定义一个局部变量 global num2 # 修改全局变量 num2 = 2 return num def func2(): num = func1() print(num2) print('func2', num) func2()
2.5 多个函数共享数据的方法
a. 全局变量: 可在不同函数中使用
b. 函数中使用return返回值
3. 函数返回值
3.1 没有返回值(默认返回None)
a. 不写return : 函数内部的代码执行完毕自动结束
b. 只写return : 结束一个函数
c. return None
3.2 返回一个值 : 函数结束了且返回一个值
3.3. 返回多个值
a. 可以把多个值放到一个列表,元组,字典中通过return一起返回
b. 使用一个值接收时返回一个列表,也可使用多个变量接收
def return1(): return {'hello': 2, 'world': 3} a, b = return1() print(a, b)
3.3 函数返回值特点:
a. 函数中如果使用return返回值时 ,只能返回一个结果,函数就结束了
b. 当函数含有返回值,调用时会返回一个结果,可使用变量保存
c. 如果函数没有返回值,我们使用变量接收时会返回一个None
d. 当函数执行到return时,函数会结束,后续代码不再执行
3.4 有没有参数看小括号里面,有没有返回值看return
4. enumerate的使用
4.1 作用: 在遍历的时候获取下标
4.2 使用方法:
for index, value in enumerate(): print(index, value)
5. 函数的嵌套
5.1 定义: 在函数中嵌套一个函数
5.2 闭包 : 内部函数调用外部函数的变量
def outer(): a = 1 def inner(): print(a) return inner inn = outer() inn()
6. 函数的参数
6.1 调用函数传参的方法
a. 按照位置参数传参 :强调传入参数的位置与定义函数时的形参位置保持一致,参数数量一致
b. 按照关键字参数传参:强调关键字的名字与函数定义时形参的名字保持一致,不要求位置
c. 前面使用位置方式,后面使用关键字方式传参,位置参数在前,关键字参数在后,如果前面使用关键字参数,后面也只能使用关键字参数
6.2 缺省参数
a. 定义: 形参设置了默认值
b. 特点: 如果给缺省参数传值了,那么就使用传入的值,否则就使用默认的值
c. 普通参数结合缺省参数的使用:缺省参数后面可以再有缺省参数,不能有普通参数
def sum_num(num1, num2=10): sum = num1 + num2 return sum
6.3 不定长参数
a. 定义: 不确定参数的个数
b. 分类:
01. 不定长位置参数(*args) : 当调用函数的时候,所有位置参数都会传给args,然后把args封装成一个元组
02. 不定长关键字参数(**kwargs) : 当调用函数的时候,所有的关键字参数都会穿给kwargs然后封装成一个字典
6.4 传参方法:
a. 调用函数的时候按照位置参数的方式传参
b. 不定长参数,结合缺省参数使用
01. 缺省参数需放到不定长位置参数(*args)的后面
02. 不定长关键字参数(**kwargs)需放在最后面
c. 顺序: (name, *args, sex='nan', **kwargs)
def show_name(*args, **kwargs): print(args) for i in args: print(i, end=' ') print('') print(kwargs) for j in kwargs.values(): print(j, end=' ') show_name(23, 45, 'fd', name='lisi', age='25')
6.5 拆包
a. 对元组进行拆包(*my_tuple),表示把元组里的每一个元素按照位置参数的方法传参
b. 对字典进行拆包{**my_dict},表示把子字典里的每一个键值对按照关键字参数进行传参
c. 对元组和字典进行拆包(*my_tuple){**my_dict}不能单独使用,只能结合带有不定长参数的函数使用
def tast1(*args, **kwargs): print('test1', args, kwargs) def tast2(*args, **kwargs): print('tast2', args, kwargs) tast1(*args, **kwargs) tast2('hello', True, name='scy', age=16)
7. 可变于不可变类型
7.1 可变类型: 可在原有内存空间的基础上修改数据(增/删/改),修改后数据内存地址不发生改变.列表,字典,集合
a. 修改保存的数据的方式:
01. 在原有内存空间的基础上修改
02. 通过重新赋值修改,内存地址会发生变化
7.2 不可变类型 : 不允许在原有内存地址的基础上修改数据,通过重新赋值修改后内存地址会发生变化,元组,字符串.数字
a. 想要修改保存的数据,可通过重新赋值来完成
my_list = [1, 2] print(my_list, id(my_list), hex(id(my_list))) my_list.append(3) print(my_list, id(my_list), hex(id(my_list))) my_list = [1, 2, 3] print(my_list, id(my_list), hex(id(my_list)))
8. 引用与引用传递
8.1 引用
a. 定义: 程序中数据在内存中的一个地址,简称内存地址
b. 程序中所有的数据都保存在内存中,变量保存其实就是保存内存中的一个地址,后续根据地址在内存中获取数据
c. 数据在内存中以十六定制的类型保存,函数id获取的内存地址为十进制,可通过hex()将其转换为十六进制
8.2 引用传递
a. 在python里面,所有赋值操作都是引用传递,赋值的是一个内存地址
b. 函数传参也是按照引用进行传递的
c. += :本意为在原有内存地址的基础上修改数据,如果数据类型不可变,则系统会重新开辟一块内存空间存储结果,数据的内存地址也将改变
d. = : 表示赋值操作,无论是可变或不可变类型,数据的内存地址都会改变
9. 递归函数
9.1 定义: 在函数内部调用自己
9.2 递归函数必须要有递归结束的条件,否则会出现无限循环,程序奔溃
9.3 获取默认的递归次数: sys.getresursionlimit()
9.4 更改默认的递归次数: sys.setresursionlimit(num)
9.5 写递归的方式
a. 写出临界条件
b. 找出这一次和上一次的关系
c. 假设当前函数已能用,调用自身计算上一次的结果,再求出本次的结果
10. 匿名函数
10.1. 定义 : 没有名字的函数可以称为匿名函数,或者使用lambda关键字定义的函数
10.2. 特点 :
a. 匿名函数可以简化代码
b. 匿名函数只能写一行代码
c. 匿名函数结果不需要return关键字返回
10.3. 格式: lambda 形参1,形参2: 匿名函数代码实现
sum = lambda a, b: a * b result = sum(2, 5) print(result)
10.4. 匿名函数只能实现简单的功能操作,不能实现复杂的比如 循环 if
10.5. 在python里面可以使用一个变量保存一个函数
10.6. 应用: 匿名函数可以作为参数传递给另一个函数,此时不需要加小括号
def calc_num(func): num1 = 1 num2 = 2 result = func(1, 2) return result result = calc_num(lambda num1, num2: num1 * num2) print(result)
11. 高阶函数
11.1 定义: 函数的参数是一个函数类型(常结合匿名函数使用)或函数的返回值是一个函数类型
11.2. 当想调用函数内部的函数时,需在外部函数将内部函数返回,返回值是一个函数,可以用一个变量接收,此时该变量就是一个函数,调用时使用变量名()即可
11.3 内置高阶函数,使用前需导入functools模块
a. functools.reduce(函数名, 容器名) : 根据函数的功能,对容器内的数据进行计算
注意点 : reduce接收的函数类型必须要有两个参数
import functools my_list = [1, 4, 67, 34] def sum_num(num1, num2): return num1 + num2 result = functools.reduce(sum_num, my_list)
# result = functools.reduce(lambda num1, num2: num1 + num2, my_list) 使用匿名函数
print(result)
b. filter(函数名, 容器名) :根据函数内功能对容器内数据进行筛选,获取数据时需将结果转换为列表
filter :遍历容器内的每一个数据,把每一个数据交给指定的函数进行比较,判断是否传入数据
my_dict = [{'name': 'scy', 'age': 18}, {'name': 'yjj', 'age': 15}] result = filter(lambda dict: dict['age'] > 15, my_dict)
print(list(result))