Skip to content

Commit cdcfd5f

Browse files
committed
更新md
更新md
1 parent 4044729 commit cdcfd5f

File tree

5 files changed

+229
-0
lines changed

5 files changed

+229
-0
lines changed

python_advance/main.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
## Python进阶
22
1. [Python中的下划线](Python中的下划线.md)
3+
2. [可迭代对象、迭代器、生成器](可迭代对象迭代器生成器.md)
4+
3. [位置参数、默认参数、可变参数、关键字参数](位置参数默认参数可变参数关键字参数.md)
5+
4. [模块和包](模块和包.md)
6+
5. [通用日志模块](通用日志模块.md)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
## 位置参数、默认参数、可变参数、关键字参数
2+
#### 1.位置参数:传入的参数按照顺序依次赋值
3+
```python
4+
def power(x,n): # x,n是位置参数,传入的值按照位置依次赋值给x,n
5+
pass
6+
```
7+
#### 2.默认参数:参数有指定的默认值
8+
```python
9+
def power(x,n=2): # n是默认参数,默认值为2
10+
pass
11+
```
12+
#### 3.可变参数 *args:可变参数允许传入0或多个参数,这些参数在函数调用时自动组成一个tuple。
13+
```python
14+
def methoda(*numbers):
15+
print(numbers)
16+
# (1, 2, 3, 3)
17+
methoda(1,2,3,3)
18+
```
19+
20+
#### 4.关键字参数:关键字参数运行传入0或多个值,这些关键字参数在函数调用时自动组成一个dict。
21+
```python
22+
def methoda(**kwargs):
23+
print(kwargs)
24+
# {'a': 1, 'b': 2}
25+
methoda(a=1,b=2)
26+
```
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
## 可迭代对象、迭代器、生成器
2+
#### 1.可迭代对象-Iterable
3+
**可以直接作用于for循环的对象称为可迭代对象。**可迭代对象包含一个\_\_iter__方法,或者\_\_getitem__方法,其中\_\_iter__方法返回一个迭代器。可迭代对象一类是集合数据类型,如list, tuple, dict, set, str等;另一类是生成器generator。
4+
5+
#### 2.迭代器-Iterator
6+
**可以作用于next()方法的对象都是迭代器,迭代器对象必须实现\_\_next__()方法。**
7+
8+
#### 3.生成器-generator
9+
**生成器实现了\_\_iter__方法和\_\_next__()方法,既是可迭代对象也是迭代器。**
10+
11+
#### 4.生成器函数
12+
**在函数中如果出现yield关键字,那这个函数就是生成器函数,调用生成器函数,返回一个生成器。**
13+
14+
#### 5.原理与实现
15+
for循环的时候,如果循环的是Iterable可迭代对象,会调用可迭代对象的\_\_iter__(),返回一个迭代器,然后调用迭代器的\_\_next__()方法,直到遇到StopIteration异常跳出循环;如果循环的是一个迭代器,直接调用迭代器的\_\_next__()方法,直到遇到StopIteration异常跳出循环。
16+
17+
实现一个迭代器和可迭代对象:
18+
19+
```python
20+
21+
class AIterator():
22+
def __init__(self,s,e):
23+
self.current = s
24+
self.e = e
25+
def __next__(self):
26+
if self.current < self.e:
27+
self.index = self.current
28+
self.current += 1
29+
return self.index
30+
else:
31+
raise StopIteration
32+
33+
class AIterable():
34+
def __init__(self, s, e):
35+
self.s = s
36+
self.e = e
37+
def __iter__(self):
38+
return AIterator(self.s, self.e)
39+
a = AIterable(0,5)
40+
for i in a:
41+
print(i)
42+
```

