Python基础第11天

一:生成器补充:

生成器只能遍历一次

#生成器只能遍历一次
def test():
    for i in range(4):
        yield i

t=test()  #产生生成器
for i in t:
    print(i)
t1=(i for i in t)  #t已经遍历完了所以输出为空
print(list(t1))

#[0, 1, 2, 3]
#[]
t1=(i for i in t) #获取内存地址
t2=(i for i in t1)
print(list(t1)) #遍历t1
print(list(t2))
#[0, 1, 2, 3]
#[]

二:装饰器:

本质是函数  功能是为其他函数添加新功能原则:不修改被修饰函数的源代码;不修改被修饰函数的调用方式实现装饰器知识储备:装饰器=高阶函数+函数嵌套+闭包高阶函数:
#1.函数接收的参数是一个函数名,实现了加功能,不能保证不改变调用方式
import time
def foo():
    print(‘你好啊‘)
def test(func):
    print(func) #foo内存地址
    start_time=time.time()
    func()
    stop_time = time.time()
    print(‘函数运行时间是 %s‘%(stop_time-start_time))
test(foo)
#2.函数的返回值是一个函数名
def foo():
    print(‘from the foo‘)
def test(func):
    return func
res=test(foo) #foo内存地址
res()  #运行foo
foo=test(foo)
foo()#不改变调用方式
#结合以上
import time
def foo():
    time.sleep(3)
    print(‘来至foo‘)
#不修改foo源代码
#不修改foo调用方式

def timer(func):
    start_time = time.time()
    func()
    stop_time = time.time()
    print(‘函数运行时间是 %s‘%(stop_time-start_time)
    return func
foo=timer(foo)
foo()

函数嵌套   函数里面又定义另外函数——闭包:函数作用域



def father(name):
    print(‘from father %s‘ %name)
    def son():
        print(‘from son‘)
        def grandson():
            print(‘from grandson‘)
        grandson()
    son()

father(‘林海峰)


#装饰器框架
def timer(func):
    def wrapper():
        print(func)
        func()
    return wrapper

#加上返回值
import time
def timer(func):  #func=test
    def wrapper():
        start_time=time.time()
        res=func()   #就是运行test()
        stop_time = time.time()
        print(‘函数运行时间是 %s‘ % (stop_time - start_time))
        return  res
    return wrapper

@timer  #test=timer(test)
def test():
    time.sleep(3)
    print(‘test函数运行完毕‘)
    return ‘这是test返回值‘

res=test()  #运行wrapper
print(res)

#加参数
import time
def timer(func):  #func=test
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)   #就是运行test()
        stop_time = time.time()
        print(‘函数运行时间是 %s‘ % (stop_time - start_time))
        return  res
    return wrapper

@timer  #test=timer(test)
def test(name,age):
    time.sleep(3)
    print(‘test函数运行完毕,名字是【%s】‘ %(name,age))
    return ‘这是test返回值‘

@timer  #test=timer(test)
def test1(name,age,gender):
    time.sleep(1)
    print(‘test函数运行完毕,名字是【%s】性别 [%s]‘ %(name,age,gender))
    return ‘这是test返回值‘

res=test(‘linhaifeng‘,age=18)  #运行wrapper
print(res)
test1(‘alex‘,18,‘male‘)

#函数闭包为函数加上认证功能
def auth_func(func):
    def wrapper(*args,**kwargs):
        username=input(‘用户名:‘).strip()
        passwd=input(‘密码:‘).strip()
        if username == ‘sb‘ and passwd == ‘123‘:
            res=func(*args,**kwargs)
        else:
            print(‘用户名或密码错误‘)
        return res
    return wrapper

@auth_func
def index():
    print(‘欢迎来到主页面‘)

@auth_func
def home(name):
    print(‘欢迎回家%s‘ %name)

@auth_func
def shopping_car(name):
    print(‘%s的购物车里有【%s,%s,%s】‘ %(name,‘商品一‘,‘商品二‘,‘商品三‘))

index()
home(‘经理‘)
shopping_car(‘经理‘)

#更加合理
user_list=[
    {‘name‘:‘alex‘,‘passwd‘:‘123‘},
    {‘name‘:‘linhaifeng‘,‘passwd‘:‘123‘},
    {‘name‘:‘wupeiqi‘,‘passwd‘:‘123‘},
    {‘name‘:‘yuanhao‘,‘passwd‘:‘123‘},
]

