10.23

本周总结

1.异常处理

2.生成器

3.索引取值与迭代取值的差异

4.模块简介

5.导入模块

6.判断文件类型

7.包的使用

8.软件开发目录规范

9.常用内置模块

1.异常处理

1.基本语法结构
  try:
     待监测的代码(可能会出现错误的代码)
  except 错误类型:
    针对上述错误类型制定的方
2.查看错误的信息
  try:
     待监测的代码(可能会出错的代码)
  except 错误类型 as e:    e就是系统提示的错误信息
     针对上述错误类型制定的方案
3.万能异常   Exception/BaseException
   try:
       待监测的代码(可能会出错的代码)
   except Exception as e:    e就是系统提示的错误信息
       针对各种常见的错误类型全部统一处理
注意:
1.异常处理能尽量少用就少用
2.被try监测的代码能尽量少就尽量少
3.当代码中可能出现一些无法控制的情况报错才应该考虑使用
  eg:使用手机访问网络软件,断网
    编写网络爬虫程序请求数据,断网
使用while循环+异常处理+迭代器对象 完成for循环迭代取值的功能
 	 l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
    iter_l1 = l1.__iter__()
    while True:
        try:
            print(iter_l1.__next__())
        except StopIteration as e:
            break

2.生成器

1.本质还是内置有__iter__和__next__的迭代器对象
2.区别:迭代器对象是解释器自动提供的
       数据类型\文件对象>>>:迭代器对象
      生成器对象是程序员编写出来的
	    代码、关键字>>>:迭代器对象(生成器)
3.创建生成器的基本语法
  函数体代码中填写yield
      def my_iter():
         print('哈哈哈 椰子汁很好喝')
         yield
    1.函数体代码中如果有yield关键字 
     那么函数名加括号并不会执行函数体代码
     会生成一个生成器对象(迭代器对象)
    
     res = my_iter()
    2.使用加括号之后的结果调用__next__才会执行函数体代码
     res.__next__()
    3.每次执行完__next__代码都会停在yield位置 下次基于该位置继续往下找第二个yield
    4.yield还有点类似于return 可以返回返回值
4.生成器表达式本质上就是生成器的简化写法
l1 = (i ** 2 for i in range(100))   
print(l1)  
for i in l1:
    print(i)

3.索引取值与迭代取值的差异

1.索引取值  可以任意位置任意次数取值,不支持无序类型的数据取值
2.迭代取值  只能从前往后依次取值无法后退,支持所有类型的数据取值(无序有序)
ps:两者的使用需要结合实际应用场景

4.模块简介

1.模块的本质是内部具有一定功能(代码)的py文件
2.python模块的历史
   python刚开始的时候所有搞其他编程语言的程序员都看不起 甚至给python起了个外号>>>:调包侠(贬义词)
 	随着时间的发展项目的复杂度越来越高 上面那帮人也不得不用一下python 然后发现真香定律>>>:调包侠(褒义词)
3.python模块的表现形式
  1.py文件(py文件也可以称之为是模块文件)
  2.含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
  3.已被编译为共享库或DLL的C或C++扩展(了解)
  4.使用C编写并链接到python解释器的内置模块(了解)
模块类型:
    自定义模块  我们自己写的模块文件
    内置模块  python解释器提供的模块
    第三方模块  别人写的模块(python背后的真正大佬)

5.导入模块

1.一定要搞清楚谁是执行文件,谁是被导入文件
2.以后开发项目的时候py文件的名称一般是纯英文,不会含有中文甚至空格
3.导入模块文件不需要填写后缀名
4.import与from...import...两者的优缺点
  import句式:由于使用模块名称空间中的名字都需要模块名点的方式才可以用
  所以不会轻易的被执行文件中的名字替换掉,但是每次使用模块名称空间中的名字
  都必须使用模块名点才可以
  from...import...句式:指名道姓的导入模块名称空间中需要使用的名字,不需要模块名点
  但是容易跟执行文件中名字冲突
5.重复导入模块
  解释器只会导入一次,后续重复的导入语句并不会执行
6.起别名
  import  wuyongerciyuan as wy
  from wuyongerciyuan import zhangzehonglovezhanghong as zz
  from a import name as n,func1 as f1
