• 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义


    复习

    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 

  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/liguodeboke/p/10775082.html
Copyright © 2020-2023  润新知