【深度之眼五——(1)】Python:有益的探索

目录

 一,数据类型的底层实现

 1错综复杂的复制

1.1列表的底层实现

1.1.1新增元素

 1.1.2修改元素

 1.2.3对列表型元素进行操作

  1.1.3对元组型元素进行操作

   1.1.4对字典型元素进行操作

        深拷贝

1.2 神秘的字典

1.2.1 快速的查找

 1.2.2 字典的底层实现

 1.3字符串

 1.4是否可变

不可变类型:数字,字符串,元组        

 可变类型:列表,字典,集合

 1.5 列表操作的小例子

 二,更加简洁的语法

2.1解析语法

 2.1.1 基本结构

 2.1.2 其他解析语法的例子

 2.2 条件表达式

 三,三大神器

3.1  生成器

 3.1.1 生成器表达式

 3.1.2 生成器函数——yield

  3.2 迭代器

3.2.1 可迭代对象

3.3 装饰器

3.3.1 目的

 3.3.2 函数对象

 3.3.3 高阶函数

 3.3.4 嵌套函数

 3.3.5 闭包

 3.3.6简单的装饰器

 知识回顾


本章导读

 一,数据类型的底层实现

 1错综复杂的复制

 

·浅拷贝

 ·对浅拷贝前后列表分别进行操作

 

1.1列表的底层实现

 

 

1.1.1新增元素

 1.1.2修改元素

 

 1.2.3对列表型元素进行操作

 

 

  1.1.3对元组型元素进行操作

   1.1.4对字典型元素进行操作

 和列表差不多

总结:像列表和字典,是可变的,地址可以不变,内容变化,而像元组那样的不可变类型,内容变时,地址也发生了响应的变化

 所以引入

        深拷贝

 

1.2 神秘的字典

1.2.1 快速的查找

 

 

 1.2.2 字典的底层实现

通过稀疏数组来实现值的存储与访问

字典的创造过程

·第一步:创建一个散列表(稀疏数组N>>n)

 

 第一步:通过hash()计算键的散列值

 

 

键值对的访问过程

 

         

 

 1.3字符串

数组

 1.4是否可变

不可变类型:数字,字符串,元组        

生命周期中保持不变

换句话说,改变了就不是自己了

不可变对象+=操作 实际创建了一个新的对象

 

 元组不是总是不可变的

元组有可变元素时可变3

 可变类型:列表,字典,集合

 

 

 1.5 列表操作的小例子

【例1】 删除列表里的元素

 

 

出现这个原因说因为使用remove函数的时候,会删除第一个出现的d,比如第一次使用的时候,出现了d,删除第一个d,在第二次for循环时候,会访问第二个地址元素,但因为第一个d被删除了,所以实际访问的是第三个d,以此类推

 

 【例2】多维列表的创建

 二,更加简洁的语法

2.1解析语法

 

 2.1.1 基本结构

 

 

 

 

 

 

 2.1.2 其他解析语法的例子

 

 

 

 2.2 条件表达式

 

 三,三大神器

3.1  生成器

 

 3.1.1 生成器表达式

        ·海量数据,不需储存

 

 3.1.2 生成器函数——yield

·生产斐波那契数列 :数列前两个元素 之和   为后元素

 

 

 

  3.2 迭代器

3.2.1 可迭代对象

可以直接用for循环的对象统称可迭代对象

 

 

 

 

 

 

 

 

 

enumerate能讲元素的位置信息和他本身进行组合,生成一个元组

 

 

 第二次在迭代就迭代不出来了

 

而且不可以被耗尽

 

3.3 装饰器

3.3.1 目的

 

 

 3.3.2 函数对象

 

 3.3.3 高阶函数

 

 3.3.4 嵌套函数

 

 3.3.5 闭包

 

 

 

会报错

解决方法

 3.3.6简单的装饰器

 

语法糖

 

装饰有参函数

有返回值函数

 

 带参数的修饰器

 

 

def timer(method):
    
    def outer(func):
        
        def inner(*args,**kwargs):
            print("inner")
            if method == "origin":
                print("origin")
                start = time.time()
                res = func(*args,**kwargs)
                end = time.time()
                print("{}:{:.2f}s".format(func.__name__,(end-start)))
            elif method == "double":
                print("double")
                start = time.time()
                res = func(*args,**kwargs)
                end = time.time()
                print("{}:{:.2f}s".format(func.__name__,2*(end-start)))
            return res
        return inner
    return outer
@timer(method="origin") # 相当于timer =timer(method="origin")f1=timer(f1)
def f1(n):
    print("f1 run")
    time.sleep(n)
    return "wake up"

@timer(method="double") # 相当于timer =timer(method="double")f2=timer(f2)
def f2(n):
    print("f2 run")
    time.sleep(n)
    return " up"

f1(1)
f2(2)

何时执行

        ·一装饰就执行,不必等调用

回归本源

        ·原函数属性被覆盖

 

        ·回来

通过这个可以使原函数的属性给弄回来

 知识回顾

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值