国内虚拟助手网站,优化wordpress后台速度,天津网站建设需要多少钱,佛山市 骏域网站建设一、递归与二分法 一#xff09;递归 1、递归调用的定义 递归调用#xff1a;在调用一个函数的过程中#xff0c;直接或间接地调用了函数本身 2、递归分为两类#xff1a;直接与间接
#直接
def func():print(from func)func()func()
# 间接
def foo():print(from foo)bar…一、递归与二分法 一递归 1、递归调用的定义 递归调用在调用一个函数的过程中直接或间接地调用了函数本身 2、递归分为两类直接与间接
#直接
def func():print(from func)func()func()
# 间接
def foo():print(from foo)bar()def bar():print(from bar)foo() 3、递归调用的特点和使用的注意点
递归调用在调用一个函数的过程中直接或间接地调用了函数本身
python中的递归效率低需要在进入下一次递归时保留当前的状态
在其他语言中可以有解决方法尾递归优化即在函数的最后一步而非最后一行)调用自己尾递归优化http://egon09.blog.51cto.com/9161406/1842475但是python又没有尾递归且对递归层级做了限制#总结递归的使用
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时问题规模相比上次递归都应有所减少
3. 递归效率不高递归层次过多会导致栈溢出
在计算机中函数调用是通过栈stack这种数据结构实现的每当进入一个函数调用栈就会加一层栈帧每当函数返回栈就会减一层栈帧。由于栈的大小不是无限的所以递归调用的次数过多会导致栈溢出 4、递归的执行分为两个阶段递推询问的过程和回溯回答的过程 1 #获知age(5)的值2 # age(5)age(4)23 # age(4)age(3)24 # age(3)age(2)25 # age(2)age(1)26 # age(1)187 #8 # age(n)age(n-1)2 #n19 # age(1)18 #n1
10
11 def age(n):
12 if n 1:
13 return 18
14 return age(n-1)2
15
16 print(age(5)) 5、可以递归的最大深度 1 #虽然可以设置但是因为不是尾递归仍然要保存栈内存大小一定不可能无限递归2 import sys3 sys.getrecursionlimit() ##获取目前默认递归的最大深度默认深度是10004 sys.setrecursionlimit(500) ##更改默认递归的最大深度5 n16 def test():7 global n8 print(n)9 n1
10 test()
11 test() 6、应用场景有许多层的列表要取出所有元素——设置结束条件使用递归
l [1, 2,list ,[3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15,[16,[17,]],19]]]]]]]
def search(l):for item in l:# if type(item) is list:if isinstance(item,list): ##判断数据类型是否是列表search(item)else:print(item)search(l) 二二分法 1、二分法的产生
一个按照从小到大排列的数字列表中找到指定的数字遍历的效率太低用二分法算法的一种算法是解决问题的方法可以极大低缩小问题规模 2、 二分法的作用不断将列表切分成两份减小压力 1 l [1,2,5,6,77,1001,1165,2340]2 def search(l,num):3 print(l)4 if len(l) 1:5 mid_index len(l) // 2 #相除取整6 if num l[mid_index]:7 #in the right8 l l[mid_index1:]9 elif num l[mid_index]:
10 #in the left
11 l l[:mid_index]
12 else:
13 print(find it)
14 return
15 else:
16 if l[0] num:
17 print(find it)
18 else:
19 print(not exists)
20 return
21 search(l,num) #重复的可以放在if里面
22 search(l,77)
二、匿名函数 一什么是匿名函数
# 有名函数
def f1(m):
print(f1(3))
# 匿名函数
lambda n:n*2 二匿名函数的应用场景
匿名函数自带return,只能使用一次
#匿名函数即没有绑定名字的函数意味着只能使用一次就会回收
应用场景只使用一次的功能 三匿名函数的使用
salaries{egon:3000,alex:10000000,wupeiqi:10000,yuanhao:2000
}def f1(k):return salaries[k] 1、max、min与 lambda结合
print(max(salaries,keylambda k:salaries[k]))
print(min(salaries,keylambda k:salaries[k])) 2、sorted与lambda结合
print(sorted(salaries,keylambda k:salaries[k]))
print(sorted(salaries,keylambda k:salaries[k],reverseTrue)) 3、map映射与lambda结合 将原来的元素进行处理后重新赋值给原变量
l[alex,egon,wzs,yuanhao]
print(list(map(lambda x:x123,l))) 4、reduce合并与lambda结合 计算0到100数字的和
1 from functools import reduce
2 # reduce(lambda 表达式,计算范围,计算的初始值)
3 resreduce(lambda x,y:xy,range(1,100),100)
4 print(res) 5、filter过滤与lambda结合 过滤出列表中以123结尾的元素
l[alex123,egon123,wzs123,yuanhao]
print(list(filter(lambda name:name.endswith(123),l))) 6、扩展 拉链函数
l1[1,2,3]
s1hello
res zip(l1,s1)
print(list(res))reszip(salaries.values(),salaries.keys())
print(max(res)[1])元素比较大小从左到右比较元素的大小
1 t1(111,a)
2 t2(11,b,123,c)
3 print(t1 t2)
三、内置函数 一什么是内置函数
内置函数python将简单的功能内置到语言中使用者不用定义可以直接使用
内置函数链接https://docs.python.org/3/library/functions.html?highlightbuilt#ascii 二常用的内置函数 1、优先掌握的函数
max min sorted map filter sum bool chr divmod enumerate
id input print isinstance iter len open pow type zip
from _functools import reduce 2、数学运算
abs(-5) # 取绝对值也就是5
round(2.6) # 四舍五入取整也就是3.0
pow(2, 3) # 相当于2**3如果是pow(2, 3, 5)相当于2**3 % 5
cmp(2.3, 3.2) # 比较两个数的大小
divmod(9,2) # 返回除法结果和余数分页显示内容计算页数
max([1,5,2,9]) # 求最大值 min([9,2,-4,2]) # 求最小值 sum([2,-1,9,12]) # 求和 3、类型转换
int(5) # 转换为整数 integer
float(2) # 转换为浮点数 float
long(23) # 转换为长整数 long integer
str(2.3) # 转换为字符串 string
complex(3, 9) # 返回复数 3 9i
bytes() # 字节
list((1,2,3)) # 转换为表 list
tuple([2,3,4]) # 转换为定值表 tuple
dict(a1,bhello,c[1,2,3]) # 构建词典 dictionary
set() # 转换成集合
slice(5,2,-1) # 切片操作python str与bytes之间的转换 1 # bytes object2 b bexample3 # str object4 s example5 # str to bytes6 sc bytes(s, encoding utf8)7 print(type(sb))8 # bytes to str9 bs str(b, encoding utf8)
10 # an alternative可替代的方法 method
11 # str to bytes
12 sc2 str.encode(s)
13 # bytes to str
14 bs2 bytes.decode(b) ASCII表中的字符和序号之间互相转好应用场景生成随机验证码
#65-90是大写A-Z
print(chr(65))
print(chr(90))
#97-122是小写a-z
print(chr(97))
print(chr(122))
print(ord(A))
#48-57是数字0-9
print(chr(48))
print(chr(57)) bool()布尔判断在python中为False的情况空字符 ‘’列表 []元组 ()字典 {}00.0None
bool(0) # 转换为相应的真假值在Python中0相当于False 进制显示
bin(56) # 返回一个字符串表示56的二进制数
hex(56) # 返回一个字符串表示56的十六进制数
oct(56) # 返回一个字符串表示56的八进制数 判断元素是否为True
all([True, 1, hello!]) # 是否所有的元素都相当于True值
any([, 0, False, [], None]) # 是否有任意一个元素相当于True值 排序
sorted([1,5,3]) # 返回正序的序列也就是[1,3,5]
reversed([1,5,3]) # 返回反序的序列也就是[3,5,1] 4、类、对象、属性
# define class
class Me(object):def test(self):print Hello!
def new_test():print New Hello!
me Me()
object()
hasattr(me, test) # 检查me对象是否有test属性
getattr(me, test) # 返回test属性
setattr(me, test, new_test) # 将test属性设置为new_test
delattr(me, test) # 删除test属性
isinstance(1,int) # 检查对象是否是类的对象返回True或False
issubclass(Me, object) # Me类是否为object类的子类 5、hash哈希值 应用——数据校验
hash(object)
如果对象object为哈希表类型返回对象object的哈希值。哈希值为整数在字典查找中哈希值用于快递比价字典的键。
两个数值如果相等则哈希值也相等。 6、名称空间 局部名称vars()、locals()全局名称空间global()显示形式是字典
print(vars() is locals())
print(globals()) 7、__import__() 可以导入字符串import不能导入字符串
# import time #不能导入字符串
# import time
minput(:)
print(type(m))
obj__import__(m) ##这样就可以导入字符串了
obj.sleep(2)
print(m) 8、compile编译执行exec、eval 了解 1、compile编译 语法
compile(str,filename,kind)
filename:用于追踪str来自于哪个文件如果不想追踪就可以不定义
kind可以是single代表一条语句exec代表一组语句eval代表一个表达式 应用
sfor i in range(10):print(i)
codecompile(s,,exec)
exec(code) ##有返回结果s1123
code1compile(s1,,eval)
eval(code1) ##没有返回结果 2、eval与exec eval 提取字符串内的表达式执行并返回结果可执行语句会报错 exec 执行字符串内的表达式或语句没有返回结果 语法
eval(str,[,globals[,locals]])
exec(str,[,globals[,locals]]) 举例
1 s1123
2 # s1[a,b,c]
3 s2for i in range(10):print (i)
4 print(eval(s1))
5 print(exec(s1))
6 print(exec(s2))
四、模块 一模块介绍 1、什么是模块
一个模块就是一个包含了python定义和声明的文件文件名就是模块名字加上.py的后缀。 2、为何使用模块
如果你退出python解释器然后重新进入那么你之前定义的函数或者变量都将丢失因此我们通常将程序写到文件中以便永久保存下来需要时就通过python test.py方式去执行此时test.py被称为脚本script。随着程序的发展功能越来越多为了方便管理我们通常将程序分成一个个的文件这样做程序的结构更清晰方便管理。这时我们不仅仅可以把这些文件当做脚本去执行还可以把他们当做模块来导入到其他的模块中实现了功能的重复利用 import加载的模块分为四个通用类别
1、使用python编写的代码.py文件
2、已被编译为共享库或DLL的C或C扩展
3、好一组模块的包
4、使用C编写并链接到python解释器的内置模块 3、导入模块都干了哪些事
1、执行源文件
2、以一个源文件的全局名称空间
3、在当前位置拿到一个模块名指向2创建的名称空间 4、python文件的两种用途
.py文件的两种用途1、当做脚本运行 2、当做模块被加载运行文件当做脚本运行时__name__等于__main__
文件当做模块被加载运行时__name__等于模块名
if __name__ __main__:# 当做脚本使用func1()func2()func3()
# main #回车会导入if __name__ __main__: 二使用import导入模块 模块代码文件spam.py
#spam.py
# print(from the spam.py)
# 限制*的导入内容
# _money1000 #对*隐藏即*无法调用from spam import *
# __all__ [money,x] # *只能调用赋予给__all__的名称 from spam import *
money10000000000000
def read1():print(spam-read1-money,money)def read2():print(spam-read2 calling read)read1()def change():global moneymoney0 1、导入模块并执行 test.py
import spam
money100
spam.read1()
spam.read2()
spam.change()
spam.read1()
print(money) 2、as取别名 用途1、模块名非常长 2、更改模块的功能 测试文件
mysql.py
1 def sqlparse():
2 print(mysql sqlparse)
oracle.py
1 def sqlparse():
2 print(oracle sqlparse) 导入模块并执行
模块名比较长
1 import spam as s1
2 money 10000000
3 spam.change()
4 print(spam.money)
传入的内容调用不同的模块
1 sql_type input(sql_type)
2 if sql_type mysql:
3 import mysql as sql ##引用不同的模块因为实现的功能是相同的所以可以起相同的别名
4 elif sql_type oracle:
5 import oracle as sql
6 sql.sqlparse()3、导入多个模块模块之间用逗号隔开不建议这么写还是不同模块分行写为好
import os,sys,requests 4、模块导入的特点 模块只在第一次导入时才会执行之后的导入都是直接引用内存已经存在的结果
导入并验证是否已在内存中 1 import spam2 import spam3 import spam4 import spam5 6 #验证是否已经在内存7 import sys8 # print(sys.modules) #存放的是已经加到内存的模块9 print(spam in sys.modules) #查看一个模块是否加到内存中
10 import spam
11 print(spam in sys.modules) 三from....import...导入模块 1、对比import导入模块from....import...的优缺点
1 对比import spam会将源文件的名称空间spam带到当前名称空间中使用时必须是spam.名字的方式
2 而from 语句相当于import也会创建新的名称空间但是将spam中的名字直接导入到当前的名称空间中在当前名称空间中直接使用名字就可以了
3 优点使用源文件内的名字时无需加前缀使用方便
4 缺点容易与当前文件的名称空间内的名字混淆,会覆盖原来名字的值 2、语法范例
1 from spam import money,read1,read2
2 money 10
3 print(money)
4 # gread1()
5 gread2()
6 print(g) 3、将模块导入并起别名
# # from spam import read1 as m
from spam import money as m
# print(m) 4、*的使用 不建议使用*
#要引用的源文件里面的内容很多时可以使用*代替所有更容易与当前文件的名称空间冲突但是不建议使用_money1000 #将调用的名字前面加_*就无法调用该名字在源文件修改
__all__ [money,x] # *只能调用赋予给__all__的名称在源文件修改
from spam import * 四模块的搜索路径 1、模块查找的顺序
查找顺序内存----内置模块----硬盘范例
import time
import importlib
import spam
time.sleep(30)
# import spam
# print(spam.money)importlib.reload(spam) ##重启加载spam可以使用到测试环境
print(spam.money) 2、模块的注意事项
注意1、Python程序只有重新加载才能生效2、Python自带的模块名不能使用 3、搜索路径和注意事项
当一个命名为spam的模块被导入时解释器首先会从内建模块中寻找该名字找不到则去sys.path中找该名字
sys.path从以下位置初始化1 执行文件所在的当前目录2 PTYHONPATH包含一系列目录名与shell变量PATH语法一样3 依赖安装时默认指定的
注意在支持软连接的文件系统中执行脚本所在的目录是在软连接之后被计算的换句话说包含软连接的目录不会被添加到模块的搜索路径中
在初始化后我们也可以在python程序中修改sys.path,执行文件所在的路径默认是sys.path的第一个目录在所有标准库路径的前面。这意味着当前目录是优先于标准库目录的需要强调的是我们自定义的模块名不要跟python标准库的模块名重复 4、添加到path环境变量
import sys
print(sys.path)
# 添加path环境变量
# 加到最后面
sys.path.append(rG:\data\PyCharm_Project\s19\day5\模块\模块的搜索路径\aaa)
# 加到最前面
sys.path.insert(0,rG:\data\PyCharm_Project\s19\day5\模块\模块的搜索路径\aaa)import spamfrom aaa import #模块的搜索路径 五模块的重载 考虑到性能的原因每个模块只被导入一次,放入字典sys.module中如果你改变了模块的内容你必须重启程序python不支持重新加载或卸载之前导入的模块 有的同学可能会想到直接从sys.module中删除一个模块不就可以卸载了吗注意了你删了sys.module中的模块对象仍然可能被其他程序的组件所引用因而不会被清楚。 特别的对于我们引用了这个模块中的一个类用这个类产生了很多对象因而这些对象都有关于这个模块的引用。 如果只是你想交互测试的一个模块使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename)这只能用于测试环境。
aa.py
1 def func1():
2 print(func1)
reload.py
1 import time,importlib
2 import aa
3
4 time.sleep(20)
5 # importlib.reload(aa)
6 aa.func1()
五、包 1、什么是包
##官网的解释
包是一种通过使用‘.模块名’来组织Python模块名称空间的方式
##详细解释
包就是一个含有__init__.py文件的文件夹所以我们创建包的目的就是为了用文件/模块组织起来。
1. 无论是import形式还是from...import形式凡是在导入语句中而不是在使用时遇到带点的都要第一时间提高警觉这是关于包才有的导入语法
2. 包是目录级的文件夹级文件夹是用来组成py文件包的本质就是一个包含__init__.py文件的目录
3. import导入文件时产生名称空间中的名字来源于文件import 包产生的名称空间的名字同样来源于文件即包下的__init__.py导入包本质就是在导入该文件
##强调1. 在python3中即使包下没有__init__.py文件import 包仍然不会报错而在python2中包下一定要有该文件否则import 包报错2. 创建包的目的不是为了运行而是被导入使用记住包只是模块的一种形式而已包即模块
包A和包B下有同名模块也不会冲突如A.a与B.a来自俩个命名空间 2、为何要使用包
随着功能越写越多我们无法将所有功能都放到一个文件中于是我们使用模块去组织功能而随着模块越来越多我们需要用文件夹将模块文件组织起来依次来提供程序的结构性和可维护性 3、注意事项
1.关于包相关的导入语句也分为import和from ... import ...两种但是无论哪种无论在什么位置在导入时都必须遵循一个原则凡是在导入时带点的点的左边都必须是一个包否则非法。可以带有一连串的点如item.subitem.subsubitem,但都必须遵循这个原则。
2.对于导入后在使用时就没有这种限制了点的左边可以是包,模块函数类(它们都可以用点的方式调用自己的属性)。
3.对比import item 和from item import name的应用场景
如果我们想直接使用name那必须使用后者。 4、实战
实验一准备执行文件为test.py内容#test.pyimport aaa同级目录下创建目录aaa,然后自建空__init__.py(或者干脆建包)需求验证导入包就是在导入包下的__init__.py解决先执行看结果再在__init__.py添加打印信息后重新执行2、实验二准备基于上面的结果需求aaa.xaaa.y解决在__init__.py中定义名字x和y3、实验三准备在aaa下建立m1.py和m2.py#m1.pydef f1():print(from 1)#m2.pydef f2():print(from 2)需求aaa.m1 #进而aaa.m1.func1()aaa.m2 #进而aaa.m2.func2()解决在__init__.py中定义名字m1和m2,先定义一个普通变量再引出如何导入模块名强调:环境变量是以执行文件为准4、实验四准备在aaa下新建包bbb需求aaa.bbb解决在aaa的__init__.py内导入名字bbb5、实验五准备在bbb下建立模块m3.py#m3.pydef f3():print(from 3)需求aaa.bbb.m3 #进而aaa.bbb.m3.f3()解决是bbb下的名字m3因而要在bbb的__init__.py文件中导入名字m3from aaa.bbb import m36、实验六准备基于上面的结果需求:aaa.m1()aaa.m2()aaa.m3()进而实现aaa.f1()aaa.f2()aaa.f3()先用绝对导入再用相对导入解决在aaa的__init__.py中拿到名字m1、m2、m3包内模块直接的相对导入强调包的本质包内的模块是用来被导入的而不是被执行的用户无法区分模块是文件还是一个包我们定义包是为了方便开发者维护7、实验七将包整理当做一个模块移动到别的目录下操作sys.path 二包的使用 1、测试文件执行文件与测试文件在同级目录下
包
├── aaa
│ ├── bbb
│ │ ├── __init__.py
│ │ ├── m3.py
│ │ └── __pycache__
│ ├── __init__.py
│ ├── m1.py
│ ├── m2.py
│ └── __pycache__
└── run.py文件内容
##文件内容#m1.py
def func1():print(f1)#m2.py
def func2():print(f2)#m3.py
def func3():print(f3) 2、包的使用之import 单独导入包名称时不会导入包中的所有包含的所有子模块
#在与aaa同级的run.py
import aaa
aaa.m1.func1()执行结果会出现如下错误
ModuleNotFoundError: No module named m1 解决方法
#与aaa底下的__init__.py
from .m1 import func1#导入模块执行aaa同级的run.py的结果
import aaaf1 需要注意的 from后import导入的模块必须是明确的一个不能带点否则会有语法错误如from a import b.c是错误语法 from aaa.bbb.m3 import func3 3、from aaa.bbb.m3 import * 从一个包中导入所有* 在 Windows 平台上工作的就不是非常好因为 Windows 是一个不区分大小写的系统。 想从包api中导入所有实际上该语句只会导入包api下__init__.py文件中定义的名字我们可以在这个文件中定义__all___:
#在__init__.py中定义
x10def func():print(from api.__init.py)__all__[x,func,policy] 4、绝对导入和相对导入 最顶级包是aaa是给用户使用的然后在aaa内部也会有彼此之间相互导入的需求这时就有绝对和相对导入两种方式。 绝对导入以aaa作为起始 相对导入用.或者..的方式最为起始只能在一个包中使用不能用于不同目录内 例想在aaa/bbb/func3.py中导入aaa/ccc/func4.py绝对导入在func3.py上写入下面的代码
from aaa.ccc.m4 import func4与run.py同级的__init__.pyd导入相应的模块
from aaa.bbb.m3 import func4在run.py上的写入下面的代码直接调用
aaa.func4()相对导入在func4.py上写入下面的代码
from ..ccc.m4 import func4与run.py同级的__init__.pyd导入相应的模块
from aaa.bbb.m3 import func4在run.py上的写入下面的代码直接调用
aaa.func4()5、包以及包所包含的模块都是用来被导入的而不是被直接执行的。而环境变量都是以执行文件为准的 添加环境变量
import sys
sys.path.append(rC:\Users\wz\PycharmProjects\python36\s19\day5\包\xxx\yyy)
import aaaaaa同级的__init__.py内容
1 from .m1 import func1
2 from .m2 import func2
3 from .bbb.m3 import func3
4 from .bbb.m3 import func4
m3.py文件内容
1 from ..ccc.m4 import func4
2 def func3():
3 print(f3)
4 func4()
运行run.py文件内容
1 import sys
2 sys.path.append(rC:\Users\wz\PycharmProjects\python36\s19\day5\包\xxx\yyy)
3 import aaa
4 aaa.func1()
5 aaa.func2()
6 aaa.func3() 运行文件使用import直接导入所需模块的功能使用了解目录结构 导入import aaa.ccc.m4 调用aaa.ccc.c4.func4() 6、包的分发了解 学习链接网址Packaging Python Projects - Python Packaging User Guide
六、软件开发规范 一软件目录规范如下 二常用模块的使用
常用模块的使用 1 #bin目录存放执行脚本2 #sos.path.dirname(os.path.dirname(os.path.abspath(__file__)))6 sys.path.append(BASE_DIR)7 8 from core import core9 from conf import my_log_settings10 11 if __name__ __main__:12 my_log_settings.load_my_logging_cfg()13 core.run()14 15 #conf目录存放配置文件16 #config.ini17 [DEFAULT]18 user_timeout 100019 20 [egon]21 password 12322 money 1000000023 24 [alex]25 password alex371426 money1000000000027 28 [yuanhao]29 password ysb12330 money1031 32 #settings.py33 import os34 config_pathr%s\%s %(os.path.dirname(os.path.abspath(__file__)),config.ini)35 user_timeout1036 user_db_pathr%s\%s %(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),\37 db)38 39 40 #my_log_settings.py41 42 logging配置43 44 45 import os46 import logging.config47 48 # 定义三种日志输出格式 开始49 50 standard_format [%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d] \51 [%(levelname)s][%(message)s] #其中name为getlogger指定的名字52 53 simple_format [%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s54 55 id_simple_format [%(levelname)s][%(asctime)s] %(message)s56 57 # 定义日志输出格式 结束58 59 logfile_dir r%s\log %os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # log文件的目录60 61 logfile_name all2.log # log文件名62 63 # 如果不存在定义的日志目录就创建一个64 if not os.path.isdir(logfile_dir):65 os.mkdir(logfile_dir)66 67 # log文件的全路径68 logfile_path os.path.join(logfile_dir, logfile_name)69 70 # log配置字典71 LOGGING_DIC {72 version: 1,73 disable_existing_loggers: False,74 formatters: {75 standard: {76 format: standard_format77 },78 simple: {79 format: simple_format80 },81 },82 filters: {},83 handlers: {84 #打印到终端的日志85 console: {86 level: DEBUG,87 class: logging.StreamHandler, # 打印到屏幕88 formatter: simple89 },90 #打印到文件的日志,收集info及以上的日志91 default: {92 level: DEBUG,93 class: logging.handlers.RotatingFileHandler, # 保存到文件94 formatter: standard,95 filename: logfile_path, # 日志文件96 maxBytes: 1024*1024*5, # 日志大小 5M97 backupCount: 5,98 encoding: utf-8, # 日志文件的编码再也不用担心中文log乱码了99 },
100 },
101 loggers: {
102 #logging.getLogger(__name__)拿到的logger配置
103 : {
104 handlers: [default, console], # 这里把上面定义的两个handler都加上即log数据既写入文件又打印到屏幕
105 level: DEBUG,
106 propagate: True, # 向上更高level的logger传递
107 },
108 },
109 }
110
111
112 def load_my_logging_cfg():
113 logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
114 logger logging.getLogger(__name__) # 生成一个log实例
115 logger.info(It works!) # 记录该文件的运行状态
116
117 if __name__ __main__:
118 load_my_logging_cfg()
119
120 #core目录存放核心逻辑
121 #core.py
122 import logging
123 import time
124 from conf import settings
125 from lib import read_ini
126
127 configread_ini.read(settings.config_path)
128 loggerlogging.getLogger(__name__)
129
130 current_user{user:None,login_time:None,timeout:int(settings.user_timeout)}
131 def auth(func):
132 def wrapper(*args,**kwargs):
133 if current_user[user]:
134 intervaltime.time()-current_user[login_time]
135 if interval current_user[timeout]:
136 return func(*args,**kwargs)
137 name input(name: )
138 password input(password: )
139 if config.has_section(name):
140 if password config.get(name,password):
141 logger.info(登录成功)
142 current_user[user]name
143 current_user[login_time]time.time()
144 return func(*args,**kwargs)
145 else:
146 logger.error(用户名不存在)
147
148 return wrapper
149
150 auth
151 def buy():
152 print(buy...)
153
154 auth
155 def run():
156
157 print(
158 购物
159 查看余额
160 转账
161 )
162 while True:
163 choice input(: ).strip()
164 if not choice:continue
165 if choice 1:
166 buy()
167
168
169
170 if __name__ __main__:
171 run()
172
173 #db目录存放数据库文件
174 #alex_json
175 #egon_json
176
177 #lib目录存放自定义的模块与包
178 #read_ini.py
179 import configparser
180 def read(config_file):
181 configconfigparser.ConfigParser()
182 config.read(config_file)
183 return config
184
185 #log目录存放日志
186 #all2.log
187 [2017-07-29 00:31:40,272][MainThread:11692][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
188 [2017-07-29 00:31:41,789][MainThread:11692][task_id:core.core][core.py:25][ERROR][用户名不存在]
189 [2017-07-29 00:31:46,394][MainThread:12348][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
190 [2017-07-29 00:31:47,629][MainThread:12348][task_id:core.core][core.py:25][ERROR][用户名不存在]
191 [2017-07-29 00:31:57,912][MainThread:10528][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
192 [2017-07-29 00:32:03,340][MainThread:12744][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
193 [2017-07-29 00:32:05,065][MainThread:12916][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
194 [2017-07-29 00:32:08,181][MainThread:12916][task_id:core.core][core.py:25][ERROR][用户名不存在]
195 [2017-07-29 00:32:13,638][MainThread:7220][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
196 [2017-07-29 00:32:23,005][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]
197 [2017-07-29 00:32:40,941][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]
198 [2017-07-29 00:32:47,222][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]
199 [2017-07-29 00:32:51,949][MainThread:7220][task_id:core.core][core.py:25][ERROR][用户名不存在]
200 [2017-07-29 00:33:00,213][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]
201 [2017-07-29 00:33:50,118][MainThread:8500][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
202 [2017-07-29 00:33:55,845][MainThread:8500][task_id:core.core][core.py:20][INFO][登录成功]
203 [2017-07-29 00:34:06,837][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]
204 [2017-07-29 00:34:09,405][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]
205 [2017-07-29 00:34:10,645][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在] 文章转载自: http://www.morning.pphbn.cn.gov.cn.pphbn.cn http://www.morning.wwgpy.cn.gov.cn.wwgpy.cn http://www.morning.rqnml.cn.gov.cn.rqnml.cn http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.hxhrg.cn.gov.cn.hxhrg.cn http://www.morning.pluimers.cn.gov.cn.pluimers.cn http://www.morning.wrtbx.cn.gov.cn.wrtbx.cn http://www.morning.hmgqy.cn.gov.cn.hmgqy.cn http://www.morning.fmjzl.cn.gov.cn.fmjzl.cn http://www.morning.cttgj.cn.gov.cn.cttgj.cn http://www.morning.qdcpn.cn.gov.cn.qdcpn.cn http://www.morning.lxthr.cn.gov.cn.lxthr.cn http://www.morning.yrngx.cn.gov.cn.yrngx.cn http://www.morning.dtnyl.cn.gov.cn.dtnyl.cn http://www.morning.rgqnt.cn.gov.cn.rgqnt.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.nmymn.cn.gov.cn.nmymn.cn http://www.morning.0small.cn.gov.cn.0small.cn http://www.morning.jcjgh.cn.gov.cn.jcjgh.cn http://www.morning.mzpd.cn.gov.cn.mzpd.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.xctdn.cn.gov.cn.xctdn.cn http://www.morning.lqqqh.cn.gov.cn.lqqqh.cn http://www.morning.qlck.cn.gov.cn.qlck.cn http://www.morning.xjqkh.cn.gov.cn.xjqkh.cn http://www.morning.rkrl.cn.gov.cn.rkrl.cn http://www.morning.cgstn.cn.gov.cn.cgstn.cn http://www.morning.plfrk.cn.gov.cn.plfrk.cn http://www.morning.bbyqz.cn.gov.cn.bbyqz.cn http://www.morning.mfbcs.cn.gov.cn.mfbcs.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.dfhkh.cn.gov.cn.dfhkh.cn http://www.morning.rxhsm.cn.gov.cn.rxhsm.cn http://www.morning.llxns.cn.gov.cn.llxns.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.btcgq.cn.gov.cn.btcgq.cn http://www.morning.ebpz.cn.gov.cn.ebpz.cn http://www.morning.chjnb.cn.gov.cn.chjnb.cn http://www.morning.pnmtk.cn.gov.cn.pnmtk.cn http://www.morning.niukaji.com.gov.cn.niukaji.com http://www.morning.nwgkk.cn.gov.cn.nwgkk.cn http://www.morning.nfsrs.cn.gov.cn.nfsrs.cn http://www.morning.mcjp.cn.gov.cn.mcjp.cn http://www.morning.brfxt.cn.gov.cn.brfxt.cn http://www.morning.xjqrn.cn.gov.cn.xjqrn.cn http://www.morning.bnrnb.cn.gov.cn.bnrnb.cn http://www.morning.stmkm.cn.gov.cn.stmkm.cn http://www.morning.qczpf.cn.gov.cn.qczpf.cn http://www.morning.ghxzd.cn.gov.cn.ghxzd.cn http://www.morning.pflry.cn.gov.cn.pflry.cn http://www.morning.lchtb.cn.gov.cn.lchtb.cn http://www.morning.bchgl.cn.gov.cn.bchgl.cn http://www.morning.qsy38.cn.gov.cn.qsy38.cn http://www.morning.yjqkk.cn.gov.cn.yjqkk.cn http://www.morning.qdsmile.cn.gov.cn.qdsmile.cn http://www.morning.jypsm.cn.gov.cn.jypsm.cn http://www.morning.qczjc.cn.gov.cn.qczjc.cn http://www.morning.nrcbx.cn.gov.cn.nrcbx.cn http://www.morning.yxkyl.cn.gov.cn.yxkyl.cn http://www.morning.qfmns.cn.gov.cn.qfmns.cn http://www.morning.lhwlp.cn.gov.cn.lhwlp.cn http://www.morning.rfmzc.cn.gov.cn.rfmzc.cn http://www.morning.iiunion.com.gov.cn.iiunion.com http://www.morning.mywnk.cn.gov.cn.mywnk.cn http://www.morning.dbsch.cn.gov.cn.dbsch.cn http://www.morning.sh-wj.com.cn.gov.cn.sh-wj.com.cn http://www.morning.rgwz.cn.gov.cn.rgwz.cn http://www.morning.hblkq.cn.gov.cn.hblkq.cn http://www.morning.qlhkx.cn.gov.cn.qlhkx.cn http://www.morning.cmrfl.cn.gov.cn.cmrfl.cn http://www.morning.rdmn.cn.gov.cn.rdmn.cn http://www.morning.xqjh.cn.gov.cn.xqjh.cn http://www.morning.ssrjt.cn.gov.cn.ssrjt.cn http://www.morning.symgk.cn.gov.cn.symgk.cn http://www.morning.rqqkc.cn.gov.cn.rqqkc.cn http://www.morning.mkccd.cn.gov.cn.mkccd.cn http://www.morning.gpsr.cn.gov.cn.gpsr.cn http://www.morning.gjmbk.cn.gov.cn.gjmbk.cn http://www.morning.zhiheliuxue.com.gov.cn.zhiheliuxue.com