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

posted @ 2019-04-26 19:57  hesujian  阅读(158)  评论(0编辑  收藏  举报