玩蛇(Python)笔记之基础Part4

玩蛇(Python)笔记之基础Part4

标签 : Python


一.Python装饰器

  1. 对象封闭原则 利用装饰器来实现添加功能而不修改本身

  2. @+函数名 自动执行outer函数并且将下面的函数名f1当做参数传递给outer 将outer函数的返回值重新赋值给f1

  3. 注意内置函数的参数

    def outer(func):
    def inner(a):
        print('log')
        ret = func(a)
        print('after')
        return ret
    
    return inner
    
    
    def outer1(func):
        def inner(*args, **kwargs):
            print('log')
            ret = func(*args, **kwargs)
            print('after')
            return ret
    
        return inner
    
    
    @outer
    def f1(a):
        print('f1')
    
  4. 装饰器最常用的功能 权限的管理

    LOGIN_USER = {"is_login": False}
    
    
    def outer2(func):
        def inner(*args, **kwargs):
            if LOGIN_USER["is_login"]:
                r = func()
                return r
            else:
                print("请登录")
    
        return inner
    
    
    @outer2
    def changepwd():
        pass
    
    
    @outer2
    def manager():
        print("欢迎%s登录" % LOGIN_USER["current_user"])
    
    
    def login(user, pwd):
        if user == 'alex' and pwd == '123':
            LOGIN_USER["is_login"] = True
            LOGIN_USER["current_user"] = user
    
    
    def main():
        inp = input("1.后台管理;2.登录")
        if inp == '1':
            manager()
        elif inp == '2':
            username = input("请输入用户名")
            pwd = input('请输入密码')
            login(username, pwd)
    
  5. 双层装饰器 原理弄清楚,多重装饰器同理,从上到下

    USER_INFO = {}
    
    
    def check_login(func):
        def inner(*args, **kwargs):
            if USER_INFO.get('is_login', None):
                ret = func(*args, **kwargs)
                return ret
            else:
                print('请登录')
    
        return inner
    
    
    def check_admin(func):
        def inner(*args, **kwargs):
            if USER_INFO.get('user_type', None) == 2:
                ret = func(*args, **kwargs)
                return ret
            else:
                print("无权查看")
    
        return inner
    
    
    @check_login
    @check_admin
    def index():
        """
        管理员才能看
        :return:
        """
        pass
    
    
    def home():
        pass
    
    
    def login():
        user = input('输入用户名')
        if user == 'admin':
            USER_INFO['is_login'] = True
            USER_INFO['user_type'] = 2
        else:
            USER_INFO['is_login'] = True
    
    
    def main():
        inp = input('1.login;2.info;3.admin')
        if inp == '1':
            login()
        elif inp == '2':
            home()
        elif inp == '3':
            index()
    

二.字符串格式化

  1. 占位符 %s %d 远远没有这么简单

  2. %[(name)][flags][width].[precision]typecode

  3. flags + 右对齐 正数加号 负数剑豪 -左对齐 正数无符号 负数减号 空格 正数前加空格 负数加减号 右对齐 0 右对齐 正数前无符号 负数前加负号 用0填充空白

  4. width 占有宽度

  5. .precision 小数点后保留的位数

  6. typecode s r,,返回__repr__ c,,整数将数字换成unicode对应的值 o,,转换成八进制 x,,转换成十六进制 d,,十进制 f,,浮点数 e,,E,,科学计数法,,大小写e g,,G,,超过6位自动转换成科学计数法..自动转换成浮点

  7. 注意 当字符串没有用到占位符时 %直接用 但是一旦有一个占位符时就必须用%%来表示%

    print("aaa%(name)+10shahaha %(age)+10d" % {'name': 'year', 'age': 100})
    
  8. 更厉害的format字符串格式化 [[fill]align][sign][#][0][width][,][.precision][type]

  9. fill 填充字符 只能一个字符

  10. align 对齐方式 需要配合width使用 < 左对齐 >右对齐 =内容右对齐将符号放置在填充字符左侧只对数字有效 ^内容居中

  11. sign 有无符号数字 +正号加正负号加负号 -正好不变负号加负 空格,正号空格负号加负 加# 对于二进制八进制十六进制如果加上# 会显示0b 0o 0x 否则不显示 加%号 会自动将你给的数转换成百分比

  12. 剩下的和占位符一样

```python
s1 = "======{:*^20s}------{:+d}-----{:#b}".format('year', 123, 15)

# 常用举例
tpl = "i am {},age{},{}".format("seven", 18, 'year')
tpl = "i am {},age{},{}".format(*["seven", 18, 'year'])
tpl = "i am {0},age{1},{0}".format("seven", 18)
tpl = "i am {0},age{1},{0}".format(*["seven", 18])
tpl = "i am {name},age{age},{name}".format(name="seven", age=18)
tpl = "i am {name},age{age},{name}".format(**{'name': "seven", 'age': 18})
tpl = "i am {0[0]},age{0[1]},{0[2]}".format([1, 2, 3])
tpl = "i am {:s},age{:d},{:s}".format('aaa', 123, 'asdfsdf')
tpl = "i am {:s},age{:d},{:s}".format(*['aaa', 123, 'asdfsdf'])
tpl = "i am {name:s},age{age:d},{name:s}".format(**{'name': 'asdf', 'age': 123})
tpl = "i am {name:s},age{age:d},{name:s}".format(name='asdf', age=123)
tpl = "numbers:{:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 0.12)
tpl = "numbers:{0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15)
tpl = "numbers:{num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)
```

三.python生成器

  1. 具有生成指定条件数据能力的对象 在循环的时候才会生成

    li = [11, 22, 33, 44]
    result = filter(lambda x: x > 22, li)
    print(result)
    
  2. 普通函数和生成器的区别 有无yield

    def func1():
    print('start')
    yield 1
    yield 2
    yield 3
    
  3. 当第一次循环进来会进入第一个yield拿走后面的东西 第二次循环会接着上次的位置向下执行到yield拿走后面的 以此类推

    ret = func1()
    print(ret)
    for i in ret:
        print(i)
    
    r = ret.__next__()  # 进入函数执行到yield,获取yield后面的数据退出 如果没有yield了就会报错
    print(r)
    
  4. 基于生成器实现range功能

    def myrange(arg):
        start = 0
        while True:
            if start > arg:
                return
            yield start
            start += 1
    
    
    ret = myrange(10)
    

三.函数递归

  1. 貌似没有什么好说的

    def a():
        return '123'
    
    
    def b():
        r = a()
        return r
    
    
    def c():
        r = b()
        print(r)
    
    
    def func(n):
        n += 1
        if n >= 10:
            return 'end'
        return func(n)
    
    
    def func1(arg):
        if arg <= 1:
            return 1
        return arg * func1(arg - 1)
    
posted @ 2016-11-26 22:36  YEAR~  阅读(174)  评论(0编辑  收藏  举报