python中的高级特性
一、生成式
定义:快速生成对象的公式
列表生成式
它是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。
• 普通的语法格式:[exp for iter_var in iterable]
result = [random.randint(1,50) for count in range(100)]
• 带过滤功能语法格式: [exp for iter_var in iterable if_exp]
result = [num for num in range(1,100) if num%3 == 0]
• 循环嵌套语法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B]
nums = [item1+item2 for item1 in ‘abc’ for item2 in ‘123’]
举例:
代码:
import random
#列表生成式
1.需求:生成10个随机数(0-20)
results = [random.randint(1,20) for i in range(10)]
print(results)
2. 需求: 生成1~20之间能被4整除的数
results =[num for num in range(1,21) if num%4 ==0]
print("1~20之间能被4整除的数:",results)
3. 生成15个文件, hello{1..5}.{"png", "jpg", "gif"}
import os
dirname ='dir'
if os.path.exists(dirname):
print("目录已经存在")
else:
os.mkdir('dir')
print("目录创建成功")
for num in range(1,6):
for name in ["png","jpg","gif"]:
file = "hello%s.%s" %(num,name)
filename = os.path.join(dirname,file) # 将目录名和文件名拼接
# Windows通过‘w’打开不存在的文件创建文件
with open(filename,'w') as f:
print("正在创建文件:%s" %(filename))
测试:
集合生成式
快速生成集合
字典生成式
字典生成式就是一个用来生成字典的特定语法形式的表达式
二、生成器
定义:一边循环一边计算的机制
什么时候需要使用生成器?
性能限制需要用到,比如读取一个10G的文件,如果一次性将10G的文件加载到内存处理的话(read方法),内存肯定会溢出;但使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.
可以用time()函数来比较生成器和生成式生成同一组数据的快慢
• 如何创建生成器?
第一种方法: 列表生成式的改写。 []改成()
第二种方法: yield关键字。
Yield生成fib()数列
打印生成器每一个元素的方法
1.通过for 循环依次打印每一个for循环
2.可以通过next()函数获得下一个返回值
python中return关键字和yield关键字的区别
return:在程序函数中返回某个值,返回之后函数不在继续执行,彻底结束。
yield: 带有yield的函数是一个生成器,函数返回某个值时,会停留在某个位置,返回函数值后,会在前面停留的位置继续执行,直到程序结束
三、迭代器
定义:可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可迭代对象
定义:可以直接作用于for循环的对象(如何判断是否可以迭代?)
一类是集合数据类型,如list, tuple,dict, set,str等;
一类是generator,包括生成器和带yield的generator function。
含义:
- 生成器一定是迭代器,但是迭代器不一定是生成器
- 迭代器一定是可迭代对象,但可迭代对象不一定是迭代器,例如,集合, 可以用iter()函数来将可迭代对象转换为迭代器
四、闭包
什么是闭包?如何实现闭包
闭包就是指有权访问另一个函数作用域中的变量的函数。
创建闭包最常见方式,就是在一个函数内部创建另一个函数。
常见形式: 内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用。闭包的一个常用场景就是装饰器
五、装饰器
什么是装饰器
器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能的工具/函数(照片与相框)
为什么要使用装饰器
如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时候就可以使用装饰器,因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能是开放的
装饰器的实现必须遵循两大原则:
封闭:对已经实现的功能代码块封闭。不能修改被装饰对象的源代码
开放:对扩展开放
装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能
如何实现装饰器
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的应用1:插入日志
import time
from functools import wraps
def timeit(fun):
@wraps(fun)
def wrapper(*args,**kwargs):
start_time = time.time()
a = fun(*args,**kwargs)
end_time = time.time()
print('函数%s执行的时间为%.2f' %(fun.__name__,end_time-start_time))
return a
return wrapper
@timeit
def hello(a,b):
time.sleep(0.2)
print(a,b)
print("欢迎学习python")
hello(1,2)
装饰器应用场景2
插入日志
import time
import logging
from functools import wraps
def add_log(f):
@wraps(f)
def wrapper(*args,**kwargs):
start_time = time.time()
result = f(*args,**kwargs)
end_time = time.time()
logging.error('%s函数执行时间为%.2f ,执行的结果是%s' %(f.__name__,end_time-start_time,result))
return result
return wrapper
@add_log
def add(x:int,y:int) -> int:
time.sleep(0.2)
return x+y
if __name__ == '__main__':
result = add(1,3)
print(result)
多装饰器
当一个函数同时被多个装饰器作为装饰对象,多个装饰器的顺序是自下而上,而调用的顺序是自上而下
内置高阶函数
函数式编程的一个特点就是允许吧函数本身作为参数传入另一个函数,还允许返回同一个函数,Python对函数编程提供部分支持
把函数作为参数传入,这样的函数称为告诫函数,函数式编程就是指这种高度抽象的编程范式。
1、map() 会根据提供的函数对指定序列做映射。
2、sorted() 函数对所有可迭代的对象进行排序操作。返回重新排序的列表。
sorted(iterable, key=None, reverse=False)
key: 主要是用来进行比较的元素,只有一个参数,
reverse: 排序规则,True 降序 ,False 升序(默认)
python排序sort()和sorted()的区别是什么?
1.排序对象不同: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
2.返回值不同:
list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,
内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
import random
def is_odd(x):
return x % 2 == 0
# 需求:偶数排在前,奇数排在后
nums = list(range(10))
random.shuffle(nums)
print('排序前:',nums)
nums.sort(key=lambda x:0 if is_odd(x) else 1)
print('排序后:',nums)
#sorted可以对所有可迭代的对象进行排序操作
result = sorted({2,3,4,5,1})
print(result)
上一篇: HTML5和CSS3新特性(常用)
下一篇: 养成良好的写代码习惯