python学习--day11(函数的进阶)

1.三元运算
c=a if a>b else b
条件成立,取if前面的,条件不成立,取else后面的。
c等于两者中的大较大的
2.命名空间
(1)内置命名空间:python中内置的函数
(2)全局命名空间:除了函数的颞部名字之外,我们 自己代码里所有的名字
(3)局部命名空间:函数内部的名字
3.作用域
(1)内置的命名空间,在任何地方都可以用
(2)全局的命名空间,在自己写的的代码部分可以用
(3)局部的命名空间,只能在自己写的函数内使用
4.作用域的作用范围
(1)范围大小:内置>全局>局部--局部(嵌套)
(2)作用域链:在局部内可以使用全局命名空间内的名字,在全局内部不能使用局部命名空间内的名字,
(3)对于局部变量来说,自己有的变量就用自己的,没有就往上寻找
5.关键字global和nonlocal的作用
(1)global 修改全局空间里的变量值
(2)nonlocal 只修改局部命名空间里的,只往上修改一层
6.函数名的本质(可以当中变量使用,函数名是第一类对象概念)
(1)首先是一个函数的内存地址
(2)可以赋值,也可以作为列表等可变容器的元素。
(3)可以作为函数的参数,返回值
7.闭包
(1)内部函数引用了外部函数的变量,内部的函数就叫做闭包。
(2)装饰器是闭包闭包的一种应用
(3)闭包的作用
8.装饰器函数
(1)装饰器的作用:在函数前后添加功能,可以改善函数的使用效果。
装饰器作业:
#编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
#    注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式

user_dic={
    'egon':'123',
    'alex':'alex3714',
    'wupeiqi':'wu13',
    'yuanhao':'123123'
}

with open('db.txt','w',encoding='utf-8') as f:
    f.write(str(user_dic))

with open('db.txt','r',encoding='utf-8') as f:
    res=f.read()
    # print(res,type(res))
    user_dic=eval(res) #eval()的功能是可以在字符串中提取python的命令,并且执行

    print(user_dic,type(user_dic))
# 定义一个路径,以后文件不在同一路径的时候只要修改这里就可以了
db_path=r'路径t'

login_dic={
    'user':None,    #可以在后面设置登录者的姓名
    'status':False, #相当于设置一个登录的状态
}


def auth(func):
    def wrapper(*args,**kwargs):
        if login_dic['user'] and login_dic['status']:
            res = func(*args, **kwargs)
            return res

        name=input('your name: ')
        password=input('your password: ')
        with open(db_path,'r',encoding='utf-8') as f:
            user_dic=eval(f.read())

        if name in user_dic and password == user_dic[name]:
                print('login ok')
                login_dic['user']=name #一次登录成功后,修改姓名
                login_dic['status']=True #一次登录成功后,并且修改登录的状态
                res=func(*args,**kwargs)
                return res
        else:
            print('login err')

    return wrapper


@auth #auth(index)
def index():
    print('welecome to index')

@auth
def home(name):
    print('welecome %s to home page' %name)


index()

home('egon')
登录认证功能
'''
编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
'''
from urllib.request import urlopen
import os

cache_path=r'路径'
def make_cache(func):
    def wrapper(*args,**kwargs):
        if os.path.getsize(cache_path):#可以通过os模块获取文件的大小
            #有缓存
            print('\033[45m=========>有缓存\033[0m')
            with open(cache_path,'rb') as f:
                res=f.read()

        else:
            res=func(*args,**kwargs) #下载
            with open(cache_path,'wb') as f: #制作缓存
                f.write(res)

        return res

    return wrapper

@make_cache
def get(url):
    return urlopen(url).read()

# 本体思路,可以通过判断文件是否存在,如果存在,则去文件中读取
# 不存在,则去网上下载


# print('================>first')
# print(get('https://www.python.org'))
# print('================>second')
# print(get('https://www.python.org'))
# print('================>third')
# print(get('https://www.python.org'))





# 扩展思路:
#缓存多个不同网站的内容:
#思路:hash每个url,用得到的值做成文件名,一个网站一个文件名,
# 然后每次根据传进来的url进行hash得到的结果去寻找文件
爬取网页内容实例

 

9.有参数的装饰器

# 有参数的装饰器
def deco(auth_type='file'):
    def auth(func):
        def wrapper(*args,**kwargs):
            if auth_type == 'file':
                print('文件的认证方式')
            elif auth_type == 'ldap':
                print('ldap认证方式')
            elif auth_type == 'mysql':
                print('mysql认证方式')
            else:
                print('不知到的认证方式')
        return wrapper
    return auth

@deco(auth_type='abc') #@auth #index=auth(index)
def index():
    print('welecome to index')

@deco(auth_type='ldap')
def home(name):
    print('welecome %s to home page' %name)

index()

home('egon')
有参数的装饰器

 

 



 
 
 
posted @ 2017-08-30 20:03  明-少  阅读(69)  评论(0)    收藏  举报