4.26Python三大神器学习笔记
迭代器
1. 什么是迭代器(iter)
迭代器是容器;程序中无法直接创建一个迭代器,只能讲别的序列转换成迭代器
特点:打印迭代器无法查看所有元素、也无法获取元素的个数;获取元素的时候每次只能获取最前面的那个元素,而且元素取一个少一个(类pop)
i1 = iter ( 'abc123' )
print ( i1)
2.查 - 获取元素
迭代器不管以什么样的方式获取到了某个元素,那么这个元素一定会从迭代器中消失
1)查单个: next(迭代器) - 获取迭代器中最前面的那个元素
2)遍历
print ( next ( i1) )
print ( next ( i1) )
i3 = iter ( { 'a' : 10 , 'b' : 20 , 'c' : 30 } )
print ( list ( i3) )
生成器
1. 什么是生成器
生成器也是容器;其他容器是直接保存多个数据,生成器保存的是产生多个数据的算法。
生成器获取数据的方式和特点和迭代器一样。
2. 创建生成器
调用一个带有yield关键字的函数就可以得到一个生成器对象
def func1 ( ) :
yield
print ( '++++' )
print ( '====' )
return 100
result = func1( )
print ( 'result:' , result)
3. 控制生成器产生数据的个数和值
一个生成器产生的数据的个数和值由创建生成器调用的那个函数的函数体在执行的时候会遇到几次yield以及每次yield后面的值来决定
个数:由遇到的yield的次数决定
值:由yield后面的数据决定
def create1 ( ) :
yield 100
yield 200
yield 300
gen2 = create1( )
def create2 ( ) :
x = 0
while True :
yield x
x += 1
gen3 = create2( )
print ( 'gen3:' , gen3)
print ( next ( gen3) )
for x in range ( 100 ) :
print ( next ( gen3) , end= ', ' )
print ( )
练习:写一个生成器可以创建某个Python班级的学生的学号,学号的范围是:python0001 ~ python1000
print ( '==================================华丽的分割线==============================' )
def student_create ( subject) :
s_id = 1
while True :
yield f' { subject} { s_id: 0>4 } '
s_id += 1
python_id = 'python'
java_id = 'java'
result_python = student_create( python_id)
result_java = student_create( java_id)
for index in range ( 1000 ) :
print ( next ( result_python) )
print ( next ( result_java) )
4.生成器创建数据原理
每次获取生成器数据的时候,就会去执行创建这个生成器的函数,但每次执行到yield
def func2 ( ) :
print ( '====' )
yield 100
print ( '++++' )
yield 200
print ( '----' )
yield 300
gen4 = func2( )
print ( '1.:' , next ( gen4) )
print ( '==================================华丽的分割线==============================' )
print ( '2,' , next ( gen4) )
print ( '==================================华丽的分割线==============================' )
print ( '3.' , next ( gen4) )
装饰器
1. 什么是装饰器 - 给已经定义好的函数天剑功能的工具
import time
装饰器就是一个函数,这个函数既是实参高阶函数,又是返回值高阶函数
2. 给函数添加功能
练习:给函数添加功能,统计函数的执行时间
def hello ( ) :
start = time. time( )
print ( 'hello world!' )
end = time. time( )
print ( f'总时间: { end - start} ' )
def factorial ( n) :
s = 1
for x in range ( 1 , n + 1 ) :
s *= x
print ( s)
hello( )
无参装饰器
1.无参装饰器语法
"""
语法:
def 装饰器名(原函数):
def 添加完功能的新函数名(*args, **kwargs):
调用原函数
添加新功能
return 添加完功能的新函数名
语法细化:
def 装饰器名(f):
def new_f(*arg, **kwargs):
result = f(*arg, **kwargs)
新增功能
return result
return new_f
装饰器名 - 根据新增的功能来命名
"""
练习1.写一个装饰器,在函数调用之前打印’千锋教育欢迎’
def add_tag ( fn) :
def new_fn ( * args, ** kwargs) :
print ( '千峰教育欢迎你' )
result = fn( * args, ** kwargs)
return result
return new_fn
@add_tag
def hello ( ) :
print ( 'hello world!' )
@add_tag
def sum2 ( num1, num2) :
return num1 + num2
hello( )
print ( '和:' , sum2( 10 , 89 ) )
练习2: 写一个装饰器在函数调用结束的时候打印’=end =’
def add_end ( fn) :
def new_fn ( * args, ** kwargs) :
result = fn( * args, ** kwargs)
print ( '=====end=====' )
return result
return new_fn
练习3:写一个装饰器将返回值是数字的函数的返回值变成原来返回值的100倍。 3 -> 300; ‘abc’ -> ‘abc’; 1.23 -> 123
def add_100 ( fn) :
def new_fn ( * args, ** kwargs) :
result = fn( * args, ** kwargs)
return result * 100 if type ( result) in ( int , float ) else result
return new_fn
@add_end
@add_100
def hello2 ( ) :
print ( 'hello world!' )
@add_100
def sum3 ( num1, num2) :
return num1 + num2
hello2( )
print ( 'sum3:' , sum3( 10 , 20 ) )
有参装饰器
"""
有参装饰器语法细化:
def 装饰器名称(参数列表):
def 无参装饰器名(f):
def new_f(*arg, **kwargs):
result = f(*arg, **kwargs)
新增功能
return result
return new_f
return 无参装饰器名
参数列表 - 看实现新功能是否需要新的参数和个数
"""
练习3:写一个装饰器将返回值是数字的函数的返回值变成原来返回值的N倍。
def magnify ( n) :
def add_100 ( fn) :
def new_fn ( * args, ** kwargs) :
result = fn( * args, ** kwargs)
return result * n if type ( result) in ( int , float ) else result
return new_fn
return add_100
@magnify ( 3 )
def sum3 ( num1, num2) :
return num1 + num2
print ( sum3( 100 , 200 ) )
练习2:写一个装饰器,用法如下
def tag ( str1) :
def temp ( fn) :
def new_fn ( * args, ** kwargs) :
result = fn( * args, ** kwargs)
if result == 100 :
return f'< { str1} > { result} </ { str1} >'
elif result == 'abc' :
return f'< { str1} > { result} </ { str1} >'
return new_fn
return temp
练习3: 写一个装饰器(针对返回值是数字的函数),用法如下
def operation ( str1: str , num1: int ) :
def temp ( fn) :
def new_fn ( * args, ** kwargs) :
result = fn( * args, ** kwargs)
return eval ( str ( result) + str1 + str ( num1) ) if type ( result) in ( int , float ) else result
return new_fn
return temp
@tag ( 'a' )
def print1 ( ) :
return 'abc'
@operation ( '-' , 20 )
def print2 ( ) :
return 12
print ( print1( ) )
print ( print2( ) )