Python面试知识点总结2
-
装饰器
简单的个人理解就是改变原有函数的指向
简单的实验如下import time def sum1(): sum = 1+1 print (sum) def timeit(func): def test(): start = time.clock() func() end =time.clock() print("time used:", end - start) return test sum1 = timeit(sum1) sum1()
其中 sum1 = timeit(sum1) 这句即起到了装饰器的作用
改变代码如下import time def timeit(func): def test(): start = time.clock() func() end =time.clock() print("time used:", end - start) return test #sum1 = timeit(sum1) @timeit def sum1(): sum = 1+1 print (sum) sum1()
运行结果相同,此时要注意要将装饰器先写,sum1函数定义在后,否则报错
-
匿名函数
lambda函数的语法:lambda arg1,arg2,…argn:expression
lambda 函数参数:返回值f = lambda a,b,c:a+b+c print(f(1,2,3))
-
生成器与迭代器
生成器
生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。
生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,但是,不同于一般的函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器。
python中创建生成器第一种方法是将列表生成式的[ ]换成( )即可。#列表生成式 lis = [x*x for x in range(10)] print(lis) #生成器 generator_ex = (x*x for x in range(10)) print(generator_ex) 结果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] <generator object <genexpr> at 0x000002A4CBF9EBA0>
生成器保存的是算法,用next()或者循环取值。循环取值常用
#生成器 generator_ex = (x*x for x in range(10)) print(next(generator_ex))
#生成器 generator_ex = (x*x for x in range(10)) for i in generator_ex: print(i)
yield
def fib(max): n,a,b =0,0,1 while n < max: yield b a,b =b,a+b n = n+1 return 'done'
可以通过next返回值,或者循环,每次执行到yeild时会暂停并返回yeild后面的值,节省内存,类似生成器,保存的是算法
-
多态
方法多态性,体现在方法的重载和重写上
方法的重载是指同一个方法名称,根据其传入的参数类型、个数和顺序的不同,所调用的方法体也不同,即同一个方法名称在一个类中有不同的功能实现;
方法的重写是指父类之中的一个方法名称,在不同的子类有不同的功能实现,而后依据实例化子类的不同,同一个方法,可以完成不同的功能。
对象多态性,体现在父、子对象之间的转型上
1.向上转型(Upcast)(自动转型):父类 父类对象=子类实例
将子类对象赋值给父类对象,这样将子类对象自动转换为父类对象。这种转换方式是安全的。
2.向下转型(Downcast)(强制转型):子类 子类对象=(子类)父类对象。
将父类对象赋值给子类对象。这种转换方式是非安全的。在特定背景下如果需要父类对象转换为子类对象,就必须使用强制类型转换。 -
使用Python发邮件
用smtplib库#创建SMTP对象 import smtplib smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] ) ''' host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: runoob.com,这个是可选参数。 port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。 local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。 ''' #Python SMTP 对象使用 sendmail 方法发送邮件 SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) ''' from_addr: 邮件发送者地址。 to_addrs: 字符串列表,邮件发送地址。 msg: 发送消息 '''
简单的实例
#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header sender = 'from@runoob.com' receivers = ['429240967@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码 message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8') message['From'] = Header("菜鸟教程", 'utf-8') # 发送者 message['To'] = Header("测试", 'utf-8') # 接收者 subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print "邮件发送成功" except smtplib.SMTPException: print "Error: 无法发送邮件"
-
raise语句自己触发异常
更多异常相关参考菜鸟教程
菜鸟教程—异常#!/usr/bin/python # -*- coding: UTF-8 -*- # 定义函数 def mye( level ): if level < 1: raise Exception,"Invalid level!" # 触发异常后,后面的代码就不会再执行 try: mye(0) # 触发异常 except Exception,err: print 1,err else: print 2 #结果 $ python test.py 1 Invalid level!