-
函数的定义
- 函数: 函数是以功能为导向,一个函数封装一个功能
- 函数减少代码的重复性,增强了代码的可读性
-
函数的结构
def new_len(obj): # new_len 函数名 count = 1 # 函数体 for i in obj: count += 1 print(count) new_len('123456') ''' def 关键字: 定义一个函数.紧跟一个空格 new_len 函数名: 与变量命名规范一至.一定要具有可描述性. (): 结构需要,传参用 : :分隔符. tab键: 四个空格.缩进,函数体. '''
-
函数的调用
使用函数名加小括号进行函数的调用
写法:函数名() 这个时候函数的函数体会被执行
def new_len(obj): count = 1 for i in obj: count += 1 print(count) new_len('sdadad') # 函数名() 函数的执行者,调用者 for el in range(3): new_len('sadadas') # 函数的调用写多少次,就执行多少次
-
函数的返回值
-
ruturn
- 结束函数,return下面的(函数内)的代码不会执行
- 给函数的调用者返回值
- 如果return后面什么都不写,或者函数中没有return,则返回的结果是None
- 如果return后面写了一个值,返回给调用者这个值
- 如果return后面写了多个结果,返回给调用者一个tuple(元组),调用者可以直接使用元组的解构获取多个变量
def new_len(obj): count = 1 for i in obj: count += 1 return count print(new_len('sdadad'))
-
-
函数的参数
-
函数的实参传递给形参的过程叫做传参: 函数的拓展性
-
实参角度 -- 函数的调用者
- 位置参数: 从左至右,按照顺序,一一对应.
- 关键字参数: 一一对应.
- 混合参数: 位置参数在关键字参数前面.
-
形参角度:
-
位置参数: 与实参角度位置参数一样.
-
默认值参数: 一定在位置参数后面,不传参数即沿用默认的参数.
-
动态参数
当给函数传入的参数数目不定时,之前的传参方式解决不了问题.
def chi(*args): # 定义一个函数的时候,* 将实参角度所有的位置参数聚合到一个元组中. print('我请你吃:', args) chi('蒸羊羔', '蒸熊掌', '蒸鹿尾')
def func(**kwargs): # 函数定义时,**将实参的所有的关键字参数聚合成了一个字典给了kwagrs print(kwargs) func(name='小明', age='18', hobby='唱跳rap篮球') def func(*args, **kwargs): # 万能参数 print(args, kwargs)
-
形参的顺序:
-
位置参数 => *args => 默认值参数 => **kwargs
-
仅限关键字参数:
在 *args 和 **kwargs 中间
-
-
-
-
*的魔法用法
def func(*args, **kwargs): print(args) print(kwargs) l1 = [1, 2, 3] l2 = ['小明', '小红', '小丽'] dic = {'k1': 'v1', 'k2': 'v2'} func(*l1, *l2) # 函数的执行时: * 代表打散 func(**dic) # 函数的执行时: ** 代表打散 (key不能是int型) 函数外: a, b, *c = [1, 2, 3, 4, 5, 6] # 处理剩余元素,得到列表形式 print(a, b, c)
-
命名空间与作用域
-
命名空间:
- 全局命名空间:我们直接在py文件中,函数外声明的变量
- 内置命名空间:python最开始会开辟一个自己的命名空间 -- 内置命名空间
- 局部命名空间:函数内部声明的变量
- 加载顺序: 内置命名空间 => 全局命名空间 => 局部命名空间
- 取值顺序: 局部命名空间 => 全局命名空间 => 内置命名空间
-
作用域:
-
作用域: 变量或函数的声明周期
-
全局作用域: 内置命名空间 全局命名空间
-
局部作用域: 局部命名空间
globals() # 查看全局作用域中的内容 locals() # 查看的是当前作用域中的内容
-
-
-
函数的嵌套
# 函数可以互相嵌套: def outer(): def inner(): print('我是内部') print('我是外部') inner() outer() # 从上至下依次执行
-
拓展
- global
- 在局部作用域中可以更改全局作用域的变量(限于字符串,数字)
- 利用global在局部作用域也可以声明一个全局变量(创建在全局)
- nonlocal
- 不能更改全局变量
- 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且当前作用域也复制一份此变量
- global
-
默认值参数的一个考点
-
当你的默认值参数是可变的数据类型,那么你要当心了
def func(a,lst=[]): # 可变数据类型使用的是一个内存空间 lst.append(a) return lst print(func(1)) # [1] print(func(2)) # [1,2] print(func(3, [])) # [3]
-
-
函数名的应用
函数名是一个特殊的变量,它具有变量的特点
-
函数名指向的是函数的内存地址,这个内存地址加上()就可以运行函数.
-
函数名是一个变量,可以赋值运算
def func(): print(666) print(func) a = func a() # 也可以运行函数func
-
函数名可以作为容器类类型的元素
def func(): print(666) lst = [func,func,func,func] lst[1]() for el in lst: el()
-
函数名可以作为函数的实参传进去
def func1(): print('in func1') def func2(argv) argv() print('in func2') func2(func1)
-
函数名可以作为函数的返回值
def func1(): print('in func1') def func2(argv): print('in func2') return argv ret = func2(func1) ret()
-