Python--day12(三元表达式、函数对象、名称空间与作用域、函数嵌套定义)
今日主要内容
1. 函数默认值细节(*)
2. 数据类型补充:三元表达式、列表推导式、字典推导式 (***)
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。3. 函数对象:函数名的各种应用场景 (*****)
4. 名称空间与作用域:解释变量重复与冲突问题 (*****)
5. 函数的潜逃定义:在函数内部定义函数 (*****)
1. 函数默认值细节
如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被定义为当时变量存在的值
a = 10
def fn(num = a): # num = 10
a = 20
print(num) # 10
a = 200
fn()
2. 数据类型补充
2.1 三目运算符(三元表达式)
三目运算符:用于简化 if...else...的语法结构
1) 只能解决if...else...结构,其他if分支结构都不管
2)一个分支提供一个结果: 如果一个分支提供了多个结果, 将多个结果通过元组返回
a = int(input('a:')) # 10
b = int(input('b:')) # 20
if a > b:
print(a)
else:
print(b) # 20
res = a if a > b else b
print(res) # 20
2.2 列表推导式(快速生成列表的语法糖)
能被列表推导式推导的数据源必须在循环取值时可以得到一个值
可以应用于生成多个数据的场景,推导式也可以拥有见到的逻辑
ls = []
for i in range(1,6):
ls.append(i)
print(ls) # [1, 2, 3, 4, 5]
ls = [v for v in range(1,6)] # [1, 2, 3, 4, 5]
print(ls)
ls = ['奇数' if v % 2 != 0 else '偶数' for v in range(1,6)]
print(ls) # ['奇数', '偶数', '奇数', '偶数', '奇数']
2.3 字典推导式(快速生成字典的语法糖)
能被推导式推导的数据源必须在循环取值时可以被解压赋值为两个值
ls = [('a',1),['b',2]]
print(dict(ls)) # {'a': 1, 'b': 2}
res = {k:v for k,v in ls}
print(res) # {'a': 1, 'b': 2}
res = {k.upper():v for k,v in ls}
print(res) # {'A': 1, 'B': 2}
3. 函数对象
3.1. 函数对象
在python中,所有变量存放的值只要是地址,就称之为对象
所有的变量都是用来存放地址的,所以都是对象
函数对象:存放函数地址的变量就是函数对象
3.2 应用场景
1. 函数对象加()就是调用函数
2. 函数对象可以直接作为变量赋值给其他变量
3. 函数对象可以作为函数的参数
4. 函数对象可以作为函数的返回值
5. 函数对象可以作为容器类型的成员
1.函数对象()就是调用函数
def f1():
pass
f1()
# 2.函数对象可以直接作为变量赋值给其他变量
def f2():
pass
f21 = f2
f21()
# 3.函数对象可以作为函数的参数
def f3(func): # func = f21 = f2
func()
fn3(f21)
# 4.函数对象可以作为函数的返回值
def f4():
return f5
f4()
# 5.函数对象可以作为容器类型的成员
ls = [f21, f5]
4. 名称空间与作用域
4.1 名称空间
名称空间:就是名字与地址的对应关系,可以被python解释器遍历查找,采用堆栈存储方式
队列存储方式:先进先出
堆栈存储方式:先进后出,优先访问到的是最后添加到结构中的变量
在内置、全局、局部三个位置,只要出现了变量的定义,一定产生了自己名称空间中的民资,这些名字之间没有冲突
三种名称空间:
1. 内置名称空间:系统级,一个,随解释器执行而产生,解释器停止而销毁
2. 全局名称空间:文件级,多个,随所属文件加载而产生,稳健运行完毕而销毁
3. 当前名称空间:函数级,多个,随所属函数执行而产生,函数执行完毕而销毁
【注】文件的if,while,for,with这些能产生缩减的关键字并不能产生名称空间
加载顺:内置名称空间 > 全局名称空间 > 当前名称空间
4.2 作用域
作用域:变量名(名字,对象)起作用的范围
四种作用域
内置作用域:作用所有文件的所有地方
全局作用域:作用当前文件的所有地方
嵌套作用域:作用当前函数以及内部被嵌套的函数
局部作用域:作用当前的函数内部
【注】
不同作用域之间名字不冲突,已达到名字的重用
每个作用域优先使用自己作用域的名字,没有再找更大的名称空间的名字,直到内置,还没有就报错
查找顺序:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域
print(len) # <built-in function len>
len = 10
def f1():
len = 20
print(len) # 20
def f2():
len = 30
print(len) # 30
f2()
f1()
print(len) # 10
5. 函数的嵌套定义
概念:在一个函数中定义另一个函数
def outter():
print('from outter:')
def inner(): # 嵌套定义在outter函数内部
print('from inner:')
inner()
outter()
