05-python基础
1、python是什么?
解释性语言、高级语言、开源、简洁、方便、容易扩展
2、可变类型与不可变类型
可变类型:list、dict、可变集合set
不可变类型:数字,str,tuple元组,frozenset (不可变的类型都可以被hash哈希)
内存中的那块内容(value)是否可变
3、深浅copy
浅拷贝。增加一个指针,指向所复制的对象,共用一块内存
深拷贝。增加一个指针,并且开辟了新的内存,这个增加的指针指向这个新的内存
简单地说,浅拷贝只拷贝一层(如果有嵌套),深拷贝拷贝所有层。
4、*args与**kwargs
*args:位置参数,元组,('alex',18)
**kwargs:关键字参数,字典, {'name'='alex','age'=18} 关键字参数一定要放在最后面
5、闭包
内部函数对外部函数,作用域里变量(非全局变量),的引用,则称内部函数为闭包。
闭包的意义:返回函数对象+一层作用域
该函数无论在何处调用,优先使用,自己外层包裹的作用域
6、装饰器
调用装饰器其实是一个闭包函数,
不修改函数的代码与修饰方式,为其他函数添加附加功能
比如:插入日志、性能测试、事物处理、缓存、权限验证等
# 装饰器
import time
def login(func):
def inner():
start_time = time.time()
func()
end_time = time.time()
print("fun 执行时间",end_time-start_time)
return inner
@login
def test():
pass
7、生成器
延迟操作,需要的时候才产生结果,而不是立即产生结果
在每次调用next()的时候执行,遇到yield语句返回
创建生成器的两种方式:
- li = [i for i in range(100)]
- yield方法
8、range-and-xrange
py2:
range() 生成的是列表
xrange() 生成的是一个生成器
py3:
range() 就是一个生成器
xrange() 没了
9、迭代器
不是一次性把数据加载到内存,而是被next()函数调用,不断返回下一个数据
可for循环的数据类型:集合数据类型+生成器
list,tuple,dict,set,str + generator
10、经典类、新式类
经典类:深度优先,python2中
新式类:广度优先,Python3中
11、继承、多态、封装
继承:类与类之间关系,解决代码重用问题 。重用父类的属性与方法
多态:同一类事物多种形态 。一个接口,多种形态
不应关注对象的类型本身,而是它如何使用的
鸭子类型:如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子封装:私有化的属性,私有化的方法,封装起来,外部无法调用
双下划线__foo
12、classmethod,staticmethod,property
- property:特性 (统一访问 原则)
把类的方法转换为属性,直接 alex.bmi 调用
@property
def bmi(self):
return self.weight / (self.height ** 2)
- staticmethod 静态方法 (普通函数 ) 绑定到对象上
类内的函数实例化---> 普通函数 。 (类和对象都可以使用)
@classmethod
def from_conf(cls):
obj = settings.name,
return obj
- classmethod 类方法 (def foo(cls)) 绑定到类上
将cls 类本身当做参数传入,直接用类来调用函数,而不用借助类实例
优雅地实现某个类的实例的构造
13、 new, __init__区别
创建一个新实例时调用__new__ , __new__在 init__之前被调用
初始化一个实例时调用__init
14、单例模式
单例模式设计的类,每次只能实例化1个对象
方式2: new _instance
class Single(object):
_instance = None
def __new__(cls,*args,**kwargs):
if not _instance:
cls._instance = super(Single,cls).__new__(cls,*args,**kwargs)
return cls._instance
15、反射
以“字符串”形式,操作对象的相关属性或方法。
hasattr, getattr, setattr, delattr
ret = getattr(obj,'get_file')() # 反射 obj是实例对象,name是方法
16、GIL
GIL:全局解释器锁(cpython解释器), 同一时刻,在cpu只能有一个线程执行
C语言解决多线程下的GIL问题
17、协程
协程:轻量级的线程,用户程序自己控制调度的
单线程下的并发, 遇到I/O阻塞,多个任务,自动切换
gevent模块实现
import gevent
def eat():
gevent.sleep(2) # 遇到阻塞会自动切换任务
def play():
gevent.sleep(3)
g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)
g1.join()
g2.join()
18、进程,线程 (I/O密集型)
from multiprocessing import Process
from threading import Thread # 子线程
def task(name):
print(name)
p = Process(target=task,args=('子进程',))
p = Thread(target=task,args=('子线程',))
p.start() # 给os发个信号
p.join() # 父进程等待子进程执行完,才执行
19、僵尸进程,孤儿进程,守护进程
- 僵尸进程
子进程退出,父进程没有回收子进程,子进程的进程描述符仍然保存在系统中。 - 孤儿进程
父进程退出,子进程还在运行。孤儿进程将被init进程(pid=1)回收 - 守护进程
如果子进程的任务在主进程任务结束后就没有存在的必要了,那么该子进程应该在开启前就被设置成守护进程。
20、进程/线程 间同步方式
- 临界区。相当于保护区域
- 互斥量。加锁控制
from threading import Thread,Lock,RLock
mutexA=Lock()
mutexB=Lock()
mutexA=mutexB=RLock()
#一个线程拿到锁,counter加1,该线程内又碰到加锁的情况,则counter继续加1,
# 这期间所有其他线程都只能等待,等待该线程释放所有锁,即counter递减到0为止
mutexA.acquire()
mutexA.release()
- 信号量。PV操作--改变信号量的值 S+1+1+1-1-1-1
信号量也是一把锁,可以指定信号量为5,
互斥锁同一时间只能有一个任务抢到锁去执行
信号量同一时间可以有5个任务拿到锁去执行
解析
Semaphore管理一个内置的计数器,
每当调用acquire()时内置计数器-1;
调用release() 时内置计数器+1;
计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。
- 事件Event。相当于通知操作
from threading import Thread, Event
import time
event = Event()
def conn():
event.wait() # 默认是False阻塞中, 等变为True 程序放行
def check():
time.sleep(5)
event.set() # Event对象 的信号标志设置未True
t1 = Thread(target=conn)
t2 = Thread(target=check)
t1.start()
t2.start()
21、整数对象池
- 小整数对象池。对小整数的定义是 [-5, 257) 这些整数对象是提前建立好的,不会被垃圾回收
- 大整数对象池。不共用内存,引用计数为0,销毁
22、python垃圾回收机制 Garbage collection(GC)
- 引用计数为主。当引用计数为0,该对象的生命就结束了
- 标记-清除。解决循环引用的问题
- 隔代回收为辅。内存块根据存活时间分为'代',gc的频率随着'代'的存活时间的增大而减小
https://www.cnblogs.com/pinganzi/p/6646742.html http://python.jobbole.com/82061/
23、网络编程
# 服务端
import socket
from threading import Thread
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 端口占用
server.bind(('127.0.0.1', 9994))
server.listen(5)
while True:
conn, addr = server.accept()
t = Thread(target=handle,args=(conn,))
t.start()
conn.close()
server.close()
def handle(conn):
data = conn.recv(1024)
conn.send(data)
# 客户端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 9994))
while True:
data = input('>>>').strip()
client.send(data.encode('utf-8'))
ret = client.recv(1024)
print('from server:', ret.decode('gbk')) # windows gbk编码
client.close()
05-python基础的更多相关文章
- Python 基础练习
今天接触了python,了解了一下 python 的基础语法,于是想着手训练一下,在本习题集中,参考代码为提供的参考答案,前面的代码为自己思考的代码,最后每道题给出练习的时间. Python 基础练习 ...
- Python基础教程【读书笔记】 - 2016/7/31
希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第十波:第10章 充电时刻 Python语言的核心非常强大,同时还提供了更多值得一试的工具.Python的标准安装包括 ...
- Day1 - Python基础1 介绍、基本语法、流程控制
Python之路,Day1 - Python基础1 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...
- python基础教程
转自:http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html Python快速教程 作者:Vamei 出处:http://www.cn ...
- Python 基础 二
Python 基础 二 今天对昨天学习的Python基础知识进行总结,学而不思则惘,思而不学则殆! 一.先对昨天学习的三大循环的使用情况进行总结: 1.while循环的本质就是让计算机在满足某一条件的 ...
- python基础篇实战
1. 判断下面的结果 # 1. 判断下面的结果 # 1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6 pri ...
- python基础1-转自金角大王
Python之路,Day1 - Python基础1---转自金角大王 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 ...
- (路-莫)-Python基础一
一,Python介绍 1,python的出生与应用 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打 ...
- 十七. Python基础(17)--正则表达式
十七. Python基础(17)--正则表达式 1 ● 正则表达式 定义: Regular expressions are sets of symbols that you can use to cr ...
- 十四. Python基础(14)--递归
十四. Python基础(14)--递归 1 ● 递归(recursion) 概念: recursive functions-functions that call themselves either ...
随机推荐
- [iOS] 列表滑动展开隐藏头部HeaderView
平常遇到大多数的带有列表的应用都会遇到这个场景:在列表顶端有一个Header,当向上滑动列表时,压缩header,向下滑动列表到头时,展开header.这种样式在例如微博,twitter这些展示动态的 ...
- 在Windows上安装Gradle
1.开发环境 (1)Java:JDK8(必须是JDK或JRE7以上,使用java -version查看当前电脑java版本) (2)操作系统:Windows 7 2.安装步骤 (1)下载最新的Grad ...
- HttpWebRequest抓取网页内容与直接输入URL得到的内容不一致!球大神帮忙!!
一.前言 我在做一个百度收录情况查询的软件,就是通过软件来批量查询文章链接是否被百度收录,主要是用来查询某个网址的收录次数还有网站的排行数,思路是借鉴别人的. 二.问题描述 首先需要考虑的是能够支持哪 ...
- Oracle EBS AR 客户API
------------------------------------ 1. Set Environment ------------------------------------ -- 1a. ...
- poj_3253 Fence Repair
Fence Repair Description Farmer John wants to repair a small length of the fence around the pasture. ...
- 表的垂直拆分和水平拆分-zz
https://www.kancloud.cn/thinkphp/mysql-design-optimalize/39326 http://www.cnblogs.com/nixi8/tag/mysq ...
- mysql 5.5 数据库 utf8改utf8mb4
由于需要用到utf8mb4,之前是utf8现在给改成utf8mb4 查看当前环境 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_ ...
- pt-heartbeat --update --daemonize 只执行一次秒退的问题
使用pt-heartbeat帮助测试MySQL从库delay时长- 第一次运行测试成功,运行顺畅. 过几天再次用--update测试时,发现pt-heartbeat只update一次就自己退出了,-- ...
- 转:.NET基础篇——反射的奥妙
反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息.使用反射可以看到一个程序集内部的接口.类.方法.字段.属性.特性等等信息.在System.Reflectio ...
- cdn刷新和对应的浏览器现象
1.浏览器手动点刷新,会发起网络请求,从cdn判断last-modify时间是否一致,未过期则返回304,如果已经过期则返回200,重新请求 关键在于发起的网络请求中'If-Modified-Sinc ...