7.涉及到多个模块导入
  import a
  import wuyongerciyuan
  如果模块功能相似度不高,推荐使用第一种,相似度高可以使用第二种
  import a, wuyngerciyuan
8.循环导入  两个文件之间彼此导入彼此并且相互使用各自名称空间中的名字,极容易报错
9.如何解决循环导入问题
	1.确保名字在使用之前就已经准备完毕
 	2.我们以后在编写代码的过程中应该尽可能避免出现循环导入
模块查找顺序:1.内存 2.内置 3.执行文件所在的sys.path(系统内部环境)
绝对导入:from mymd.aaa.bbb.ccc import name   可以精确到变量名
       from mymd.aaa.bbb.ccc import ddd   可以精确到模块名
    ps:套路就是按照项目根目录一层层往下查找
相对导入: .在路径中表示当前目录
       ..在路径中表示上一层目录
       ..\..在路径中表示上上一层目录
       不在依据执行文件所在的sys.path,而是以模块自身6路径为准
         from . import b
       相对导入只能用于模块文件中,不能在执行文件中使用
 相对导入使用频率较低,一般用绝对导入即可,结构更加清晰

6.判断文件类型

所有的py文件都可以直接打印__name__对应的值
当py文件是执行文件的时候__name__对应的值是__main__
当py文件是被导入文件的时候__name__对应的值是模块名
if__name__=='__main__':
    print('哈哈哈 我是执行文件 我可以运行这里的子代码')
上述脚本可以用来区分所在py文件内python代码的执行
使用场景
 1.模块开发阶段
 2.项目启动阶段
from a import *   *默认是将模块名称空间中所有的名字导入
__all__ =['名字1‘,’名字2']   针对*可以限制拿的名字

7.包的使用

虽然python3对包的要求降低了,不需要__init__.py也可以识别,但是为了兼容性考虑最好还是加上__init__.py
1.如果只想用包中某几个模块,那么还是按照之前的导入方式即可
  from aaa import md1,md2
2.如果直接导入包名
  import aaa 导入包名其实就是导包下面的__iniit__.py文件,该文件内有什么名字就可以通过包名点什么名字
 

8.软件开发目录规范

1.文件及目录的名字可变换,但是思想是不变的
2.目录规范主要规定开发程序的过程中针对不同的文件功能需要做不同的分类
 myproject项目文件夹
  1.bin文件夹  主要存放项目启动文件
    start.py  启动文件可以放在bin目录下,也可以直接在项目根目录
  2.conf文件夹  主要存放项目配置文件
    settings.py  里面存放项目的默认配置,一般都是全大写
  3.core文件夹  主要存放项目核心文件
    src.py  里面存放项目核心功能
  4.interface文件夹  主要存放项目接口文件
     goods.py  根据具体业务逻辑划分对应的文件
     user.py
     account.py
  5.db文件夹  主要存放项目相关数据
    userinfo.txt
    db_handler.py  存放数据库操作相关的代码
  6.log文件夹  主要存放项目日志文件  log.log
  7.lib文件夹  主要存放项目公共功能 common.py 
  8.readme文件  主要存放项目相关说明
  9.requirements.txt文件 主要存放项目所需模块及版本
     

9.常用内置模块

1.常用内置模块之collection
 具名元组:namedtuple
  from collections import namedtuple
   表示二维坐标系
   point = namedtuple('点',['x','y'])
   生成点信息
   p1 = point(1,2)
   print(p1)  #点(x=1,y=2)
   print(p1.x)  #1
   print(p1.y)  #2
 队列
 队列与堆栈
  队列:先进先出
  堆栈:先进后出
 队列和堆栈都是一边只能进一边只能出
