Python笔记总结week5

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python笔记总结week5相关的知识,希望对你有一定的参考价值。

Decorator:多层装饰器

#双层装饰器(用户登录,权限)
#多层: 调用从最外层到最内层函数,返回值则从最内到最外层函数

USER_INFO = {}
#USER_INFO[‘is_login‘] = True
#USER_INFO[‘user_type‘] = 2


def check_login(func):
    def inner(*args,**kwargs):
        if USER_INFO.get(is_login,None):
            ret = func(*args,**kwargs)
            return ret
        else:
            print("please login")
    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("You are not allowed to do this")
    return inner


@check_login
@check_admin
def index():
    print("index")


index()

 

Packages:创建与运用

?? 1.创建一个名为s4.py的python文件,写入以下函数:

def login():
    print("login")

2. 在另一个python文件中以模块形式import s4文件,并调用login函数:

import s4          #加载所有s4文件中内容到内存
s4.login()

! 注意:创建模块时不能和内置模块名重名;

导入模块时:

若导入单模块: import xxx

嵌套在文件夹下:

form xxx import yyy

from xxx import yyy as zzz

requests:用get获取网址信息,打印响应内容、响应状态码 

import requests

url = http://q.stock.sohu.com/cn/bk_2011.shtml
r = requests.get(url)
print(r.text)
print(r.status_code)

 

序列化:常用模块为json与pickle:

  • json,用于字符串 和 python数据类型间进行转换

  • pickle,用于python特有的类型 和 python的数据类型间进行转换

json - dumps返回的是一个字符串,load和loads则会返回python的对象。

import json
dic={k1:v1}
print(dic,type(dic))
#将python基本数据类型转成字符串形式
result = json.dumps(dic)
print(result ,type(result))

s1 = {"k1":123}
#将python字符串形式转化成基本数据类型
dic= json.loads(s1)
print(dic,type(dic))

