先要解析出 baidu.com 对应的 ip 地址
? 要先使用 arp 获取默认网关的 mac 地址
? 组织数据发送给默认网关(ip 还是 dns 服务器的 ip,但是 mac 地址是默认网关的 mac 地址)
? 默认网关拥有转发数据的能力,把数据转发给路由器
? 路由器根据自己的路由协议,来选择一个合适的较快的路径转发数据给目的网关
? 目的网关(dns 服务器所在的网关),把数据转发给 dns 服务器
? dns 服务器查询解析出 baidu.com 对应的 ip 地址,并原路返回请求这个域名的 client
得到了 baidu.com 对应的 ip 地址之后,会发送 tcp 的 3 次握手,进行连接
? 使用 http 协议发送请求数据给 web 服务器
? web 服务器收到数据请求之后,通过查询自己的服务器得到相应的结果,原路返回给浏览器。
? 浏览器接收到数据之后通过浏览器自己的渲染功能来显示这个网页。
? 浏览器关闭 tcp 连接,即 4 次挥手结束,完成整个访问过程
不可变参数用值传递:
像整数和字符串这样的不可变对象,是通过拷贝进行传递的,因为你无论如何都不可能在原处改变
不可变对象
可变参数是引用传递的:
比如像列表,字典这样的对象是通过引用传递、和 C 语言里面的用指针传递数组很相似,可变对象
能在函数内部改变。
内存管理机制:引用计数、垃圾回收、内存池。
引用计数:
引用计数是一种非常高效的内存管理手段, 当一个 Python 对象被引用时其引用计数增加 1, 当
其不再被一个变量引用时则计数减 1. 当引用计数等于 0 时对象被删除。
垃圾回收 :
1. 引用计数
引用计数也是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术。当 Python 的某
个对象的引用计数降为 0 时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。比如
某个新建对象,它被分配给某个引用,对象的引用计数变为 1。如果引用被删除,对象的引用计数为 0,
那么该对象就可以被垃圾回收。不过如果出现循环引用的话,引用计数机制就不再起有效的作用了
2. 标记清除
如果两个对象的引用计数都为 1,但是仅仅存在他们之间的循环引用,那么这两个对象都是需要被
回收的,也就是说,它们的引用计数虽然表现为非 0,但实际上有效的引用计数为 0。所以先将循环引
用摘掉,就会得出这两个对象的有效计数。
3. 分代回收(多次没清除的保留,下次不回收这些内容)
从前面“标记-清除”这样的垃圾收集机制来看,这种垃圾收集机制所带来的额外操作实际上与系统
中总的内存块的数量是相关的,当需要回收的内存块越多时,垃圾检测带来的额外操作就越多,而垃圾
回收带来的额外操作就越少;反之,当需回收的内存块越少时,垃圾检测就将比垃圾回收带来更少的额
外操作。
内存池:
1. Python 的内存机制呈现金字塔形状,-1,-2 层主要有操作系统进行操作;
2. 第 0 层是 C 中的 malloc,free 等内存分配和释放函数进行操作;
3. 第 1 层和第 2 层是内存池,有 Python 的接口函数 PyMem_Malloc 函数实现,当对象小于
256K 时有该层直接分配内存;
4. 第 3 层是最上层,也就是我们对 Python 对象的直接操作;
Python 在运行期间会大量地执行 malloc 和 free 的操作,频繁地在用户态和核心态之间进行切
换,这将严重影响 Python 的执行效率。为了加速 Python 的执行效率,Python 引入了一个内存池
机制,用于管理对小块内存的申请和释放。
Python 内部默认的小块内存与大块内存的分界点定在 256 个字节,当申请的内存小于 256 字节
时,PyObject_Malloc 会在内存池中申请内存;当申请的内存大于 256 字节时,PyObject_Malloc 的
行为将蜕化为 malloc 的行为。当然,通过修改 Python 源代码,我们可以改变这个默认值,从而改
变 Python 的默认内存管理行为
d = {‘a‘: 3, ‘b‘: 1, ‘c‘: 2, ‘d‘: 4} # 有返回值 d_reverse = sorted(d.items(), key=lambda x:x[1], reverse=True) d_sorted = sorted(d.items(), key=lambda x:x[1], reverse=False) print(d_reverse,d_sorted)
# 今年的第几天 import datetime year = int(input("请输入年份:")) month = int(input("请输入月份:")) day = int(input("请输入天数:")) data1 = datetime.date(year=year, month=month, day=day) data2 = datetime.date(year=year, month=1, day=1) result = data1 - data2 # <class ‘datetime.timedelta‘> 1 day, 0:00:00 result = result.days + 1 print(result)
在 Python3 中,input()获取用户输入,不论用户输入的是什么,获取到的都是字符串类型的。
在 Python2 中,input()获取用户输入,不论用户输入的是什么,获取到的就是什么数据类型的。
详情见:https://www.cnblogs.com/shuimohei/p/10232668.html
https://www.cnblogs.com/shuimohei/p/10232473.html
进程:程序运行在操作系统上的一个实例,就称之为进程。进程需要相应的系统资源:内存、时间
片、pid。
https://www.cnblogs.com/shuimohei/p/10500266.html
https://www.cnblogs.com/shuimohei/p/10500299.html
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass # 继承指向父类x所在地址:1635999904 print(id(Parent.x), id(Child1.x), id(Child2.x)) # 1 1 1 print(Parent.x, Child1.x, Child2.x) Child1.x = 2 # 1 2 1 print(Parent.x, Child1.x, Child2.x) Parent.x = 3 # 3 2 3 print(Parent.x, Child1.x, Child2.x)
原文:https://www.cnblogs.com/shuimohei/p/13288309.html