Python笔记-3_下

一、闭包

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

六、函数生成器

我们改成生成器只需要两布

  1. 定义函数
  2. 把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)

猜你喜欢

转载自www.cnblogs.com/jzbk/p/12783907.html