Python2

Python1-环境配置
Python2-基础认识
Python3-数据类型
Python4-面向对象
Python5-闭包和装饰器
Python6-IO模块
Python7-进程线程携程
Python8-网络编程
Python爬虫

集成环境IDE

PyCharm

python学习开发的好帮手

Visual Studion Code

用有自定义功能,装高手(为了装高手,后续的均以此为主)

想要用这个软件就要自己动手。

Jupyter Notebook

基于web编辑器,数据可视化,数据分析常用。

包管理

python自带pip命令进行包管理(并不太好用)

后期学习的话需要使用第三方包管理

pip 包管理器

使用pip命令对python开源包进行下载管理

更改镜像源

# 临时有效
pip3 install 模块名 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 永久有效
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
>>>Writing to C:\Users\HW\AppData\Roaming\pip\pip.ini # 会在此路径下生成pip.ini,
如果想改回原样,删除此文件即可

常用镜像源

http://pypi.douban.com/ # 豆瓣
http://pypi.hustunique.com/ # 华中理工大学
http://pypi.sdutlinux.org/ # 山东理工大学
http://pypi.mirrors.ustc.edu.cn/ # 中国科学技术大学
http://mirrors.aliyun.com/pypi/simple/ # 阿里云
https://pypi.tuna.tsinghua.edu.cn/simple/ # 清华大学

安装第三方模块

# pip3 install 模块名
pip3 install ujson
pip3 install ujson==5.4.0
'''
第三方模块的安装路径在Python安装目录下的:\lib\site-packages,此路径存在于sys.path里面,所
以安装完成之后直接导就可以了
'''

卸载模块

pip3 uninstall 模块名
# 重新安装的话不需要卸载,新安装的会覆盖掉原来的

其他命令

pip3 list # 查看已安装的第三方模块
pip3 show 模块名 # 查看已安装模块的详细信息

虚拟环境

virtualenv虚拟环境

virtualenv更像是一个包管理器,将不同的包隔离管理,不能管理python的版本

需要先安装好python再使用

conda虚拟环境

conda则更全面可以管理python版本,内置有conda的包管理器,也可使用pip

但是有一定的上手难度,管理的对新用户来说较为混乱

需要安装anaconda/miniconda

anaconda有图形化界面,对新手更为友好

miniconda更轻便,自定义程度更高,需要一定的基础

conda --version 查看版本信息

conda config --show 查看环境配置

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 设置镜像源

conda config --set show_channel_urls yes 搜索显示通道地址

conda update conda 更新conda

conda create -n env_name python==3.8 创建环境

conda info -e 查看创建了那些环境

conda activate env_name 激活虚拟环境

conda remove --name env_name --all 删除虚拟环境

conda remove --name env_name package_name 删除虚拟环境当中的包

conda env export --name env_name > env_name.yml 导出虚拟环境

conda env create -f env_name.yml 导入虚拟环境

conda clear -pt 清空包管理

Python内置函数

