玩蛇(Python)笔记之基础Part4
玩蛇(Python)笔记之基础Part4
标签 : Python
一.Python装饰器
-
对象封闭原则 利用装饰器来实现添加功能而不修改本身
-
@+函数名 自动执行outer函数并且将下面的函数名f1当做参数传递给outer 将outer函数的返回值重新赋值给f1
-
注意内置函数的参数
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')
-
装饰器最常用的功能 权限的管理
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)
-
双层装饰器 原理弄清楚,多重装饰器同理,从上到下
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()
二.字符串格式化
-
占位符 %s %d 远远没有这么简单
-
%[(name)][flags][width].[precision]typecode
-
flags + 右对齐 正数加号 负数剑豪 -左对齐 正数无符号 负数减号 空格 正数前加空格 负数加减号 右对齐 0 右对齐 正数前无符号 负数前加负号 用0填充空白
-
width 占有宽度
-
.precision 小数点后保留的位数
-
typecode s r,,返回__repr__ c,,整数将数字换成unicode对应的值 o,,转换成八进制 x,,转换成十六进制 d,,十进制 f,,浮点数 e,,E,,科学计数法,,大小写e g,,G,,超过6位自动转换成科学计数法..自动转换成浮点
-
注意 当字符串没有用到占位符时 %直接用 但是一旦有一个占位符时就必须用%%来表示%
print("aaa%(name)+10shahaha %(age)+10d" % {'name': 'year', 'age': 100})
-
更厉害的format字符串格式化 [[fill]align][sign][#][0][width][,][.precision][type]
-
fill 填充字符 只能一个字符
-
align 对齐方式 需要配合width使用 < 左对齐 >右对齐 =内容右对齐将符号放置在填充字符左侧只对数字有效 ^内容居中
-
sign 有无符号数字 +正号加正负号加负号 -正好不变负号加负 空格,正号空格负号加负 加# 对于二进制八进制十六进制如果加上# 会显示0b 0o 0x 否则不显示 加%号 会自动将你给的数转换成百分比
-
剩下的和占位符一样
```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生成器
-
具有生成指定条件数据能力的对象 在循环的时候才会生成
li = [11, 22, 33, 44] result = filter(lambda x: x > 22, li) print(result)
-
普通函数和生成器的区别 有无yield
def func1(): print('start') yield 1 yield 2 yield 3
-
当第一次循环进来会进入第一个yield拿走后面的东西 第二次循环会接着上次的位置向下执行到yield拿走后面的 以此类推
ret = func1() print(ret) for i in ret: print(i) r = ret.__next__() # 进入函数执行到yield,获取yield后面的数据退出 如果没有yield了就会报错 print(r)
-
基于生成器实现range功能
def myrange(arg): start = 0 while True: if start > arg: return yield start start += 1 ret = myrange(10)
三.函数递归
-
貌似没有什么好说的
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)