day21_python

参考Eva_J的博客,原文连接:https://www.cnblogs.com/Eva-J/p/7277026.html

知识

'''
序列化模块
数据类型转换为字符串的过程就是序列化,方便存储和网络传输
json 、pickle、shelve
dumps 、dump 、loads、 load
pickle支持python所有的数据类型,文件是rb或者wb打开的
序列化和反序列化需要相同的环境
模块的导入
shelve提供一个open方法,获取一个文件句柄,操作和字典类似
'''

要导入的包或者模块

import os
import json
import sys

dumps使用

data = {'username': ['李华', '二愣子'], 'sex': 'male', 'age': 16}
json_dic2 = json.dumps(data, sort_keys=True, indent=2,
                       separators=(',', ':'), ensure_ascii=False)  # indent缩进的空格数, separators分隔符
print(json_dic2)

把解决一类问题的模块放在同一个文件夹中,python2.7包中有一个__init__.py

创建包的文件结构

os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
lis = []
lis.append(open('glance/__init__.py', 'w'))
lis.append(open('glance/api/__init__.py', 'w'))
lis.append(open('glance/api/policy.py', 'w'))
lis.append(open('glance/api/versions.py', 'w'))
lis.append(open('glance/cmd/__init__.py', 'w'))
lis.append(open('glance/cmd/manage.py', 'w'))
lis.append(open('glance/db/models.py', 'w'))
map(lambda f: f.close(), lis)  # 拿到文件句柄中的每一个,然后关闭文件句柄
# 凡是导入带点的,点的左边必须是一个包,insert()第一个参数是插入位置
# 导包时不执行py文件,python2.7只执行__init__.py
# 在编译报错时,从下往上找
# 绝对路径导入不能挪动,但是直观
# from .import 变量名
# 使用上面的相对路径找到包,可以随意移动包,只要能找到包的位置就可以使用模块,不能在包里使用.和..导入了,会报错,
# 包里的模块如果想使用其他模块的内容就只能使用相对路径,使用了相对路径就不能再包内直接执行了
# from .api import *和__all__

项目文件的命名结构

soft/bin、conf、core、db、lib、log的文件结构,非web
bin文件夹下有个start.py,程序的入口,如

# start.py
from conf import my_log_settings
from core import core
import sys
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)


if __name__ == '__main__':
    my_log_settings.load_my_logging_cfg()
    core.run()

core文件夹下是core.py, 写的所有的代码
conf文件夹,配置文件,有config.ini、my_log_setting.py、settings.py
db文件夹下放数据
lib文件夹下放完整功能的包或者模块,通用自定义模块
log文件夹下放日志

异常处理

逻辑错误、语法错误,程序一旦发生错误就从错误的位置停下来了,不再继续执行
基础的异常处理语句
使用try和except就可以处理异常
可以有多个except,单独的异常处理要写在万能异常的前面
try 里面的代码没有异常就会执行else:
举例子,短信、邮件发送的结构
finally:不管代码是否有误都执行,用于无法判断异常发生在什么地方时候要执行的操作,避免枚举法,和return相遇依然会执行,
先执行finall的内容,再接到返回值,一般在函数中做异常处理时使用,做一些收尾工作

基础的异常处理语句

try:  # 一定执行
    ret = int(input('number>>>'))
    print(ret*'*')
except ValueError:  # 遇到错误执行
    print('你输入的内容有误,请输入一个数字')
except IndexError:
    print('超出列表的最大长度了')
except Exception as error:  # 万能异常,加上参数可以提示错误是什么
    print('你错了', error)
else:
    print('TRUE')
finally:
    print('finally')

常用异常

'''
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,
基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
'''

更多异常

'''
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
'''

三级菜单练习

递归方式

menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}


def threeLM(dic):
    while 1:
        for k in dic:
            print(k)
        key = input('>>>').strip()
        if key == 'b' or key == 'q':
            return key
        elif key in dic.keys() and dic[key]:
            ret = threeLM(dic[key])
            if ret == 'q':
                return 'q'


threeLM(menu)

堆栈方式

menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}
lis = [menu]
while lis:
    for key in lis[-1]:
        print(key)
    k = input('>>>').strip()
    if k in lis[-1].keys() and lis[-1][k]:
        lis.append(lis[-1][k])
    elif k == 'b':
        lis.pop()
    elif k == 'q':
        break
posted @ 2021-08-18 14:45  二儿八月  阅读(28)  评论(0)    收藏  举报