跟着老男孩教育学Python开发【第四篇】:模块
双层装饰器示例
- __author__ = 'Golden'
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- USER_INFO = {}
- def check_login(func):
- def inner(*args,**kwargs):
- #如果不存在给定默认值None
- 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:
- """
- print("index")
- @check_login
- def home():
- """
- 普通用户功能
- :return:
- """
- print("home")
- def login():
- user = input("请输入用户名:")
- if user == "admin":
- USER_INFO['is_login'] = True
- USER_INFO['user_type'] = 2
- else:
- USER_INFO['is_login'] = True
- USER_INFO['user_type'] = 1
- def main():
- while True:
- inp = input("1:登录;2:查看信息;3:超级管理员管理")
- ":
- login()
- elif inp == "":
- home()
- elif inp == "":
- index()
- main()
字符串格式化
Python的字符串格式化有两种方式:百分号方式、format方式。
百分号方式
- %[(name)][flags][width].[precision]typecode
- (name)可选,用于选择指定的key。
- s = "%s %d"%('alex',23)
- print(s)
- s = "%(name)s %(age)d"%{'name':'alex','age':123}
- print(s)
- flags可选,可供选择的值有:
+:右对齐,正数前加"+",负数前加"-"。
- s = "test%(name)+10stest %(age)d"%{'name':'alex','age':123}
- print(s)
-:左对齐,正数前无符号,负数前加"-"。
- s = "test%(name)-10stest %(age)d"%{'name':'alex','age':123}
- print(s)
空格:右对齐,正数前加空格,负数前加 "-"。
0:右对齐,正数前无符号,负数前加"-",用0填充空白处。
- width可选,占用宽度。
- .precision可选,小数点后保留的位数。
- s = "test%(name)-10stest test%(age).2ftest"%{'name':'alex','age':123.1234567}
- print(s)
- typecode必选
s:获取传入对象的_str_方法的返回值,并将其格式化到指定位置。
r:获取传入对象的_repr_方法的返回值,并将其格式化到指定位置。
c:整数,将数字装换成其unicode对应的值,10进制范围为0<=i<=1114111(py27则只支持0--255),将字符添加到指定位置。
o:将整数转换成八进制表示,并将其格式化到指定位置。
x:将整数转换成十六进制表示,并将其格式化到指定位置。
- s = "test %c---%o---%x"%(65,15,15)
- print(s)
d:将整数、浮点数转换成十进制表示,并将其格式化到指定位置。
e:将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)。
E:将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)。
- s = "test %e %E"%(1000000000000000,1000000000000000)
- print(s)
f:将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)。
F:同上。
g:自动调整将整数、浮点数转换成浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学技术则是e)。
G:自动调整将整数、浮点数转换成浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学技术则是E)。
%:定字符串中存在格式化标志时,需要用%%表示一个百分号。
格式化时,字符串中出现占位符%,需要用%%输出%。
- s = "alex %"
- print(s)
- s = "alex %s %% " %('SB')
- print(s)
注意:python中百分号格式化是不存在自动将整数转换成二进制表示的方式。
Format方式
- [[fill]align][sign][#][width][,][.precision][type]
- fill【可选】空白处填充的字符。
- align【可选】对齐方式(需配个width使用)
<:内容左对齐
>:内容右对齐(默认)
=:内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。即使:符号+填充物+数字。
^:内容居中。
- s = "---{:a^20s}----".format('alex')
- print(s)
- sign【可选】有无符号数字。
+:正号加正,负号加负。
-:正号不变,负号加负。
空格:正号空格,负号加负。
- s = "---{:a^20s}----{:+d}".format('alex',123)
- print(s)
- #【可选】对于二进制、八进制、十六进制,如果加上#,会显示0b/0o/0x,否则不显示。
- ,【可选】为数字添加分隔符,如1,000,000
- width【可选】格式化位所占宽度。
- .precision【可选】小数位保留精度。
- type【可选】格式化类型
b:将10进制整数自动转换成2进制显示然后格式化。
- s = "---{:a^20s}----{:+d}----{:#b}".format('alex',123,15)
- print(s)
%:显示百分比(默认显示小数点后6位)。
- s = "test {:%}".format(0.234567)
- print(s)
- s = "test {:.2%}".format(0.234567)
- print(s)
总结:
- s = "i am {},age {},{}".format("seven",18,"alex")
- s = "i am {},age {},{}".format(*["seven",18,"alex"])
- s = "i am {0},age {1},{0}".format("seven",18)
- s = "i am {0},age {1},{0}".format(*["seven",18])
- s = "i am {name},age {age},{name}".format(name="seven",age=18)
- s = "i am {name},age {age},{name}".format(**{"name":"seven","age":18})
- s = "i am {0[0]},age {0[1]},{0[2]}".format([1,2,3],[11,22,33])
- s = "i am {:s},age {:d},{:f}".format("seven",18,88888.1)
- s = "i am {:s},age {:d}".format("seven",18)
- s = "i am {name:s},age {age:d}".format(name="seven",age=18)
- s = "i am {name:s},age {age:d}".format(**{"name":"seven","age":18})
- s = "numbers:{:b},{:o},{:d},{:x},{:X},{:%}".format(15,15,15,15,15,0.78912)
- s = "numbers:{0:b},{0:o},{0:d},{0:x},{0:X},{0:%}".format(15)
生成器
- #普通函数
- def func():
- return 123
- ret = func()
- #生成器
- def func():
- print("start")
- yield 1
- print(222)
- yield 2
- print(333)
- yield 3
- ret01 = func()
- print(ret01)
- '''
- for i in ret01:
- print(i)
- '''
- #进入函数找到yield,获取yield后面的数据
- r = ret01.__next__()
- print(r)
- r = ret01.__next__()
- print(r)
- r = ret01.__next__()
- print(r)
基于生成器实现range功能
- def myrange(arg):
- start = 0
- while True:
- if start > arg:
- return
- yield start
- start += 1
- ret = myrange(3)
- r = ret.__next__()
- print(r)
- r = ret.__next__()
- print(r)
- r = ret.__next__()
- print(r)
- r = ret.__next__()
- print(r)
迭代器
- def myrange(arg):
- start = 0
- while True:
- if start > arg:
- return
- yield start
- start += 1
- ret = myrange(3)
- for item in ret:
- print(item)
递归
函数的调用
- def d():
- "
- def c():
- r = d()
- return r
- def b():
- r = c()
- return r
- def a():
- r = b()
- print(r)
- a()
递归调用
- def func(n):
- n += 1
- if n >= 10:
- return 'end',n
- return func(n)
- r = func(1)
- print(r)
模块
添加一个模块路径
- import sys
- sys.path.append('E:\\')
导入模块
- #导入模块s3
- import s3
- #引用s3中login()函数
- s3.login()
单模块使用import导入,嵌套在文件夹下使用from xxx import xxx或from xxx import xxx as xx。
第三方模块
安装第三方模块
pip3安装:python3 -m pip3 install xxxx或python2 -m pip install xxxx。
源码安装:下载,解压,进入解压目录python setup.py install。
序列化
import json(基本数据类型)和import pickle(python任何类型)
- import json
- dic = {'k1':'v1'}
- #将python基本数据类型转换成字符串形式
- result = json.dumps(dic)
- print(result,type(result))
- s1 = '{"k1":123}'
- #将python字符串形式转化成基本数据类型
- dic = json.loads(s1)
- print(dic,type(dic))
获取天气相关json数据
- import requests
- import json
- response = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=武汉')
- response.encoding = 'utf-8'
- print(response.text,type(response.text))
- dic = json.loads(response.text)
- print(type(dic))
loads反序列化是,一定注意引号的使用格式
- import json
- r = json.dumps([11,22,33])
- #注意外面用单引号,里面用双引号
- li = '["alex","eric"]'
- ret = json.loads(li)
- print(ret,type(ret))
dump与load
- import json
- li = [11,22,44]
- json.dump(li,open('db','w'))
- li = json.load(open('db','r'))
- print(type(li))
pickle仅仅python可用
- #pickle仅仅python之间调用
- import pickle
- li = [11,22,33]
- r = pickle.dumps(li)
- print(r)
- ret = pickle.loads(r)
- print(ret)
- #二进制方式
- pickle.dump(li,open('db','wb'))
- ret = pickle.load(open('db','rb'))
- print(ret)
json更适合跨语言,基本数据类型的序列化。
pickle针对python所有类型的序列化,仅仅适用于python。
time
- import time
- #时间戳1970年1月1号0点开始的秒数(unix版本正式上线)
- print(time.time())
- #当前系统时间
- print(time.ctime())
- print(time.ctime(time.time()-86400))
- #将时间戳转换成struct_time格式
- print(time.gmtime())
- time_obj = time.gmtime()
- print(time_obj.tm_year,time_obj.tm_mday)
- #本地时间(struct_time格式)
- print(time.localtime())
- #struct_time转成时间戳
- print(time.mktime(time_obj))
- #延迟4秒后继续执行
- #time.sleep(4)
- print("----")
- #将struct_time格式转换成指定的字符串格式
- tm = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
- print(tm)
- #将字符串格式转换成struct_time格式
- tm = time.strptime("2016-12-14","%Y-%m-%d")
- tm_1 = time.strptime("2016-12-12 8:58","%Y-%m-%d %H:%M")
- print(tm)
- print(tm_1)
- #字符串格式转换成时间戳
- tm = time.mktime(time.strptime("2016-12-14",'%Y-%m-%d'))
- print(tm)
datetime
- import datetime
- import time
- #输出格式2016-01-01
- print(datetime.date.today())
- #将时间戳转换成日期格式
- print(datetime.date.fromtimestamp(time.time()-864400))
- #详细时间
- current_time = datetime.datetime.now()
- print(current_time)
- #返回struct_time格式
- print(current_time.timetuple())
- #days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0
- #加10天
- print(datetime.datetime.now()+datetime.timedelta(days=10))
- #减10天
- print(datetime.datetime.now()+datetime.timedelta(days=-10))
- #减10小时
- print(datetime.datetime.now()+datetime.timedelta(hours=-10))
- #加130秒
- print(datetime.datetime.now()+datetime.timedelta(seconds=-130))
- #时间替换
- current_time = datetime.datetime.now()
- print(current_time.replace(2014,9,12))
- #将字符串转换成日期格式
- print(datetime.datetime.strptime("23/12/14 09:13","%d/%m/%y %H:%M"))
- #时间比较
- time_obj = current_time.replace(2015,5)
- print(current_time > time_obj)
- print(type(time_obj))
logging
- import logging
- logging.warning("user [alex] attempted wrong password more then 3 times")
- logging.critical("server is down")
记录日志到文件
- 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')
注意:只有级别比INFO高或相等才会被记录到文件中。
记录时间、日志到文件
- logging.basicConfig(filename='example.log',level=logging.INFO,format='%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')
- logging.debug('This message should go to the log file')
- logging.info('So should this')
- logging.warning('And this,too')
同时打印在屏幕和文件里
- import logging
- #获取日志的对象
- logger = logging.getLogger('TEST-LOG')
- #设定一个全局的日志级别
- logger.setLevel(logging.INFO)
- #输出到屏幕
- ch = logging.StreamHandler()
- #设定输出级别
- ch.setLevel(logging.DEBUG)
- #写入日志文件
- fh = logging.FileHandler("access.log")
- #设定写入的级别
- fh.setLevel(logging.WARNING)
- fh_err = logging.FileHandler("error.log")
- fh_err.setLevel(logging.ERROR)
- #格式:时间 名字 信息
- formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
- formatter_for_file = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
- formatter_for_file_err= logging.Formatter('%(asctime)s %(filename)s - %(levelname)s - %(message)s')
- #屏幕输出格式
- ch.setFormatter(formatter)
- #文件记录格式
- fh.setFormatter(formatter_for_file)
- fh_err.setFormatter(formatter_for_file_err)
- #添加到logger
- logger.addHandler(ch)
- logger.addHandler(fh)
- logger.addHandler(fh_err)
- #打印日志
- logger.debug('debug message')
- logger.info('info message')
- logger.warn('warn message')
- logger.error('error message')
- logger.critical('critical message')
日志记录格式
%(filename)s:程序文件路径
%(funcName)s:函数名
%(lineno)d:行数
%(module):模块名
%(processName)s:进程名
%(process)d:进程id
%(thread)d:线程id
跟着老男孩教育学Python开发【第四篇】:模块的更多相关文章
- 跟着老男孩教育学Python开发【第一篇】:初识Python
Python简介 Python前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...
- 跟着老男孩教育学Python开发【第二篇】:Python基本数据类型
运算符 设定:a=10,b=20 . 算数运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**3 ...
- 跟着老男孩教育学Python开发【第五篇】:模块
递归的案例:阶乘 1*2*3*4*5*6*7- def func(num): if num == 1: return 1 return num * func(num - ...
- 跟着老男孩教育学Python开发【第三篇】:Python函数
set 无序,不重复,可嵌套. 函数 创建函数: 1.def关键字,创建函数 2.函数名 3.() 4.函数体 5.返回值 发邮件函数 def sendmail(): import smtpl ...
- python开发第四篇:函数(1)
函数 阅读目录 一 函数知识体系 二 函数基础 三 函数对象.函数嵌套.名称空间与作用域.装饰器 四 迭代器.生成器.面向过程编程 五 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数 ...
- Python开发第四篇
文件操作 一.文件基本操作 打开文件方法:open f = open("test",encoding="") r:只读模式(只能读取文件,不能做写操作,文件不存 ...
- Python开发【第二篇】:初识Python
Python开发[第二篇]:初识Python Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...
- Python开发【第一篇】:目录
本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python ...
- 基于GBT28181:SIP协议组件开发-----------第四篇SIP注册流程eXosip2实现(一)
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3945294.html. 上章节讲解了利用自主开发的组件SIP组件l ...
随机推荐
- Python高手之路【二】python基本数据类型
一:数字 int int(整型): 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值 ...
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- nodejs进阶(2)—函数模块调用
函数调用 1. 文件内普通函数调用 创建一个js文件命名为2_callFunction.js,其中定义一个函数fun1,向返回对象输出了一段字符串“你好,我是fun1”. //------------ ...
- 移动端1px边框
问题:移动端1px边框,看起来总是2倍的边框大小,为了解决这个问题试用过很多方法,用图片,用js判断dpr等,都不太满意, 最后找到一个还算好用的方法:伪类 + transform 原理是把原先元素的 ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- echarts+php+mysql 绘图实例
最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...
- continue break 区别
在循环中有两种循环方式 continue , break continue 只是跳出本次循环, 不在继续往下走, 还是开始下一次循环 break 将会跳出整个循环, 此循环将会被终止 count = ...
- ubuntu 下安装scrapy
1.把Scrapy签名的GPG密钥添加到APT的钥匙环中: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 6272 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
- ComponentPattern (组合模式)
import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...