python的高级特性
列表生成式
生成式:就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list
普通的语法格式:[exp for iter_var in iterable]
带过滤功能语法格式: [exp for iter_var in iterable if_exp]
循环嵌套语法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B]
集合生成式:result = { i for i in range(10) }
字典生成式:result = { str(i):i for i in range(10) }
1、需求:生成10个0-20的随机数
不用列表生成式
代码:
import random
d=[]
for i in range(10):
add = random.randint(0,20)
d.append(add)
print(d)
列表生成式
import random
d = [random.randint(1,20)for i in range(10)]
print(d)
2、生成0-20中能被4整除的数
代码:
d = [num for num in range(1,21) if num%4==0]
print(d)
运行结果:
3、创建目录dir并生成15个文件hello{1…5}{jng.gif.jpg}
代码:
import os
dirname = 'dir'
for num in range(1,6):
for name in ["jng","gif","jpg"]:
file = "hello%s.%s"%(num,name)
filename = os.path.join(dirname,file)
with open("filename",'w') as f:
print("正在创建%s:"%(filename))
运行结果练习题:
1.求以r为半径的圆的面积和周长(1,10)
代码:
import math
result = [(float("%.2f"%(math.pi*r*r)),round(2*math.pi*r,2)) for r in range(1,11)]
print(result)
运行结果
2.将字典的key值和value值调换
代码:
d = {'a':'A','b':'B','c':'C'}
result = {value:key for key,value in d.items()}
print(result)
运行结果
生成器Generator
1、什么叫生成器:
在Python中,一边循环一边计算的机制,称为生成器:Generator
2、什么时候需要使用生成器:
性能限制需要用到,比如读取一个10G的文件,如果一次性将10G的文件加载到内存处理的话(read方法),内存肯定会溢出;但使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间
3、如何创建生成器:
第一种方法: 列表生成式的改写。 []改成()
比较列表生成式和生成器生成速度:
代码:
start_time = time.time()
result = [i for i in range(1,10000000)]
end_time = time.time()
print('列表生成式生成时间',end_time-start_time)
start_time = time.time()
result = (i for i in range(1,10000000))
end_time = time.time()
print('生成器生成时间:',end_time-start_time)
运行结果:
第二种方法: yield关键字
代码:
def g():
print('step1')
print('step2')
yield 'step3'
print('step4')
yield 'step5'
g = g()
result1 = next(g)
result2 = next(g)
print(result1)
print(result2)
运行结果:
4、如何打印生成器的每一个元素
通过for循环, 依次计算并生成每一个元素。
如果要一个一个打印出来,可以通过next()函数获得生成器的下一个返回值。
生成器的特点
- 解耦. 爬虫与数据存储解耦
- 减少内存占用. 随时生产, 即时消费, 不用堆积在内存当中
- 可不终止调用. 写上循环, 即可循环接收数据, 对在循环之前定义的变量, 可重复使用
- 生成器的循环, 在 yield 处中断,节省cpu
python中return关键字和yield关键字的区别:
return:在程序函数中返回某个值,返回之后函数不在继续执行,彻底结束
yield: 带有yield的函数是一个迭代器,函数返回某个值时,会停留在某个位置,返回函数值后,会在前面停留的位置继续执行,直到程序结束
生成器、迭代器与可迭代对象
迭代:是访问容器元素的一种方式。迭代器是一个可以记住遍历的位置的对象
迭代器对象:从集合的第一个元素开始访问,直到所有的元素被访问完结束
可迭代对象:可以直接作用于for循环的对象
- 一类是集合数据类型,如list, tuple,dict, set,str等
- 一类是generator,包括生成器和带yield的generator function
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator
把list、dict、str等Iterable变成Iterator可以使用iter()函数**
迭代器与生成器的区别
闭包
闭包就是指有权访问另一个函数作用域中的变量的函数。
如何创建闭包:在函数内创建另一个函数
闭包的常见形式:
- 内部函数使用外部函数的临时变量
- 外部函数的返回值是内部函数的引用
装饰器
什么是装饰器:器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能的工具/函数
装饰器的实现必须遵循两大原则:
1、封闭: 对已经实现的功能代码块封闭。 不修改被装饰对象的源代码
2、开放: 对扩展开发
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象
装饰器的通用模板
from functools import wraps
def timeit(fun):
@wraps(fun)
def wrapper(*args,**kwargs):
result = fun(*args,**kwargs)
return result
return wrapper()
多个装饰器的执行顺序:自上而下
被装饰顺序:自下而上
内置高阶函数
函数式编程特点:允许把函数本身作为参数传入另一个函数,还允许返回一个函数!Python对函数式编程提供部分支持。
高阶函数:把函数作为参数传入
map函数
map():根据提供的函数对指定序列做映射
分别求出10的0-3次方的结果
代码:
result = map(lambda x:10**x,range(4))
print(list(result))
print(type(result))
运行结果:## reduce函数
reduce():会对参数序列中元素进行累积
求1到6的阶乘
代码:
from functools import reduce
result = reduce(lambda x,y:x*y,range(1,7))
print(result)
print(type(result))
运行结果:
filter函数
filter函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
过滤掉小于等于四的数
代码:
def small(n):
if n>4:
return n
result = filter(small,[1,2,3,4,5,6])
print(list(result))
运行结果:
sorted函数
sorted函数:对所有可迭代的对象进行排序操作。返回重新排序的列表sorted(iterable, key=None, reverse=False)
上一篇: Jquery基础11_Ajax简介
下一篇: 前端开发 | ajax基础了解