1、Python基本语法
1、@staticmethod 和 @classmethod
Python中有三种方法,实例方法、类方法(@classmethod)、静态方法(@staticmethod)。
类方法的第一个参数是cls,表示该类的一个实例,静态方法基本上和一个全局函数相同
class A(object):
def foo(self, x):
print(“executing foo(%s,%s)” % (self, x))
print(‘self:’, self)
@classmethod
def class_foo(cls, x):
print(“executing class_foo(%s,%s)” % (cls, x))
print(‘cls:’, cls)
@staticmethod
def static_foo(x):
print(“executing static_foo(%s)” % x)
a = A()
print(a.foo(1))
print(a.class_foo(1))
print(a.static_foo(1))
2、迭代器和生成器
迭代器:是访问集合元素的一种方式,从集合的第一个元素开始访问,直到所有元素被访问结束。其优点是不需要事先准备好整个迭代过程中的所有元素,仅在迭代到某个元素时才开始计算该元素。适合遍历比较巨大的集合。iter():方法返回迭代器本身, next():方法用于返回容器中下一个元素或数据。
生成器:带有yield的函数不再是一个普通函数,而是一个生成器。当函数被调用时,返回一个生成器对象。不像一般函数在生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行状态。
‘’‘迭代器’’’
print(‘for x in iter([1, 2, 3, 4, 5]):’)
for x in iter([1, 2, 3, 4, 5]):
print(x)
‘’‘生成器’’’
def myyield(n):
while n>0:
print(“开始生成…:”)
yield n
print(“完成一次…:”)
n -= 1
for i in myyield(4):
print(“遍历得到的值:”,i)
3、闭包
闭包可以实现先将一个参数传递给一个函数,而并不立即执行,以达到延迟求值的目的。满足以下三个条件:必须有一个内嵌函数;内嵌函数必须引用外部函数中变量;外部函数返回值必须是内嵌函数。
def delay_fun(x, y):
def caculator():
return x+y
return caculator
print(‘返回一个求和的函数,并不求和’)
msum = delay_fun(3,4)
print(‘调用并求和:’)
print(msum())
4、*args 和 **kwargs
这两个是Python中的可变参数,用于接受参数的传递。args表示任何多个无名参数,它是一个元组,**kwargs表示关键字参数,它是一个字典。同时使用args和kwargs时,必须*args在kwargs之前。
5、鸭子类型:
在鸭子类型中,关注的不是对象的类型本身,而是他是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。
class duck():
def walk(self):
print(‘I am duck,I can walk…’)
def swim(self):
print(‘I am duck,I can swim…’)
def call(self):
print(‘I am duck,I can call…’)
duck1=duck()
duck1.walk()
# I am duck,I can walk…
duck1.call() # I am duck,I can call…
6、@property 和 @setter
@property负责把一个方法变成属性调用。在对实例操作时,不暴露接口,而是通过getter和setter方法实现。
class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an intager')
if value<0 or value>100:
raise ValueError('score must between 0~100!')
self._score = value
s = Student()
s.score = 60
print(s.score)
s.score = 999
print(s.score)
7、多进程和多线程
进程:是资源分配的最小单位,创建和销毁开销较大;
线程:是CPU调度的最小单位,开销小,切换速度快;
操作系统将CPU时间片分配给多个线程,每个线程在指定放到时间片内完成。操作系统不断从一个线程切换到另一个线程执行,宏观上看就好像是多个线程一起执行。
Python中由于全局锁 (GIL) 的存在导致,同一时间只有一个获得GIL的线程在跑,其他线程则处于等待状态,这导致了多线程只是在做分时切换,并不能利用多核。
多线程与多进程的区别:(1)多进程中同一个变量各自有一份拷贝在每个进程中,互不影响;(2)多线程中,所有变量都由所有线程共享,任何一个变量都可被任何一个线程修改。线程之间共享数据的最大危险在于多个线程同时更改一个变量,把内容改乱。
from multiprocessing import Pool #多进程
from multiprocessing.dummpy import Pool #多线程
8、类变量和实例变量
普通的变量(非类的变量),在被赋值后即变量存在。类的变量在class里def外,通过变量名能被赋值,在def里通过类对象可被赋值
class Apple(object):
name = ‘apple’
p1 = Apple()
p2 = Apple()
p1.name = ‘orange’
print(p1.name)
print(p2.name)
9、装饰器
装饰器是一个工厂函数,接受一个函数作为参数,然后返回一个新函数,其闭包中包含被装饰的函数。有了装饰器,可以提取大量函数中与本身功能无关的类似代码 ( 这块在Flask中用于定义路由的@app.route,就是一个很好的例子),达到代码重用的目的。可应用于插入日志、性能测试、事务处理等方面。
def deco(func):
def warpper(*args, **kwargs):
print(‘start’)
func(*args, **kwargs)
print(‘end’)
return warpper
@deco
def myfunc(parameter):
print(“run with %s” % parameter)
myfunc(“something”)
2、数据库
1、MySQL基本语法
增:创建数据表
USE database
CREATE TABLE example(id INT,
name VARCHAR(20),
sex BOOLEAN);
删:
ALTER TABLE 表名 DROP 属性名; # 删除字段
DROP TABLE 表名; # 删除表
改:
ALTER TABLE 旧表名 RENAME 新表名; # 修改表名
ALTER TABLE 表名 MODIFY 属性名 数据类型; # 修改字段数据类型
查:
SELECT * FROM 表名 WHERE id=1; # 条件查询
SELECT * FROM 表名 WHERE 字段名 BETWEEN 条件一 AND 条件二 # 范围查询
SELECT COUNT(*) FROM 表名; # 查询表共有多少条记录
触发器:是由INSERT、UPDATE和DELETE等事件来触发某种特定操作,满足触发条件时,数据库系统会执行触发器中定义的语句,这样可以保证某些操作之间的一致性。
CREATE TRIGGER 触发器名称 BEFORE|AFTER 触发事件
ON 表名称 FOR EACH ROW
BEGIN
执行语句
END
3、算法
1、快排
算法:先从数列中取出一个数作为基准;然后将比该数大的数放到右边,比该数小的数放到左边;再对左右区间重复上一步骤。
def qsort(seq):
if seq==[]:
return []
else:
pivot=seq[0]
lesser=qsort([x for x in seq[1:] if x<pivot])
greater=qsort([x for x in seq[1:] if x>=pivot])
return lesser+[pivot]+greater
if name==‘main’:
seq=[5,6,78,9,0,-1,2,3,-65,12]
print(qsort(seq))
2、冒泡
算法:每次比较两个相邻的元素,然后进行排列。但是效率非常低。
def bubbleSort(nums):
for i in range(len(nums)-1): # 这个循环负责设置冒泡排序进行的次数
for j in range(len(nums)-i-1): # j为列表下标
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
return nums
nums = [5,2,45,6,8,3,1]
print(bubbleSort(nums))
4、网络
1、post 和 get方法区别
GET:浏览器告知服务器,只获取页面上的信息,请求的参数加到url后面;
POST:浏览器告知服务器,想在URL上发布新的信息,并且服务器必须确保数据已经存储且仅存储一次。这是html表单发送数据到服务器的方法。提交的数据放到data或body中,不能放到url中。
2、Cookie 和 Session
Cookie:存储在客户端,用于跟踪会话,保存用户偏好设置和用户名密码等,不安全;
Session:存储在服务器端,用于跟踪会话,安全。
-
Python是如何进行内存管理的?
答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制
一、对象的引用计数机制
python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况:
1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值
sys.getrefcount( )函数可以获得对象的当前引用计数
多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。
二、垃圾回收
1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
三、内存池机制
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
-
什么是lambda函数?它有什么好处?
答:lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数
lambda函数:首要用途是指点短小的回调函数
lambda [arguments]:expression
a=lambdax,y:x+y
a(3,11)
-
Python里面如何实现tuple和list的转换?
答:直接使用tuple和list函数就行了,type()可以判断对象的类型
-
请写出一段Python代码实现删除一个list里面的重复元素
答:
1,使用set函数,set(list)
2,使用字典函数,
a=[1,2,4,2,4,5,6,5,7,8,9,0]
b={}
b=b.fromkeys(a)
c=list(b.keys())
c
-
编程用sort进行排序,然后从最后一个元素开始判断
a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
a.sort()
last=a[-1]
for i inrange(len(a)-2,-1,-1):
if last==a[i]:
del a[i]
else:last=a[i]
print(a)
-
Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
答:赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
-
介绍一下except的用法和作用?
答:try…except…except…[else…][finally…]
执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
如果存在finally语句,最后总是会执行。
-
Python中pass语句的作用是什么?
答:pass语句不会执行任何操作,一般作为占位符或者创建占位程序,whileFalse:pass
-
介绍一下Python下range()函数的用法?
答:列出一组数据,经常用在for in range()循环中
- 如何用Python来进行查询和替换一个文本字符串?
答:可以使用re模块中的sub()函数或者subn()函数来进行查询和替换,
格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)
import re
p=re.compile(‘blue|white|red’)
print(p.sub(‘colour’,'blue socks and red shoes’))
colour socks and colourshoes
print(p.sub(‘colour’,'blue socks and red shoes’,count=1))
colour socks and redshoes
subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量
- Python里面match()和search()的区别?
答:re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。
re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。
print(re.match(‘super’, ‘superstition’).span())
(0, 5)
print(re.match(‘super’, ‘insuperable’))
None
print(re.search(‘super’, ‘superstition’).span())
(0, 5)
print(re.search(‘super’, ‘insuperable’).span())
(2, 7)
- 用Python匹配HTML tag的时候,<.>和<.?>有什么区别?
答:术语叫贪婪匹配( <.> )和非贪婪匹配(<.?> )
例如:
<.*> :
<.*?> :
- Python里面如何生成随机数?
答:random模块
随机整数:random.randint(a,b):返回随机整数x,a<=x<=b
random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。
随机实数:random.random( ):返回0到1之间的浮点数
random.uniform(a,b):返回指定范围内的浮点数。
- 有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
Pylint是另外一个工具可以进行codingstandard检查
- 如何在一个function里面设置一个全局的变量?
答:解决方法是在function的开始插入一个global声明:
def f()
global x
- 单引号,双引号,三引号的区别
答:单引号和双引号是等效的,如果要换行,需要符号(),三引号则可以直接换行,并且可以包含注释
如果要表示Let’s go 这个字符串
单引号:s4 = ‘Let\’s go’
双引号:s5 = “Let’s go”
s6 = ‘I realy like“python”!’
这就是单引号和双引号都可以表示字符串的原因了
- 如何用Python来发送邮件?
可以使用smtplib标准库。
以下代码可以在支持SMTP监听器的服务器上执行。
import sys, smtplib
fromaddr =raw_input(“From: “)
toaddrs = raw_input(“To: “).split(‘,’)
print “Enter message, end with ^D:”
msg = ”
while 1:
line = sys.stdin.readline()
if not line:
break
msg = msg + line
发送邮件部分
server = smtplib.SMTP(‘localhost’)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
- Python如何实现单例模式?其他23种设计模式python如何实现?
Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模式:
class Singleton(type):
def init(cls, name, bases, dict):
super(Singleton, cls).init(name, bases, dict)
cls.instance = None
def call(cls, *args,**kw):
if cls.instance is None:
cls.instance = super(Singleton, cls).call(*args, **kw)
return cls.instance
class MyClass(object):
metaclass = Singleton
print MyClass()
print MyClass()
2. 使用decorator来实现单例模式
def singleton(cls):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance
@singleton
class MyClass:
…
- 华为一道编程
有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 - 将两序列合并为一个序列,并排序,为序列Source
- 拿出最大元素Big,次大的元素Small
- 在余下的序列S[:-2]进行平分,得到序列max,min
- 将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。
Python代码
def mean( sorted_list ):
if not sorted_list:
return (([],[]))
big = sorted_list[-1]
small = sorted_list[-2]
big_list, small_list =mean(sorted_list[:-2])
big_list.append(small)
small_list.append(big)
big_list_sum =sum(big_list)
small_list_sum =sum(small_list)
if big_list_sum >small_list_sum:
return ( (big_list,small_list))
else:
return (( small_list,big_list))
tests = [ [1,2,3,4,5,6,700,800],
[10001,10000,100,90,50,1],
range(1, 11),
[12312, 12311, 232, 210,30, 29, 3, 2, 1, 1]
]
for l in tests:
l.sort()
print “Source List:\t”,l
l1,l2 = mean(l)
print “Result List:\t”,l1, l2
print “Distance:\t”,abs(sum(l1)-sum(l2))
print ‘-*’*40
输出结果
Python代码
Source List: [1, 2, 3, 4, 5, 6, 700, 800]
Result List: [1, 4, 5, 800] [2, 3, 6, 700]
Distance: 99
----------------------------------------
Source List: [1, 50, 90, 100, 10000, 10001]
Result List: [50, 90, 10000] [1, 100, 10001]
Distance: 38
----------------------------------------
Source List: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Result List: [2, 3, 6, 7, 10] [1, 4, 5, 8, 9]
Distance: 1
----------------------------------------
Source List: [1, 1, 2, 3, 29, 30, 210, 232, 12311, 12312]
Result List: [1, 3, 29, 232, 12311] [1, 2, 30, 210, 12312]
Distance: 21
- python程序中文输出问题怎么解决?
方法一:
用encode和decode
如:
import os.path
import xlrd,sys
Filename=’/home/tom/Desktop/1234.xls’
if not os.path.isfile(Filename):
raise NameError,”%s is not a valid filename”%Filename
bk=xlrd.open_workbook(Filename)
shxrange=range(bk.nsheets)
print shxrange
for x in shxrange:
p=bk.sheets()[x].name.encode(‘utf-8′)
print p.decode(‘utf-8′)
方法二:
在文件开头加上
reload(sys)
sys.setdefaultencoding(‘utf8′)这2行,再试着运行一下
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。
因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
代码中字符串的默认编码与代码文件本身的编码一致。
如:s=‘中文’
如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。
如果字符串是这样定义:s=u’中文’
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
isinstance(s,unicode) #用来判断是否为unicode
用非unicode编码形式的str来encode会报错
如何获得系统的默认编码?
#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()
该段程序在英文WindowsXP上输出为:ascii
- python代码得到列表list的交集与差集
交集
b1=[1,2,3]
b2=[2,3,4]
b3 = [val for val in b1if val in b2]
print b3
差集
b1=[1,2,3]
b2=[2,3,4]
b3 = [val for val in b1 if val not in b2]
print b3
差集实例
———-
#/bin/env python
-- coding:utf-8 --
f =open(‘C:\diff_dealer\excel.txt’)
excel = f.readlines()
f.close()
f= open(‘C:\diff_dealer\db.txt’)
db = f.readlines()
diff = [val for val in db if val not in excel]
f.close()
f =open(‘C:\diff_dealer\diff.txt’, ‘w’)
f.writelines(diff)
f.close()
print diff
- 写一个简单的python socket编程
python 编写server的步骤:
1第一步是创建socket对象。调用socket构造函数。如:
socket = socket.socket(family, type )
family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
2.第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的:
socket.bind( address )由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。
3.第三步是使用socket套接字的listen方法接收连接请求。
socket.listen( backlog )
backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
4.第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。
connection, address =socket.accept()
调用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素address是客户的Internet地址。
-
第五步是处理阶段,服务器和客户端通过send和recv方法通信(传输数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。
-
传输结束,服务器调用socket的close方法关闭连接。
python编写client的步骤:
- 创建一个socket以连接服务器:socket= socket.socket( family, type )
2.使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:
socket.connect((host,port) )
host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。
-
处理阶段,客户和服务器将通过send方法和recv方法通信。
-
传输结束,客户通过调用socket的close方法关闭连接。
下面给个简单的例子:
if name ==‘main’:
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind((‘localhost’,8001))
sock.listen(5)
while True:
connection,address =sock.accept()
try:
connection.settimeout(5)
buf =connection.recv(1024)
if buf == ‘1’:
connection.send(‘welcometo server!’)
else:
connection.send(‘pleasego out!’)
except socket.timeout:
print ‘time out’
connection.close()
python 代码
if name ==‘main’:
import socket
sock =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((‘localhost’,8001))
import time
time.sleep(2)
sock.send(‘1’)
print sock.recv(1024)
sock.close()
在终端运行server.py,然后运行clien.py,会在终端打印“welcometo server!"。如果更改client.py的sock.
-
Python文件操作的面试题
-
如何用Python删除一个文件?
使用os.remove(filename)或者os.unlink(filename); -
Python如何copy一个文件?
shutil模块有一个copyfile函数可以实现文件拷贝
1:Python如何实现单例模式?
Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模式:
1.
class Singleton(type):
def init(cls, name, bases, dict):
super(Singleton, cls).init(name, bases, dict)
cls.instance = None
def call(cls, *args, **kw):
if cls.instance is None:
cls.instance = super(Singleton, cls).call(*args, **kw)
return cls.instance
class MyClass(object):
metaclass = Singleton
print MyClass()
print MyClass()
2. 使用decorator来实现单例模式
def singleton(cls):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance
@singleton
class MyClass:
…
2:什么是lambda函数?
Python允许你定义一种单行的小函数。定义lambda函数的形式如下:labmda参数:表达式lambda函数默认返回表达式的值。你也可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个:
g = lambda x, y: x*y
g(3,4)
12g = lambda x, y=0, z=0: x+y+z
g(1)
1g(3, 4, 7)
14
也能够直接使用lambda函数,不把它赋值给变量:(lambda x,y=0,z=0:x+y+z)(3,5,6)
14
如果你的函数非常简单,只有一个表达式,不包含命令,可以考虑lambda函数。否则,你还是定义函数才对,毕竟函数没有这么多限制。
3:Python是如何进行类型转换的?
Python提供了将变量或值从一种类型转换成另一种类型的内置函数。int函数能够将符合数学格式数字型字符串转换成整数。否则,返回错误信息。
int(”34″)
34int(”1234ab”) #不能转换成整数
ValueError: invalid literal for int(): 1234ab
函数int也能够把浮点数转换成整数,但浮点数的小数部分被截去。int(34.1234)
34int(-2.46)
-2
函数°oat将整数和字符串转换成浮点数:float(”12″)
12.0float(”1.111111″)
1.111111
函数str将数字转换成字符:str(98)
‘98′str(”76.765″)
‘76.765′
整数1和浮点数1.0在python中是不同的。虽然它们的值相等的,但却属于不同的类型。这两个数在计算机的存储形式也是不一样。
4:Python如何定义一个函数
函数的定义形式如
下:
def (arg1, arg2,… argN):
函数的名字也必须以字母开头,可以包括下划线“ ”,但不能把Python的
关键字定义成函数的名字。函数内的语句数量是任意的,每个语句至少有
一个空格的缩进,以表示此语句属于这个函数的。缩进结束的地方,函数
自然结束。
下面定义了一个两个数相加的函数:
def add(p1, p2):
print p1, “+”, p2, “=”, p1+p2add(1, 2)
1 + 2 = 3
函数的目的是把一些复杂的操作隐藏,来简化程序的结构,使其容易
阅读。函数在调用前,必须先定义。也可以在一个函数内部定义函数,内
部函数只有在外部函数调用时才能够被执行。程序调用函数时,转到函数
内部执行函数内部的语句,函数执行完毕后,返回到它离开程序的地方,
执行程序的下一条语句。
5:Python是如何进行内存管理的?
Python的内存管理是由Python得解释器负责的,开发人员可以从内存管理事务中解放出来,致力于应用程序的开发,这样就使得开发的程序错误更少,程序更健壮,开发周期更短
6:如何反序的迭代一个序列?howdo I iterate over a sequence in reverse order
如果是一个list, 最快的解决方案是:
list.reverse()
try:
for x in list:
“do something with x”
finally:
list.reverse()
如果不是list, 最通用但是稍慢的解决方案是:
for i in range(len(sequence)-1, -1, -1):
x = sequence[i]
7:Python里面如何实现tuple和list的转换?
函数tuple(seq)可以把所有可迭代的(iterable)序列转换成一个tuple, 元素不变,排序也不变。
例如,tuple([1,2,3])返回(1,2,3),tuple(’abc’)返回(’a’.’b’,’c’).如果参数已经是一个tuple的话,函数不做任何拷贝而直接返回原来的对象,所以在不确定对象是不是tuple的时候来调用tuple()函数也不是很耗费的。
函数list(seq)可以把所有的序列和可迭代的对象转换成一个list,元素不变,排序也不变。
例如 list([1,2,3])返回(1,2,3),list(’abc’)返回[‘a’, ‘b’, ‘c’]。如果参数是一个list,她会像set[:]一样做一个拷贝
8:Python面试题:请写出一段Python代码实现删除一个list里面的重复元素
可以先把list重新排序,然后从list的最后开始扫描,代码如下:
if List:
List.sort()
last = List[-1]
for i in range(len(List)-2, -1, -1):
if last==List[i]: del List[i]
else: last=List[i]
9:Python文件操作的面试题
-
如何用Python删除一个文件?
使用os.remove(filename)或者os.unlink(filename); -
Python如何copy一个文件?
shutil模块有一个copyfile函数可以实现文件拷贝
10:Python里面如何生成随机数?
标准库random实现了一个随机数生成器,实例代码如下:
import random
random.random()
它会返回一个随机的0和1之间的浮点数
11:如何用Python来发送邮件?
可以使用smtplib标准库。
以下代码可以在支持SMTP监听器的服务器上执行。
import sys, smtplib
fromaddr = raw_input(”From: “)
toaddrs = raw_input(”To: “).split(’,’)
print “Enter message, end with ^D:”
msg = ”
while 1:
line = sys.stdin.readline()
if not line:
break
msg = msg + line
发送邮件部分
server = smtplib.SMTP(’localhost’)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
12:Python里面如何拷贝一个对象?
一般来说可以使用copy.copy()方法或者copy.deepcopy()方法,几乎所有的对象都可以被拷贝
一些对象可以更容易的拷贝,Dictionaries有一个copy方法:
newdict = olddict.copy()
13:有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
有,PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
Pylint是另外一个工具可以进行coding standard检查。
14:如何在一个function里面设置一个全局的变量?
解决方法是在function的开始插入一个global声明:
def f()
global x
14:有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
-
将两序列合并为一个序列,并排序,为序列Source
-
拿出最大元素Big,次大的元素Small
-
在余下的序列S[:-2]进行平分,得到序列max,min
-
将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。
Python代码
def mean( sorted_list ):
if not sorted_list:
return (([],[]))
big = sorted_list[-1]
small = sorted_list[-2]
big_list, small_list = mean(sorted_list[:-2])
big_list.append(small)
small_list.append(big)
big_list_sum = sum(big_list)
small_list_sum = sum(small_list)
if big_list_sum > small_list_sum:
return ( (big_list, small_list))
else:
return (( small_list, big_list))
tests = [ [1,2,3,4,5,6,700,800],
[10001,10000,100,90,50,1],
range(1, 11),
[12312, 12311, 232, 210, 30, 29, 3, 2, 1, 1]
]
for l in tests:
l.sort()
print “Source List:\t”, l
l1,l2 = mean(l)
print “Result List:\t”, l1, l2
print “Distance:\t”, abs(sum(l1)-sum(l2))
print ‘-*’*40
输出结果
Python代码
Source List: [1, 2, 3, 4, 5, 6, 700, 800]
Result List: [1, 4, 5, 800] [2, 3, 6, 700]
Distance: 99
----------------------------------------
Source List: [1, 50, 90, 100, 10000, 10001]
Result List: [50, 90, 10000] [1, 100, 10001]
Distance: 38
----------------------------------------
Source List: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Result List: [2, 3, 6, 7, 10] [1, 4, 5, 8, 9]
Distance: 1
----------------------------------------
Source List: [1, 1, 2, 3, 29, 30, 210, 232, 12311, 12312]
Result List: [1, 3, 29, 232, 12311] [1, 2, 30, 210, 12312]
Distance: 21
----------------------------------------
15:用Python匹配HTML tag的时候,<.>和<.?>有什么区别?
当重复匹配一个正则表达式时候, 例如<.*>, 当程序执行匹配的时候,会返回最大的匹配值
例如:
import re
s = ‘
print(re.match(’<.*>’, s).group())
会返回一个匹配
而
import re
s = ‘
print(re.match(’<.*?>’, s).group())
则会返回
<.>这种匹配称作贪心匹配 <.?>称作非贪心匹配
16:Python里面search()和match()的区别?
match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none
例如:
print(re.match(’super’, ’superstition’).span())会返回(0,5)
而print(re.match(’super’, ‘insuperable’))则返回None
search()会扫描整个字符串并返回第一个成功的匹配
例如:print(re.search(’super’, ’superstition’).span())返回(0, 5)
print(re.search(’super’, ‘insuperable’).span())返回(2,7)
17:如何用Python来进行查询和替换一个文本字符串?
可以使用sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, string[, count=0])
replacement是被替换成的文本
string是需要被替换的文本
count是一个可选参数,指最大被替换的数量
例子:
import re
p = re.compile(’(blue|white|red)’)
print(p.sub(’colour’,'blue socks and red shoes’))
print(p.sub(’colour’,'blue socks and red shoes’, count=1))
输出:
colour socks and colour shoes
colour socks and red shoes
subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量
例如:
import re
p = re.compile(’(blue|white|red)’)
print(p.subn(’colour’,'blue socks and red shoes’))
print(p.subn(’colour’,'blue socks and red shoes’, count=1))
输出
(’colour socks and colour shoes’, 2)
(’colour socks and red shoes’, 1)
18:介绍一下except的用法和作用?
Python的except用来捕获所有异常, 因为Python里面的每次错误都会抛出 一个异常,所以每个程序的错误都被当作一个运行时错误。
一下是使用except的一个例子:
try:
foo = opne(”file”) #open被错写为opne
except:
sys.exit(”could not open file!”)
因为这个错误是由于open被拼写成opne而造成的,然后被except捕获,所以debug程序的时候很容易不知道出了什么问题
下面这个例子更好点:
try:
foo = opne(”file”) # 这时候except只捕获IOError
except IOError:
sys.exit(”could not open file”)
19:Python中pass语句的作用是什么?
pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作,比如:
while False:
pass
pass通常用来创建一个最简单的类:
class MyEmptyClass:
pass
pass在软件设计阶段也经常用来作为TODO,提醒实现相应的实现,比如:
def initlog(*args):
pass #please implement this
20:介绍一下Python下range()函数的用法?
如果需要迭代一个数字序列的话,可以使用range()函数,range()函数可以生成等差级数。
如例:
for i in range(5)
print(i)
这段代码将输出0, 1, 2, 3, 4五个数字
range(10)会产生10个值, 也可以让range()从另外一个数字开始,或者定义一个不同的增量,甚至是负数增量
range(5, 10)从5到9的五个数字
range(0, 10, 3) 增量为三, 包括0,3,6,9四个数字
range(-10, -100, -30) 增量为-30, 包括-10, -40, -70
可以一起使用range()和len()来迭代一个索引序列
例如:
a = [‘Nina’, ‘Jim’, ‘Rainman’, ‘Hello’]
for i in range(len(a)):
print(i, a[i])