abs()           # 绝对值 abs(-2) >> 2
all()           # 判断是否全部为真 all([1,2,3]) >> True
any()           # 判断是否有一个为真 any([0,0,0]) >> False
ascii()         # 字符串转ascii  ascii('a') >> 'a'
bin()           # 转二进制 bin(10) >> '0b1010'
bool()          # 转布尔值 bool(0) >> False
bytearray()     # 字符串转字节 bytearray('a') >> bytearray(b'a')
bytes()         # 字符串转字节 bytes('a') >> b'a'
callable()      # 判断是否可调用 callable(print) >> True
chr()           # 字符转ascii chr(97) >> 'a'
classmethod()   # 类方法 
compile()       # 编译 compile('print("hello")')
complex()       # 复数 complex(1,2) >> (1+2j)
delattr()       # 删除属性 delattr(obj,'attr')
dict()          # 字典 dict() >> {}
dir()           # 查看属性 dir(obj)
divmod()        # 取余 divmod(10,3) >> (3,1)
enumerate()     # 枚举 enumerate([1,2,3]) >> <enumerate object at 0x000001F7B7D4D830>
eval()          # 执行字符串 eval('print("hello")')
exec()          # 执行字符串 exec('print("hello")')
filter()        # 过滤 filter(lambda x:x>0,[1,2,3]) >> <filter object at 0x000001F7B7D4D830>
float()         # 转浮点数 float('1.1') >> 1.1
format()        # 格式化 format(1.1,'.2f') >> '1.10'
frozenset()     # 冻结集合 frozenset([1,2,3]) >> frozenset({1, 2, 3})
getattr()       # 获取属性 getattr(obj,'attr')
globals()       # 全局变量 globals() >> {...}
hasattr()       # 判断是否有属性 hasattr(obj,'attr') >> True
hash()          # 哈希 hash('a') >> 97
help()          # 帮助 help(print)
hex()           # 十六进制 hex(10) >> '0xa'
id()            # 内存地址 id(obj) >> 123456789
input()         # 输入 input('请输入:') >> 'a'
int()           # 转整数 int('1') >> 1
isinstance()    # 判断类型 isinstance(obj,str) >> True
issubclass()    # 判断子类 issubclass(str,object) >> True
iter()          # 迭代器 iter([1,2,3]) >> <list_iterator object at 0x000001F7B7D4D830>
len()           # 长度 len([1,2,3]) >> 3
list()          # 列表 list([1,2,3]) >> [1, 2, 3]
locals()        # 局部变量 locals() >> {...}
map()           # 映射 map(lambda x:x+1,[1,2,3]) >> <map object at 0x000001F7B7D4D830>
max()           # 最大值 max([1,2,3]) >> 3
memoryview()    # 内存视图 memoryview(obj)
min()           # 最小值 min([1,2,3]) >> 1
next()          # 下一个 next(iter([1,2,3])) >> 1
object()        # 对象 object()
oct()           # 八进制 oct(10) >> '0o12'
open()          # 打开文件 open('file.txt','r')
ord()           # ascii转字符 ord('a') >> 97
pow()           # 幂 pow(2,3) >> 8
print()         # 打印 print('hello')
property()      # 属性 property()
range()         # 范围 range(1,10) >> range(1, 10)
repr()          # 字符串 repr('hello') >> 'hello'
reversed()      # 反转 reversed([1,2,3]) >> <list_reverseiterator object at 0x000001F7B7D4D830>
round()         # 四舍五入 round(1.234,2) >> 1.23
set()           # 集合 set([1,2,3]) >> {1, 2, 3}
setattr()       # 设置属性 setattr(obj,'attr',value)
sum()           # 求和 sum([1,2,3]) >> 6
slice()         # 切片 slice(1,3) >> slice(1, 3, None)
sorted()        # 排序 sorted([1,2,3]) >> [1, 2, 3]
staticmethod()  # 静态方法 staticmethod()
str()           # 字符串 str(1) >> '1'
sum()           # 求和 sum([1,2,3]) >> 6
super()         # 父类 super()
tuple()         # 元组 tuple([1,2,3]) >> (1, 2, 3)
type()          # 类型 type(obj) >> <class 'int'>
vars()          # 属性 vars(obj) >> {...}
zip()           # 压缩 zip([1,2,3],[4,5,6]) >> <zip object at 0x000001F7B7D4D830>
__import__()    # 导入模块 __import__('os')

logging的使用

import logging
logging.basicConfig(level=logging.DEBUG,filename='error.log',filemode='a',
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
                    encoding='utf-8')
logging.debug('asd')
logging.info('qwe')
logging.warning('zxc')
logging.error('poi')
logging.critical('mnb')

日志级别

logging.debug('调试日志')

logging.info('消息日志')

logging.warning('警告日志')

logging.error('错误日志')

logging.critical(‘严重错误日志’)

字典形式配置日志

