• 内置函数与匿名函数


    内置函数

    截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。它们就是python提供给你直接可以拿来使用的所有函数。

      Built-in Functions  
    abs() dict() help() min() setattr()
    all() dir() hex() next() slice()
    any() divmod() id() object() sorted()
    ascii() enumerate() input() oct() staticmethod()
    bin() eval() int() open() str()
    bool() exec() isinstance() ord() sum()
    bytearray() filter() issubclass() pow() super()
    bytes() float() iter() print() tuple()
    callable() format() len() property() type()
    chr() frozenset() list() range() vars()
    classmethod() getattr() locals() repr() zip()
    compile() globals() map() reversed() __import__()
    complex() hasattr() max() round()  
    delattr() hash() memoryview() set()  

    详细的功能说明请参阅:http://www.runoob.com/python/python-built-in-functions.html

    作用域相关

    globals()

    获取全局变量的字典

    locals()

    获取执行本方法所在命名空间内的局部变量的字典

    字符串类型代码的执行

    字符串类型执行相关

    eval()

    功能:将字符串str当成有效的表达式来求值并返回计算结果。
    语法: eval(source[, globals[, locals]]) -> value
    参数:source:一个Python表达式或函数compile()返回的代码对象globals:可选。 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。locals:可选。 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
    可以把list,tuple,dict和string相互转化。
    #################################################
    字符串转换成列表
    a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
    type(a)
    # <type 'str'>
    b = eval(a)
    print(b)
    # [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
    type(b)
    # <type 'list'>
    #################################################
    字符串转换成字典
    a = "{1: 'a', 2: 'b'}"
    type(a)
    # <type 'str'>
    b = eval(a)
    print(b)
    #{1: 'a', 2: 'b'}
    type(b)
    # <type 'dict'>
    #################################################
    字符串转换成元组
    a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
    type(a)
    # <type 'str'>
    b = eval(a)
    print (b)
    ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
    type(b)
    # <type 'tuple'># 计算公式值x = 7 eval( '3 * x' ) # 21 eval('pow(2,2)') # 4eval('2 + 2') # 4
    View Code

    exec()

    功能: exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。

    语法:    exec(object[, globals[, locals]])

     参数:  object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果                            object是一个code对象,那么它只是被简单的执行。

    globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。

     locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。

    exec 返回值永远为 None。

    >>>exec('print("Hello World")')
    Hello World
    # 单行语句字符串
    >>> exec("print ('runoob.com')")
    runoob.com
     
    #  多行语句字符串
    >>> exec ("""for i in range(5):
    ...     print ("iter time: %d" % i)
    ... """)
    iter time: 0
    iter time: 1
    iter time: 2
    iter time: 3
    iter time: 4
    
    
    x = 10
    expr = """
    z = 30
    sum = x + y + z
    print(sum)
    """
    def func():
        y = 20
        exec(expr)
        exec(expr, {'x': 1, 'y': 2})
        exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
        
    func()
    60
    33
    34
    

      

    code = '''
    import os 
    print(os.path.abspath('.'))
    '''
    code = '''
    print(123)
    a = 20
    print(a)
    '''
    a = 10
    exec(code,{'print':print},)
    print(a)

    compile()

    将字符串类型的代码编译,代码对象能够通过exec语句来执行或者eval()进行求值

    参数说明:   

    1. 参数source:字符串或者AST(Abstract Syntax Trees)对象。即需要动态执行的代码段。  

    2. 参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。当传入了source参数时,filename参数传入空字符即可。  

    3. 参数model:指定编译代码的种类,可以指定为 ‘exec’,’eval’,’single’。当source中包含流程语句时,model应指定为‘exec’;当source中只包含一个简单的求值表达式,model应指定为‘eval’;当source中包含了交互式命令语句,model应指定为'single'。

    >>> #流程语句使用exec
    >>> code1 = 'for i in range(0,10): print (i)'
    >>> compile1 = compile(code1,'','exec')
    >>> exec (compile1)
    1
    3
    5
    7
    9
    
    >>> #简单求值表达式用eval
    >>> code2 = '1 + 2 + 3 + 4'
    >>> compile2 = compile(code2,'','eval')
    >>> eval(compile2)
    
    
    >>> #交互语句用single
    >>> code3 = 'name = input("please input your name:")'
    >>> compile3 = compile(code3,'','single')
    >>> name #执行前name变量不存在
    Traceback (most recent call last):
      File "<pyshell#29>", line 1, in <module>
        name
    NameError: name 'name' is not defined
    >>> exec(compile3) #执行时显示交互命令,提示输入
    please input your name:'pythoner'
    >>> name #执行后name变量有值
    "'pythoner'"
    View Code 

    输入输出相关

    input() 

    s = input("请输入内容 : ")  #输入的内容赋值给s变量
    print(s)  #输入什么打印什么。数据类型是str
    View Code

    print() 

    def print(self, *args, sep=' ', end='
    ', file=None): # known special case of print
        """
        print(value, ..., sep=' ', end='
    ', file=sys.stdout, flush=False)
        file:  默认是输出到屏幕,如果设置为文件句柄,输出到文件
        sep:   打印多个值之间的分隔符,默认为空格
        end:   每一次打印的结尾,默认为换行符
        flush: 立即把内容输出到流文件,不作缓存
        """
    
    import time
    for i in range(0,101,2):  
         time.sleep(0.1)
         char_num = i//2      #打印多少个'*'
         per_str = '
    %s%% : %s
    ' % (i, '*' * char_num) if i == 100 else '
    %s%% : %s'%(i,'*'*char_num)
         print(per_str,end='', flush=True)
    
    # 
     可以把光标移动到行首但不换行

    类与对象相关

    type() 

    返回变量的数据类型

    id()

    返回一个变量的内存地址

    hash() 

    返回一个可hash变量的哈希值,不可hash的变量被hash之后会报错。

    t = (1,2,3)
    l = [1,2,3]
    print(hash(t))  #可hash
    print(hash(l))  #会报错
    
    '''
    结果:
    TypeError: unhashable type: 'list'
    '''
    View Code

    hash函数会根据一个内部的算法对当前可hash变量进行处理,返回一个int数字。

    *每一次执行程序,内容相同的变量hash值在这一次执行过程中不会发生改变。

    basestring()

    方法是 str 和 unicode 的超类(父类),也是抽象类,因此不能被调用和实例化,但可以被用来判断一个对象是否为 str 或者 unicode 的实例,isinstance(obj, basestring) 等价于 isinstance(obj, (str, unicode))。

    没有返回值

    bool()

    函数用于将给定参数转换为布尔类型,如果没有参数,返回 False。

    bool 是 int 的子类。

    >>> issubclass(boolint) # bool 是 int 子类 True

    bytearray() 方法返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。

    callable() 

    函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。

    对于函数, 方法, lambda 函式, 类, 以及实现了 __call__ 方法的类实例, 它都返回 True。 

    cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。

    delattr() 

    用于删除属性。

    delattr(x, 'foobar') 相等于 del x.foobar

    dir()

    函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息

    返回模块的属性列表

    getattr()

    函数用于返回一个对象属性值

    getattr 语法:

    getattr(object, name[, default])
    • object -- 对象。
    • name -- 字符串,对象属性。
    • default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。

    hasattr()

    函数用于判断对象是否包含对应的属性

    文件操作相关

    open() 

    打开一个文件,返回一个文件操作符(文件句柄)

    操作文件的模式有r,w,a,r+,w+,a+ 共6种,每一种方式都可以用二进制的形式操作(rb,wb,ab,rb+,wb+,ab+)

    可以用encoding指定编码.

    模块操作相关

    __import__

    导入一个模块

    import time
    os = __import__('os')
    print(os.path.abspath('.'))

    帮助相关

    help()

    在控制台执行help()进入帮助模式。可以随意输入变量或者变量的类型。输入q退出

    或者直接执行help(o),o是参数,查看和变量o有关的操作。。。

    调用相关

    callable()

    看这个变量是不是可调用。

    如果参数是一个函数名,就会返回True

    def func():pass
    print(callable(func))  #参数是函数名,可调用,返回True
    print(callable(123))   #参数是数字,不可调用,返回False
    View Code

    查看参数所属类型的所有内置方法

    dir() 

    内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回,默认查看全局空间内的属性,也接受一个参数,查看这个参数内的方法或变量

    print(dir(list))  #查看列表的内置方法
    print(dir(int))  #查看整数的内置方法
    
    >>> import fibo, sys
    >>> dir(fibo)
    ['__name__', 'fib', 'fib2']
    >>> dir(sys)  
    ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
     '__package__', '__stderr__', '__stdin__', '__stdout__',
     '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
     '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
     'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
     'call_tracing', 'callstats', 'copyright', 'displayhook',
     'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
     'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
     'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
     'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
     'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
     'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
     'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
     'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
     'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
     'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
     'thread_info', 'version', 'version_info', 'warnoptions']
    
    如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:
    >>> a = [1, 2, 3, 4, 5]
    >>> import fibo
    >>> fib = fibo.fib
    >>> dir() # 得到一个当前模块中定义的属性列表
    ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
    >>> a = 5 # 建立一个新的变量 'a'
    >>> dir()
    ['__builtins__', '__doc__', '__name__', 'a', 'sys']
    >>>
    >>> del a # 删除变量名a
    >>>
    >>> dir()
    ['__builtins__', '__doc__', '__name__', 'sys']
    >>>
    View Code

    数字相关

    数字——数据类型相关

    bool

    int

    float

    complex()

    函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。

    数字——进制转换相关

    bin()

    返回一个整数int 或者长整数 long int 的二进制表示

    oct

    hex

    数字——数学运算

    abs()

    函数返回数字的绝对值

    divmod

    () 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。

    在 python 2.3 版本之前不允许处理复数

    ,min,max,sum,round,pow

    数据结构相关

    list

    tuple

    str

    format

    bytes

    bytearry

    memoryview

    ord

    chr

    ascii

    repr

    ret = bytearray('alex',encoding='utf-8')
    print(id(ret))
    print(ret[0])
    ret[0] = 65
    print(ret)
    print(id(ret))
    View Code
    ret = memoryview(bytes('你好',encoding='utf-8'))
    print(len(ret))
    print(bytes(ret[:3]).decode('utf-8'))
    print(bytes(ret[3:]).decode('utf-8'))
    View Code

    reversed

    slice

    l = (1,2,23,213,5612,342,43)
    print(l)
    print(list(reversed(l)))
    View Code
    l = (1,2,23,213,5612,342,43)
    sli = slice(1,5,2)
    print(l[sli])
    View Code

    dict

    set

    frozenset()
    功能:返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。

    语法:class frozenset([iterable])

    参数: iterable – 可迭代的对象,比如列表、字典、元组等等 

    返回新的 frozenset 对象,如果不提供任何参数,默认会生成空集合。

    示例:

    >>> a = frozenset(range(10))
    # 生成一个新的不可变集合
    >>> a
    frozenset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> b = frozenset('runoob')
    >>> b
    frozenset(['b', 'r', 'u', 'o', 'n'])
    View Code

    匿名函数lambda

    匿名函数:为了解决那些功能很简单的需求而设计的一句话函数

    #这段代码
    def calc(n):
        return n**n
    print(calc(10))
     
    #换成匿名函数
    calc = lambda n:n**n
    print(calc(10))
    View Code
    函数名 = lambda 参数 :返回值
    
    #参数可以有多个,用逗号隔开
    #匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
    #返回值和正常的函数一样可以是任意数据类型
    View Code

    我们可以看出,匿名函数并不是真的不能有名字。

    匿名函数的调用和正常的调用也没有什么分别。 就是 函数名(参数) 就可以了~~~

    练一练:

    请把以下函数变成匿名函数
    def add(x,y):
        return x+y
    
    res=lambda x,y:x+y
    print(res(1,3))
    View Code

    上面是匿名函数的函数用法。除此之外,匿名函数也不是浪得虚名,它真的可以匿名。在和其他功能函数合作的时候

    数据集合

    len()

    max()

    salaries = {
        'egon': 3000,
        'alex': 100000000,
        'wupeiqi': 10000,
        'yuanhao': 2000
    }
    
    # nums=[10,-1,11,9,23]
    # print(max(nums))
    # print(max(salaries.values()))
    
    # key=函数的内存地址: 作用是控制max函数的比较的值
    # def func(k):
    #     return salaries[k]
    
    # print(max(salaries,key=func))
    # 1. 将可迭代对象salaries变成迭代器对象iter_obj
    # 2. next(iter_obj)得到一个人名,然后将该人名当作参数传给key指定的函数,
    #    然后调用函数将函数的返回值当作比较依据
    # 3. 比较大小,取出最大值对应的人名
    # print(max(salaries,key=lambda k:salaries[k]))
    # print(min(salaries,key=lambda k:salaries[k]))
    View Code

    sorted()

    功能: 对List、Dict进行排序,Python提供了两个方法
               对给定的List L进行排序,
              方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本
              方法2.用built-in函数sorted进行排序(从2.4开始),返回副本,原始输入不变

    语法:sorted(iterable, key=None, reverse=False)

    参数说明:
            iterable:是可迭代类型;
            key:传入一个函数名,函数的参数是可迭代类型中的每一项,根据函数的返回值大小排序;
            reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,有默认值。
    返回值:有序列表

    sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作

    列表按照其中每一个值的绝对值排序
    
    l1 = [1,3,5,-2,-4,-6]
    l2 = sorted(l1,key=abs)
    print(11)
    print(12)
    
    列表按照每一个元素的len排序
    
    l = [[1,2],[3,4,5,6],(7,),'123']
    print(sorted(l,key=len))
    
    与匿名函数一起使用
    nums=[10,-1,11,9,23]
    print(sorted(nums))
    print(nums)
    
    salaries={
    'egon':3000,
    'alex':100000000,
     'wupeiqi':10000,
    'yuanhao':2000
    }
    print(sorted(salaries,key=lambda k:salaries[k]))
    print(sorted(salaries,key=lambda k:salaries[k],reverse=True))
    View Code

    enumerate()

    函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

    Python 2.3. 以上版本可用,2.6 添加 start 参数

    list(enumerate(seasonsstart=1)) # 下标从 1 开始 [(1'Spring')(2'Summer')(3'Fall')(4'Winter')]

    all()

    函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。

    如果iterable的所有元素不为0、''、False或者iterable为空,all(iterable)返回True,否则返回False;

    注意:空元组、空列表返回值为True,这里要特别注意。

    any()

    函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。

    元素除了是 0、空、FALSE 外都算 TRUE。

    如果都为空、0、false,则返回false,如果不都为空、0、false,则返回true。

    zip()

    函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

    如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

    zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

    返回元组列表

    map()

    功能:会根据提供的函数对指定序列做映射。
                     第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

    语法:map(function, iterable, ...)

    参数:function -- 函数
              iterable -- 一个或多个序列
                 
    返回值:
                   Python 2.x 返回列表。
                   Python 3.x 返回迭代器

    Python中的map函数应用于每一个可迭代的项,返回的是一个结果list。如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理。map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
    
    有一个list, L = [1,2,3,4,5,6,7,8],我们要将f(x)=x^2作用于这个list上,那么我们可以使用map函数处理。
    
    
    >>> L = [1,2,3,4,] 
    >>> def pow2(x): 
    ... return x*x 
    ... 
    >>> list(map(pow2,L))
    [1, 4, 9, 16] 
    View Code

    reduce()

    功能:reduce() 函数会对参数序列中元素进行累积。

    语法:reduce(function, iterable[, initializer])

    参数:    function -- 函数,有两个参数

                iterable -- 可迭代对象
                initializer -- 可选,初始参数
    返回值: 返回函数计算结果
           函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

    方式一:手动实现
    res=0
    for i in range(101):
     res+=i
     print(res)
    
    方式二:列表生成式
    print(sum([i for i in range(101)]))
    
    方式三:reduce+匿名函数
    from functools import reduce
    print(reduce(lambda x,y:x+y,[i for i in range(101)],100))
    print(reduce(lambda x,y:x+y,[i for i in range(101)]))
    print(reduce(lambda x,y:x+y,['h','e','l','l','o'],'----------'))
    View Code

    filter()

    功能:  函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

    语法 :    filter(function, iterable)
    参数:  function -- 判断函数。
                 iterable -- 可迭代对象。
    接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
    注意: Pyhton2.7 返回列表,Python3.x 返回迭代器对象

    例如,要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:
    
    def is_odd(x):
      return x % 2 == 1
    然后,利用filter()过滤掉偶数:
    
    >>>list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17]))
    
    输出  [1, 7, 9, 17]
    利用filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:
    
    def is_not_empty(s):
      return s and len(s.strip()) > 0
    >>>list(filter(is_not_empty, ['test', None, '', 'str', ' ', 'END']))
    
    输出    ['test', 'str', 'END']
    注意: s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。
    
    当rm为空时,默认删除空白符(包括'
    ', '
    ', '	', ' '),如下:
    
    >>> a = ' 123'
    >>> a.strip()
    '123'
    
    >>> a = '		123
    '
    >>> a.strip()
    '123'
    
    练习:请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    
    方法:
    import math
    def is_sqr(x):
      return math.sqrt(x) % 1 == 0
    print(list(filter(is_sqr, range(1, 101))))
    
    结果:
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    
    与匿名函数一起使用
    res = filter(lambda x:x>10,[5,8,11,9,15])
    for i in res:
        print(i)
    
    输出
    11
    View Code

    匿名函数应用中遇到的大坑:

    li = [lambda :x  for x in range(10)]
    res = li[0]()
    print(res)
    
    输出都是:9(所有都是返回9,如res = li[1]() --> 9)
    
    首先,需要解释一些基本知识:
    函数在定义的时候,并没有分配内存空间用来保存任何变量的值,只有在执行的时候,才会分配空间,保存变量的值。
    然后,这是一个列表解析表达式,每个元素都是一个函数,每个函数返回的是x的值。
    所以,这是一个列表,有10个元素,每个元素都是一个函数,函数体是返回x的值,前面说过,没有执行的时候,x是没有值的。
    
    所以,当去执行这个列表中的某个函数的时候,函数就去取这个x的值,那么x的值已经变为9了。因为for循环执行完毕了,x最后变成了9。
    
    循环在python中是没有作用域的概念的,这里的10个函数都会(都可以)引用同一个x(for的那个x),所以在向列表中添加func的时候,并没有保存 i 的值,而是当执行函数( li[0]())的时候才去取,这时候循环已经结束,i 的值是 9,所以结果都是9。
    即是:li这个列表只是有10个函数,而每个函数体的x变量,引用的都是for的那个x,而for的这个x最后变成了9。
    
    再进一步解释循环的作用域问题:
    当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:
    本地作用域(Local)→外围作用域——即当前作用域是一个内嵌作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)。
    全局作用域(Global)就是模块内的作用域,他的作用范围是单一文件内。
    
    也就是说for循环中的target list(for x in range(10) x 就是target list)在循环结束中并未被删除,可以被后续程序直接使用。但除一种情况外:循环序列为空时,target list根本不会被赋值。
    
    PYTHON的作用域由def、class、lambda等语句产生,iftry、for等语句并不会产生新的作用域。变量名引用分为三个作用域进行查找:首先是本地,然后是函数内(如果有的话),之后是全局,最后是内置。
    View Code
    flist=[]
    for i in range(3):
      def makefunc(i):
        def func(x):
          return x*i
        return func
      flist.append(makefunc(i))
    
    for f in flist:
      print (f(2))
    
    在func外面再定义一个makefunc函数,func形成闭包,结果就正确了。
    输出:0   2   4 。就是利用闭包技术,保存 i 的值。
    所以,记得:返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
    如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变。
    利用闭包技术保存i的值

    其他内置函数

    execfile()

    函数可以用来执行一个文件

    frozenset()

    返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。

    frozenset() 函数语法

    class frozenset([iterable])

    hash()

    用于获取取一个对象(字符串或者数值等)的哈希值

    locals()

    函数会以字典类型返回当前位置的全部局部变量。

    对于函数, 方法, lambda 函式, 类, 以及实现了 __call__ 方法的类实例, 它都返回 True

    >>>def runoob(arg): # 两个局部变量:arg、z ... z = 1 ... print (locals()) ... >>> runoob(4) {'z': 1, 'arg': 4} # 返回一个名字/值对的字典

    pow()

    方法返回 xy(x的y次方) 的值

    repr() 函数将对象转化为供解释器读取的形式

    round() 方法返回浮点数x的四舍五入值

    setattr() 函数对应函数 getattr(),用于设置属性值,该属性必须存在

    >>>class A(object): ... bar = 1 ... >>> a = A() >>> getattr(a, 'bar') # 获取属性 bar 值 1 >>> setattr(a, 'bar', 5) # 设置属性 bar 值 >>> a.bar 5

    slice() 函数实现切片对象,主要用在切片操作函数里的参数传递

    slice 语法:

    class slice(stop)
    class slice(start, stop[, step])

    super()

    函数是用于调用父类(超类)的一个方法。

    super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

    MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表

    Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :

    Python3.x 实例:

    class A:
        pass
    class B(A):
        def add(self, x):
            super().add(x)

    vars()

    函数返回对象object的属性和属性值的字典对象

    返回对象object的属性和属性值的字典对象,如果没有参数,就打印当前调用位置的属性和属性值 类似 locals()

    面试题

    现有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]

    答案一
    test = lambda t1,t2 :[{i:j} for i,j in zip(t1,t2)]
    print(test(t1,t2))
    答案二
    print(list(map(lambda t:{t[0]:t[1]},zip(t1,t2))))
    还可以这样写
    print([{i:j} for i,j in zip(t1,t2)])
    

      

  • 相关阅读:
    WP7中HttpWebRequest的使用方法之GET方式
    C#使用技巧之调用JS脚本方法一
    SQL Server Date 函数之CONVERT()
    C#日期格式化和数字格式化
    C#使用技巧之调用JS脚本方法二
    Win8的RSS阅读器
    yield
    浮点类型(float、double)在内存中的存储
    从<<CSS禅意花园>>中学到的用户界面设计原则
    The First Essay
  • 原文地址:https://www.cnblogs.com/596014054-yangdongsheng/p/9739509.html
Copyright © 2020-2023  润新知