python进阶之路
Day11
hello world!今日是python学习的第十一天,我将会在下面文章对基础语法进行一些介绍,主要为装饰器、迭代器与生成器等。
1 装饰器
1.1 什么是装饰器
装饰器本质就是一个实参高阶函数与返回值高阶函数
装饰是用来给函数添加功能(在不修改原函数的基础上给函数添加功能)
返回值高阶函数
import time
def func1():
def func2():
return 'abc'
return func2
print(func1()())
1.2 怎么给函数添加功能
方法一:直接修改函数:代码需要写多遍,麻烦。
def sum1(a,b):
time1 = time.time()
print(a+b)
time2 = time.time()
print('执行时间:',time2 - time1)
sum1(3,8)
def factorial(n):
sum1 = 1
for x in range(1,n+1):
sum1 *= x
print(sum1)
factorial(5)
方法二:实参高阶函数
定义一个函数功能是统计一个函数的执行时间
def count_execution_time(func,*args,**kwargs):
time1 = time.time()
func(*args,**kwargs) #可以给任意多函数的参数添加功能
time2 = time.time()
print('执行时间',time2 - time1)
def func2():
print('你好,世界!')
count_execution_time(func2)
count_execution_time(factorial,10)
解包:
def test(*args,**kwargs):
print(args,kwargs)
print(*args,**kwargs)
def test2(a,b,c):
print(f'a:{a},b:{b},c:{c}')
test(398,56,'dds')
#test(a=10,b=20)
test2(10,20,30)
nums = [10,20,30]
test2(*nums)
方法三:装饰器-实参高阶函数改进
def count_execution_time(func):
def test():
time1 = time.time()
func()
time2 = time.time()
prnt('执行时间:',time2 - time1)
return test
def func4(m):
print('============')
func4 = count_execution_time(func4)
func4(10)
方法四:装饰器
def 函数名1(func):
def test(*args,***kwargs):
func(*args,***kwargs)
添加新的功能
return test
说明:
函数名1 - 装饰器对应的函数名,也是装饰器的名字(根据需要添加的新功能命名)
func - func指向的就是需要添加新功能的函数
test - 指向的是已经添加完功能的新的函数
def func1():
print('=========')
def print_end(func):
def test(*args,**kwargs):
func(*args,**kwargs)
print('end')
return test
@print_end
def sum2(a,b):
print(a+b)
sum2(2,3)
写一个装饰器在原函数执行前打印‘start。。。’
def print_start(func):
def test(*args,**kwargs):
print('start。。。。。')
func(*args,**kwargs)
return test
@print_start
def func4(a,b):
print('哈哈啊',a+b)
func4(3,98)
定义一个装饰器,将原函数的返回值转换成字符串:
def switch_str(func):
def test(*args,**kwargs):
result = func(*args,**kwargs)
return str(result)
return test
练习:写一个装饰器,可以给返回值是数字的函数添加新的功能:让原函数的结果保留两位小数。
def two_deci(func):
def test(*args,**kwargs):
result = func(*args,**kwargs)
if type(result) in (int,float):
return f'{result:.2f}'
else:
return result
return test# test相当于一个变量,test函数内
@two_deci
def sum1(a,b):
e= a+b
return e
print(sum1(1,2))
##### 1.3 有参的装饰器
如果在实现装饰器新增的功能的时候需要额外的数据,那么就可以使用有参的装饰器
def 装饰器名称(装饰器的参数列表):
def test1(func):
def test2(\*args,\*\*kwargs):
funnc(\*args,\*\*kwargs)
添加新的功能
return test2
return test1
练习:写一个装饰器让函数的返回值保留N位小数(返回值是数字的时候)
```python
def constraint_decimals(n):
def test1(func):
def test2(*args,**kwargs):
result = func(*args,**kwargs)
if type(result) == int:
return str(result)+'.'+'0'*n
elif type(result) == float:
nums = str(result).split('.')[-1]
return f'{nums[0]}.{nums[-1][0:n]}'
return result
return test2
return test1
@constraint_decimals(3)
def sum1(a,b):
return a+b
print(sum1(2.154463543545,3))
练习:写一个装饰器在函数结束后打印n个*
def print_nstar(n):
def test1(func):
def test2(*args,**kwargs):
result = func(*args,**kwargs)
print('*' * n)
return result
return test2
return test1
@print_nstar(5)
def sum1(a,b):
return a+b
print(sum1(3,3))
练习:写一个装饰器可以在原函数的返回值的基础上加上一个数或者减去一个数,(针对返回值是数字的基础上)
def add_minus_nums(a_or_m,num):
def test1(func):
def test2(*args,**kwargs):
result = func(*args,**kwargs)
if type(result) not in (int,float):
return result
else:
if a_or_m == 'a':
return result + num
elif a_or_m == 'm':
return result - num
return test2
return test1
@add_minus_nums('m',6)
def sum2(a,b):
return a+b
print(sum2(2,3))
2 迭代器
2.1 什么是迭代器
1)迭代器的特点
迭代器是一种特殊容器: a.不能直接查看所有的元素(打印看不到任何元素;不能计算长度) b.如果要读取元素的值,必须将这个元素从迭代器中取出来(取出来后就再也放不回去了,迭代器中就不再有这个元素了)
2)怎么创建迭代器
两种:a.将其他序列转换成迭代器:iter(序列)
b.创建生成器(生成器的本质就是迭代器)
iter1 = iter([10,20,30,40])
print(iter1)
#print(len(iter1))#object of type 'list_iterator' has no len()
iter2 = iter('hello')
2.2 获取迭代器的元素(查)
注意:不管以任何方式获取到了迭代器的元素,这个元素在迭代器中都不存在了。
1)获取单个元素
next(迭代器) - 获取迭代器中最前面的一个元素.没有元素再取会报错。
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(list(iter1))
print(list(iter2))# 当迭代器转换成列表后,原迭代器中元素为空,到新的列表中。
2)遍历
iter3 = iter(['name','age','hello','world'])
for x in iter3:
print(x, end = ',')
遍历后已经将元素全部取出,故没法再次使用。