python day12
函数默认值的细节
#如果函数的默认参数的默认值为变量,在所属函数定义阶段以执行就被确定为当时变量存着的值 eg:
a = 10
def fn(num = a):
print(num) #打印出来的还是10
a = 20
fn()
三元表达式(就是if...else...的语法糖)
三元表达式就是用于简化if...else...结构的语法
--1、只能简化if...else...结构,其他if分支结构不管
--2、一个分支只能提供一个结果
a = input('>>')
b = input('>>')
res = a if a > b else b #输出的是a和b中的大者
print(res) #三元表达式前面的是条件成立输出的结果后面是条件失败的结果
列表与字典的推导式
快速生成列表或者字典的语法糖,且能在生成的过程中添加简单的逻辑
ls = [v for v in range(1,6)]
print(ls) # -->[1,2,3,4,5]
#能被列表推导式推导的数据源必须在循环取值时可以得到一个值
ls = [v*2 for v in range(1,6)]
print(ls) -->[2,4,6,8,10]
ls = ['偶数' if v % 2 == 0 else '奇数' for v in range(1,6)]
print(ls) -->['奇数', '偶数', '奇数', '偶数', '奇数'] #可以把三元表达式应用于列表推导式
---------------------------------------------------------------------------------------------------
ls = [['A',2],('s','k')] dic = {k:v for k,v in ls} print(dic) -->{'A': 2, 's': 'k'}
dic = {k.lower():v for k,v in ls} #可以做一些简单逻辑
print(dic) -->{'a': 2, 's': 'k'}
函数对象*****
在python中,所有变量存放的值只要是地址,我们就称之为对象
--所有变量都是用来存放地址的,所以都是对象
--存放整型的地址就是整型对象,存放函数的地址就是函数对象,存放文件地址的就是文件对象
函数对象:存放函数地址的变量就是函数对象
def fn():pass #这里的fn就是函数对象
函数对象的应用场景*****
def func():
pass
1、函数对象()就是对函数的调用
fn1() --->就是对函数的调用
2、函数对象可以作为变量赋值给其他变量
fn2 = fn1 #my_fn1和fn2都存着函数的地址,所以都是函数对象,后面加()就可以调用该函数
3、函数对象可以作为函数的参数
def fn3(func):
func()
fn3(fn1) #将函数对象fn1作为参数传入fn3就可以在fn3函数的内部直接调用fn1函数
4、函数对象可以作为函数的返回值
def fn4():
return func
func = fn4()
5、函数对象可以作为容器的成员
ls = [fn1,fn2,fn3]
名称空间*****
名称空间,就是名字与地址的对应关系,可以被python解释器遍历查找,采用堆栈的存储方式
三种名称空间
Built-in:内置名称空间,系统级,就一个,随之python解释器的执行而产生,解释器的停止而销毁
Global:全局名称空间,文件级,多个,随着所属文件的打开而产生,文件的关闭而销毁
Local:局部名称空间,函数级,多个,随着所属函数的执行而产生,函数执行结束而销毁
堆栈存储方式:先进的后出,后进的先出
加载顺序:先加载内置名称空间,再加载全局名称空间,最后加载局部名称空间
#同一名称空间内变量名不可以重复,再次使用变量名会发生重指向
#不同名称空间的变量名可以重复,但不冲突,调用时会有一个顺序
#遍历变量名的顺序:现在所属的名称空间遍历,找不到就往上一级名称空间遍历寻找,最后内置名称空间都找不到的话就会报错。
函数的嵌套定义
在一个函数的内部定义另一个函数
--所以想要调用内部函数,只能在内部调用
def outer():
print('outer run')
a = 10 #普通变量,随着函数的调用而产生,结束而销毁
def inner(): #函数对象和普通变量一样,随着函数的调用而产生,结束而销毁
print('inner run')
inner() #所以只能在函数的内部调用
outer()
作用域
作用域:就是变量(名字|对象)起作用的范围
四种作用域
Built-in:内置作用域,作用与所有文件的所有地方
Global:全局作用域,作用于当前文件的所有地方
Enclosing:嵌套作用域:作用于当前函数及内部嵌套的函数
Local:局部作用域:作用域当前函数内部
#注:1、不同作用域之间的名字不冲突,所以重名无所谓
2、每个作用域都优先使用自己作用域的名字,没有的话再找更高的名称空间的名字,知道内置,还没有就报错
3、查找顺序:Local > Enclosing > Global > Built-in