module模块和包的介绍# 模块的介绍# python给我们提供了十分简单的方法去创建一个模块,我们只需要写一个python文件即可,也就是说写一个.py为后缀的文件。包的介绍# 简单来说,包就是多个模块的集合。当项目较大,模块较多时,我们就可以把模块放在包中,便于管理。 我们在包中一般带有__init__.py文件,随你建包的时候就默认生成。 迭代器和生成器# 迭代器# 迭代器只不过是一个实现迭代器协议的容器对象。它基于两个方法:next :返回容器的下一个项目在3.x的版本中为__next__或者next(可迭代对象) __iter__ : 返回迭代器本身 迭代器可以通过使用一个iter内建函数和一个序列来创建,示例如下。 1
2
3
4
5
6
7
8
In [21 ]: a = ['a' ,'b' , 'c' ]
In [22 ]: a = iter(a)
In [23 ]: next(a)
Out[23 ]: 'a'
In [24 ]: a. __next__()
Out[24 ]: 'b'
生成器# 生成器 从Python2.2起,生成器提供了一种出色的方法,使得需要返回一系列元素的函数所需的代码更加简单、高效。基于yield指令,可以暂停一个函数并返回中间结果。该函数将保存执行环境并且可以在必要时恢复。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [25 ]: def fibonanci ():
... : a, b = 0 , 1
... : while True :
... : yield b
... : a, b = b, a + b
... :
In [26 ]: fib = fibonanci()
In [28 ]: fib. __next__()
Out[28 ]: 1
In [29 ]: fib. __next__()
Out[29 ]: 1
In [30 ]: fib. __next__()
Out[30 ]: 2
In [31 ]: fib. __next__()
yield可以理解为return,每次调用next()就yield值,下次next()从上次的yield处开始运行该函数将返回一个特殊的迭代器,也就是generator对象,它知道如何保存执行环境。对它的调用是不确定的,每次都将产生序列中的下一个元素。这种语法很简洁,算法的不确定特性并没有影响代码的可读性。不必提供使函数可停止的方法。实际上,这看上去像是用伪代码设计的序列一样。 高阶函数的定义# 函数的接收参数是一个函数名 函数的返回值是一个函数名 1
2
3
4
5
6
7
8
9
10
11
12
13
14
def father (name):
print("I am father %s " % name)
def son ():
print("i am son" )
# print(locals())
return son
father("luenci" )
father("luenci" )()
out:
I am father luenci
I am father luenci
i am son
简单的装饰器# @语法糖:相当于执行下面timmer(test)()i d @ # d t # m e t e e p f i t f s t o m i t i r t d r m m t t p ( m t i e e e m e i r ) m m f t r e s m i e t m u r t e n r i e w s f s p r ( ( . t ( m r r t u w r n t ) s ( t e ( a a n e i e : l " e f p r c i n w s e t s u p t ( g t r t e e t n e _ ) h ( a ) p s ) c r t t " p ( ( t ( ) ( i _ 函 p ) 3 函 ) : ) m t 数 e ) 数 : e i 运 r @ 运 m 行 行 = e 时 语 完 间 法 毕 t = 为 糖 " i : ) m t e i % . m s t e " i . % m t ( e i s ( m w ) e e ( i ) g h t _ t i m e - s t a r t _ t i m e ) )
带参数的装饰器# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import time
def timmer (func):
def wrapper (* args, ** kwargs):
print(* args)
# print(**kwargs)
start_time = time. time()
res = func(* args, ** kwargs)
sweight_time = time. time()
print("程序运行时间为: %s " % (sweight_time - start_time))
return res
return wrapper
@timmer
def test (name, age, gender):
time. sleep(2 )
print("我是 %s ,今年 %s ,性别 %s " % (name, age, gender))
return "sucess"
res = test("lusheng" , 18 , gender= "男" )
# print(res)
装饰器应用案例# 登录验证# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
user_list = [
{"username" : "luenci" , "pswd" : "123" },
{"username" : "lynn" , "pswd" : "456" },
{"username" : "lu" , "pswd" : "789" },
]
current_dic = {"username" : None , "login" : False }
def verify (func):
def wrapper (* args, ** kwargs):
if current_dic['username' ] and current_dic['login' ]:
res = func(* args, ** kwargs)
return res
username = input("请输入用户名:" ). strip()
pswd = input("请输入密码:" ). strip()
for user in user_list:
if user['username' ] == username and user['pswd' ] == pswd:
current_dic['username' ] = username
current_dic['login' ] = True
res = func(* args, ** kwargs)
return res
else :
print('用户名或密码错误' )
return wrapper
@verify
def shop ():
print('我的购物车' )
@verify
def user ():
print('我的信息' )
@verify
def things ():
print('我的商品' )
print('登录前的状态: %s ' % (current_dic))
user()
print('登录后的状态: %s ' % (current_dic))
shop()
things()
日志记录# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import logging
import traceback
def get_logger ():
logger = logging. getLogger("Test" )
# 设定日志级别,只有大于或等于这个级别才输出
logger. setLevel(level= logging. DEBUG)
# 当前路径下创建test_log文件记录错误日志
fh = logging. FileHandler("test_log" , encoding= 'utf-8' )
ch = logging. StreamHandler()
fm = logging. Formatter(fmt= ' %(asctime)s %(name)s %(pathname)s [ %(lineno)d ] %(message)s ' , datefmt= '%Y/%m/ %d %H:%M:%S' )
fh. setFormatter(fm)
ch. setFormatter(fm)
logger. addHandler(fh)
logger. addHandler(ch)
return logger
def decoratore (func):
def log (* args,** kwargs):
try :
print("当前运行方法" , func. __name__)
return func(* args,** kwargs)
except Exception as e:
get_logger(). error(f " { func. __name__} is error,here are details: { traceback. format_exc()} " )
return log
@decoratore
def test ():
print(1 / 0 )
test()