Python Python的数据类型与数据结构 数据类型分为: 整数型 ;数字的整数 浮点型; 数字带小数 字符串; 用 ‘’ 或者 “” 引用的任意文本 布尔型;只有 True 和 False 数据结构分为:列表 list、元祖 tuple、字典 dict、集合 set ORM 直接使用sql语句虽然方便,但缺点是如果要更换数据库可能还需要修改程序中的Sql语句。为了解决这个问题,出现了ORM。在Python语言中使用ORM有多种选择,都是通过模块支持的。 比较著名的有SQLAlchemy和SQLObject,SQLObject比SQLAlchemy简单的多,但是网上实例太少,所以建议使用SQLAlchemy SQLAlchemy模式 首先安装所需模块:pip install SQLAlchemy && pip install pymysql 创建表、增、删、改、查 实例 定义要操作的表名 开始连接数据库、创建会话(Session)、session=Session()、提交修改、关闭session Cookie Web服务器要完成的任务的最后一步就是向客户端返回数据。如果客户端是浏览器,那么返回的数据通常是HTML、JS、CSS或者其他类型的代码。 Cookie是保存在客户端的字典 当客户端浏览器向服务端发送数据时,将保存在客户端本地的Cookie通过HTTP请求头发送给服务端,然后服务端发送给客户端。 本例通过writeCooki函数写入了两个Cooki值,然后通过readCookie 读取这两个Cooki值,并将它们返回给客户端。本例设置了其中一个Cooki值的过期时间(20s) Session Session是保存在服务端的字典 Session与Cookie有些类似,都是通过字典管理key-value对,只不过Cookie是保存在客户端的字典,而Session是保存在服务端的字典。Session可以在服务端使用多种存在方式, 默认一般存储在内存中,一旦web服务重启,所有保存在内存中的Session就会消失。为了让Session即使在web服务器重启后仍然能够存在,也可以将Session保存到文件或者数据中。 不管如何保存Session,操作都是一样的。 Session的另外一个重要作用就是跟踪客户端。也就是说,当一个客户端浏览器访问web服务器后,关闭浏览器,再次启动浏览器,再次访问web服务。这时web服务器就会知道这个浏览器 已经访问了两次web服务。这就是通过Session跟踪的。每一个客户端访问web服务器时都会创建一个单独的Session,同时为这个Session生成一个ID,这里就叫它Session-ID。 这个Session-ID会利用Cookie的方式保存在客户端,如果客户端再次访问web服务器时,这个ession-ID也会跟着HTTP请求发送给web服务,web服务会通过这个Session-ID寻找这个客户端 的Session。也就是说如果客户端不支持Cookie,那么Session是无法跟踪客户端的。当然可以通过其他方式保存这个Session-ID,这里不做讨论。 Python多线程、线程锁 python多线程使用场景:如果程序时cpu密集型的,使用python的多线程是无法提升效率的,如果程序时IO密集型的,使用python多线程可以提高程序的整体效率 1、python多线程 多线程可以把空闲时间利用起来 比如有两个进程函数 func1、func2,func1函数里使用sleep休眠一定时间,如果使用单线程调用这两个函数,那么会顺序执行这两个函数 也就是直到第一个函数执行完后,才会执行第二个函数,这样需要很长时间; 如果使用多线程,会发现这两个函数是同时执行的,这是因为多线程会把空闲的时间利用起来,在第一个函数休眠的函数就开始执行第二个函数 2、线程和锁 第一种 这里的锁并不是把程序锁住不退出,而是通过锁可以让程序了解是否还有线程函数没有执行,而且可以做到当所有的线程函数执行完后, 程序会立刻退出, allocate_lock 函数创建锁对象,然后使用锁对象的acquire方法获取锁,如果不需要锁了,可以使用锁对象的release方法释放锁, 如果判断锁是否被释放可以使用锁对象的locked方法 第二种 还可以使用Thread对象的join方法等待函数执行完毕再往下执行;等待所有线程函数都执行完毕后再推出程序(一般用这个) 线程锁实例: import threading from time import sleep,ctimedef fun(index,sec): print('开始执行',index,'时间',ctime()) sleep(sec) print('执行结束',index,'时间',ctime())def main(): #创建第1个Thread类,通过target关键字参数指定线程函数fun,传入索引10和休眠时间(4s) thread1=threading.Thread(target=fun,args=(10,4)) #启动第1个线程 thread1.start() #创建第2个Thread类,通过target关键字参数指定线程函数fun,传入索引20和休眠时间(2s) thread2=threading.Thread(target=fun,args=(20,2)) #启动第2个线程 thread2.start() #等待第1个线程函数执行完毕 thread1.join() #等待第2个线程函数执行完毕 thread2.join()if __name__ == '__main__': main() E:pythonpython.exe E:/progect/untitled1/untitled1/urls.py 开始执行 10 时间 Sat Feb 16 09:03:48 2019 开始执行 20 时间 Sat Feb 16 09:03:48 2019 执行结束 20 时间 Sat Feb 16 09:03:50 2019 执行结束 10 时间 Sat Feb 16 09:03:52 2019 python装饰器 python装饰器作用就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能 装饰器实例: import time def timmer(func): def deco(): start_time=time.time() func() stop_time=time.time() print("in the func run is %s" % (stop_time-start_time)) return deco @timmer #test1=timmer(test1) def test1(): time.sleep(3) print("in the test1") @timmer #=test2=timmer(test2) def test2(): time.sleep(3) print("in the test2") test1() test2() 生产者-消费者问题与quene模块 下面使用线程锁以及队列来模拟一个典型的案例:生产者-消费者模型。在这个场景下,商品或服务的生产者生产商品,然后将其放到类似队列的数据结构中,生产商品的时间是不确定的, 同样消费者消费生产者的商品的时间也是不确定的。 这里使用quene模块来提供线程间通信的机制,也就是说,生产者和消费者共享一个队列。生产者生产商品后,会将商品添加到队列中。消费者消费商品,会从队列中取出一个商品。 由于向队列中添加商品和从队列中获取商品都不是原子操作,所以需要使用线程锁将这两个操作锁住。 生成器 如果说迭代器是以类为基础的单位产生器,那么生成器(generator)就是以函数为基础的单位产生器。也就是说,迭代器和生成器都是一个值一个值得生产,每迭代一次,只能得到一个值, 所不同的是,迭代器需要在类中定义__iter__和__next__方法,在使用时需要创建迭代器的实例。而生成器是通过一个函数展现的,可以直接调用,生成器在使用上更简洁。 迭代器 为什么要用迭代器 为什么不使用列表而使用迭代器,列表可以获取列表长度,然后使用变量i对列表索引进行循环,而且容器理解,也可以获取集合的所有元素。 没错,使用列表的代码是容易理解也很好操作,但这是要付出代价的。列表之所以可以用索引来快速定位其中的任何一个元素,是因为列表是一下子将所有的数据都装在在内存中, 而且是一块连续存在的空间。当数量比较小时,实现比较容易;当数据量大时,会非常消耗内存资源。而迭代就不同,迭代是读取多少元素,就讲多少元素装载到内存中。 迭代器和生成器的区别 如果说迭代器是以类为基础的单位产生器,那么生成器(generator)就是以函数为基础的单位产生器。也就是说,迭代器和生成器都是一个值一个值得生产,每迭代一次,只能得到一个值, 所不同的是,迭代器需要在类中定义__iter__和__next__方法,在使用时需要创建迭代器的实例。而生成器是通过一个函数展现的,可以直接调用, 所以从某种意义上来说,生成器在使用上更简洁 简单的django登录项目 首先建立工程 配置静态目录 在setting.py中找到STATIC_URL配置如下: STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR,"static"), ) 在setting.py中配置:添加APP包名(项目名称) INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'Firstdjango', #新添加的APP名(项目名称) ] 在setting.py中配置:设置禁止CSRF校验 下载bootsrtap解压放在project下新创建的static目录下。 创建login.html的文件 创建views.py视图函数脚本文件