可迭代对象(Iterable)
python中任意对象,只要它定义了可以返回一个迭代器的__iter__
方法,或者定义了可以支持下标索引的__getitem__
方法,那么他就是一个可迭代对象。可迭代对象就是能够提供迭代器的任意对象。
迭代器(Iterator)
任意对象,只要定义了next
(python2)或者__next__
方法他就是一个迭代器。
迭代(Iteration)
从某个地方(比如一个列表)取出一个元素的过程。当我们使用一个循环来遍历某个东西时,这个过程本身叫迭代。
生成器(Generators)
生成器也是一种迭代器,但是你只能对其迭代一次。这是因为他们并没有把所有的值都存在内存中,而是在运行时生成值。大多数时候生成器是以函数是实现的。然而,它们并不返回一个值,而是yield
(暂且译作“生出”)一个值。
Python内置函数:next()
。它允许我们获取一个序列的下一个元素。
在yield
掉所有的值后,next()
触发了一个StopIteration
的异常。基本上这个异常告诉我们,所有的值都已经被yield
完了。
为什么我们在使用for
循环时没有这个异常呢?for
循环会自动捕捉到这个异常并停止调用next()
。
Python中一些内置数据类型也支持迭代。
这个异常说那个str
对象不是一个迭代器。它是一个可迭代对象,而不是一个迭代器。这意味着它支持迭代,但我们不能直接对其进行迭代操作。怎样才能对它实施迭代呢?
内置函数,iter
。它将根据一个可迭代对象返回一个迭代器对象。
装饰器
装饰器(Decorators)是Python的一个重要部分。简单地说:他们是修改其他函数的功能的函数。
嵌套函数解析
从函数中返回函数
解析:
调用hi
函数中创建的greet
函数和welcome
函数,作为结果输出出来。
问题:
在if/else
语句中我们返回greet
和welcome
,而不是greet()
和welcome()
。为什么那样?这是因为当你把一对小括号放在后面,这个函数就会执行;然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。
当我们写下a = hi()
,hi()
会被执行,而由于name
参数默认是yasoob,所以函数greet
被返回了。如果我们把语句改为a = hi(name = "ali")
,那么welcome
函数将被返回。我们还可以打印出hi()()
,这会输出now you are in the greet() function。
将函数作为参数传递给另一个参数
文件格式判断
常见的文件头字节码信息
判断blue.jpg
文件是不是jpg
格式的文件。将判断结果保存到summary.txt
.
提示:.jpg
格式的文件头字节码为ff d8
,注意读取blue.jpg
文件时,要以字节方式读取。
u
以unicode
形式存储字符串。
socket 模块
udp套接字
应用层的一种编程方法
创建套接字:socket()
绑定IP端口: bind()
发送消息: sendto()
接受消息: recvfrom()
关闭套接字: close()
udp 服务端代码:
udp客户端代码:
TCP编程流程
创建套接字:socket
绑定地址:bind
设置监听:listen
等待处理连接:accept
发送/接收消息:send/recv
关闭连接:close
粘包问题
产生原因
为了解决数据传输中的速率不协调问题,操作系统设置了缓冲区
实际网路工作过程比较复杂,导致消息收发不一致
tcp以字节流方式进行数据传输,在接收的时候不区分消息边界
带来问题
如果发送的消息每次都是独立的,需要接收端去独立解析消息时回带来消息误解问题
解决方式
人工设置消息边界
减缓消息发送速度
tcp服务端代码
tcp客户端代码
vscode 先运行服务端,再运行客户端。服务端和客户端分两个目录,这样可以同时运行。
文件传输
文件传输服务端
1.建立TCP套接字
2.等待客户端内的连接
3.接收图片内容
4.保存图片
5.终止连接
评论区