zoukankan      html  css  js  c++  java
  • 11 闭包生成器

    一.函数
    1.函数时一种特殊变量,函数名加小括号,表示执行函数 func()
    2.函数可以赋值给其他变量
    3.函数名可以作为参数
    def func(func1):
    pass
    4.函数可以当容器的元素 li=[func1,func2...]
    5.函数可以作返回值

    二.闭包
    1.内层函数对外层函数中变量的引用
    2.使用__closure__来检测函数是否是闭包. 使用 函数名.__closure__ 返回cell就是闭包,返回None时,不是闭包
    def outer():
    a=10
    def inner():
    print(a)
    inner()
    print(inner.__closure__) #(<cell at 0x0000000002158468: int object at 0x0000000065E26D40>,) 说明inner是闭包
    outer()
    3.闭包的作用
    1.保护变量
    2.能让变量常驻内存
    def outer():#外层函数
    a=10 #外层函数中的变量
    def inner(): #内层函数
    print(a)
    return inner
    ret=outer() #inner
    ret()#调用inner

    三.迭代器
    1.Iterable 可迭代对象:含有__iter__()方法
    2.Iteration迭代器:含有__iter__()和__next__()方法
    li=[1,2,3,4,54,"a","钟"] #可迭代对象
    it=li.__iter__() #用__iter__方法获取迭代器

    3.迭代器的特点
    节省内存空间
    惰性机制,必须用__next__()获取数据
    不能反复,只能向下执行 (想再次从头取值时,需要重新获取新的迭代器)

    4.如何判断一个对象是否是一个可迭代对象
    #方法一
    print("__iter__" in dir(lst)) # True 可迭代的
    print("__next__" in dir(lst)) # True 迭代器

    #方法二
    from collections import Iterable,Iterator
    print(isinstance(lst, Iterable)) # True
    print(isinstance(lst, Iterator)) # False

    四.用while循环+迭代器模拟for循环
    lst=[1,2,"s","a"]
    it=lst.__iter__() #获取新的迭代器
    while 1:
    try:
    print(it__next__()) #从迭代器中取值
    except StopIteration: #出现StopIteration错误时走接下来的程序
    break

    五.一些方法
    1. dir(str) dir查看数据类型(str)的方法
    2. print(isinstance(a,b) ) #a是否属于b类型
    3.获取函数名 func.__name__
    4.获取函数内的注释: func.__doc__

    def func(a, b):
    '''
    文档注释
    这个函数用来计算两个数的和并返回
    :param a: 第一个数
    :param b: 第二个数
    :return: 第一个数和第二个数的和
    author:sylar
    date:2018-10-31
    '''
    print("我是func")
    return a + b
    print(func.__doc__) # document 文档注释
    print(func.__name__) # name 名字 获取函数名
    #乘法表
    for i in range(1,10):
        for j in range(1,i+1):
            print("%sx%s=%s"%(j,i,i*j),end="  ")
        print()#换行 

    1x1=1
    1x2=2 2x2=4
    1x3=3 2x3=6 3x3=9
    1x4=4 2x4=8 3x4=12 4x4=16
    1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
    1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
    1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
    1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
    1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

    for i in range(1,10,2):
        for j in range(13-i,2,-2):
            print(" ",end="")
        print(i*"*")
    

      

  • 相关阅读:
    IXmlSerializable With WCFData Transfer in Service Contracts
    Difference Between XmlSerialization and BinarySerialization
    Using XmlSerializer (using Attributes like XmlElement , XmlAttribute etc ) Data Transfer in Service Contracts
    Introducing XML Serialization
    Version Tolerant Serialization
    Which binding is bestWCF Bindings
    Data Transfer in Service Contracts
    DataContract KnownTypeData Transfer in Service Contracts
    Using the Message ClassData Transfer in Service Contracts
    DataContract POCO SupportData Transfer in Service Contracts
  • 原文地址:https://www.cnblogs.com/knighterrant/p/9886244.html
Copyright © 2011-2022 走看看