2.18~2.22学习笔记

<一>

1. python有用的设计模式:
创建型模式: 这些模式用于生成具有特定行为的对象.
结构型模式: 这些模式有助于为特定用例构建代码.
行为模式: 这些模式有助于分配责任和封装行为.

2. 创建型模式: 处理对象实例化机制,这样的模式可以定义如何创建对象实例或者甚至如何构造类的方式.

3. 单例: 限制类的实例化,只能实例化一个对象.
class Singleton:
    _instance = None
    
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
             cls._instance = super().__new__(cls, *args, **kwargs)
        return cls._instance

4. 结构型模式: 适配器, 代理, 外观

5. 优化原则:
首先要能工作
从用户的角度考虑
保持代码的可读性

6. 优化策略:
找到另外的罪魁祸首:确保第三方服务器或资源没有故障
扩展硬件: 确保资源充足
编写速度测试: 创建具有速度目标的场景

7. 递归函数
def fibonacci(n):
    """递归计算返回斐波那契数列的第n项"""
    if n<2:
       return 1
    else:
       return fibonacci(n-1) + fibonacci(n-2)


<二>

1. django 与 flask 的区别,适用于不同场景需求,django 更侧重于哪些场景,若想开发一款类似于链家楼盘字典的项目,哪个更合适?
解答: django比较全面,包括数据库维护,orm查询和各种扩展组件.
      django都提供了框架层面的支持,不需要很复杂的配置,都可以直接使用.
      django开发前端后端都可以.
      django比较重适合 快速开发.
      flask的主要发展就是基于一个核心的web框架.实现的核心的web框架功能,对数据库的使用,需要参考第三方模块,可选择行比较丰富,但是都需要自己做选型; flask开发接口很快速; flask针对接口开发比较快速

2. 版本控制系统: 集中式系统, 分布式系统

3. 集中式版本控制系统(VCS): 基于保存文件的单个服务器,并允许人们签入和签出对这些文件所做的更改.
原理: 每个人都可以得到他的系统上的文件的副本,然后对他们进行更改,从那里,每个用户可以向服务器提交(commit)它的更改.这些更改就会生效,修订版本(revision)号也会随之增加.其他用户可以通过更新(update)同步他们的仓库的副本来获取这些更改.
缺点: 分支和合并难以处理;由于系统是集中式的,因此不可能离线提交更改.

4. 分布式系统(DVCS): 分布式很好地解决集中式VSC的缺陷,它不依赖于人们使用的主服务器,而是基于对等(peer-to-peer)原则,每个人都可以拥有和管理他自己的项目的独立仓库,并且与其他仓库同步.需要注意的是修订版本号对每个仓库都是本地的,并且没有任何人可以指向全局的修订版本号,因此需要标签(tags)附加到修订版本的文本标签.最后用户负责备份自己的仓库.它只是一个中心,允许所有的开发人员在一个地方分享他们的变化,而不是在他们彼此的仓库之间进行拉取和推送.

5. Git工作流程与GitHub工作流程,是两个不同的工作流程.
Git工作流程(git flow)  https://www.cnblogs.com/lcngu/p/5770288.html
GitHub工作流程: 它只有一个主要的开发分支(主分支),它总是稳定的(与git流中的开发分支相反),没有发布分支.

6. 持续集成, 持续交付, 持续发布
http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html

7. 学历代表你的过去, 能力代表你的现在, 学习代表你的将来!

8. 了解纯C的扩展是如何创建的,是非常有好处的.

9. 应用部署十二要素:
代码库, 依赖, 配置, 后端服务, 构建 发布 运行, 进程, 端口绑定, 并发, 易处理, 开发环境与生产环境等价, 日志,
管理进程

10. 用Fabric进行自动化部署:
通过远程shell手动输入安装新版代码所必需的一系列命令,并在远程shell中执行.这种方法容易出错.
Fabric是python开发者用于自动化远程执行的最常用的解决方案,它是一个python库,也是一个命令工具,用来提高使用SSH进行应用部署或系统管理的效率.事实上Fabric只是利用SSH将命令执行连在一起的工具,所以仍然需要知道命令行界面的工作方式.

11. 在python社区中, 管理应用进程的两个常用工具是Supervisor.