current_dic={‘username‘:None,‘login‘:False}#全局变量
def auth(auth_type=‘filedb‘):
    def auth_func(func):
        def wrapper(*args,**kwargs):
            print(‘认证类型‘,auth_type)
            if auth_type == ‘filedb‘:
                if current_dic[‘username‘] and current_dic[‘login‘]:
                    res = func(*args, **kwargs)
                    return res
                username = input(‘用户名:‘).strip()
                passwd = input(‘密码:‘).strip()
                for user_dic in user_list:
                    if username==user_dic[‘name‘] and passwd == user_dic[‘passwd‘]:
                        current_dic[‘username‘]=username
                        current_dic[‘login‘] = True
                        res = func(*args, **kwargs)
                        return res
                else:
                    print(‘用户名或密码错误‘)

        return wrapper
    return auth_func

@auth(auth_type=‘filedb‘)
def index():
    print(‘欢迎来到主页面‘)

# @auth_func
def home(name):
    print(‘欢迎回家%s‘ %name)

print(‘before-->‘,current_dic)
index()
print(‘after-->‘,current_dic)
home(‘经理‘)
 
时间: 2024-12-20 15:18:01

Python基础第11天的相关文章

python基础学习11(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #执行环境 #可调用对象 """ 许多的python 对象都是我们所说的可调用的,即是任何能通过函数操作符“()”来调用的对象.要调用可调用对象, 函数操作符得紧跟在可调用对象之后.Python 有4

python 基础篇 11 函数进阶----装饰器

11. 前??能-装饰器初识本节主要内容:1. 函数名的运?, 第?类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ?. 闭包什么是闭包? 闭包就是内层函数, 对外层函数(非全局)的变量的引?. 叫闭包 可以使用_clesure_检测函数是否是闭包  返回cell则是闭包,返回None则不是 闭包的好处: 由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函数访问的时间和时机就不?定了, 因为在外部,

Python基础(11)--面向对象1

面向对象设计与面向对象编程的关系 面向对象设计(OOD)不会特别要求面向对象编程语言.事实上,OOD 可以由纯结构化语言来实现,比如 C,但如果想要构造具备对象性质和特点的数据类型,就需要在程序上作更多的努力.当一门语言内建 OO 特性,OO 编程开发就会更加方便高效.另一方面,一门面向对象的语言不一定会强制你写 OO 方面的程序.例如 C++可以被认为“更好的C”:而 Java,则要求万物皆类,此外还规定,一个源文件对应一个类定义.然而,在 Python 中,类和 OOP 都不是日常编程所必需

Python基础:11.2_函数调用

我们已经接触过函数(function)的参数(arguments)传递.当时我们根据位置,传递对应的参数.这种参数传递的方式被称为函数参数的位置传递. 我们将接触更多的参数传递方式. 回忆一下位置传递: def f(a,b,c): return a+b+c res = f(1,2,3) print res 在调用f函数时,1,2,3根据位置分别传递给了a,b,c. 关键字传递 有些情况下,用位置传递会感觉比较死板.关键字(keyword)传递是根据每个参数的名字传递参数.关键字并不用遵守位置的对

Python基础(11)_python模块之time模块、rando模块、hashlib、os模块

一.模块 1.什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀 模块的本质:模块的本质是一个py文件 2.模块分为三类:1)内置模块:2)第三方模块:3)自定义模块 3.使用模块的目的: 退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script. 随着程序的发展,功能越来越多,为了方便管理,我

python基础复习-1-1文件类型、变量、运算符、表达式

文件类型: .py python源文件 由python解释器执行 .pyc python源码编译后生成的文件(字节代码) 编译方法: 源码文件中使用py_compile模块 import py_compile py_complie.compile('***.py') .pyo python源码优化编译后后文件 python -O -m compile ***.py (无需要源码中使用 compile模块) -O 表示优化 -m 表示模块 python 变量 变量是计算机内存中的一个区域,可以存储

python基础学习11天,作业题

1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数. apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3 通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱. 2,有如下文件: ------- alex是老男孩python发起人,

Python之路【第三篇】:Python基础(11)——set集合

old_dict = { "#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 }, "#2":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 }, "#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 } } # cmdb 新汇报的数据 new_dict =

Python基础学习11

函数 代码的一种组织形式,一个函数一般完成一项特定的功能 函数的使用: 函数需要先定义 使用函数,俗称调用 定义一个函数: 函数的定义部分不会被执行 def关键字,后跟一个空格 函数名,自己定义,起名需要遵循便令命名规则,约定俗成,大驼峰命名只给类用 后面括号和冒号不能省,括号内可以有参数 函数内所有代码缩进 语法 def 函数名(参数列表): 函数体 实例: def func1(): # 定义函数,此处未传参数 print('这就是函数!') print('我不玩了.') func1() #