2.常用内置模块之时间模块
 import time
 三种时间表现形式
   1.时间戳 秒数
   2.结构化时间 主要是给计算机看的,人看不适应
   3.格式化时间 主要是给人看的
 time.time() 展示当前时间戳
 time.localtime()参数为空时返回当前时区的struct_time格式时间,也可以将一个时间戳转化成struct_time格式时间
 time.striftime()把一个代表时间的元组或者struct_time转化为格式化的时间字符串
 time.sleep()让程序原地停顿指定的秒数
 import datetime
 print(datetime.datetime.now())  # 2022-10-19 11:58:23.682282
 print(datetime.datetime.today())  # 2022-10-19 11:58:23.682282
 print(datetime.date.today())  # 2022-10-19
 datetime 年月日 时分秒
 date   年月日
 time   时分秒
3.常用内置模块之随机模块
 import random
 print(random.random()) #随机产生0到1之间的小数
 print(random.randint(1,6)) #随机产生1到6之间的整数
 print(random.randrange(1,100,2)) #随机产生指定的整数
 print(random.choice(['一等奖','二等奖','三等奖','谢谢惠顾'])) #随机抽取一个样本 二等奖
 print(random.choices(['一等奖','二等奖','三等奖','谢谢惠顾'])) #随机抽取一个样本 ['二等奖']
 print(random.sample(['jason','kevin','tony','oscar','jerry','tom'],2)) #随机抽指定样本 ['tom','jason']
 l1 = [2,3,4,5,6,7,8,9,10,'J','Q','K','A']
 random.shuffle(l1) #随机打乱数据集
 print(l1)
4.常用内置模块之os模块
os模块主要与代码运行所在的操作系统打交道
import os
    1.创建目录(文件夹)
    os.mkdir(r'd1')相对路径,可以在执行文件所在的路径下创建目录,可以创建单级目录,不可以创建多级目录
    os.makedirs(r'd2\d22\d222')可以创建单级目录,也可以创建多级目录
    2.删除目录(文件夹)
    os.rmdir(r'd1')可以删除单级目录,不可以一次性删除多级目录,只能删除空的单级目录
    os.removedirs(r'd2\d22\d222')只能删除空的多级目录
    3.列举指定路径下内容名称
    print(os.listdir())
    print(os.listdir(r'D:\\'))
    4.删除/重命名文件
    os.rename(r'a.txt', r'aaa.txt')
    os.remove(r'aaa.txt')
    5.获取/切换当前工作目录
    print(os.getcwd())  # D:\pythonProject03\day19
    os.chdir('..')  # 切换到上一级目录
    print(os.getcwd())  # D:\pythonProject03
    os.mkdir(r'hei')
    6.动态获取项目根路径
    print(os.path.abspath(__file__))  # 获取执行文件的绝对路径  D:/pythonProject03/day19/01 os模块.py
    print(os.path.dirname(__file__))  # 获取执行文件所在的目录路径  D:/pythonProject03/day19
    7.判断路径是否存在(文件、目录)
    print(os.path.exists(r'01 os模块.py'))  # 判断文件路径是否存在  True
    print(os.path.exists(r'D:\pythonProject03\day19'))  # 判断目录是否存在  True
    print(os.path.isfile(r'01 os模块.py'))  # 判断路径是否是文件  True
    print(os.path.isfile(r'D:\pythonProject03\day19'))  # 判断路径是否是文件  False
    print(os.path.isdir(r'01 os模块.py'))  # False
    print(os.path.isdir(r'D:\pythonProject03\day19'))  # True
    8.路径拼接(重要)
    s1 = r'D:\pythonProject03\day19'
    s2 = r'01 os模块.py'
    print(f'{s1}\{s2}')
5.常用内置模块之sys模块
import sys
sys.path()获取执行文件的sys.path
sys.getrecursionlimit() 获取python解释器默认最大递归深度
sys.setrecursionlimit() 修改python解释器默认最大递归深度
sys.version 获取版本
sys.platform 平台信息
6.json模块
json模块也称为序列化模块,序列化可以打破语言限制实现不同编程语言之间数据交互
json格式数据的作用
son格式数据的形式  字符串类型并且引号都是双引号
json相关操作
针对数据
   json.dumps()将字典类型的数据转换成字符串
   json.loads()将字符串类型的数据转换成字典类型

针对文件
   json.dump()把数据以json的数据类型写入文件
   json.load()从json文件中读取数据
posted @ 2022-10-23 14:32  与屿  阅读(154)  评论(0)    收藏  举报