12. python3中列表字符串转数字
eg1:
number = ['1', '2', '3']
number = [int(x) for x in number]
print(number)
[1, 2, 3]
或者使用map()方法
number1 = list(map(int, number))    # 使用内置map返回一个map对象,再用list将其转换为列表
print(number1)
[1, 2, 3]

<三>

1. python上下文with语法
https://blog.csdn.net/qq_33339479/article/details/87719826

2.
*r+为可读写两种操作
w+为可读写两种操作(会首先自动清空文件内容)
a+为追加读写两种操作**

3. f.seek(0)是重定位的意思。
标准格式是:seek(offset,whence=0)
offset:开始的偏移量,也就是代表需要移动偏移的字节数
whence:给offset参数一个定义,表示要从哪个位置开始偏移;
0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。默认为0

4. docker:   https://blog.csdn.net/Ohmyberry/article/details/80446309

<四>

1. 一些基本观点和概念
①多线程采用的是分时复用技术,即不存在真正的多线程,cpu做的事是快速地切换线程,以达到类似同步运行的目的,因为高密集运算方面多线程是没有用的,但是对于存在延迟的情况(延迟IO,网络等)多线程可以大大减少等待时间,避免不必要的浪费.
②原子操作: 这件事情是不可再分的,如变量的赋值,不可能一个线程在赋值,到一半切到另外一个线程工作去了.但是一些数据结构的操作,如栈的push什么的,并非原子操作,比如要经过栈顶指针上移,赋值,计数器加1等等,在其中的任何一步中断,切换到另一线程在操作这个栈时,就会产生严重的问题,因此要使用锁来避免这样的情况.比如加锁后的push操作可以认为是原子的了.
③阻塞: 所谓阻塞,就是线程等待,一直到可以运行为止,最简单的例子就是一线程原子操作下,其他线程都是阻塞状态,这是微观情况.对于宏观情况,比如服务器等待用户连接,如果始终没有连接,那么这个线程在阻塞状态.同理,最简单的input语句,在等待输入时也是阻塞状态.
④在创建线程后,执行p.start(),这个函数是非阻塞的,即主线程会继续执行以后的指令,相当于主线程和子线程都并行地执行。所以非阻塞的函数立刻返回值的.
⑤互斥锁: 某个线程要共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进入写入操作,从而保证了多线程情况下数据的正确性.
⑥条件变量: 有些情况下复杂的问题互斥锁搞不定了,这时就出现了条件变量.所谓条件变量,即这种机制是在满足了特定的条件后,线程菜可以访问相关数据.Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的acquire(获得锁)和release(释放锁)方法外,还提供了wait和notify方法.
https://www.jianshu.com/p/5d2579938517

2. Python标准库queue模块原理浅析

https://blog.csdn.net/qq_33339479/article/details/86706626

3. Pthreads 多线程程序设计

http://www.cnblogs.com/mywolrd/archive/2009/02/05/1930707.html#abstract

4.c语言结构体: 聚合类型,自定义的数据类型,只不过这种数据类型比较复杂,是由int,char,float等基本类型组成的.可以将一组类型不同的,但是用来描述同一事物的变量放到结构体中.redis中的类型也是结构体类型.

5.流式套接字(TCP)和数据报套接字(UDP)的区别

   ①流式套接字(SOCK_STREAM): 流式套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流式套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。服务器通过转发实现一个客户与另一个客户的数据传送。当向另一个客户转发时,他必须知道对方IP(或套接字等),所以要求转发的客户必须提供关于接受方的信息,否则服务器不知道向哪转发。

   ②数据报套接字(SOCK_DGRAM):数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。

   ③二者比较:
    流式套接字要分客户和服务器,而数据报不用分
    流式套接字适合传输数据量大的,而数据报套接字适合传递数据量少的  
    流式套接字建立麻烦,数据报套接字建立简单
    客户的流式套接字只能向一个方向传递,数据报套接字可以接受任何方向的来得数据,并可以向任何地址发送数据报
    流套接字比数据报套接字好,这样你可以不必管理底层细节,只需要相信TCP就可以保证传送的数据是依次,可靠的传送的,缺点是效率相对数据报套接字低。
    使用数据报套接字,可以让你更快,但你得自已保证数据是否依次,准确的传送来的, 如使用数据报套接字,你可能先收到后发的,后收到先发的,还有可能收漏

猜你喜欢

转载自blog.csdn.net/liugaigai427/article/details/87881209