笔记

  • 三次握手最后一次失败时

    失败时服务器并不会重传ACK报文,而是直接发送RTS报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。

  • 关于python装饰器

    python装饰器本质上就是一个函数,最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑。python装饰器有很多经典的应用场景,比如:插入日志、性能测试、事务处理、权限校验等。装饰器是解决这类问题的绝佳设计。

如下以为函数添加计时功能,讲述装饰器

import time
 
def decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        func()
        end_time = time.time()
        print(end_time - start_time)
 
    return wrapper
 
@decorator 
def func():
    time.sleep(0.8)
 
func() # 函数调用
# 输出:0.800644397735595

这里用到了闭包函数概念:

闭包函数定义:1.函数内部定义的函数;2.引用了外部变量但非全局变量

在上面代码中 func是我要装饰器的函数,我想用装饰器显示func函数运行的时间。@decorator这个语法相当于 执行 func = decorator(func),为func函数装饰并返回。在来看一下我们的装饰器函数 - decorator,该函数的传入参数是func (被装饰函数),返回参数是内层函数。这里的内层函数-wrapper,其实就相当于闭包函数,它起到装饰给定函数的作用,wrapper参数为*args, **kwargs。*args表示的参数以列表的形式传入;**kwargs表示的参数以字典的形式传入:

参考链接:https://blog.csdn.net/nawenqiang/article/details/79836609

  • 迭代器

(1)迭代器可以记住遍历位置,常用作访问集合元素,迭代器从第一个元素开始访问,一直到最后一个,且只会往前不会后退

(2)迭代器有两个方法:iter()方法和next()方法

(3)字符串,列表或元组对象都可用于创建迭代器:如下例子

迭代器好处:使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。

  • 生成器

生成器是一个返回迭代器的函数,只能用于迭代操作,使用了 yield(一个或多个) 的函数被称为生成器(generator)

也可用()创建生成器,如:

gen = (x for x in range(5)) print(gen) #output: <generator object <genexpr> at 0x0000000000AA20F8>

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

迭代器好处:不会计算它每一个项的值,他们只会等你访问这些项的时候采取计算,如此对比大量数据集来说(一次性读取占内存很大),节约了内存资源。

入选利用生成器生成斐波那契数列:F[n]=F[n-1]+F[n-2](n>=3,F[1]=1,F[2]=1)

def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b  #a,b = b ,a+b  其实相当于 t =a+b ,a =b ,b =t 
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()
    

分析:每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行

结果为:

生成器理解:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

  • 深拷贝和浅拷贝

几乎可以说,Python 没有"变量",我们平时所说的变量其实只是"标签",是引用。

浅拷贝

copy模块里面的copy方法实现

1.对于不可变类型(Number,String,Tuple),浅复制仅仅是地址指向,不会新开辟空间

2.对于可变类型(List,Dictionary,Set),浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝

3.浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象的;改变原始对象中为不可变类型的元素的值,只有原始类型受影响

深拷贝:

copy模块里面的deepcopy方法实现

  • 1、浅拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝)
  • 2、经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了,相互独立不影响

参考链接:

https://www.jianshu.com/p/03dce38cc97e

https://blog.csdn.net/qq_41333582/article/details/82155698

https://www.cnblogs.com/xulf/p/4320676.html

https://blog.csdn.net/dearyangjie/article/details/71533615

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值