## 函数默认参数值的细节 ```python 如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值 a = 100 def fn(num=a): print(num) # 100 a = 200 fn() 原因:py解释器执行的时候是由上往下一条一条执行的,当遇到函数定义语句的时候,只执行读入函数定义冒号前的部分,不执行函数体。当发生调用的时候,才直接执行函数体(此时不再执行函数冒号前的部分。) ``` ## 三元表达式(三目运算符) ```python 1,用于简化if···else···的语句,且只能简化该结构语句,其他if结构都不支持! 2, 一个分支提供一个结果即有返回值(只有两个分支)(if···else····语句无返回值!),如果提供了多个结果,将采用元组返回。 a=int(input("a:")) b=int(input("b:")) res= a if a>b else b print() ``` ## 列表与字典推导式: ```python 为什么要用推导式? 快速生成列表和字典的语法糖,且能在生成过程中添加简单逻辑。 能被列表推导式推导的数据源必须在循环取值时可以得到一个值! 例:ls=[v for v in range (1,6)] print(ls) #[1, 2, 3, 4, 5] 其中可以在两个 V 的位置做简单运算,例: ls = ['奇数' if v % 2 != 0 else '偶数' for v in range(1, 6)] print(ls) # ['奇数', '偶数', '奇数', '偶数', '奇数'] # 能被字典推导式推导的数据源必须在循环取值时可以被解压赋值为两个值 ls = [['A', 1], ('B', 2)] res = {k.lower(): v for k, v in ls} print(res) ``` ## 函数的对象 ```python 在python中,所有变量存放的值只要是地址,我们就称之为对象 所有的变量都是用来存放地址的,所有都是对象 存放整型的变量就是整型对象,存放函数的地址就是函数对象,文件就是文件对象。 例:def fn(): pass my_fn = fn # my_fn | fn都存着函数地址,所以都是函数对象,函数对象的使用就是 函数对象() 来调用函数 函数对象的应用场景: 1,函数对象可以直接作为变量赋值给其他变量 2,函数对象()用来调用函数 3,函数对象可以作为函数的参数 4,函数的对象可以作为函数的返回值 5,函数对象可以作为容器的成员 总之,函数对象,可以看做变量名来用,但最终都会转换成函数对象()。 否则函数对象没有意义。 ``` ## 名称空间 ```python 名称空间:存放名字与地址的对应关系的内存空间,在堆区采用堆栈方式存取,使用的 的时候被Python解释器遍历查找。 堆栈存储:先进后出,后进先出。 三种名称空间: Built-in:内置名称空间;系统级,一个;随解释器执行而产生停止而销毁。 Global:全局名称空间:文件级,多个;随所属文件加载而产生,文件运行结束而销毁。 Local:局部名称空间;函数级,多个;随函数执行而产生,函数执行完毕而销毁。 注:文件中if、while、for、with这些能产生缩进的关键词并不能产生名称空间。 加载顺序:Built-in>Globa>Local ``` ## 函数嵌套定义 ```python 定义:在函数内部定义另一个函数 函数内部的函数,跟函数内部的变量一样,在函数内部定义,随函数调用而产生,调用结束而销毁,所以只能在函数内部调用。 ``` ## 作用域 ```python 作用域:变量对象起作用的范围 四种作用域: Built-in:内置作用域:作用所有文件的所有地方 Global:全局作用域:作用在当前文件的所有地方 Enclosing:嵌套作用域:作用当前函数内部被嵌套函数 Local:局部作用域 :作用当前函数内部 注: 不同作用域之间名字不冲突,已达到名字的重用 每个作用域优先使用自己作用域的名字,没有找到再找更大的名称空间的名字,直到内置,还没有就报错 查找顺序:Local>Enclosing>Global>Built-in ```