zoukankan      html  css  js  c++  java
  • Python高级编程(二)

    迭代器(lterator)

    可以直接作用于for循环的数据类型
    

    判断是否可以迭代

    from collections import Iterable
    isinstance("abc", Iterable)      #判断是否可迭代
    
    输出:
    True
    
    isinstance(100,Iterable)
    
    输出:
    False
    

    iter()函数

    生成器都是lterator对象,但是lterable不一定是迭代器对象,

    list、dict、str等lterable变成iterator可以使用iter()函数

    isinstance(iter("100"),Iterable)#不可迭代对象转换为可迭代对象
    
    True
    

    闭包

    在函数内部再定义一个函数,并且这个函数用到了外边函数的变量
    
    应用
    def test(a, b):
        def test_in(x):
            if a == 0:
                print("X")
            else:
                print(a*x+b)
    
        return test_in
    
    line1 = test(1, 1)
    line1(0)
    line2 = test(2, 2)
    line2(4)
    line1(5)
    
    输出:
    1
    10
    6
    
    • 好处在于a,b的值不需要每次传入x时都重新输入

    装饰器

    装饰器的优点

    • 无需修改被装饰的函数源代码
    • 无需修改被装饰函数的调用方式

    装饰器的作用

    装饰器是Python特有的方法,用于给某程序增添程序,但该程序已经上线或者使用,因此无法大批量的更改代码,所以用到了装饰器

    装饰器的实现

    def w1(func):
        def inner():
            print("2222222222")
            func()
        return inner
    @w1   #相当于f1 = w1(f1)
    def f1():
        print("f11111111")
    
    f1()
    
    输出:
    2222222222
    f11111111
    

    多个装饰器

    def makeBlod(fn):
        def wrapped():
            print("11111111111")
            return "<b>" + fn() + "</b>"
        return wrapped
    
    def makeItalic(fn):
        def wrapped():
            print("22222222222")
            return "<i>" + fn() + "</i>"
    
        return wrapped
    
    @makeBlod
    @makeItalic
    def test1():
        print("33333333333")
        return "hello world-1"
    ret = test1()
    print(ret)
    

    通过下面的输出可以看到,当有多个装饰器的时候,装饰器运行是从下到上依次运行

    输出:
    11111111111
    22222222222
    33333333333
    <b><i>hello world-1</i></b>
    

    通用的装饰器

    有无参数都可用

    def func(functionName):
        def func_in(*args, **kwargs):
            ret = functionName(*args, **kwargs)
            return ret
        return func_in
    

    作用域

    命名空间

    简单说命名空间是对变量名的分组划分,某个变量隶属于哪个空间内
    

    globals、locals

    • globals()打印当前全局变量
    • locals()打印当前局部变量

    LEGB规则

    LEGB规则就是用来规定命名空间查找顺序的规则
    即:LEGB规定了查找一个名称的顺序为:local-->enclosing function locals-->global-->builtin
  • 相关阅读:
    JAVA_NIO 与Netty框架
    Socket编程
    P3368树状数组2(树状数组//改段求点)
    P3373 树状数组1(树状数组//改点求段)
    树状数组
    P1197 星球大战(并查集+链式向前星)
    P2024 食物链(种类并查集||带权并查集)
    P1111 修复公路(kruscal+并查集)
    P1387 最大正方形+P1736 创意吃鱼法(矩形上的dp+预处理)
    P2330 繁忙的城市(krusal最小生成树)
  • 原文地址:https://www.cnblogs.com/Burtit/p/8664205.html
Copyright © 2011-2022 走看看