#返回信息原本是字符串类型(字典形态)
response = requests.get(http://wthrcdn.etouch.cn/weather_mini?city=北京)
response.encoding =utf-8
#返回信息自动转化为字典
dic = json.loads(response.text)
print(type(dic))

r= json.dumps([11,22,33])
#通过loads去翻序列的时候一定要里面是双引号
li = ["eric","alex"]
ret = json.loads(li)
print(ret,type(ret))

#比加s的多一步操作,把序列化的字符串写到另一个文件(写\\读文件操作)
li = ["eric","alex"]
f1 = json.dump(li,open("db1","w"))
f2 = json.load(open("db1","r"))


Pickle

import pickle
li = [11,22,33]
r= pickle.dumps(li)
print(r)

result = pickle.loads(r)
print(result)

li =[11,22,33]
pickle.dump(li,open(db,wb))

 

json与pickle比较: -reference:https://docs.python.org/3/library/pickle.html

  • JSON是文本形式的存储,Pickle则是二进制形式(至少常用二进制)
  • JSON是人可读的,Pickle不可读
  • JSON广泛应用于除Python外的其他领域,Pickle是Python独有的。
  • JSON只能dump一些python的内置对象,Pickle可以存储几乎所有对象。   

time与datetime模块:time一般用来取时间戳;datetime一般取日期

import time
#1970年开始,unix系统上线(linux雏形),到现在的秒数
print(time.time())  #1465726407.219118
tu = (2016,6,16,2,14,33,22,22,33)
print(time.mktime(tu))     #时间对象转换成时间戳(1970年到现在):1466010873.0

print(time.ctime())  #返回当前时间字符串形式:Sun Jun 12 18:13:27 2016

print(time.gmtime())
print(time.localtime())
#打印结果均为e.struct_time(tm_year=2016, tm_mon=6, tm_mday=12, tm_hour=10, tm_min=15, tm_sec=9, tm_wday=6, tm_yday=164, tm_isdst=0)

time.sleep(4)   #睡眠4秒钟,阻塞
tm = time.strftime("%Y-%m-%d", time. gmtime())

import datetime
print(datetime.date.today())   #2016-06-12
print(datetime.date.fromtimestamp(10000000))#时间戳转成日期格式:1970-04-27
current_time = datetime.datetime.now()   #精确到毫秒

#进行时间运算
datetime.datetime.now()-datetime.timedelta(hours= 10) #比现在加10小时
print(current_time.replace(2014,6,9))   #直接更改时间:2014-06-09 18:18:45.366615

 

logging模块: 可以通过以下几类存储日志

技术分享

??

import logging
logging.warning("User tried three times")
logging.critical("server is down")

写入文件:其中下面这句中的level=loggin.INFO意思是把日志纪录级别设置为INFO;只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里

import logging

logging.basicConfig(filename=example.log,level= logging.INFO)
logging.debug(This message should go to the log file)
logging.info(So should this)
logging.warning(And this, too)

 ?? 加上时间:

import logging
logging.basicConfig(format=%(asctime)s %(message)s, datefmt=%m/%d/%Y %I:%M:%S %p)
logging.warning(is when this event was logged.)

 

格式化:

Format与占位符%s,%d-format要比%s %d功能强大很多

占位符%s,%d:

#%s文字
s = "I am %s"%("Alex")
print(s)

#%d数字
s = "I am %s, %d years old"%("Alex",18)
print(s)

#用字典传值
s = "I am %(name)s,%(age)d years old"%{"name":"Alex","age":18}
print(s)

#保留n位小数(%.nf)
s = "percent %.2f" % 99.6323
print(s)

#用字典传值,保留n位小数
s = "%(pp).2f"% {"pp":132.86346}
print(s)

#当格式化时,字符串中如果已经出现占位符,需要用两个%,才能在输出的时候看见一个%
s = "%(pp).2f %%"% {"pp":132.86346}
print(s)

Format:填充字符,居中,%s自动转换. 二进制八进制0x,0b需不需要:

s1 = "adjh{0}s{0}d{1}mb".format(123,"Alex")
print(s1)

s1 = "----{name:s}-----{age:d}---".format(name = "alex", age = 18)
print(s1)

#填充只能填一个字符,20个a填充;"Alex"居中,数字前面加正号
s1 ="{:a^20s}{:+d}".format("Alex",18)
print(s1)

#基础
s1 = "i am {},age{}{}".format("seven",18,alex)
print(s1)

#用列表传值时要在列表前加一个*
s1 = "i am {},age{}{}".format(*["seven",18,alex])
print(s1)

#数字体现顺序
s1 = "i am {0},age{1}{0}".format("seven",18)
print(s1)

#用列表传值,数字体现列表中顺序
s1 = "i am {0},age{1}{0}".format(*["seven",18,alex])
print(s1)

s1 = "i am {name},age{age}{name}".format(name = "seven",age = 18)
print(s1)

#用字典传的时候要在字典前面加两个*
s1 = "i am {name},age{age}{name}".format(**{"name" : "seven", "age" : 18})
print(s1)

#列表中的列表,体现顺序
s1 = "i am {0[0],age{0[1],really{0[2]}".format([1,2,3],[2,3,4])
print(s1)

#:b转为二进制;:%自动加上百分号
s1 = "numbers{:b},{:o},{:d},{:x},{:x},{:%}".format(15,15,15,15,15,15.2554643,2)
print(s1)

生成器:

一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器;

#生成器:函数出现yield
def func():
    print("111")
    yield 1
    print("222")
    yield 2
    print("333")
    yield 3

ret =func()

#进入函数找到yield(保存上一次执行的位置),获取yield后面数据
r1 = ret.__next__()
print(r1)
r2 = ret.__next__()
print(r2)
r3 = ret.__next__()
print(r3)

递归:

(1)递归就是在过程或函数里调用自身;
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

??

def d():
    return "123"

def c():
    r = d()
    return r

def b():
    r = c()
    return r

def a():
    r = b()
    return r
print(a())

??

def func(n):
    print("---")  #六条线
    n+=1
    if n >= 4:
        return end
    return func(n)
func(1)
print(func(1))

 

以上是关于Python笔记总结week5的主要内容,如果未能解决你的问题,请参考以下文章

读书笔记 Week5 2018-4-5

Python学习week5

学习笔记:python3,代码片段(2017)

python常用代码片段总结

python学习week5-递归,匿名函数生成器

python学习笔记目录