当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组,我们就使用*args:
def func(*args): for i in args: print(i) func(3,2,1,4,7) 3 2 1 4 7
在我们不知道该传递多少关键字参数时,使用**kwargs来收集关键字参数:
def func(**kwargs): for i in kwargs: print(i,kwargs[i]) func(a=1,b=2,c=7) a.1 b.2 c.7
使用命令os.remove(filename)或os.unlink(filename)
您可以通过以下方法访问C中用Python编写的模块:
Module = = PyImport_ImportModule(“<modulename>”)
它是一个Floor Divisionoperator,用于分割两个操作数,结果为商,只显示小数点前的数字。
例如,10 // 5 = 2和10.0 // 5.0 = 2.0。
字符串中的前导空格就是出现在字符串中第一个非空格字符前的空格。
我们使用方法Istrip()可以将它从字符串中移除。
’ Data123 '.lstrip()
结果:
'Data123 ’
最初的字符串当中既有前导字符也有后缀字符,调用Istrip()去除了前导空格,如果我们想去除后缀空格,可以使用rstrip()方法。
'Data123 '.rstrip() 'Data123'
a,b = 0, 1 while b<100: print (b) a, b = b, a+b
如果字符串只含有数字字符,可以用函数int()将其转换为整数。
int(‘22’)
我们检查一下变量类型:
type('22') <class'str'> type(int('22')) <class'int'>
要想生成随机数,我们可以从random模块中导入函数random()。
from random import random random() 0.013501571090371978
我们还可以使用函数randint(),它会用两个参数表示一个区间,返回该区间内的一个随机整数。
from random import randint randint(2,7) 4
最简单的方法就是用capitalize()方法。
'daxie'.capitalize() 'Daxie'
对于这个问题,我们可以使用isalnum()方法。
'DATA123'.isalnum() True 'DATA123!'.isalnum() False
我们还可以用其它一些方法:
'123'.isdigit()#检测字符串是否只由数字组成 True '123'.isnumeric()#只针对unicode对象 True 'data'.islower()#是否都为小写 True 'Data'.isupper()#是否都为大写 False
Python中的连接就是将两个序列连在一起,我们使用 运算符完成:
'22'+'33' ‘2233' [1,2,3]+[4,5,6] [1, 2,3, 4, 5, 6] (2,3)+(4) TypeError Traceback (most recent call last) <ipython-input-7-69a1660f2fc5> in <module> ----> 1 (2,3)+(4) TypeError: can only concatenate tuple (not "int") to tuple
这里运行出错,因为(4)被看作是一个整数,修改一下再重新运行:
(2,3)+(4,) (2, 3,4)
当一个函数在其调用过程中直接或间接地调用了自身时,这就是递归。但为了避免出现死循环,必须要有一个结束条件,举个例子:
def facto(n): if n==1: return 1 return n*facto(n-1) facto(5) 120
生成器会生成一系列的值用于迭代,这样看它又是一种可迭代对象。
它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。
我们定义一个能逐个“yield”值的函数,然后用一个for循环来迭代它。
def squares(n): i=1 while(i<=n): yield i**2 i+=1 for i in squares(5): print(i) 1 4 9 16 25
迭代器是访问集合元素的一种方式。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退。我们使用inter()函数创建迭代器。
odds=iter([1,2,3,4,5]) #每次想获取一个对象时,我们就调用next()函数 next (odds) 1 next (odds) 2 next (odds) 3 next (odds) 4 next (odds) 5
1)在使用生成器时,我们创建一个函数;在使用迭代器时,我们使用内置函数iter()和next();
2)在生成器中,我们使用关键字‘yield’来每次生成/返回一个对象;
3)生成器中有多少‘yield’语句,你可以自定义;
生成器会在每次暂停循环时保存本地变量状态。迭代器只需要一个可迭代对象就能进行迭代,不需要使用局部变量
5)使用类可以实现你自己的迭代器,但无法实现生成器;
6)生成器运行速度快,语法简洁,更简单;
7)迭代器更能节约内存。
Python新手可能对这个函数不是很熟悉,zip()可以返回元组的迭代器。
list(zip([‘a’,‘b’,‘c’],[1,2,3]))
[(‘a’,1), (‘b’, 2), (‘c’, 3)]
在这里zip()函数对两个列表中的数据项进行了配对,并用它们创建了元组。
我们可以使用函数/方法getcwd(),从模块os中将其导入。
import os
os.getcwd()
‘C:Users37410Desktop代码’
这个也比较简单,在我们想计算长度的字符串上调用函数len()即可。
len(‘Data 123’)
8
从列表中删除并返回最后一个对象或obj。
list.pop(obj = list [-1])
有时,当我们想要遍历列表时,一些方法会派上用场。
1)filter()
过滤器允许我们根据条件逻辑过滤一些值。
list(filter(lambda x:x> 5,range(8))) [6,7] 2)map()
Map将函数应用于iterable中的每个元素。
list(map(lambda x:x ** 2,range(8))) [0,1,4,9,16,25,36,49] 3)reduce()
在我们达到单个值之前,Reduce会反复减少序列顺序。
from functools import reduce reduce(lambda x,y:xy,[1,2,3,4,5]) -13
def list_sum(num_List):如果len(num_List)== 1: return num_List [0] else: return num_List [0] + list_sum(num_List [1:]) print(list_sum([3,4,5,6,11])) 29
import random def random_line(fname): lines = open(fname).read().splitlines() return random.choice(lines) print(random_line('test.txt'))
def file_lengthy(fname): open(fname)as f: for i,l in enumerate(f): pass return i + 1 print(“file of lines:”,file_lengthy(“test.txt”))
import os os.chdir('C:\Users\lifei\Desktop') with open('Today.txt') as today: count=0 for i in today.read(): if i.isupper(): count+=1 print(count)
以下代码可用于在Python中对列表进行排序:
list = ["1", "4", "0", "6", "9"] list = [int(i) for i in list] list.sort() print (list) Django有关
对于Django框架遵循MVC设计,并且有一个专有名词:MVT,
M全拼为Model,与MVC中的M功能相同,负责数据处理,内嵌了ORM框架;
V全拼为View,与MVC中的C功能相同,接收HttpRequest,业务处理,返回HttpResponse;
T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html,内嵌了模板引擎
Flask是一个“微框架”,主要用于具有更简单要求的小型应用程序。
Pyramid适用于大型应用程序,具有灵活性,允许开发人员为他们的项目使用数据库,URL结构,模板样式等正确的工具。
Django也可以像Pyramid一样用于更大的应用程序。它包括一个ORM。
Django架构
开发人员提供模型,视图和模板,然后将其映射到URL,Django可以为用户提供服务。
Django使用SQLite作为默认数据库,它将数据作为单个文件存储在文件系统中。
如过你有数据库服务器-PostgreSQL,MySQL,Oracle,MSSQL-并且想要使用它而不是SQLite,那么使用数据库的管理工具为你的Django项目创建一个新的数据库。
无论哪种方式,在您的(空)数据库到位的情况下,剩下的就是告诉Django如何使用它。
这是项目的settings.py文件的来源。
我们将以下代码行添加到setting.py文件中:
DATABASES ={‘default’: {‘ENGINE’: ‘django.db.backends.sqlite3’, ‘NAME’: os.path.join(BASE_DIR, ‘db.sqlite3’),
这是我们在Django中使用write一个视图的方法:
from django.http import HttpResponse import datetime def Current_datetime(request): now =datetime.datetime.now() html ="<html><body>It is now %s</body></html>"%now return HttpResponse(html)
返回当前日期和时间,作为HTML文档。
模板是一个简单的文本文件。
它可以创建任何基于文本的格式,如XML,CSV,HTML等。
模板包含在评估模板时替换为值的变量和控制模板逻辑的标记(%tag%)。
Django提供的会话允许您基于每个站点访问者存储和检索数据。
Django通过在客户端放置会话ID cookie并在服务器端存储所有相关数据来抽象发送和接收cookie的过程。
所以数据本身并不存储在客户端。
从安全角度来看,这很好。
在Django中,有三种可能的继承样式:
抽象基类:当你只希望父类包含而你不想为每个子模型键入的信息时使用;
多表继承:对现有模型进行子类化,并且需要每个模型都有自己的数据库表。
代理模型:只想修改模型的Python级别行为,而无需更改模型的字段。
数据分析
map函数执行作为第一个参数给出的函数,该函数作为第二个参数给出的iterable的所有元素。
如果给定的函数接受多于1个参数,则给出了许多迭代。
我们可以使用下面的代码在NumPy数组中获得N个最大值的索引:
importnumpy as np arr =np.array([1, 3, 2, 4, 5]) print(arr.argsort()[-3:][::-1]) 4 3 1
Q86.如何用Python/ NumPy计算百分位数?
importnumpy as np a =np.array([1,2,3,4,5] p =np.percentile(a, 50) #Returns 50th percentile, e.g. median print(p) 3
1)Python的列表是高效的通用容器。
它们支持(相当)有效的插入,删除,追加和连接,Python的列表推导使它们易于构造和操作。
2)有一定的局限性
它们不支持元素化加法和乘法等“向量化”操作,可以包含不同类型的对象这一事实意味着Python必须存储每个元素的类型信息,并且必须在操作时执行类型调度代码在每个元素上。
3)NumPy不仅效率更高,也更方便
你可以获得大量的矢量和矩阵运算,这有时可以避免不必要的工作。
4)NumPy数组更快
你可以使用NumPy,FFT,卷积,快速搜索,基本统计,线性代数,直方图等内置。
Python中的装饰器用于修改或注入函数或类中的代码。
使用装饰器,您可以包装类或函数方法调用,以便在执行原始代码之前或之后执行一段代码。
装饰器可用于检查权限,修改或跟踪传递给方法的参数,将调用记录到特定方法等
如果在一个理想的世界中,NumPy只含有最基本的数组数据类型和操作,如索引、排序、重塑和基本元素函数。
2)所有数字代码都将驻留在SciPy中。尽管如此,NumPy仍然保持着向后兼容的目标,力图保留其前身所支持的所有功能。
因此,尽管更适合属于SciPy,NumPy仍然包括一些线性代数函数。无论如何,SciPy都包含比其他数值算法更全面的线性代数模块版本和其他许多数值算法。
若用python进行科学计算,建议安装NumPy及SciPy。大多数新功能属于SciPy而非NumPy。
与2D绘图一样,3D图形超出了NumPy和SciPy的范围,但就像2D情况一样,存在与NumPy集成的包。
Matplotlib在mplot3d子包中提供基本的3D绘图,而Mayavi使用功能强大的VTK引擎提供各种高质量的3D可视化功能。
爬虫和scary框架
scrapy是一个Python爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。
而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可以让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合。
因为redis支持主从同步,而且数据都是缓存在内存中的,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高。
Python自带:urllib,urllib2
第 三 方:requests
框 架:Scrapy
urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能。
urllib2.:urllib2.urlopen可以接受一个Request对象或者url,(在接受Request对象时候,并以此可以来设置一个URL 的headers),urllib.urlopen只接收一个url
urllib 有urlencode,urllib2没有,因此总是urllib,urllib2常会一起使用的原因
scrapy是封装起来的框架,他包含了下载器,解析器,日志及异常处理,基于多线程,。
twisted的方式处理,对于固定单个网站的爬取开发,有优势;但是对于多网站爬取 100个网站,并发及分布式处理方面,不够灵活,不便调整与括展。
request 是一个HTTP库, 它只是用来,进行请求,对于HTTP请求,他是一个强大的库,下载,解析全部自己处理,灵活性更高,高并发与分布式部署也非常灵活,对于功能可以更好实现。
主要 MyISAM 与 InnoDB 两个引擎,其主要区别如下:
1)InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高
级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM就不可以了;
MyISAM更适合以查询和插入为主的应用程序,而InnoDB则更适合需要频繁修改和涉及较高安全性的应用程序
3)InnoDB 支持外键,MyISAM 不支持;
4)MyISAM 是默认引擎,InnoDB 需要指定;
5)InnoDB 不支持 FULLTEXT 类型的索引;
6)InnoDB 中不保存表的行数,如 select count(*) from table 时,InnoDB;
需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。
注意的是,当 count(*)语句包含 where 条件时 MyISAM 也需要扫描整个表;
7)对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM表中可以和其他字段一起建立联合索引;
8)清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表;
9)InnoDB 支持行锁(某些情况下还是锁整表,如 update table set a=1 whereuser like ‘%lee%’
从start_urls里获取第一批url并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,
调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理:
如果提取出需要的数据,则交给管道文件处理;
2)如果提取出url,则继续执行之前的步骤(发送url请求,并由引擎将请求交给调度器入队列…),直到请求队列里没有请求,程序结束。
将多个表联合起来进行查询,主要有内连接、左连接、右连接、全连接(外连接)
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,
而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。
在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况来设置多进程或多线程。
1)优化索引、SQL 语句、分析慢查询;
2)优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等;
3)采用MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率;
4)选择合适的表引擎,参数上的优化;
5)进行架构级别的缓存,静态化和分布式;
6)采用更快的存储方式,例如 NoSQL存储经常访问的数据
1)ip
2)带宽
3)cpu
4)io
1)scrapy自带
2)付费接口
1)通过Headers反爬虫从用户请求的Headers反爬虫是最常见的反爬虫策略。
可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。
2)基于用户行为反爬虫
通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。
大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。
可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。
有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib2中很容易做到,这样就能很容易的绕过第一种反爬虫。
对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。
有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。
3)动态页面的反爬虫
首先用Fiddler对网络请求进行分析,如果能够找到ajax请求,也能分析出具体的参数和响应的具体含义,我们就能采用上面的方法。
使用 requests 或 urllib2 模拟 ajax 请求并分析响应的 JSON 格式以获取所需数据。
但是有些网站把ajax请求的所有参数全部加密了,没办法构造自己所需要的数据的请求。
这种情况下就用selenium phantomJS,调用浏览器内核,并利用phantomJS执行js来模拟人为操作以及触发页面中的js脚本。
以上是Python常问的面试题有哪些的详细内容。更多信息请关注PHP中文网其他相关文章!