• python


    一、第一类对象
    1、函数名的运用
        函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量
        1、函数名的内存地址
    def func1():
        print('你是谁,你来自哪里')
    print(func1)
    # <function func1 at 0x000001256F021E18>

      2、函数名可以赋值给其他变量 

    def func1():
        print('这是函数1')
    # print(func1)
    res = func1 # 把函数当成一个变量赋值给另一个变量
    res() # 函数调用 func1()
    #  这是函数1

    3、函数名可以当作容器类的元素 

    def func1():
        print('大风吹1')
    
    def func2():
        print('大风吹2')
    
    def func3():
        print('大风吹3')
    
    def func4():
        print('大风吹4')
    
    lst = [func1,func2,func3,func4]
    for i in lst:
        i()

      4、函数名可以当作函数的参数进行传递 

    def func1():
        print('这两天降温了')
    
    def func2(fn):
        print('我是函数2')
        fn()
        print('我是函数2')
    
    func2(func1)

     

    def func1():
        print('哈哈')
    
    def func2():
        print('嘿嘿')
    
    def func3():
        print('呵呵')
    
    # 代理装饰器雏形
    def proxy( a ): # a 就是变量,形参
        print('我是代理')
    a()
    print('代理完毕')
    
    proxy(func1)
    proxy(func2)
    proxy(func3)

     5、函数名可以作为函数的返回值 

    def func1():
        print('这是函数1')
        def func2():
            print('这是函数2')
        return func2
    
    fn = func1() # 执行函数1,函数1返回的是函数2,这时fn之想的就是函数2
    fn() # 执行上面返回的函数(也就是函数2)
    二、闭包  -->函数的嵌套
     
       闭包就是内层函数,对外层函数(非全局)的变量的引用,
     
    闭包的优点:
        1、保护变量不被修改
        2、让一个变量常驻内存
    def wapper():
        name = '昂昂' # 局部变量常驻于内存
        def inner():
            print(name) # 在内层函数中调用外层函数的局部变量
         return inner # 返回内部函数名
    
    res = wapper() # res 是一个内层函数
    res() # res 就是inner,执行的时间不确定,必须保证里边的name存在
    # 写一个简易爬虫
    
    from urllib.request import urlopen
    # 去掉数字签名
    import ssl
    ssl._create_default_https_contest = ssl._create_unverified_context
    
    def func():
    #获取到网页中的内容,当网速很慢时,反复的去打开这个网站,会很慢
        content = urlopen("https://www.dytt8.net/";).read()
    
        def inner():
            return content.decode("gbk") # 网页内容
            return inner
    
    print('开始网络请求')
    ret = func() # 网络请求已经完毕
    print("网络请求完毕")
    print("第一次",ret()[30])
    print("第二次",ret()[30])
    查看是否闭包
         我们可以使用 __closure__ 来检测函数是否闭包,使用函数名.__closure__ 返回cell 就是闭包,但会None 就不是闭包
     
    不是闭包
    def wapper():
        name = 'xiaomeng'
    def inner():
        print('zhangying')
        print(inner.__closure__)
        inner()
    
    wapper()

    是闭包 

    def wapper():
        name = 'xiaomeng'
    def inner():
        print(name)
        print(inner.__closure__)  # (<cell at 0x000001B2D03086A8: str object at 0x000001B2D03A23F0>,)
        inner()
    
    wapper()
    三、迭代器  -->固定思路,for循环
     
        一个数据类型中包含了__iter__ 函数表示这个数据是可迭代的
     
     dir(数据):返回这个数据可执行的所有操作
    s = '你是谁啊'
    print(dir(s)) # 可以打印对象中的方法和函数
    print(dir(str)) # 可以打印类中申明的方法和函数
    判断迭代器和可迭代对象的方案
     
        __iter__    可迭代的
        
        __iter__   __next__  迭代器
     
    判断迭代器和可迭代对象的方案(官方)
     
        from collections import Iterable,Iterator
        isinstance(对象,Iterable) 是否是可迭代的   True  or  Fault
        isinstance(对象,Iterator) 是否是迭代器   True  or  Fault
     
    模拟for循环
    lst = [1, 2, 3]
    # 模拟for循环 for el in lst
    it = lst.__iter__() # 拿迭代器
    while 1: # 循环
        try: # 尝试
            it.__next__()
        except StopIteration: # 出现错误,意味着数据拿完了
            break # 结束循环
    迭代器一定可迭代,可迭代的东西,不一定是迭代器
     
    迭代器的特点:
     
        1、省内存(生成器)
        2、惰性机制
        3、只能向前,不能后退 
     
    作用:统一了各种数据类型的遍历
     
     
  • 相关阅读:
    面试话痨(四)常量在哪里呀,常量在哪里
    面试话痨(三)我会锁的四种配法,您配吗?
    面试话痨(二)C:JAVA String,别以为你穿个马甲我就不认识你了
    面试话痨(一)让我们来热切的讨论这个养猪场吧
    (JAVA)String类型的逻辑语句编译
    小白的REDIS学习(二)-链表
    小白的Redis学习(一)-SDS简单动态字符串
    mongo中的游标与数据一致性的取舍
    spring-data-mongodb与mongo shell的对应关系
    spring-data-mongodb 使用原生aggregate语句
  • 原文地址:https://www.cnblogs.com/1915823-huxt/p/10099230.html
Copyright © 2020-2023  润新知