一、闭包
def func():
a = 7
#print("I'm fun")
def fun1(num):
print("I'm fun1")
print(num+a) # 因为引用了上一级的变量,所以上一级的变量没法释放
return fun1 # 把fun的内存地址传给func
var = func()
var(3) # 这里调用var(3) = func(3)
二、装饰器
account = {
"is_authenticated":False,# 用户登录了就把这个改成True
"username":"alex", # 假装这是DB里存的用户信息
"password":"abc123" # 假装这是DB里存的用户信息
}
def login(func):
def res():
if account["is_authenticated"] is False:
username = input("user:")
password = input("pasword:")
if username == account["username"] and password == account["password"]:
print("welcome login....")
account["is_authenticated"] = True
func() #如果为True就执行这个函数
else:
print("wrong username or password!")
else:
print("用户已登录,验证通过...")
func()
return res
def home():
print("---首页----")
@login #就代替了america = login(america)
def america():
#login() # 执行前加上验证
print("----欧美专区----")
def japan():
print("----日韩专区----")
@login #就代替了henan = login(henan)
def henan():
#login() # 执行前加上验证
print("----河南专区----")
home()
# america()
# henan() #此时的验证要是user pass上一层输入对了 就已为True
#america = login(america) #现在的login是res的内存地址,func内部函数里没有,他就会去往上找
#henan = login(henan)
america()
henan()
报错-1
解决方法:
非固定参数
红标的俩也一定要加
三、列表生成式
[i+1 for i in list]
#列表生成式
list3 = [78,79,80]
c = [val+1 for val in list3]
print(c)
四、生成器
把列表生成式的[]改成()就可以
a = (i*i for i in range(10))
for i in a:
print(i)
五、斐波那契数列
#斐波那契数列
a = 0
b = 1
count = 0
while count < 20:
tmp = a #存旧a
a = b
b = tmp + b
#print(a,b)
print(b)
count += 1
六、函数生成器
我们改成生成器只需要两布
- 定义函数
- 把print改成yield
def one():
a = 0
b = 1
count = 0
while count<20:
tmp = a
a = b
b = tmp + b
yield b
count += 1
one()
七、用生成器实现并发编程
就这里得知,我们得先传一个为None的值过去
def test():
while True:
n = yield #n就等于send传过来的值
print('n:',n)
t = test()
for i in range(10):
t.send(i)
解决方法
def test():
while True:
n = yield #n就等于send传过来的值
print('n:',n)
t = test()
#next(t)
t.__next__() #也就是next(t)
for i in range(10):
t.send(i)
我们用next
or __next__()
是都可以的
2 .demo
def eat(name):
print('%s准备吃包子了'%name)
while True:
baozi = yield #接收外部传来的值
print('%s开始吃第%s批包子了'%(name,baozi))
one = eat('王二狗')
two = eat('黄埔牛')
three = eat('罗尔峰')
one.__next__() #先传None,yidle那里暂停,到for循环那里才唤醒
two.__next__() #因为第一次要让他定到yield那里,所以要先传空。否则也会报错
three.__next__()
for i in range(5):
print('-----第%s轮开始-----'%i)
one.send(i)
two.send(i)
three.send(i)
八、迭代器
isinstance(xxx,Iterable)
:判断是否可迭代对象
可循环的都是迭代器
list = [1,2,3]
res = isinstance(list,Iterable)
print(res)
isinstance(xxx,Iterator)
判断是否为迭代器
#判断是否是迭代器
from collections import Iterator
res = isinstance((i for i in range(10)),Iterator)
print(res) #生成器也是迭代器
res1 = isinstance(list,Iterator)
print(res1) #列表就不是迭代器
iter()变成迭代器
from collections import Iterator
dict = iter({})
print(isinstance({},Iterator))
res = isinstance(dict,Iterator)
print(res)