老男孩14期自动化运维day4随笔和作业(ATM)

1.装饰器:相当于对一个函数进行功能的添加,装饰器是由高阶函数和嵌套函数的结合
使用装饰器装饰函数时,不能修改原函数的调用方式。比如登录认证时会用到装饰器
装饰器能够带参数,一下是一个高级装饰器列子

#!/usr/bin/env python
# coding:utf-8
# Author:Yang


# 装饰器高级版

import time
user="yang"
pwd="123"
def auth(auth_type):
   print("auth func:",auth_type)
   def outer_wrapper(func):
       def wrapper(*args, **kwargs):
           print("auth func wrapper:",*args, **kwargs)
           if auth_type =="local":
               username = input("username:").strip()
               password = input("pwd:").strip()

               if user == username and pwd == password:
                   print("\033[32;1m user has passed authentication\033[0m")
                   res = func(*args, **kwargs)  # from home
                   print('---')
                   return res
               else:
                   exit("\033[32;1m error\033[0m")
           elif auth_type=="ldap":
                 print("ladap")
       return wrapper
   return outer_wrapper

def index():
    print("welcome to index page")
@auth(auth_type="local")  # 本地认证  这句话相当于
def home(): # 需要登录
    print("welcome to home page")
    return "from home"
@auth(auth_type="ldap")   # 远程认证
def bbs(): # 需要登录
    print("welcome to bbs page")


index()
print(home()) # 调用的wrapper
bbs()

2.生成器
只要带有yield关键字的就是生成器,且已经不是函数了

#!/usr/bin/env python
# coding:utf-8
# Author:Yang


def fib(max):  # 只要有yield存在 就是生成器 且不是函数了
    n,a,b=0,0,1
    while n <max:
        # print(b)
        yield b  # 保存函数的中断状态
        a,b=b,a+b
        # a,b=b,a+b相当于 t=(b,a+b) t是一个元组
        # a=t[0]
        # b=t[1]
        n=n+1
    return  'done'

f=fib(10)
# #print('---------ddddd')
# print(f.__next__())
# print("----")
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())

print('start loop')
# #for i in f:
#     print(i)



3.协程的使用。(单线程并行)

#!/usr/bin/env python
# coding:utf-8
# Author:Yang

import time
# 生产者消费者模型 单线程并行(协程)
def consumer(name):# 消费者
    print("%s 准备吃包子了"%name)
    while True:
        baozi=yield
        print("包子[%s]来了,被[%s]吃了"%(baozi,name))

c=consumer("yhr")
c.__next__()
# b1="韭菜馅"
# c.send(b1) # 调用yield 传值 (唤醒传值)
# c.__next__() # 调用yield  不传值 (只唤醒)


def producer(name): #生产者
    c = consumer('A')
    c2 = consumer('B')
    c.__next__()
    c2.__next__()
    print("老子开始做包子了")
    for i in range(10):
        time.sleep(1)
        print("做了一个包子,分两半")
        c.send(i)
        c2.send(i)


producer("yang")

4.迭代器
–可迭代对象iterable,凡是可作用于for 循环的都是iterable对象,list,dict,tuple,str是可迭代对象
–迭代器iterator,凡是可作用于next()函数的对象都是iterator对象,表示一个惰性计算的序列,
使用b=iter(a)讲a转为iterator对象
注:在python 2.x版本中,range(10)得到的结果是列表,是一个iterable对象。在python 3.x版本中 range(10)得到的是一个iterator对象

#!/usr/bin/env python
# coding:utf-8
# Author:Yang
from collections import Iterable
a=[1,2,3]
print(dir(a))
print(isinstance(a,Iterable))


# 生成器都是iterator对象,list,dict,tuple,str 是Iterbale,却不是iterator
# 凡是可作用与for循环的对象都是iterable对象
# 凡是可作用与next()函数的兑现个都是iterator对象,表示一个惰性计算的序列
# b=iter(a) 将a转为iterator对象

5.序列化与反序列化
可在不同的语言环境,操作系统环境上进行数据的传输。使用Pickle作为序列化格式的时候,可以将对象传入,但是只能在python语言中执行,且pickle实际上传输的是函数的内存地址
(json 与pickle)
序列化:

#!/usr/bin/env python
# coding:utf-8
# Author:Yang
import json
import pickle


def sayhi():
    name='yhr'
    print("hello",name)
info ={
    'name':'yang',
    'age':22

}

f = open("test.txt","w")   # 写json 传简单数据
f.write(json.dumps(info))


# f=open('test2.txt','wb')  # 写pickle 能序列化函数对象 传输内存地址
# f.write(pickle.dumps(info)) # f.write(pickle.dump(info,f)
f.close()

反序列化

#!/usr/bin/env python
# coding:utf-8
# Author:Yang

# 读json
import json
f=open('test.txt','r')
data=json.loads(f.read())
print(data['age'])
f.close()
# print(eval(data)['age'])


# # 读pickle
# import pickle
#
# def sayhi():
#     name='yhr'
#     print("hello",name)
#     print("hello2")
# f=open('test2.txt','rb')
# data=pickle.loads(f.read())
# print(data)
# print(data['func']())
f.close

6.python 3.x内置函数及用法概览

#!/usr/bin/env python
# coding:utf-8
# Author:Yang
# 内置函数
print(all([0,-1,3])) # 判断iterable元素 都为真则返回True 非0为真 有假则假

print(any([0,-1,3])) # 有真则真

print(ascii([1,2,"杨"])) #把内存的数据对象变成可打印的字符串对象

print(bin(255)) # 数字十进制转二进制 b 代表二进制开头

print(bool(0),bool(1),bool(-1)) # 判断布尔值 列表为空 字典为空 是假

a=bytes("abcde",encoding="utf-8")
b=bytearray("abcde",encoding="utf-8") #打印a的ascii形式
print(b[1])

def a():
    pass
print(callable(a)) # 判断是否可调用

print(chr(98)) # 把数字对应ascii

print(ord('d')) # 把ascii转对应数字

code="for i in range(10):print(i)"
#print(compile(code,'','exec'))
#c=compile(code,'','exec') # 把字符串编译成可执行文件
exec(code) # exec可直接执行。。。(多行)

list=[]

print(dir(list)) # 可以查方法

print(divmod(5,3)) # 得商,余数

l=[1,2,3]
for i in enumerate(l): # 将iterable可迭代对象组成一个索引序列
    print(i)
a="2*5"
d="[1,2,3]"
print(eval(a)) # 用来执行字符串表达式,并返回表达式的值
print(eval(d)) # 将字符串对象转换为有效的表达式,讲d转换为list

res = filter(lambda n:n>5,range(10)) # 使用了匿名函数做条件,filter作为过滤器,在3.0 filter生成的是迭代器对象,要用for来迭代
for i in res:
    print(i)

import functools
res1=functools.reduce(lambda x,y:x+y,range(10))
print(res1)

f="{} {}".format("hello","world") # 格式化字符串/数字
print(f)

a=frozenset([1,3,444,55,231,3]) # 变成不可变集合

print(globals()) # 返回当前程序所有全局变量的字典

print(hash('yang')) # 生成哈希算法对应哈希值 (找字符串的时候 就是哈希值的二分查找)

print(hex(10)) # 转为16进制 0x

def test():
    local_var='a'
    print(locals()) # 打印当前局部变量
test()

print(oct(10)) # 转八进制 0o
print(oct(8))

print(round(1.3323))
print(round(1.32,2)) #保留两位

a={6:2,-3:1,3:4}
print(sorted(a.items())) # 把key排序变成列表
print(sorted(a.items(),key=lambda x:x[1])) # 把value排序变成列表

a=[1,2,3,4]
b=['a','b','c','d']
for i in zip(a,b): # 拉链 组合
    print(i)

__import__('decorator') # 之后会用

day5作业
需求
在这里插入图片描述
模拟的atm机器,完成转账、还款、取款等操作,并于购物车结合,付款时调用付款接口。数据存储采用txt格式,以json的数据格式进行存储。
github地址:https://github.com/yyyhhhrrr/atm-shop/tree/master/day4/homework4atm-shop

猜你喜欢

转载自blog.csdn.net/qq_33060225/article/details/83747810
今日推荐