[TOC] >[success] # 函数 def ~~~ 1.函数:对功能的封装,和为了让代码可以复用,它是命名的用于区分的代码段。函 数可以接受任何类型参数,并且有返回。 2.定义函数: def、函数名、带有函数参数的圆括号,最后紧跟 一个冒号(:),例如: def 函数名(形参): 函数体 3.函数命名规范和变量命名一样(必须使用字母或者下划线 _ 开头,仅能含 有字 母、数字和下划线) 4.调用函数:函数名(实参) 5.pass:Python 函数中的 pass 表明函数没有做任何事情 ~~~ >[danger] ##### 关于return 和 None * return ~~~ 1. return, 函数执行完毕. 不会执行后面逻辑 2. 如果函数中不写return返回None 3. 只写return 返回None 4. return 返回值. 返回一个值 5. return 值1, 值2,... 返回多个值. 调用方接收到的是元组 ~~~ * None ~~~ 1.None 是 Python 中一个特殊的值,虽然它不表示任何数据,但仍然具有重要的 作用。 虽然 None 作为布尔值和 False 是一样的,但是它和 False 有很多差别。 2.案例解释 实际判断None 用is来做判断: thing = None if thing: print("等同True") else: print("等同False") # 实际使用用is if thing is None: print("is 是None") 打印结果: 等同False is 是None 3.这虽然是一个微妙的区别,但是对于 Python 来说是很重要的。你需要把 None 和不含 任何值的空数据结构区分开来。0 值的整型 / 浮点型、空字符串('')、空 列表([])、 空元组((,))、空字典({})、空集合(set())都等价于 False,但 是不等于 None。 4.更好的区分案例 def is_none(thing): if thing is None: print("是None") elif thing: print("是true") else: print("是False") >>> is_none(None) It's None >>> is_none(0.0) It's False >>> is_none(()) It's False ~~~ >[danger] ##### 参数 ~~~ 1.在创建函数声明的参数叫形参,调用使用的叫实参 2.位置参数传 入参数的值是按照顺序依次复制过去的。列子:def menu(wine, entree, dessert): 3.关键字参数 为了避免位置参数带来的混乱,调用参数时可以指定对应参数的名 字,例子: menu(entree='beef', dessert='bagel', wine='bordeaux') 4.位置参数和关键字参数的使用,先定义位置参数,在定义关键字参数,例子: menu('frontenac', dessert='flan', entree='fish') 5.动态参数:位置参数的动态参数: *args,关键字参数的动态参数 : **kwargs 6.*arg 是在形参定义是为了接受实参中不确定个数使用,接受回来的是一个元组 在函数中调用*arg 是将内容元组解包后的采纳数展示,arg是元组形式展示。 7.**kwargs 在形参定义接受键值对形式的参数并且变成字典,在实参的使用方式 例子:(wine='merlot', entree='mutton', dessert='macaroon') ,函数中只能直接使 用kwargs不能加**,kwargs 直接就是一个字典形式 8.位置参数 > *args > 默认值 > **kwargs 例子:def func(a, b, c, *args, d = 5, **kwargsd) 使用效果func(1,2,3,4,5,6,7, d ="马大哈"),d是将默认差数从5变成马大哈. ~~~ >[danger] ##### 函数的命名空间 ~~~ 命名空间分类: 1. 全局命名空间--> 我们直接在py⽂文件中, 函数外声明的变量量都属于全局命名空间 2. 局部命名空间--> 在函数中声明的变量量会放在局部命名空间 3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内 置命名空间 加载顺序: 1. 内置命名空间 2. 全局命名空间 3. 局部命名空间(函数被执⾏行行的时候) 取值顺序: 1. 局部命名空间 2. 全局命名空间 3. 内置命名空间 ~~~ >[danger] ##### 函数的作用域 ~~~ a = 10 # 全局 def func(): a = 20 # 局部 print(a) # 就近原则 print(globals()) # globals() 获取到全局作用域(内置,全局)中的所有名字 print(locals()) # locals() 查看当前作用域中的所有名字 func() 1. 全局 也就是所有函数都能使用,局部函数内部自己使用其他函数无法使用, 遵循就近原则 2.globals() 获取到全局作用域(内置,全局)中的所有名字 3.locals() 查看当前作用域中的所有名字 4.在函数定义,global a -- a 不再是局部变量. 是全局变量 5.在函数定义,nonlocal a -- a 找局部作用域中 离他最近的那个变量引入进来 ~~~ >[danger] ##### 函数嵌套案例 ~~~ def fun(): a = 1 print(a) def fun2(): a = 2 print(a) fun2() print(a) fun() 打印结果(fun2 虽然变量也叫a 但是不会改变fun中的a,证明作用域在自身起作用): 1 2 1 ~~~ >[danger] ##### python 和 js 函数作用域区别 * js 可以在函数内改变 var 声明的全局作用域 ~~~ var a = 12; function c(){ a +=1; console.log(a); } c(); 打印结果: 13 ~~~ * python 不可以更改全局作用域的变量,但可以使用 ~~~ a = 1 def c(): print(a) # 可以使用全局作用域的a # def b(): # a = a+1 # print(a) # 报错 def e(): global a # 可以使用global 引入全局 a += 1 print(a) c() e() print(a) 打印结果: 1 2 2 ~~~