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 ...
随机推荐
- 微信为啥不能直接下载.apk安装包
今天遇到一个很蛋疼问题,我们的微信公众号上想放一个下载自己公司app的点击按钮,如果是苹果手机点击这个按钮就直接跳转到苹果的appstore,如果是android手机的话,就直接跳我们的服务器下载ap ...
- go语言练习:类型转换
package main import "fmt" func main() { var a int var b uint var c float32 var d float64 a ...
- C# 实例化的执行顺序(转)
首先进行细分1.类的成员分为:字段,属性,方法,构造函数2.成员修饰符:静态成员,实例成员不考虑继承的关系执行顺序为:1.静态字段2.静态构造方法3.实例字段4.实例构造方法其中 属性和方法只有在调用 ...
- 表的垂直拆分和水平拆分-zz
https://www.kancloud.cn/thinkphp/mysql-design-optimalize/39326 http://www.cnblogs.com/nixi8/tag/mysq ...
- [原创]使MySQL注释语句在后台能够输出的方法
开启general log或slow log的时候,前端发出的sql语句中的注释都别屏蔽掉了. 本意加注释我们想通过注释来快速知道sql是由哪个业务模块发出的.这点对dba和研发很有帮助. 一种变通的 ...
- linux操作系统基础讲解
计算机的组成及功能: 现在市场上的计算机组成结构遵循冯 诺依曼体系,由CPU.内存.I/O设备,存储四大部分组成. CPU是整个计算机的核心部件,主要由运算器和控制器组成,它负责整个计算机的程序运行以 ...
- October 22nd, 2017 Week 43rd Sunday
Yesterday is not ours to recover, but tomorrwo is ours to win or lose. 我们无法重拾昨天,但我们可以选择赢得或者输掉明天. Eve ...
- 网络编程_UDP协议_聊天程序
发送端:(将数据源改为键盘录入) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...
- BZOJ3233:[AHOI2013]找硬币(DP)
Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...
- 【洛谷】【前缀和+st表】P2629 好消息,坏消息
[题目描述:] uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一 ...