import logging
# 日志基本配置
logging.basicConfig(
# 1、日志级别
level=30,
# DEBUG:10
# INFO:20
# WARNING:30
# ERROR:40
# CRITICAL:50
# 2、日志输出格式
# format='%(asctime)s %(name)s [%(pathname)s line:%(lineno)d] %(levelname)s %(message)s',
# 3、asctime的时间格式
# datefmt='%Y-%m-%d %H:%M:%S',
# 4、日志输出位置:终端/文件
# filename='user.log', # 不指定此配置,默认打印到终端
)
'''
%(name)s Logger的名字(getlogger时指定的名字)
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出日志的完整路径名
%(filename)s 调用日志输出日志的文件名
%(module)s 调用日志输出日志的模块名
%(funcName)s 调用日志输出日志的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间,默认格式是 “2022-07-30 22:15:53,394”
%(thread)d 线程ID,可能没有
%(threadName)s 线程名,可能没有
%(process)d 进程ID,可能没有
%(message)s 用户输出的消息
'''
'''
logging模块有三个比较重要的功能组件:
1、loggers 配置文件可定义一些输出日志的appname
2、handler 配置日志的分隔大小,输出位置,日志文件创建等
3、formatters 配置日志输出的格式
'''
# 日志配置字典
LOGGING_DIC = {
    'version': 1.0,
    'disable_existing_loggers': False,
    # 日志格式
    'formatters': {
        'standard': {
            'format': '%(asctime)s %(threadName)s:%(thread)d [%(name)s] %(levelname)s [%(pathname)s:%(lineno)d] %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
        'simple': {
            'format': '%(asctime)s [%(name)s] %(levelname)s %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
        'test': {
            'format': '%(asctime)s %(message)s',
        },
    },
    'filters': {},
    # 日志处理器
    'handlers': {
        'console_debug_handler': {
            'level': 'DEBUG', # 日志处理的级别限制
            'class': 'logging.StreamHandler', # 输出到终端
            'formatter': 'simple' # 日志格式
        },
        'file_info_handler': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,日志轮转
            'filename': 'user.log',
            'maxBytes': 1024*1024*10, # 日志大小 10M
            'backupCount': 10, # 日志文件保存数量限制
            'encoding': 'utf-8',
            'formatter': 'standard',
        },
        'file_debug_handler': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler', # 保存到文件
            'filename': 'test.log', # 日志存放的路径
            'encoding': 'utf-8', # 日志文件的编码
            'formatter': 'test',
        },
    },
    # 日志记录器
    'loggers': {
        'logger1': { # 导入时logging.getLogger时使用的app_name
            'handlers': ['console_debug_handler'], # 日志分配到哪个handlers中
            'level': 'DEBUG', # 日志记录的级别限制
            'propagate': False, # 默认为True,向上(更高级别的logger)传递,设置为False即可,否则会一份日志向上层层传递
        },
        'logger2': {
            'handlers': ['console_debug_handler', 'file_debug_handler'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}
# 注:进行日志轮转的日志文件,不能和其他handler共用,不然会导致文件被占用无法更名而报错!

使用

import logging.config
import settings
logging.config.dictConfig(settings.LOGGING_DIC)
logger1 = logging.getLogger('logger1')
logger1.info('xxx登录了')
logger2 = logging.getLogger('logger2')
logger2.info('xxx充值了5毛钱')

文件形式配置日志

创建一个以.cfg结尾或者.ini结尾的配置文件

# 定义logger
[loggers]
keys=root,error,info #创建三个app名,root是父类,必需存在的(和配置字典里面的空名字logger一样,在getLogger的时候,找不到对应的logger名字的,则使用root这个logger)
[logger_root] #创建完的app名我们要定义一些规则,严格要求格式为"logger_appname"
level=DEBUG #设置日志级别
qualname=root #在"root"下的appname可填可不填
handlers=console,file #设置指定过滤器,多个以逗号分隔
[logger_error]
level=ERROR
qualname=error #除了root下的appname以外,所有的app必须要设置这个属性,用于定义打印输出时候的app名
handlers=console
propagate=0 # 禁止日志向父类传递
[logger_info]
level=INFO
qualname=info
handlers=file,rotating_file
propagate=0
# 定义handler
[handlers]
keys=console,file,rotating_file #定义过滤器名称(keysname),下面定义以handler_keysname格式定义,引用的时候用keysname
[handler_console]
class=StreamHandler
level=DEBUG
formatter=simple
[handler_file]
class=FileHandler
level=DEBUG
formatter=standard
args=('info.log','a', 'utf-8') #创建文件名字,以什么方式打开,并指定编码方式
[handler_rotating_file]
class=handlers.RotatingFileHandler # 日志轮转
level=DEBUG
formatter=standard
args=('user.log','a')
kwargs={'maxBytes':1024*1024*10,'backupCount':2,'encoding':'utf-8'} #日志大小10M,文件保存数量2,编码方式utf-8
# 定义formatter
[formatters]
keys=standard,simple #定义格式名称(keysname),下面定义以formatter_keysname格式定义,引用的时候用keysname
[formatter_standard]
format=%(asctime)s %(threadName)s:%(thread)d [%(name)s] %(levelname)s [%(pathname)s:%(lineno)d] %(message)s
datefmt=%Y-%m-%d %H:%M:%S
[formatter_simple]
format=%(asctime)s [%(name)s] %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
# 注:注释必须单独写在一行,不能跟在配置项后面,我这里只是为了方便注释说明,你用的时候需要把注释去掉,或者改到单独一行去。

使用

import logging.config
logging.config.fileConfig('log.conf') # 和日志配置字典用法一样,只是这一步使用
fileConfig来加载篇日志文件就好了
logger = logging.getLogger('info')
logger.info('xxx充值了5毛钱')

注:使用fileConfig读取log.conf时,无法设置字符编码,如果你的文件是utf-8编码,且在windows系

统中运行,就报如下错误:

Python使用log日志报错

解决方法:
需要改源码(把read函数的encoding参数默认的None,改成utf-8):
fileConfig() -> cp.read(fname) -> def read(self, filenames, encoding='utf-8'):
只有windows系统需要改此源码,其他系统不用改,或者你的配置文件本身就是gbk编码的,也不用改此选项
总之改源码不太好,所以我们一般用配置字典,比较少用配置文件

常见的异常类型

ZeroDivisionError   除零  
IndexError          序列中没有此索引  
KeyError            映射中没有这个键  
NameError           未声明/初始化对象  
SyntaxError         Python语法错误  
ValueError          传入无效参数  

异常处理机制

try:
    子代码块1
    子代码块2
    子代码块3
except 异常类型1 as e:
    子代码块
except 异常类型2 as e:
    子代码块
except 异常类型3 as e:
    子代码块
except Exception as e:
    子代码块
else:
    子代码块:会在被检测代码(try 下面的子代码块)没有异常的时候执行
finally:
    子代码块(不管前面是否发生异常都要执行)
xxx
xxx
posted @ 2025-03-24 18:29  *--_-  阅读(22)  评论(0)    收藏  举报