python协程

Python-常见面试题

杀马特。学长 韩版系。学妹 提交于 2020-03-11 08:59:59
什么是Python Python是一种解释型语言,也就是说,它和C语言以及C的衍生语言不通,Python代码在运行之前不需要编译 Python是一种动态类型语言,指的是,你在声明变量时不需要指定变量的类型 Python让困难的事变的容易,因此程序员可以专注于算法和数据结构的设计,而不用处理底层的细节 Python用途非常广泛–网络应用,自动化,科学建模,大数据应用等等,它也常被用作“胶水语言”,用于帮助其他语言和组件改善运行状况 Python支持的数据类型 数字、字符串、元组、字典、列表 下划线的作用 _xxx:表示的是protected类型,即只允许其本身和子类进行访问 __xxx:表示的是private类型 __xxx__:表示的特列方式,如__init__ 如何生成一个不可变集合 使用 frozenset 函数,将一个列表变成一个不可变的集合,如下: s = frozenset([1, 2, 3]) is与== is对比地址,==是对比值 多线程与多进程 对比维度 多进程 多线程 数据共享、同步 数据共享复杂,需要用到IPC;数据是分开的、同步简单 因为共享进程数据,所以共享简单,但也因为这个导致同步复杂 内存、CPU 占用内存多,切换复杂,CPU利用率低 占用内存小,切换简单,CPU利用率高 创建、销毁、切换 创建销毁、切换复杂,速度很慢 创建销毁、切换简单,速度很快 编程

python yield用法举例说明

為{幸葍}努か 提交于 2020-03-07 07:24:34
1 yield基本用法 典型的例子 :   斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到。1 2 3 5 8…… def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print b a, b = b, a + b n = n + 1   yield 的作用就是把一个函数变成一个generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个生成器,如调用fab函数, 不会执行该函数,而是返回一个iterable迭代对象!   在for循环执行时,每次循环都会相当于执行生成器的next函数,才开始执行fab函数的内部代码,执行到yield b时,fab函数就返回一个迭代值,然后挂起。   下次迭代时,代码从yield b的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到yield。 更多 yield 例子: #!/usr/bin/python def a(): print ("do a() will not print out") yield 5 a() print ("===============test a()") def b(): print ("list

Python-线程池、进程池,协程

大憨熊 提交于 2020-03-06 20:48:37
线程池&进程池 在python2中没有提供,在python3之后才提供 作用:保证程序中最多可以创建的线程的个数 import time from concurrent.futures import ThreadPoolExecutordef task(n1,n2): time.sleep(1) print('星空不问赶路人')pool = ThreadPoolExecutor(10) # 创建线程池for i in range(100): pool.submit(task,i,1)pool.shutdown(True) # 等线程池中任务执行完毕之后,再继续往后走print('岁月不负有心人') import time from concurrent.futures import ThreadPoolExecutordef task(arg): time.sleep(1) print('星空不问赶路人') return '岁月不负有心人'ret = pool.map(task,range(1,20)) # 具有返回值print('end',ret)pool.shutdwon(True)for i in ret: print(i) # 直接输出i import timefrom concurrent.futures import ThreadPoolExecutordef task

是什么原因导致Python运算效率这么低呢?

心不动则不痛 提交于 2020-03-06 13:41:10
Python是一门目前很流行的编程语言,因其语法简洁、功能强大、上手简单,目前已广泛应用于人工智能等领域,但是python运算效率低,具体是什么原因呢,下列罗列一些: 第一:python是动态语言 一个变量所指向对象的类型在运行时才确定,编译器做不了任何预测,也就无从优化。举一个简单的例子: r = a + b。 a和b相加,但a和b的类型在运行时才知道,对于加法操作,不同的类型有不同的处理,所以每次运行的时候都会去判断a和b的类型,然后执行对应的操作。而在静态语言如C++中,编译的时候就确定了运行时的代码。 另外一个例子是属性查找,关于具体的查找顺序在《python属性查找》中有详细介绍。简而言之,访问对象的某个属性是一个非常复杂的过程,而且通过同一个变量访问到的python对象还都可能不一样(参见Lazy property的例子)。而在C语言中,访问属性用对象的地址加上属性的偏移就可以了。 第二:python是解释执行,但是不支持JIT(just in time compiler)。虽然大名鼎鼎的google曾经尝试Unladen Swallow 这个项目,但最终也折了。 第三:python中一切都是对象,每个对象都需要维护引用计数,增加了额外的工作。 第四:python GIL,GIL是Python最为诟病的一点,因为GIL,python中的多线程并不能真正的并发

Python面试重点(爬虫篇)

