Python自动化第四周
来源:互联网 发布:多益网络校园招聘 编辑:程序博客网 时间:2024/06/10 03:58
1.装饰器
- 定义:本质是函数,功能装饰其他函数,就是为其他函数添加附加功能
- 原则:a,不能修改被装饰的函数的源代码, b,不能修改被装饰的函数的调用方式
实现装饰器知识储备: - 函数即‘变量’
- 高阶函数
a. 把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下添加新功能)
b. 返回值中包含函数名(不修改函数调用方式) - 嵌套函数
高阶函数 + 嵌套函数 -> 装饰器
"""装饰器:1. 定义:本质是函数,功能装饰其他函数,就是为其他函数添加附加功能2. 原则:a,不能修改被装饰的函数的源代码, b,不能修改被装饰的函数的调用方式实现装饰器知识储备:1. 函数即‘变量’2. 高阶函数3. 嵌套函数高阶函数 + 嵌套函数 -> 装饰器"""import timedef timmer(func): def warpper(*args, **kwargs): start_time = time.time() func() stop_time = time.time() print('the func run time is %s ' % (stop_time - start_time)) return warpper()@timmerdef test1(): time.sleep(3) print('in the test1')test1()
# 装饰home和bbs方法,判断是否登录import timeusername, password = 'admin1', 'admin11'def auth(auth_type): print('auth func is %s', auth_type) def outer_wrapper(func): def wrapper(*args, **kwargs): if auth_type == 'local': _username = input('Username:').strip() _password = input('Password:').strip() if _username == username and _password == password: print('\033[1;32;1mLogin success. \033[1m') return func(*args, **kwargs) else: print('\033[1;31;1mYour username or password are error! \033[1m') elif auth_type == 'ldap': print("I do't kown!") return wrapper return outer_wrapperdef index(): print('welcome to index page')@auth(auth_type = 'local')def home(): print('welcome to home page') return 'home page'@auth(auth_type = 'ldap')def bbs(): print('welcome to bbs page') return 'bbs page'index()print(home())bbs()
2.迭代器:
可以直接作用于for循环的数据类型有一下几种: 一类是集合数据类型,如list,tuple,dict,set,str等 一类是generator,包括生成器和yield的generator function这些可以直接作用于for循环的对象统称为可迭代对象(可循环对象):Iterable可以使用isinstance()判断一个对象是否是Iterable对象isinstance()判断一个对象是否可迭代或可循环可以被next()函数调用并不断返回下一个值的对象称为迭代器,Iterator迭代对象Iterable可以通过iter()方法转成迭代器
from collections import Iterableprint(isinstance([], Iterable))a = [1, 2, 3]print(dir(a)) # dir查询a可调用方法print(isinstance((x for x in range(10)), Iterable))# 迭代对象变成迭代器,使用iter()方法b = iter(a)print(b.__next__())print(isinstance(b, Iterable))
3.生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
a = [1, 2, 4]print(a)b = [i*2 for i in range(10)] # 列表生成式print(b)
a = [1, 3, 4, 5, 5]print(a)print(range(10))b = [ i*2 for i in range(10)]print(b)c = ( i*2 for i in range(10)) # 生成器print(c)for i in c: print(i)
# @Author: Pofoo# @Time: 2017/11/6 10:46"""斐波那契数列:1,1,2,3,5,8,13,21,34,..."""def fib(max): n = 0 a = 0 b = 1 while n < max: # print(b) yield b # 生成器generator关键字 c = a a = b b = a + c n += 1 return '----done'# f = fib(6)g = fib(11)while True: try: x = next(g) print('g:', x) except StopIteration as e: print('Generator return value:', e.value) break# print(f.__next__())# print(f.__next__())# print(f.__next__())# print(f.__next__())# print(f.__next__())# print(f.__next__())# print(f.__next__())# print('start loop'.center(50, '-'))# for i in f:# print(f.__next__())# print('end loop'.center(50, '-'))
# 生成器并行import timedef consumer(name): print('【吃货部】【%s】准备吃包子咯!' % name) while True: bun = yield print('【吃货部】【%s】的包子被【%s】吃掉了!!!' % (bun, name))def production(number, *args): a = consumer(args[0]) b = consumer(args[1]) a.__next__() b.__next__() for i in range(1, number+1): time.sleep(1) print('【生产部】 正在生产%s号包子...' % i) time.sleep(0.5) a.send(i) b.send(i)production(20, 'Pofoo','wendy')
4.内置函数
# @Author: Pofoo# @Time: 2017/11/6 16:39print(abs(-1)) # 绝对值print(all([]))print(any([])) # any 空返回false,非空返回trueprint(any([1, 2]))print(ascii('中国')) # 字符串形式print(bin(11)) # 十进制转成二进制print(bool(0)) # 判断真假a = bytes('abcd', encoding='utf-8')b = bytearray('abcd', encoding='utf-8')print(a.capitalize(), a)print(b[0]) # 转成ASCII码b[1] = 111 # 必须负责成ASCIIprint(b)def say_hi():passprint(callable(say_hi))print(chr(99)) # 输入十进制,返回字符print(ord('c')) # 输入字符,返回十进制c = 'for i in range(10):print(i)'d = compile(c, '', 'exec') # 将字符串代码编译,变成可执行代码,exec有同样作用print(compile(c, '', 'exec'))exec(d) # 执行编译后的代码eval(d) # 执行编译后的代码print(dir(c)) # 查看c可调用的方法print(divmod(5, 3)) # 返回(1, 2) 商和余数e = filter(lambda n:n>5, range(10)) # filter过滤列表range(10)中大于5的列表,返回filter objf = map(lambda n: n*2, range(10)) # map重新生成一个新的列表print(filter(lambda n:n>5, range(10)), map(lambda n: n*2, range(10)))for i in e: print(i)for i in f: print(i)import functoolsres = functools.reduce(lambda x, y: x+y, range(10)) # reduce叠加,剩print(res)a = frozenset([1, 2, 3, 4]) # frozenset:不可变的集合print(globals()) # globals(): 返回globals所在文件的全局变量内容,转成字典print(hash('fasdalksflajsdlaskldasdaaaaaaaaaaa'))print(hex(1211)) # 将十进制转成十六进制def test(): local_var = 333 print(locals())print(globals())print(globals().get('local_var'))print(type(repr(11111)), repr(11111)) # 将object转化成strprint(reversed('11123123')) # 与list的reversed一致print(round(1.11112, 2)) # 保留小数位数a = range(20)print(a[slice(2, 5)]) # 切片dict_str = {6:2, 8:0, 1:4, -5:6}print(dict_str, sorted(dict_str.items())) # sorted变成list并有序排序,print(sorted(dict_str)) # 按key排序print(sorted(dict_str.items(), key=lambda x:x[1])) # 按value排序a = [1, 2, 3, 4, 5, 6]b = ['a', 'b', 'c', 'd']# print(zip(a, b))for i in zip(a, b): # zip:2个list连接,拉链 print(i)import time__import__('time') # 导入模块,字符串
# lambda用法def say_hi(n): print(n)say_hi('a_test')x = lambda n: print(n) # 与say_hi()一样的作用,只能写三元运算y = lambda n: 3 if n<4 else nx('nnn1')print(y(5))
5. json/pickle序列化与反序列化
用于序列化的两个模块:
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
# 序列化import jsonimport pickledef say_hi(name): print('Hi,', name)dict_info = { 'name': 'wendy', 'age': 12, 'func': say_hi}# with open('test15.txt', 'w', encoding='utf-8') as f:# f.write(str(dict_info))with open('test15.txt', 'wb') as f: # json为w, pickle为wb # f.write(json.dumps(dict_info)) f.write(pickle.dumps(dict_info)) # 二进制
# 反序列化import jsonimport pickledef say_hi(name): print('Hi2222,', name)# with open("test15.txt", 'r', encoding='utf-8') as f:# data = f.read()# print(type(eval(data)))# with open("test15.txt", 'r', encoding='utf-8') as f:# data = f.read()# print(type(eval(data)))with open("test15.txt", 'rb') as f: # data = json.loads(f.read()) # print(data['age']) data = pickle.loads(f.read()) print(data['func']('a_test'))
6. 作业
- 额度15000或自定义
- 实现购物商城,买东西加入购物车,调用信用卡接口结账
- 可以提现,手续费5%
- 支持多账户登录
- 支持账户转账
- 记录每月日常消费流水
- 提供还款接口
- ATM记录操作日志
- 提供管理接口,包括添加账户、用户额度、冻结账户等
10.用户认证用装饰器
blog:
程序说明:
1. atm管理人员登录的用户名和密码为:admin/admin
2. 默认已经新增了2个账户,分别为62258888/62259999,密码都为123456,状态正常,额度和余额都是15000
3. ATM管理人员入口:执行bin目录下manage.py文件
4. atm账户管理:执行bin目录下atm.py文件
5. shopping购物:执行bin目录下shopping.py文件
程序结构:
Atm
├──ReadMe
├──apps
│ ├──init.py
│ ├──auth.py # 用于用户登录和用户认证模块
│ ├──logger.py # 日志记录模块
│ ├──main.py # 主要逻辑、atm和manage交互模块
│ ├──managerApi.py # atm管理员操作账户模块
│ └──shopping_cart.py # 购物及其交互模块
├──bin
│ ├──init.py
│ ├──atm.py # atm执行程序
│ ├──manager.py # atm管理人员执行程序(默认账户和密码为admin/admin)
│ └──shopping.py # 购物执行程序
├──conf
│ ├──init.py
│ └──settings.py # 配置文件
├──db # 账户保存文件
│ ├──init.py
│ ├──62258888.json
│ └──62259999.json
└──logs # 日志文件
├──logger.log
├──operate.log
└──transaction.log
- Python自动化第四周
- leetcode-python 第四周
- Python第四周:函数与递归函数
- selenium-python自动化测试第一天
- python+webdriver自动化测试第一天
- 第四周
- 第四周
- 第四周
- 第四周
- 第四周
- 第四周
- 第四周
- 第四周
- 第四周
- 第四周
- 第四周
- 第四周
- 第四周
- 登录、鉴权业务实践
- 代码创建UICollectionView(带分组header)
- I/O复用的场景
- LeNet-5结构写Mnist识别(Tensorflow)
- 图论第一次课
- Python自动化第四周
- idea cannot find declaration to go to
- WebPack使用流程小记
- 数据分析的统计学基础--相关及回归分析
- mysql alter
- 这么简单的道理,猩猩都懂,我们却忘了
- 回文质数
- PAT甲级 1051. Pop Sequence (25)
- Daily summary