一.有参装饰器
def auth(x,engine = "file"):
def outter(func):
def wrapper(*args, **kwargs):
x
name = input("username>: ").strip()
pwd = input("password>: ").strip()
if engine == "file":
if name == "egon" and pwd == "123":
print('login successful'.center(50,'='))
res = func(*args, **kwargs)
return res
else:
print('username or password error')
elif engine == "mysql":
print("基于mysql的认证")
elif engine == "ldap":
print("基于ldap的认证")
else:
print('engine不存在')
return wrapper
return outter
@auth(11,"file") # @outter函数的内存地址 # index=outter函数的内存地址(index函数的内存地址)
def index():
print('from index')
@auth(11,"mysql")
def home(name):
print('welcome %s to home page' %name)
# index=auth(index,"file")
# home=auth(index,"ldap")
index()
home("egon")
# 模板
def outter2(x):
def outter1(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
return outter1
@outter2(x=1)
def index():
pass
二.叠加多个装饰器
# def deco1(func1): # func1 = wrapper2的内存地址
# def wrapper1(*args, **kwargs):
# print('====>wrapper1')
# res1 = func1(*args, **kwargs)
# return res1
# return wrapper1
#
# def deco2(func2): # func2 = wrapper3的内存地址
# def wrapper2(*args, **kwargs):
# print('====>wrapper2')
# res2 = func2(*args, **kwargs)
# return res2
# return wrapper2
#
# def deco3(func3): # func3 = index函数的内存地址
# def wrapper3(*args, **kwargs):
# print('====>wrapper3')
# res3 = func3(*args, **kwargs)
# return res3
# return wrapper3
#
# # 加载/得到wrapper函数的顺序是自下而上的
# # 我们运行wrapper函数的顺序是:
#
# # index=wrapper1的内存地址
# @deco1 # deco1(wrapper2的内存地址) => wrapper1的内存地址
# @deco2 # deco2(wrapper3的内存地址) => wrapper2的内存地址
# @deco3 # deco3(index函数的内存地址) => wrapper3的内存地址
# def index():
# print('from index')
#
# # print(index)
# res=index()
# """
# ====>wrapper1
# ====>wrapper2
# ====>wrapper3
# from index
# """
import time
def timmer(func):
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print("run time is : %s" %(stop - start))
return res
return wrapper # 千万不要加括号
def auth(x,engine = "file"):
def outter(func):
def wrapper(*args, **kwargs):
x
name = input("username>: ").strip()
pwd = input("password>: ").strip()
if engine == "file":
if name == "egon" and pwd == "123":
print('login successful'.center(50,'='))
res = func(*args, **kwargs)
return res
else:
print('username or password error')
elif engine == "mysql":
print("基于mysql的认证")
elif engine == "ldap":
print("基于ldap的认证")
else:
print('engine不存在')
return wrapper
return outter
@auth(111,"file")
@timmer
def index():
print("index=====>")
time.sleep(3)
index()
三.迭代器
"""
1 什么是迭代器
器=>工具
迭代:迭代是一个重复的过程,但是每次重复都是基于上一次的结果而来的
count = 1
while count < 5:
print(count)
count+=1
迭代器:迭代取值的工具
2 为何要用迭代器
优点:
1、迭代器是一种通用的、不依赖于索引的迭代取值方式
2、节省内存
缺点:
1、取值不灵活,只能往后取,不能取指定的值
2、无法预知长度,只能取一次
3 如何用迭代器
python为一些类型内置了__iter__方法,调用了__iter__方法就会将原类型转换成一个迭代器
可迭代对象:内置有__iter__
迭代器对象:内置有__next__,__iter__
"""
# 例1
# names=["egon","alex","lxx"]
# names="abcdefg"
# i=0
# while i < len(names):
# print(names[i])
# i+=1
# 例2:
# c="hello"
# d=["a",'B','C']
# e=("a",'B','C')
# a={"k1":111}
# g={111,222,333}
# f=open("a.txt",'w')
# dic={'k1':111,"k2":222,'k3':333}
# dic={111,222,333}
# iter_dic=dic.__iter__()
# print(iter_dic.__iter__() is iter_dic)
# print(iter_dic)
# res=iter_dic.__next__()
# print(res)
#
# res=iter_dic.__next__()
# print(res)
#
# res=iter_dic.__next__()
# print(res)
#
# res=iter_dic.__next__()
# print(res)
dic={111,222,333}
iter_dic=dic.__iter__()
while True:
try:
print(iter_dic.__next__())
except StopIteration:
break
print('='*50)
iter_dic=dic.__iter__()
while True:
try:
print(iter_dic.__next__())
except StopIteration:
break
# for循环的底层工作原理
# 1、dic.__iter__()拿到一个迭代器
# 2、k=迭代器.__next__(),循环往复直到抛出异常
# 3、for循环会捕捉异常,然后结束循环
# dic = {'k1': 111, "k2": 222, 'k3': 333}
# # for k in dic:
# # print(k,dic[k])
# # print('='*50)
# # for k in dic:
# # print(k,dic[k])
# for k in f:
# print(k)
四.生成器
# 生成器:自定义的迭代器
# 函数内但凡出现yield关键字,再调用函数,不会触发函数体代码的运行
# 会得到一个返回值,该返回值就是一个生成器对象,也就是自定义的迭代器
# yield与return
# 相同点:都能返回值
# 不同点:yield能返回多次值,而return只能返回一次值函数就立即结束
def func():
print("first")
yield
print("second")
yield 222
return 777777777777777777
print("third")
yield 333
print('fourth')
g=func()
# print(g)
# iter(g) # g.__iter__()
# next(g) # g.p__next__()
# res=next(g)
# print(res)
#
# res=next(g)
# print(res)
#
# res=next(g)
# print(res)
#
# next(g)
#range(1,5,2)
def my_range(start,stop,step=1):
while start < stop:
yield start
start += step
for i in my_range(1,5,2):
print(i)
五.递归
# 递归调用:在调用一个函数的过程中又直接或者间接地调用函数自己
# 例1:
# def foo():
# print('from foo')
# foo()
# foo()
# import sys
# print(sys.getrecursionlimit())
# sys.setrecursionlimit(2000)
# 例2:
# def foo():
# print('from foo')
# bar()
#
# def bar():
# print('from bar')
# foo()
#
# foo()
# 递归调用有两个阶段
# 1、回溯:一层一层地递归调用下去
# 2、递推:在某一层结束递归调用,开始向上一层一层地返回
# age(5) = age(4) + 10
# age(4) = age(3) + 10
# age(3) = age(2) + 10
# age(2) = age(1) + 10
# age(1) = 18
#n = 1: age(1) = 18
#n > 1: age(n) = age(n-1) + 10
# def age(n):
# if n == 1:
# return 18
# return age(n-1) + 10
#
# res=age(5)
# print(res)
# 应用示例1:
# nums=[1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]
#
# def func(list1):
# for item in list1:
# if type(item) is list:
# func(item)
# else:
# print(item)
#
# func(nums)
# 应用示例2:二分法
nums=[-3,11,13,25,37,39,43,52,77,84,91]
def search(list1,find_num):
print(list1)
if len(list1) == 0:
print('not exists')
return
mid_index = len(list1) // 2
if find_num > list1[mid_index]:
# on the right
search(list1[mid_index+1:],find_num)
elif find_num < list1[mid_index]:
# on the left
search(list1[:mid_index],find_num)
else:
print('find it')
search(nums,85)
六.匿名函数
# 匿名函数:没有名字的函数,意味着只能调用一次就被回收了
# 应用场景:临时调用一次的场景
# res=(lambda x,y:x+y)(1,2)
# print(res)
# 匿名函数应用示例
salaries = {
"egon": 3000,
"alex": 5000,
"zhangsan": 1000,
}
# def func(k):
# return salaries[k]
# res = max(salaries,key=lambda k:salaries[k])
# print(res)
# print(max([11,10,44,9]))
# res = min(salaries,key=lambda k:salaries[k])
# print(res)
# res=sorted([11,10,44,9],reverse=True)
# print(res)
# res=sorted(salaries,key=lambda k:salaries[k],reverse=True)
# print(res)
# 了解
# map
# filter
# reduce
七.面向过程编程
'''
面向过程编程
核心是过程二字,过程即做事的步骤,即先干什么、再干什么、然后干什么...
基于该思想写程序就好比是在设计一条条的流水线
优点:复杂问题流程化、进而简单化
缺点:扩展性差
'''
八.三元表达式
def max2(x,y):
if x > y:
return x
else:
return y
# res =条件成立时运行的表达式 if 条件 else 条件不成立时运行的表达式
x=11
y=22
res=x*12 if x > y else y*100
print(res)
九.生成器
# l=[]
# for i in range(1,6):
# if i > 3:
# l.append(i)
#
# print(l)
#1、列表生成式
# res=[i for i in range(1,6) if i > 3]
# print(res)
#2、集合生成式
# res={i for i in range(1,6) if i > 3}
# print(res,type(res))
#3、字典生成式
# items=[("name","egon"),('age',18),('gender','male')]
# dict(items)
# res={k:v for k,v in items if k != "age"}
# print(res,type(res))
#4、生成器表达式
# res = (i for i in range(1, 6) if i > 3)
# print(res)
# print(next(res))
# print(next(res))
# print(next(res))
# def my_sum(nums,res=0):
# for num in nums:
# res+=num
# return res
# with open(r'D:weekend_s7day06 2 叠加多个装饰器.py',mode='rt',encoding="utf-8") as f:
# # print(len(f.read())) # 2061
#
# # res=0
# # for line in f:
# # res+=len(line)
#
# res=sum(len(line) for line in f)
# print(res)
#
#
# # g=(len(line) for line in f)
# # res=my_sum(g)
#
# # print(res)
# 了解:map、filter、reduce
# 1、map函数
# salaries=[1000,2000,3000,4000,5000]
# res=map(lambda num:num*12,salaries)
# print(res)
# print(list(res))
# print((num*12 for num in salaries))
#2、filter函数
# names=['egon',"alex_dsb","liuqingzheng_dsb"]
# res=filter(lambda n:n.endswith("dsb"),names)
# print(res)
# print([name for name in names if name.endswith('dsb')])
#3、reduce函数
# from functools import reduce
#
# res=reduce(lambda x,y:x+y,[1,2],100)
# print(res)