≯℡__Kan透↙ 提交于 2020-03-06 12:41:38
Python面试重点(爬虫篇) 注意:只有必答题部分计算分值,补充题不计算分值。 第一部分 必答题 注意:第31题1分,其他题均每题3分。 了解哪些基于爬虫相关的模块? requests、urllib、lxml、bs4、selenium 常见的数据解析方式? re、lxml、bs4 列举在爬虫过程中遇到的哪些比较难的反爬机制? 参数加密、数据加密 简述如何抓取动态加载数据? 获取动态ip地址 向动态id发送请求 移动端数据如何抓取? 抓取过哪些类型的数据,量级多少? 了解哪些爬虫框架? scrapy 谈谈对scrapy的了解? 如何解析出携带标签的局部页面数据? scrapy核心组件? 引擎(EGINE) 、 调度器(SCHEDULER) 、 下载器(DOWLOADER) 、 爬虫(SPIDERS) 、 项目管道(ITEM PIPLINES) 、 下载器中间件(Downloader Middlewares) 、 爬虫中间件(Spider Middlewares) scrapy中间件的应用? 位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response 如何实现全站数据爬取? 如何检测网站数据更新? 分布式爬虫实现原理? 如何提升爬取数据的效率(异步爬虫) 列举你接触的反爬机制?

Python生成器

跟風遠走 提交于 2020-03-06 05:48:07
生成器详解 1.什么是迭代器 只要定义了 __iter__ 的类那么他就是一个 可迭代对象 ,如果定义了 __next__ 方法那么他就是一个迭代器. 2.迭代器与生成器的区别 生成器 是一种 迭代器 ,但是 迭代器 不一定是生成器 3.什么是生成器 简单理解为每次生出(yield)一个值的东西 例子: def generator(): for i in range(3): yield i 这个函数就是一个生成器,与普通函数不同的是,当函数执行到 yield i 语句时,函数会被挂起并且把 yield 后面的 i 给返回,当你再次执行该函数时会从 yield 语句后面接着执行 不同于 return 语句的是, return 语句不会挂起 4.生成器的优点 由于生成器每调用一次就只执行一次,所以生成器占用得到内存就会非常少,看个循环100000000次的例子 In [185]: def func(): ...: for i in range(100000000): ...: pass ...: In [186]: def gene(): ...: for i in range(100000000): ...: yield ...: In [187]: def getTime(f): ...: start = time.time() ...: f() ...: end = time

python —— 生成器

Deadly 提交于 2020-03-06 02:57:49
  通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。 在Python中,这种一边循环一边计算的机制,称为生成器:generator。    1、创建生成器方法一   把一个列表生成式的 [ ] 改成 ( )   生成器保存的是算法,每次调用 next(G) ,就计算出 G 的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的异常。当然,这种不断调用 next() 实在是太变态了,正确的方法是使用 for 循环,因为生成器也是可迭代对象。所以,我们创建了一个生成器后,基本上永远不会调用 next() ,而是通过 for 循环来迭代它,并且不需要关心 StopIteration 异常。     2、创建生成器方法二   用函数来实现,如下getNum(num) 1 # test.py 2 def getNum(num): 3 a,b = 0,1 4 print("*****") 5 for i in range(num): 6

Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程

那年仲夏 提交于 2020-03-05 00:36:02
队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构。 get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = 10) queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中: q.put() 调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为True。如果队列当前为空且block为True,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为False,put方法将引发Full异常。 import queue q=queue.Queue(3) q.put(11) q.put(22) q.put(33) q.put(44,False) #queue.Full ==q.put_nowait() 将一个值从队列中取出 q.get() 调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False

python 入门基础知识点总结

与世无争的帅哥 提交于 2020-03-04 08:56:04
最近在群里,同学们对于 python基础课程 到底要学什么,一直不能很好的确定,那么我在这里针对python基础知识的几个阶段,做一个总结,新手朋友们,可以根据这个来进行学习,那么由于我是做web开发的,所以会从web的角度去涉及。 第一阶段知识---基础语法 (1) python的数据结构的认识: python所有数据结构的认识 字符串的使用以及字符串的相关方法 列表的使用以及列表的相关方法 字典的使用以及字典的相关方法 元组的使用以及远足的相关方法 (2)逻辑判断的使用 if else if elif else (3)循环的使用 for 循环的使用 while循环的使用 continue 与 break 在循环里的使用 集合 set的使用 (4)函数的学习 函数的定义 函数的返回 (5)异常的学习 try except 的使用 raise 的学习 了解python内部的异常方法 (6)类的学习 类的创建,init的使用,类的实例化 继承的学习 (7)包的概念 定义一个包 __init__.py 如何导入一个包 安装第三方包,esay_install 与 pip 第二阶段知识----基础内置包与内置函数的使用(顺序不分前后) (1)os 包的使用 使用场景如常用的获取文件夹内文件,检查文件夹或文件等操作 (2)sys包的使用 使用场景如调用系统命令等简单操作,添加系统path等

Python学习第九天

拟墨画扇 提交于 2020-03-03 08:29:20
生产者-消费者模型: 看下面的例子哦: 1 import threading,queue 2 import time 3 def consumer(n): 4 while True: 5 print("\033[32;1mconsumer [%s]\033[0m get task: %s"%(n,q.get())) 6 time.sleep(1) 7 q.task_done() 8 def producer(n): 9 count=1 10 while True: 11 print('producer [%s] produced a new task: %s'%(n,count)) 12 q.put(count) 13 count += 1 14 q.join()#queue is emtpy 15 print('all tasks has been cosumed by consumers...') 16 q=queue.Queue() 17 c1=threading.Thread(target=consumer,args=[1,]) 18 c2=threading.Thread(target=consumer,args=[2,]) 19 c3=threading.Thread(target=consumer,args=[3,]) 20 21 p=threading.Thread