zoukankan      html  css  js  c++  java
  • Python基础之函数

    一.函数对象,函数是第一类对象,即函数可以当做数据传递

    • 可以被引用
    • 可以当做参数传递
    • 返回值可以是函数
    • 可以当做容器类型的元素

    1.引用函数

    def foo():
        print('from foo')
    
    func=foo
    
    print(foo)
    print(func)
    func()
    """
    输出结果:
    <function foo at 0x0000018D8AC77F28>
    <function foo at 0x0000018D8AC77F28>
    from foo
    
    """
    

     2.当做参数传递

    def foo():
        print('from foo')
    
    def bar(func):
        print(func)
        func()
    
    bar(foo)
    """
    输出结果:
    <function foo at 0x0000018D8AC77F28>
    from foo
    
    """
    

     3.返回值为函数

    def foo():
        print('from foo')
    
    def bar(func):
        return func
    
    f=bar(foo)
    
    print(f)
    
    f()
    """
    输出结果:
    <function foo at 0x0000018D8AC77F28>
    from foo
    

     4.可以当做容器类型的元素

    def foo():
        print('from foo')
    dic={'func':foo}
    
    print(dic['func'])
    
    dic['func']()
    """
    输出结果:
    <function foo at 0x0000018D8AC77F28>
    from foo
    
    """
    

    二.函数嵌套

    1.将两个数字比较的函数嵌套进新函数进行4个数字比较

    def max2(x,y):
        return x if x > y else y
    
    def max4(a,b,c,d):
        res1=max2(a,b)
        res2=max2(res1,c)
        res3=max2(res2,d)
        return res3
    
    print(max4(10,99,31,22))
    """
    输出结果:
    99
    """
    

     2.函数嵌套的定义

    def f1():
        def f2():
            print('from f2')
            def f3():
                print('from f3')
            f3()
        f2()
    f1()
    """
    输出结果:
    from f2
    from f3
    """
    

    三.名称空间与作用域

    1.内置名称空间:随着python解释器的启动而产生

    print(max([1,2,3]))
    """
    输出结果:
    3
    """
    
    import builtins
    for i in dir(builtins):
        print(i)
    """
    输出结果:
    查看内置名称空间
    """
    

    2.全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入改空间

    x=2
    def func():
        money=2000
        x=2
        print('func')
    print(x)
    print(func)
    func()
    func()
    print(x)
    """
    输出结果:
    func
    func
    2
    """
    

     3.局部名称空间:调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用结束解绑定

    x=10000
    def func():
        x=1
        def f1():
            pass
    

     4.作用域:

      全局作用域:内置名称空间,全局名层空间。

      局部作用:局部名称空间。

    a.名字的查找顺序:局部名称空间---》全局名层空间---》内置名称空间

    x=1
    def func():
        x=2
        print(x)
        sum=123123
        print(sum)
    func()
    """
    输出结果:
    2
    123123
    """
    

     b.查看全局作用域内的名字:gloabls(),查看局局作用域内的名字:locals()

    x=1000
    def func():
        x=2
    
    print(globals())
    
    print(locals())
    print(globals() is locals())
    """
    输出结果:
    Ture
    """
    
    x=1000
    def func(y):
        x=2
        print(locals())
        print(globals())
    func(1)
    

     c.全局作用域与局部作用域

      全局作用域:全局有效,在任何位置都能被访问到,除非del删掉,否则会一直存活到文件执行完毕
      局部作用域的名字:局部有效,只能在局部范围调用,只在函数调用时才有效,调用结束就失效

    x=1
    def foo():
        print(x)
    foo()
    def f(x):
        # x=4
        def f2():
            x=3
            print(x)
            def f3():
                x=2
                print(x)
            f3()
        f2()
    f(4)
    """
    输出结果:
    1
    3
    2
    """
    

    四.闭包函数

    • 定义在函数内部
    • 包含对外部作用域而非全局作用域的引用
    def f1():
        x = 1
        def f2():
            x = 5
            print(x)
    
        return f2
    
    f=f1()
    f()
    """
    输出结果:
    5
    """
    

     2.闭包应用:惰性计算

    from urllib.request import urlopen
    
    def index(url):
        def get():
            return urlopen(url).read()
    
        return get
    
    res=index('http://www.baidu.com')
    
    print(res().decode('utf-8'))
    # 查看闭包元素
    print(res.__closure__[0].cell_contents)
    

    五.装饰器

    • 修饰别人的工具,修饰添加功能,工具指的是函数。
    • 装饰器本身可以是任何可调用对象,被装饰的对象也可以是任意可调用对象

    1.无参装饰器

    import time
    
    def timmer(func):
        def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            stop_time=time.time()
            print('run time is %s' %(stop_time-start_time))
        return wrapper
    
    @timmer
    def index():
    
        time.sleep(3)
        print('welcome to index')
    
    index()
    

     2.有参装饰器

    login_user={'user':None,'status':False}
    def auth(func):
        def wrapper(*args,**kwargs):
            if login_user['user'] and login_user['status']:
                res=func(*args,**kwargs)
                return res
            else:
                name=input('>>: ')
                password=input('>>: ')
                if name == 'json' and password == '123':
                    login_user['user']='json'
                    login_user['status']=True
                    print('33[45mlogin successful33[0m')
                    res=func(*args,**kwargs)
                    return res
                else:
                    print('33[45mlogin err33[0m')
        return wrapper
    
    @auth
    def index():
        print('welcome to index page')
    @auth
    def home(name):
        print('%s welcome to home page' %name)
    index()
    home('json')
    '''
    输出结果:
    login successful
    welcome to index page
    json welcome to home page
    '''
    

    六.迭代器

    (1)迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束。迭代器只能往前不会后退.

    (2)对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。迭代器更大的功劳是提供了一个统一的访问集合的接口,只要定义了__iter__()方法对象,就可以使用迭代器访问。

    1.next  进行遍历

    list = [1, 2, 3, 4]
    it = iter(list)  # 创建迭代器对象
    
    while True:
        try:
            print(next(it))
        except StopIteration:
            break
    

     2.__next__() 返回迭代器的下一个元素

    names = iter(['json','nickle','alex'])
    print(names)
    print(names.__next__())
    print(names.__next__())
    print('暂停')
    print(names.__next__())
    '''
    输出结果:
    <list_iterator object at 0x000001FF1BB1A8D0>
    json
    nickle
    暂停
    alex
    '''
    

     3.__iter__()返回迭代器对象本身

    names = iter(['json','nickle','alex'])
    print(names.__iter__())
    '''
    输出结果:
    <list_iterator object at 0x000001ED14FFAD30>
    暂停
    alex
    '''
    

    七.生成器

    定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器

    yield的功能:

        ①相当于为函数封装好__iter__和__next__;

        ②每次遇到 yield 时,挂起函数的运行状态,返回yield的值。并在下一次执行 next()方法时,从当前位置继续运行。

    注意事项:生成器只能遍历一次

    def grep(pattern, lines):
        for line in lines:
            if pattern in line:
                yield line
    g = grep('python', tail('a.txt'))
    print(g)
    
    for i in g:
        print(i)
    

    八.内置函数

    1.abs( ):返回数字的绝对值

    print(abs(-222))
    

     2.all()集合中的函数如都为真返回True

    lis = [1,2,3]
    print(all(lis)) # True
    

    3.any()list中的元素一个为真时,返回True,空返回False

    lis = [1,2,3]
    a = []
    print(any(lis)) # True
    print(any(a)) # False
    

     4.chr()返回整数对应的Ascii对应的字符

    print(chr(66))  # B
    

     5.ord()将整数返回字符对应的ASC编码

    print(ord('B'))
    

     6.bin()将整数转换为二进制字符串

    print(bin(77))  # 0b1001101
    

    7. bool(x)返回x的布尔值

    print(bool(0))   # False   
    print(bool(1))  # True
    

     8.dir()不带参数时,返回当前范围内的变量、方法和定义的类型列表,带参数时,返回参数的属性、方法列表

    print(dir())
    print(dir(list))
    

     9.divmod()分别取商和余数

    print(divmod(66,7))
    '''
    输出结果:
    (9, 3)
    '''
    

     10.enumerate()返回一个可枚举的对象,该对象的next()方法将返回一个tuple

    lis = ["json", "nickle", "lyl"]
    for m, n in enumerate(lis):
        print(m,n)
    '''
    输出结果:
    0 json
    1 nickle
    2 lyl
    '''
    

     11.eval()将字符串str当成有效的表达式来求值并返回计算结果。

    lis = '[{"json": 20}, {"nickle":90}, {"lyl": 70}]'
    name = eval(lis)
    print(name)
    '''
    输出结果:
    [{'json': 20}, {'nickle': 90}, {'lyl': 70}]
    '''
    

     12.filter(function, iterable):过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的生成器(py2返回序列)

    • function---判断函数
    • iterable---可迭代对象
    newlist = filter(None, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    for i in newlist:
        print(i)
    

     13.float([x]):将整数和字符串转换成浮点数

    print(float(88))
    print(float(123))
    '''
    输出结果:
    88.0
    123.0
    '''
    

     14.dict():创建一个字典

    print(dict(a = "1", b = "2"))
    '''
    输出结果:
    {'a': '1', 'b': '2'}
    '''
    

     15.id()返回对象地址

    print(id("uhuh"))
    '''
    输出结果:
    2926276336752
    '''
    

     16.callable(object):检测一个对象是否是可调用的

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

    def add(a, b):
        return a + b
    print(callable(add))  
    print(callable("abc"))
    '''
    输出结果:
    True
    False
    '''
    
  • 相关阅读:
    java接口工厂模式理解
    ViewDragHelper的点击事件处理
    ViewDragHelper的使用
    路径跟踪 PathMeasure的简单使用
    view事件分发源码理解
    layoutInflater参数解析与源码分析
    安卓menu的介绍与使用
    安卓广播api介绍,给自己理清楚概念
    动态删除集合遇到的一些问题理解
    【翻译】借助 NeoCPU 在 CPU 上进行 CNN 模型推理优化
  • 原文地址:https://www.cnblogs.com/Crazy-lyl/p/6914714.html
Copyright © 2011-2022 走看看