装饰器&偏函数与作用域与异常处理与文件读写

  1. 装饰器

    • 概念:是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上就是一个返回函数的函数
    • 简单的装饰器
      • def func1():
      • print("sunck is a good man")
      • def outer(func):
      • def inner():
      • print("*** ** * * ***")
      • func()
      • return inner
      • #f是函数func1的加强版本
      • f = outer(func1)
      • f()
    • 复杂一点的装饰器
      • def say(name):
      • print("%s is a good name" % (name))
      • def outer(func):
      • def inner(age):
      • if age<0:
      • age = 0
      • func(age)
      • return inner
      • 使用@符号将装饰器应用到函数
      • @outer #相当于say = outer(say)
      • say(-10)
    • 通用装饰器
      • def outer(func):
      • def inner(*args, **kwargs):
      • #添加修改的功能
      • print("&&&&&&&&&&&")
      • func(*argc,**kwargs)
      • return inner
      • @outer
      • def say(name,age): #函数的参数理论上是无限制的,但实际上最好不要超过6、7个
      • print("my name is %s,I am %d years old" % (name,age))
      • say("xiaoxin",18)
  2. 偏函数
    • import functools
    • #把一个参数固定住,形成一个新的函数
    • int3 = functools.partial(int,base = 2)
    • int3("111") 把111当成2进制转成十进制 值为7
  3. 变量的作用域
    • 作用域:变量可以使用的范围
    • 程序的变量并不是再所有位置都能使用的,访问的权限决定于变量的在哪里赋值的
    • 作用域:
      • 局部作用域
      • 函数作用域
      • 全局作用域
        • 在变量前面加个 global 就变成全局变量了
      • 内建作用域
  4. 异常处理
    • 需求:当程序遇到问题时不让程序结束,而越过错误继续向下执行
    • 错误处理的格式
      • try......except.......else
      • 格式:
        • try:
        • 语句t
        • except 错误表示码 as e:
        • 语句1
        • except 错误表示码 as e:
        • 语句2
        • ........
        • except 错误表示码 as e:
        • 语句n
        • else:
        • 语句e
        • 注意: else语句 可有可无
      • 作用: 用来检测try语句块中的错误,从而让except语句捕获错误信息并处理
      • 逻辑: 当程序执行到try- except - else 语句时
        • 当try语句 "语句t" 执行出现错误,会匹配第一个错误码,如果匹配上就执行对应的"语句"
        • 当try语句 "语句t" 执行出现错误,没有匹配的异常,错误将会被提交到上一层的try语句。或者到程序的最上层
        • 当try语句 "语句t" 执行没有出现错误,执行else下的"语句e" (你得有)
      • 使用except 而不使用任何的错误类型
        • try:
        • print(num)
        • except:
        • print("程序出现了异常")
      • 使用except带着多种异常
        • try:
        • print(5/0)
        • except (NameError,ZeroDivisionError):
        • print("出现了NameError或ZeroDIvisionError")
      • 特殊的地方
        • 错误其实是class(类),所有的错误都继承自BaseException,所以再捕获的时候,它捕获了该类型的错误,还把子类一网打尽
        • 跨越多层调用,main调用了func2,func2调用了func1,func1出现了错误,这是只要main捕获到了就可以处理
          • def func1(num):
          • print(1/num)
          • def func2(num):
          • func1(num)
          • def main():
          • func2(0)
          • try:
          • main()
          • except ZeroDivisionError as e:
          • print("* * ** ***")
    • try......except.......finally
      • 格式:

        • try:
        • 语句t
        • except 错误表示码 as e:
        • 语句1
        • except 错误表示码 as e:
        • 语句2
        • ........
        • except 错误表示码 as e:
        • 语句n
        • finally:
        • 语句f
      • 作用:语句t无论是否有错误都将执行最后的语句f
    • 断言
      • def func(num,div):
      • assert(div != 0) , "div 不能为0"
      • return num / div
      • print(func(10,0)) 会指出哪里出错了
  5. 文件读写
    • 读文件

      • 过程:

        • 打开文件

          • f=open(path,flag,encoding,errors)

            • path:要打开文件的路径
            • flag:打开方式
              • r 以只读的方式打开文件,文件的描述符放在文件的开头
              • rb 以二进制格式打开一个文件用于只读,文件的描述符放在文件的开头
              • r+ 打开一个文件用于读写,文件的描述符放在文件的开头
              • w 打开一个文件只用于写入,如果该文件已经存在会覆盖,如果不存在则创建新文件
              • wb 打开一个文件只用于写入二进制,如果该文件已经存在会覆盖,如果不存在则创建新文件
              • w+ 打开一个文件用于读写
              • a 打开一个文件用于追加,如果文件存在,文件描述符将会放到文件末尾
              • a+ 打开一个文件用于追加
            • encoding:编码方式 (可写可不写)
            • errors: 错误处理 (可写可不写)
        • 读文件内容
          • 读取文件全部内容

            • str1 = f.read() #读取全部内容
          • 读取指定字符串
            • str2 = f.read(10) #读取10个字符
          • 读取整行,包括 "\n"字符
            • str3 = f.readline()
          • 读取指定字符串
            • str4 = f.readline(10)
          • 读取所有行并返回一个列表
            • list7 = f.readlines()
          • 若给定的数字大于0,返回实际size字节的行数
            • list8 = f.readlines(10)
          • 修改描述符的位置
            • f.seek(0)
        • 关闭文件
          • f.close()
      • 一个读文件完整的过程
        • try:
        • f1 = open(path,"r",encoding ="utf-8")
        • print(f1.read())
        • finally:
        • if f1:
        • f1.close()
        • 1
        • with open(path,"r",encoding = "utf-8") as f2:
        • print(f2.read()) 无论你读写成功还是失败,with会自动关闭文件
    • 写文件
      • 第一步打开文件

        • f = open(path,"w")
      • 第二步写文件
        • f.write("sunck is a good man") #1.将信息写入缓冲区
        • f.flush() 2.刷新缓冲区,直接把内部缓冲区的数据立刻写入文件,而不是被动的等待自动刷牙缓冲区写入
      • 第三步关闭文件
        • f.close()
    • 以二进制写文件,必须编码才能写进去,以二进制读文件,必须解码才能读出来
    • list&tuple&dict&set文件操作
      • 需要一个模块

        • import pickle #数据持久性模块
      • 举例
        • myList = [1,2,3,4,5,"sunck is a good man"]
        • f = open(path,"wb")
        • pickle.dump(myList,f)
        • f.close()
        • #读取
        • f1 = open(path,"rb")
        • tempList = pickle.load(f1)
        • print(tempList)
        • f1.close()

