zoukankan      html  css  js  c++  java
  • 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义

    复习

    1. 字符串的比较:

    2. 函数的参数:形参与实参

    3. 实参的分类:位置实参与关键字实参

    4. 形参分类:

      1.无值位置形参

      2.有值位置形参

      3.可变长位置形参

      4.有无值关键字形参

      5.可变长关键字形参

    5. 打散机制

    今日内容

    1. 函数默认值的细节。*

    2. 数据类型的补充:语法简单,经常去使用就OK ***

              ----- 三元表达式  |  列表推导式  |  字典推导式

    3. 函数对象:函数名的各种应用场景  *****

    4. 名称空间与作用域:解释变量名重复与从图冲突问题  *****

    5. 函数的嵌套定义:在函数内部定义函数  *****

    函数默认值的细节

    如果函数的默认参数,它的默认值为变量,在所属函数定义阶段执行时就被确为当时变量存放的值。

    a = 100
    def fn(num=a):
    print(num) # 此处打印的值还是100
    a = 200 # 此处再次赋值的200并没有被带入函数中
    fn()


    三元表达式

    三目运算符:用于简化 if ...else... 的语法:

              ----- 只能解决 if...else...结构,其他 if  分支结构都不管

              -----一个分支提供一个结果,如果一个分支提供了多个结果,将多个结果通过元祖返回

    a = int(input('输入:'))
    b = int(input('输入:'))
    res = a if a > b else b
    print(res)


    列表与字典推导式

    ---快速生成列表或者字典的语法糖。而且还能在生成过程中添加简单的逻辑

    1 . 能被列表推导式推到的数据源,必须在循环取值时可以得到一个值

    ls = [v for v in range(1,6)]
    print(ls) # [1, 2, 3, 4, 5] 快速的创建一个字典

    ls = ['奇数'if v %2 ==0 else '偶数' for v in range(1,6)]  #  可以使用if...else 与for循环连用,此处if后的v就是经过for循环的v
    print(ls) # ['偶数', '奇数', '偶数', '奇数', '偶数']


    2. 能被字典推导式推导的数据源,必须在循环取值时可以被解压赋值为两个值

    ls = [['A',1],('B',2)]
    res = {k.lower():v for k,v in ls} # 字典推导式可以for循环遍历列表总的元素,然后用k,v来接受,来作为它的key和value 还可以对key加功能,比如此处的lower
    print(res) # 此处的结果为{'a': 1, 'b': 2}

    函数对象

    在python中,所有变量存放的值,只要是地址,我们就称之为对象

              -----所有的变量都是用来存放地址的,所以都是对象

                  -----存放整型的地址就是整型对象 |  存放函数的地址就是函数对象  |  存放文件的地址就是文件对象

    函数对象:存放函数地址的变量,就是函数对象

    def fn():pass
    my_fn = fn
    # my_fn 存着函数fn()的函数地址,所以都是函数对象,函数对象的使用就是函数对象加()来调用函数
    my_fn() # 可以这样来使用

    函数对象的应用场景

    1. 函数对象()就是调用函数

    def fn1():
    pass
    fn1() # 普通的函数调用

    2. 函数对象可以直接作为变量赋值给其他变量

    def fn2():
    pass
    my_fn = fn2
    print('>>>',my_fn,fn2) # 此处打印的地址一致,说明函数对象可以作为变量来赋值给其他变量
    my_fn() # 依然能调用 此处my_fn 等同与所定义的 fn2 函数

     

    3. 函数对象可以作为函数的参数

    def fn3(func):   # 所以此处的fnnc 就等同与my_fn 和 fn2
    func()
    fn3(my_fn) # 此处把my_fn作为了 func的实参所以这个函数所执行的就是fn2函数

    4. 函数对象可以作为函数的返回值

    def fn4():
    return my_fn # 此处这个函数的返回值是my_fn
    my_fn2 = fn4() # s所以此处的my_fn2的功能就是my_fn而my_fn的功能是fn2,所以等同于fn2

    5. 函数对象可以作为容器类型的成员

    ls = [my_fn,my_fn2]  #  函数的对象可以作为容器的元素。如果调用,也具有函数的功能
    print(ls[0]()) # 可以按照索引来调用

    名称空间并不能

    队列存储方式: 先进先出

    堆栈存储方式:先进后出

    名称空间:就是名字与地址的对应关系,可以被python解释器遍历查找,采用堆栈存储方式

    三种名称空间:

    1. Built - in : 内置名称空间,系统级,一个,随解释器执行而产生,解释器停止而销毁

    2. Global : 全局名称空间,文件级,多个,随所属文件加载而产生,文件运行完毕后销毁

    3. Local : 局部名称空间,函数级,多个,随所属函数执行而产生,函数执行完毕后销毁

        注:文件的 if ,while,for ,with,这些能产生缩减的关键字并不能产生名称空间

    4. 加载顺序  Bulit-in  >  Global  >  Local

    函数嵌套定义

    概念:在一个函数内部定义另一个函数

    def outer():
    print('outer run')
    a = 10 # 函数对象 (变量) 与普通(对象)变量一样,在函数内部定义,随函数调用而产生
    # 调用结束而销毁,所以只能在函数内部调用
    def inner():
    print('inner run')
    inner() # 此处inner必须在函数内部调用,在外部是无法调用
    outer()

    作用域

    作用域:变量(名字 | 对象) 起作用的范围

    四种作用域

    1. Built-in 内置作用域:作用所有文件的所有地方

    2. Global 全局作用域 :作用当前文件的所有地方

    3. Enclosing 嵌套作用域 :作用当前函数以及内部被嵌套的函数

    4. Local 局部作用域 :  作用当前函数内部

    注意:

    不同作用域之间名字不冲突,来达到名字的重复的使用

    每个作用域优先使用自己作用域中的名字,没有再找到更大的名称空间,直到内置。再找不到就会报错

    查找顺序:Local  >  Enclosing  > Global  >  Built - in 

  • 相关阅读:
    stl_heap
    关于随机数 C++
    关于if语句的细节
    C++关于智能指针
    sqlyog
    win10 64位 汇编环境
    Qt 乱码
    Vux使用经验
    Flex布局新旧混合写法详解
    【原】npm 常用命令详解
  • 原文地址:https://www.cnblogs.com/liguodeboke/p/10775082.html
Copyright © 2011-2022 走看看