这篇文章主要的内容是不同语言的比较,python基本数据类型,socket相关,线程与进程,高阶函数:迭代器,生成器,装饰器
python和java的区别
- JAVA编译以后才能运行,python直接就可以运行;
- JAVA是混合型语言,python是解释型语言。JAVA可以是解释型的,因为java代码编译后不能直接运行,它是解释运行在JVM上的;但是现在的JVM为了效率,都有一些JIT优化,它又会把.class的二进制代码编译为本地的代码直接运行。
- JAVA 的类型要声明,Python 的类型不需要。
- JAVA 中的字符串以双引号括起来,Python 中单引号或双引号都可以
- python是弱类型语言,java是强类型。
- Python是函数为一等公民的语言,而Java是类为一等公民的语言
python和java都是面向对象的
定义
编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。
解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!
区别
编译型语言,执行速度快、效率高;依靠编译器、跨平台性差些。
解释型语言,执行速度慢、效率低;依靠解释器、跨平台性好。
为什么python比较慢
Python的缓慢主要是由于它动态的特点。每次读取、写入变量或引用变量类型时都会进行检查,比较和转换类型是耗时的。
另外,在具有多个cpu的机器上使用多线程时,python都会比较慢。这是由于python中GIL的存在,python的多线程是伪多线程,他在同一时刻只能运行一个线程,但其他语言比如说java,就可以在多个核上同时运行多个线程。
基本数据类型
- 不可变:frozenset不可变集合,数值(整数,浮点数,复数,bool),字符串,元组
- 可变:字典,列表,集合set
socket相关
socket
Socket 是一种网络间不同计算机上的进程通信的一种方法
python&socket
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345 # 设置端口
s.bind((host, port)) # 绑定端口
s.listen(5) # 等待客户端连接
while True:
c,addr = s.accept() # 建立客户端连接
print '连接地址:', addr
c.send('欢迎访问菜鸟教程!')
c.close() # 关闭连接
web socket
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。
socket和web socket的区别
- Socket 是传输控制层的接口。用户可以通过 Socket 来操作底层 TCP/IP 协议族通信。
- WebSocket 是一个完整应用层协议。
- Socket 更灵活,WebSocket 更易用。
- 两者都能做即时通讯
为什么有了 HTTP 还需要 WebSocket?
http通信协议不是双工的,只能客户端先发送请求,服务器响应请求。如果有需要服务端主动通知的业务,就需要轮询(客户端定时向服务端发送请求)。轮询的效率低,非常浪费资源。为了解决 Web 端即时通讯的需求就出现了 WebSocket。
装饰器
本质上,decorator就是一个返回函数的高阶函数。装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。可以进行插入日志、性能测试、权限校验这些操作。
迭代器和生成器的区别
在python的实现中:
- 实现了
__iter__
方法和__next__
方法的类对象,就是迭代器 - 使用yield语句返回结果就是生成器
定义
迭代器
迭代器是用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。
iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素。
next()也是python内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束。
class Fib(object):
def __init__(self, max):
self.max = max
def __iter__(self):
self.a = 0
self.b = 1
return self
def __next__(self):
fib = self.b
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return fib
# 定义一个main函数,循环遍历每一个菲波那切数
def main():
# 20以内的数
fib = Fib(20)
for i in fib:
print(i)
生成器
延迟操作。也就是在需要的时候才产生结果,不是立即产生结果。.
区别:生成器是只能遍历一次的。
联系:生成器是一类特殊的迭代器。
def Fib(max):
a, b = 0, 1
for _ in range (max):
yield b
a, b = b, a + b
return
变量打印
方法1
直接print(变量名)
方法2
运用%:
print ("%s %s " %(a,b))#两个变量要加()
说明:
(1) %字符:标记转换说明符的开始
(2) 转换标志:-表示左对齐;+表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充
(3) 最小字段宽度:转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从值元组中读出。
(4) 点(.)后跟精度值:如果转换的是实数,精度值就表示出现在小数点后的位数。如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么精度将从元组中读出
字符串格式化转换类型
转换类型 | 含义 |
---|---|
d,i | 带符号的十进制整数 |
o | 不带符号的八进制 |
u | 不带符号的十进制 |
x | 不带符号的十六进制(小写) |
X | 不带符号的十六进制(大写) |
e | 科学计数法表示的浮点数(小写) |
E | 科学计数法表示的浮点数(大写) |
f,F | 十进制浮点数 |
g | 如果指数大于-4或者小于精度值则和e相同,其他情况和f相同 |
G | 如果指数大于-4或者小于精度值则和E相同,其他情况和F相同 |
C | 单字符(接受整数或者单字符字符串) |
r | 字符串(使用repr转换任意python对象) |
s | 字符串(使用str转换任意python对象) |