第二十一天包和异常处理

1.json的格式化功能:

import json
data={'username':['梨花','二愣子'],'sex':'male','age':15}
json_dic2=json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)
print(json_dic2)
结果为
{
  "age":15,
  "sex":"male",
  "username":[
    "梨花",
    "二愣子"
  ]
}
View Code

  注;ensure_ascii 当它为True 的时候,所有的非ascii码显示为uxxxx序列,只需要在调用dump时将ensure_ascii设置成为False既可以显示正常的中文文字

  separators 分隔符,实际上是(item_separator,dic_separator)的一个元组,默认就是(',',':'),这表示dictionary内keys之间用逗号隔开,而keys和values之间用冒号隔开。

  sor_keys:将数据根据keys的值进行排序

2.包的讲解:

  2.1创建多个文件(包就是文件里含有__init__.py文件就是)(把解决同一类问题的模块放在同一个文件夹中成为包)(如果创建的文件已经存在,在进行编译会报错)

import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l=[]
l.append(open('glance/__init__.py','w'))
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)
View Code

结果为

3.在python中创建包的过程: 

 4.关于包相关的调用可以使用import   和from ...import 两种,但是无论使用哪一种,无论在什么位置,再导入时必须遵循凡是导入时带点的,点的左边必须是一个包。

import glance.api.policy as t
t.get()
结果为
from policy.py
View Code
from  glance.api import policy
policy.get()
结果为
from policy.py
View Code

 5. 如果要是把glance文件移动到一个新的文件下这些操作执行的方法为:

from  glance.api import policy
policy.get()
结果为
from  glance.api import policy
policy.get()
View Code

解决方法1.是是把文件路径加进去

import os
import sys
ret=os.getcwd()
ret1=os.path.join(ret,'dir') #把dir的文件路径加进去
sys.path.append(ret1)
from  glance.api import policy
policy.get()
结果为
from policy.py
View Code

6.怎么通过调用fromglance来进行调用模块:

import glance #执行此语句会执行glance里的init文件里的命令
结果为
输出_init+方法:
View Code

  6.1通过上述我们可以把所调用的写在每一个init文件中:

import glance #执行此语句会执行glance里的init文件里的命令
glance.cmd.manage.main()
结果为
fjdkjfdkjf
View Code

 

 7.如果glance移动了,6的方法就没有办法继续使用:需要在每一个init里添加dir目录:或者在sys.path里吧这个文件路境添加进去

import glance
glance.api
结果为
    import glance
ModuleNotFoundError: No module named 'glance
View Code

8.使用绝对路径可以改变文件移动的问题:

9.总结:使用绝对路径,不管在包内还是外部导入就能使用,但是文件不能挪动,很直观。

    使用相对路径:可以随意挪动包,只要能找到包的位置,就可以使用包里的模块,包里的模块如果想其他的内容只能使用相对路径,使用了相对路径不能在包内直接执行。

from dir import glance
glance.db.models.modle()
结果为
fjdkjfkjd
View Code

9.使用__all__来控制from...import *

10异常错误有两种:语法错误(这种错误过不了python解释器)逻辑错误(会在程序执行的过程中报错)

11.程序一旦发生错误,就从错误位置停下来,不在执行后面的内容:

12.第一种排除异常错误继续执行下面程序的方法:try.....except

try:
    ret=int(input('number...'))
    print(ret*'*')
except ValueError:  #如果try里面的内容有错误就会执行此语句反之不执行
    print('你输入的内容有误,请输入一个数字:')
结果为
number...1
*



number...a
你输入的内容有误,请输入一个数字:
View Code

 13.可以写一个try多个except

try:  #符合哪个条件执行哪一个
    list1=[1,3]
    list1[4]
except ValueError:  #如果try里面的内容有错误就会执行此语句反之不执行
    print('你输入的内容有误,请输入一个数字:')
except IndentationError:
    print('超出范围')
超出范围
View Code

14Exception 可以处理任何的错误:

try:  #符合哪个条件执行哪一个
    list1=[1,3]
    list1[4]
except Exception as error:  #如果try里面的内容有错误就会执行此语句反之不执行
    print('你输入的内容有误,请输入一个数字:',error)

你输入的内容有误,请输入一个数字: list index out of rangetry:  #符合哪个条件执行哪一个
    int('a')
except Exception as error:  #如果try里面的内容有错误就会执行此语句反之不执行
    print('你输入的内容有误,请输入一个数字:',error)

你输入的内容有误,请输入一个数字: invalid literal for int() with base 10: 'a'
View Code

15.else的用法;只有·程序正确的时候才会执行

try:
    ret=int(input('请输入一个数'))
    print(ret*'*')
except ValueError:  #把所能发现的错误类型都写下来
    print('输入的数据类型有误:')
except IndexError:
    print('超出文件的范围')
except Exception as error: #最后一个写万能错误类型
    print(error)
else:   #当程序对的时候执行此语句
    print('可以执行else语句')
View Code

16.finally无论程序的正确与错误都会执行此动作:(主要用于文件的操作和数据库操作)

try:
    ret=int(input('请输入一个数'))
    print(ret*'*')
except ValueError:  #把所能发现的错误类型都写下来
    print('输入的数据类型有误:')
except IndexError:
    print('超出文件的范围')
except Exception as error: #最后一个写万能错误类型
    print(error)
else:   #当程序对的时候执行此语句
    print('可以执行else语句')
finally:
    print('可以执行finally此语句')
结果为
请输入一个数1
*
可以执行else语句
可以执行finally此语句

请输入一个数a
输入的数据类型有误:
可以执行finally此语句
View Code

17finally’和return相遇时会执行完finally之后在执行return语句

18.常遇到的错误类型:

 19.三级菜单问题:

menu = {
    '北京':{
        '朝阳':{
            '国贸':{},
                'CICC':{},
                'HP':{},
                '渣打银行':{},
                'CCTV':{},
            },
            '望京':{
                '陌陌':{},
                '奔驰':{},
                '360':{},
            },
            '三里屯':{
                '优衣库':{},
                'apple':{},
        },
        '昌平':{
            '沙河':{
                '老男孩':{},
                '阿泰包子':{},
            },
            '天通苑':{
                '链家':{},
                '我爱我家':{},
            },
            '回龙观':{},
        },
        '海淀':{
            '五道口':{
                '谷歌':{},
                '网易':{},
                'sohu':{},
                '快手':{},
            },
            '中关村':{
                'youku':{},
                'Iqiyi':{},
                '汽车之家':{},
                '新东方':{},
                'QQ':{},
            },

        },
    },
    '上海':{
        '浦东':{
            '陆家嘴':{
                'CICC':{},
                '高盛':{},
                '摩根':{},
            },
        },
        '闵行':{},
        '静安':{},
    },
    '山东':{
        '济南':{},
        '德州':{
            '乐陵':{
                '丁务镇':{},
                '城区':{},
            },
            '平原':{},
        },
        '青岛':{},
    },
}

def threeLM(dic):
    while True:
        for k in dic:print(k)
        key=input('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'
        elif (not dic.get(key))or (not dic[key]):
            continue
threeLM(menu)
View Code
原文地址:https://www.cnblogs.com/ab461087603/p/12347141.html