原文地址:https://www.cnblogs.com/fengzi759/p/12001159.html

时间: 2024-07-29 00:15:48

装饰器&偏函数与作用域与异常处理与文件读写的相关文章

闭包 装饰器 偏函数

闭包:一个函数可以返回一个计算结果,也可以返回一个函数.返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量.匿名函数 lambda:用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突.此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数装饰器:http://python.jobbole.com/81683/偏函数:函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的

&lt;04day&gt;_函数嵌套--闭包函数--装饰器--迭代器--生成器

一.函数的嵌套定义 1.python函数支持嵌套 def f1(): #f1函数的定义 def f2(): #f2函数的定义 print('from f2') def f3(): #f3函数的定义 print('from f3') f2() f1() 嵌套函数--运行结果说明: 1首先调用f1()结果,f1函数为空.担保函f2函数,f2函数有内容打印并且有调用,f2函数包含f3函数,但f3函数无调用. 运行结果: 列子:多个数据之间的大小比较. #!/usr/bin/python # -*- c

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r

设计模式-装饰器模式(Decrator Model)

文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概述 装饰器模式在不改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.通常给一个对象添加功能,要么在类中直接进行修改,要么通过子类继承来扩展对象的功能,又或者使用装饰模式将相应的功能进行任意的组合,使功能的扩展变的具有灵活性和动态性.装饰模式是通过创建一个包装对象,也就是装饰来包裹真实的对象,

Python练习-装饰器版-为什么我的用户总被锁定

参考代码如下: 1.用户登录程序流程控制代码: 1 # 编辑者:闫龙 2 if __name__ == '__main__': 3 import UserLoginFuncation 4 LoclCount=[]; 5 while True: 6 UserName = input("用户名:>>") 7 if(UserLoginFuncation.CheckUserLock(UserName)): 8 print("用户",UserName,"

PHP设计模式 五 (代理模式 装饰器模式)

代理模式 在客户端和实体之间建立一个代理对象,客户端对实体的操作全部委派给代理对象,隐藏实体具体实现细节. Proxy还可以与业务代码分离,部署到另外的服务器,业务代码中通过RPC来委派任务. 代理Proxy.php: <?php namespace Components\Proxy; class Proxy implements IUserProxy { function get($id) { $db = \Components\Register::get('slave'); $db->qu

设计模式(八)装饰器模式Decorator(结构型)

设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许

Decorator模式 装饰器模式

Android 使用了装饰器模式 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办

python3_装饰器_异常处理

装饰器: def auth(func):     def wrapper(name):                     如果函数带参数,要加在这里         user=raw_input("input passwd:").strip()         if user=='test':             print "welcome login"             func(name)              如果函数带参数,要加在这里