python_advance/模块和包.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
## 模块和包
2+
* 模块:Python中每个有效的.py文件,就是一个python模块。
3+
* 包:每个包含__init__.py的文件夹,就是一个python包。
4+
5+
#### \_\_name__
6+
**每个有效的python文件都是一个模块,\_\_name__是标识模块名称的系统变量。**
7+
* 如果模块是被导入的,\_\_name__就是模块名,.py文件的文件名.
8+
* 如果模块是被直接执行的,\_\_name__就是’__main__
9+
10+
test1.py
11+
12+
```python
13+
def test():
14+
print('__name__ is : ', __name__) # __name__ is : __main__
15+
if __name__ == '__main__':
16+
test()
17+
```
18+
19+
test2.py
20+
21+
```python
22+
import test1
23+
def test():
24+
print('__name__ is: ', __name__) # __name__ is: __main__
25+
if __name__ == '__main__':
26+
test()
27+
print(test1.test()) # test1
28+
```
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
## 通用日志模块
2+
#### 按日期记录日志,只保留最近十五天的日志。
3+
4+
```python
5+
# -*- coding:utf-8 -*-
6+
7+
import os
8+
import re
9+
import sys
10+
import logging
11+
import logging.handlers
12+
13+
14+
class GraceLog:
15+
"""
16+
日志模块
17+
CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
18+
self.loggers = [logging.NOTSET,logging.DEBUG,logging.INFO,logging.WARNING,logging.ERROR,logging.CRITICAL]
19+
项目中可以所有模块共用一个log模块,也可以各个模块单独使用一个log模块
20+
"""
21+
22+
def __init__(self, log_dir, log_name, backup_day=14):
23+
"""
24+
:param log_dir: 存放log文件夹的路径,通常为项目根目录绝对路径,
25+
:param log_name: 日志文件夹名,通常为模块名,
26+
:param console_show: 是否在console上显示输出
27+
"""
28+
self.log_dir = os.path.abspath(os.path.join(log_dir, 'log'))
29+
self.log_name = log_name
30+
self.backup_day = backup_day
31+
32+
# console和log file都共用一个格式
33+
self.log_formatter = logging.Formatter('%(asctime)s * [{}] %(message)s'.format(self.log_name))
34+
35+
# 每个等级一个logger
36+
self.logger_debug = self.create_logger(logging.DEBUG)
37+
self.logger_info = self.create_logger(logging.INFO)
38+
self.logger_error = self.create_logger(logging.ERROR)
39+
40+
def create_logger(self, level):
41+
logger = logging.getLogger(self.log_name + str(level))
42+
logger.setLevel(level)
43+
if level == logging.INFO: # 通常只有info的logger需要添加,因为其他登录的logger都会执行一次info
44+
self.add_handler_stream(logger, level)
45+
self.add_handler_time_totate(logger)
46+
return logger
47+
48+
def add_handler_stream(self, logger, level):
49+
"""
50+
添加StreamHandler,让日志输出到console
51+
通常只有info的logger需要添加,因为其他登录的logger都会执行一次info
52+
:param logger:
53+
:param level:
54+
:return:
55+
"""
56+
stream_console = logging.StreamHandler(stream=sys.stdout)
57+
stream_console.setLevel(level)
58+
stream_console.setFormatter(self.log_formatter)
59+
60+
logger.addHandler(stream_console)
61+
62+
def add_handler_time_totate(self, logger):
63+
"""
64+
记录日志,并实现定期删除日志功能
65+
:param logger:
66+
:return:
67+
"""
68+
os.makedirs(os.path.join(self.log_dir, self.log_name), exist_ok=True)
69+
# E:\interface-server\dev2web\log\[baihonglte]\error
70+
log_file_path = os.path.join(self.log_dir, self.log_name, logging.getLevelName(logger.level).lower())
71+
handler = logging.handlers.TimedRotatingFileHandler(filename=log_file_path, encoding='utf-8', when='midnight',
72+
interval=1, backupCount=self.backup_day)
73+
handler.suffix = '%Y%m%d.log'
74+
handler.extMatch = re.compile(r'^\d{8}.log$') # 只有填写了此变量才能删除旧日志
75+
handler.setFormatter(self.log_formatter)
76+
logger.addHandler(handler)
77+
78+
def debug(self, message):
79+
level_name = logging.getLevelName(logging.DEBUG)
80+
self.info(message, level_name)
81+
self.logger_debug.debug('[{}] {}'.format(level_name, message))
82+
83+
def info(self, message, level_name=None):
84+
if not level_name:
85+
level_name = logging.getLevelName(logging.INFO)
86+
self.logger_info.info('[{}] {}'.format(level_name, message))
87+
88+
def error(self, message):
89+
level_name = logging.getLevelName(logging.ERROR)
90+
self.info(message, level_name)
91+
self.logger_error.error('[{}] {}'.format(level_name, message))
92+
93+
mylog = GraceLog(os.path.split(os.path.realpath(__file__))[0], "mylog")
94+
```
95+
96+
#### 函数形式
97+
```python
98+
def log_record(log_filename):
99+
"""
100+
日志模块配置
101+
CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
102+
"""
103+
dir_path = os.path.split(__file__)[0]
104+
logdir = os.path.join(dir_path, 'log')
105+
try:
106+
os.makedirs(logdir, exist_ok=True)
107+
except FileExistsError:
108+
pass
109+
110+
myapp = logging.getLogger(os.path.basename(log_filename))
111+
myapp.setLevel(logging.DEBUG)
112+
# 按照每天一个日志,保留最近14个
113+
filehandler = logging.handlers.TimedRotatingFileHandler(
114+
filename='%s/%s' % (logdir, os.path.basename(log_filename)),
115+
when='midnight', interval=1, backupCount=14)
116+
filehandler.suffix = '%Y%m%d.log'
117+
filehandler.extMatch = re.compile(r'^\d{8}.log$') # 只有填写了此变量才能删除旧日志
118+
filehandler.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
119+
myapp.addHandler(filehandler)
120+
# 让日志输出到console
121+
console = logging.StreamHandler()
122+
console.setLevel(logging.INFO)
123+
console.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
124+
myapp.addHandler(console)
125+
return myapp
126+
127+
128+
mylog = log_record('mylog')
129+
```

0 commit comments

Comments
 (0)