zoukankan      html  css  js  c++  java
  • python之函数的进阶

    1.名称空间:

      定义:用来存放名字的(变量,函数名,类名,引入的模块名)

      分类:

        内置名称空间:python解释器提供好的一些内置内容

        全局名称空间:py文件中自己写的变量

        局部名称空间:执行函数时会产生一个局部名称空间,放的是函数内部的内容

    2.作用域:

      1.全局作用域:内置 + 全局

      2.局部作用域: 局部

      范围;   内置范围  >   全局  > 局部

      全局不能找局部的变量     局部的变量可以找全局的变量

    3.locals和globals

      locals()  :查看当前作用域里面的内容    print(locals())

      globals()  :查看全局作用域里面的内容   print(globals())

      示例

        def print():

          pass

        def func():

          a = 10

          print(a)

        #输出结果是空 :因为第一行print将内置的print改为全局的print,导致在再次调用的时候只会使用全局的print不会使用内置的print

     4.关键字  global和nonlocal  

      4.1 globale 表示从全局把一个变量(比如a)引入局部,后面的变量全是此变量a

        使用方法:   globale 变量名

    # 全局变量一般是不能随意的修改的
    # a = 10
    # def func():
    #     # 慎用.
    #     global a  # global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量
    #     a += 10 #  a = a + 10 # 现在的a是全局的, 你现在视图改全局变量
    #     print("里面的打印",a) #20
    # func()
    # print("外面的打印", a)  #20

      4.2 nonlocal  在局部寻找离他最近的外层的一个变量

        使用方法: nonlocal 变量名

    a = 50
    def func1():
        a = 10 # 局部
        def func2():
            nonlocal a # 不找全局, global找全局
            a += 10
            print("func2", a) #20
        func2()
        print(a) #20
    func1()
    print(a) #50

    使用global模拟登陆

    flag = False
    
    def login():
        global flag
        uname = input('输入用户名')
         upwd= input('输入密码')
        if uname == '李雷'and upwd =='韩梅梅':
            flag =True
        else:
            flag = False
    
    def fatie():
        if flag =True:
            print('可以发帖')
        else:
            print('去登陆')
    
    
    login()
    fatie()

    5.闭包

      1.内层函数对外层函数的应用

      2.闭包的优点

        1.可以保护变量不被其他人侵害

        2.保持一个变量常驻内存

    def wrapper():
        name = "韩梅梅" # 局部变量常驻与内存
        def inner():
            print(name) # 在内层函数中使用了外层函数的局部变量
        return inner  # 返回函数名
    
    ret = wrapper() # ret是一个内层函数
    ret() # ret是inner, 执行的时机是不确定的, 必须保证里面的name必须存在

      3.__closure__查看是否是闭包. 有内容就是闭包, 没有内容就不是闭包

    def wrapper():
        name = "韩梅梅"
        def inner():
            print(name)
        print(inner.__closure__) # 查看是否是闭包. 有内容就是闭包, 没有内容就不是闭包
        inner()
    
    wrapper()

     6. 迭代与迭代器

      dir( )   查看xx数据可执行哪些操作   dir( lst )   

      数据可执行操作中有__iter__,就是可迭代对象

      获取迭代器      it = lst.__iter__()     it就是迭代器

      获取迭代器里面的一个数据   it.__next__()

      官方通过代码判断是否是迭代器

        from collections import Iterator,Iterable

        print(isinstance(lst , Iterator))   True就是迭代器,False就不是迭代器

        print(isinstance(lst , Iterable)  True就是可迭代的,False就不可迭代

      迭代器都是可迭代的,   可迭代的不一定是迭代器

      迭代器的意义:统一数据类型的遍历工作

    #模拟for循环

    7.生成器

      生成器本质就是一个迭代器

      函数中包含yield,此函数就是生成器函数

      生成器函数运行之后,是产生一个生成器,而不是运行函数

      yield表示返回,但不会终止函数的执行,是分段的执行函数

      执行生成器函数 

           ret = fn()    #ret是创建一个生成器

           ret.__next__()  #生成器拿值 

       能向下执行的两个条件:
           __next__(), 执行到下一个yield
          send(), 执行到下一个yield, 给上一个yield位置传值

        所有的生成器都是迭代器都可以直接使用for循环
        都可以使用list()函数来获取到生成器内所有的数据

    7 .  各种推导式 
      列表推导式 [结果 for循环 if条件]
      字典推导式 {结果(k:v) for循环 if条件}
      集合推导式 {结果(k) for循环 if条件}

      元组没有推导式

    8 . 生成器表达式 
        (结果 for循环 if条件)

     

  • 相关阅读:
    【自动化测试】rf+selenium中解决for计数嵌套循环问题
    【自动化测试】RF链接数据库12c遇到的问题总结
    【自动化测试】关于如何管理规范整个团队的想法(1)
    python爬虫--基本流程
    python爬虫--理论
    [工具箱]一键优化Windows
    [工具箱]禁用Windows系统更新做了哪些操作?
    有人说要节能,有人说要耗能
    让攻击挖矿耗能的攻击者闭嘴的方法是?
    POC挖矿没有前途
  • 原文地址:https://www.cnblogs.com/l1222514/p/13940337.html
Copyright © 2011-2022 走看看