zoukankan      html  css  js  c++  java
  • day15 模块

    day15 模块

    今日内容概要

    1. 自定义模块
    2. time模块
    3. datetime模块
    4. random模块
    5. sys模块
    6. os模块

    昨日回顾

    1. 有参装饰器:

      给装饰器额外增加一个参数来控制装饰器的行为:

      def auth(arg):
          def wrapper(func):
              def inner(*args, **kwargs):
                  if arg:
                      print(111)
                      ret = func(*args, **kwargs)
                      print(222)
                  else:
                      func(*args, **kwargs)
                  return ret
              return inner
          return wrapper
      
      @auth(True)
      def index():
          print('is index')
      index()
      
    2. 多个装饰器装饰一个函数:

      def wrapper2(func):
          def inner(*args, **kwargs):
              print(111)
              func(*args, **kwargs)
              print(222)
          return inner
      
      def wrapper1(func):
          def inner(*args, **kwargs):
              print(333)
              func(*args, **kwargs)
              print(444)
          return inner
              
      @wrapper1
      @wrapper2
      def func():
          print('is func')
      func()
      
    3. 递归

      1. 不断调用自己本身
      2. 有明确的结束条件

      递归最大深度:官方宣称1000,实测994

      修改递归最大深度:

      import sys
      sys.setrecuisionlimit(10000)
      

    今日内容详细

    自定义模块

    模块的定义:模块就是一个py文件。

    模块主要分为三类:

    1. 内置模块,也称Python标准库,是Python官方已经封装在Python解释器中了,大约有200多个;
    2. 第三方模块,是一些组织或个人写好的py文件,供我们使用;
    3. 自定义模块,也就是我们自己写的py文件。

    为什么要学习模块:

    1. 开发效率高
    2. 拿来主义:同内置函数一样,我们只需要把模块拿来用就好,不必深究它的原理
    3. 减少重复代码:分文件管理,有助于修改和维护。

    怎么使用模块:

    import 导入 将模块中所有内容导入
    import lib
    lib.a # import使用功能需要.操作
    
    from 模块名 import 功能
    from 同一个模块 import a,b,c
    from lib import a as aa
    

    导入时发生的事情

    1. 将模块存储到当前名称空间中
    2. 以模块的名字命名,并开辟空间
    3. 通过模块名来使用模块中的功能

    同一个模块即便写多次导入, 也只执行一次

    导入顺序:
    内存 ---> 内置 ---> sys.path列表

    模块的两种用法:

    1. 当做普通模块执行
    2. 被当做脚本执行
    if __name__ == "__main__":
        pass
    

    在当前文件中执行__name__获取的值是'__main__'
    当前文件被当做模块导入时,__name__获取的是当前文件名

    以后要避免(不能这么写)的问题:

    • 循环导入(了解)

    import 和 from 的对比:

    • import 全部导入

    • from 指定功能导入

    • import和from都可以支持as

    • from会将之前定义同名的覆盖

    • from 可以一行导入多个功能

    • from lib import * 将lib下所有的功能全部导入

    • import 建议一行导入一个模块

    • 推荐是使用from

    模块导入的顺序:

    • 内存,内置,sys.path、
    sys.path  # *****
    sys.path.append() # 添加一个模块查找路径
    __all__=['name','read1'] # 控制form import *
    

    time模块

    time模块,也就是时间模块,用来进行一些与时间有关的操作。其使用方法为:

    import time
    print(time.time())   # 时间戳 浮点数
    print(time.sleep(2)) # 秒 进行睡眠
    

    时间分类:

    1. 时间戳 --- 用于进行计算
    2. 结构化时间 --- 给程序员查看使用(命名元组)
    3. 字符串时间 --- 给用户查看的

    时间模块的基本方法有:

    t = time.time()         # 用于获取当前时间戳
    print(time.localtime(t))   # 将时间戳转成结构化时间
    t = time.localtime()     # 将时间戳转成结构化时间,不写默认是当前时间戳
    print(time.mktime(t))    # 将结构化时间转成时间戳
    t = time.localtime()
    print(time.strftime("%Y-%m-%d %H:%M:%S",t))  # 将结构化时间转换成字符串时间
    str_time = "2019-9-1 12:23:06"
    print(time.strptime(str_time,"%Y-%m-%d %H:%M:%S")) # 将字符串时间转换成结构化时间
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))    # 将结构化时间转化为字符串时间
    str_time = "2019-9-1 12:23:06"
    print(time.mktime(time.strptime(str_time,"%Y-%m-%d %H:%M:%S")))
    
    print(time.localtime()[0])
    print(time.localtime().tm_year)
    print(time.localtime().tm_yday)
    
    输出的结果为:
    time.struct_time(tm_year=2019, tm_mon=9, tm_mday=26, tm_hour=19, tm_min=19, tm_sec=21, tm_wday=3, tm_yday=269, tm_isdst=0)
    1569496761.0
    2019-09-26 19:19:21
    time.struct_time(tm_year=2019, tm_mon=9, tm_mday=1, tm_hour=12, tm_min=23, tm_sec=6, tm_wday=6, tm_yday=244, tm_isdst=-1)
    2019-09-26 19:19:21
    1567311786.0
    2019
    2019
    269
    

    datetime模块

    datetime模块的作用和time模块类似,都是用来进行时间操作的,其基本操作为:

    from datetime import datetime
    print(datetime.now())   # 获取到当前是时间,对象
    print(type(datetime.now()))
    print(datetime(2016,11,13,12,13,14)) # 将指定时间转化为datetime对象
    
    import time
    print(datetime.fromtimestamp(time.time()))    # 时间戳转换成对象
    print(datetime.timestamp(datetime.now()))    # 将对象转换成时间戳
    
    
    print(datetime.strftime(datetime.now(),"%Y-%m-%d %H:%M:%S"))    # 将对象转换成字符串
    print(datetime.strptime("2019/10/14","%Y/%m/%d"))    # 将字符串转换成对象
    
    print(datetime.now() - datetime(9999,11,1,12,13,14))    # 用来计算当前时间相对于指定时间相差多久
    
    from datetime import datetime,timedelta
    print(datetime.now())
    print(datetime.now() - timedelta(days=400))    # 用来计算400天前时间的datetime对象
    print(datetime.now() - timedelta(days=500))
    
    输出的结果为:
    2019-09-26 19:32:59.456316
    <class 'datetime.datetime'>
    2016-11-13 12:13:14
    2019-09-26 19:32:59.457314
    1569497579.457313
    2019-09-26 19:32:59
    2019-10-14 00:00:00
    -2914671 days, 7:19:45.490226
    2019-09-26 19:32:59.490226
    2018-08-22 19:32:59.490226
    2018-05-14 19:32:59.490226
    

    random模块

    random模块,也就是随机数模块,用来生成一定范围内的随机数。随机数模块可以这样使用:

    import random
    print(random.random())    # 用来生成0~1之间的小数
    print(random.randint(1, 5))   # 随机生成1~5之间(包括1和5)的整数
    print(random.randrange(0, 10, 2))    # 随机产生range切片范围内的整数,参数的使用方法与range相同
    
    lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(random.choice(lst))    # 从可迭代对象中随机选出一个元素
    print(random.choices(lst, k=5))    # 从可迭代对象中选择指定个数的元素,可能会重复选取
    print(random.sample(lst, k=5))    # 从可迭代对象中选取指定个数的元素,不会重复选取
    random.shuffle(lst)    # 将列表顺序打乱
    print(lst)
    
    输出的结果为:
    0.30540264424342467
    2
    6
    4
    [3, 1, 9, 3, 8]
    [8, 5, 9, 6, 3]
    [3, 5, 1, 8, 4, 6, 9, 7, 2]
    

    os模块

    os模块主要用来进行与操作系统进行交互,它的导入方式为:

    import os
    

    os模块主要涉及文件操作、文件夹操作、路径操作和其他操作四个方面。

    文件操作

    通过os模块对文件直接进行的操作:

    os.rename('旧名字', '新名字')    # 重命名    非常重要
    os.remove('要删除的文件名')    # 删除文件    非常重要
    

    文件夹操作

    对文件夹进行操作:

    os.makedirs('a/b/c/d/e/f')    # 递归创建文件夹    非常重要
    os.removedirs('a/b/c/d/e/f')    # 递归删除文件夹,若文件夹非空,会报错    非常重要
    os.mkdir('a')    # 创建文件夹    非常重要
    os.rmdir('a')    # 删除文件夹    非常重要
    print(os.listdir('.'))    # 查看指定路径下的所有文件    非常重要
    

    路径操作

    对路径的操作主要使用os.path下的各种方法:

    print(os.getcwd())    # 获取当前工作路径    非常重要
    os.chdir('..day14')    # 改变当前脚本工作目录,相当于终端下的cd
    print(os.path.abspath('lib.py'))    # 获取文件的绝对路径
    print(os.path.split('C:Python_26day14'))    # 对路径进行分割位目录和文件名,返回值为元组
    print(os.path.dirname('C:Python_26day14'))    # 获取父级目录    非常重要
    print(os.path.basename('C:Python_26day14'))    # 返回path最后的文件名
    
    # is系列
    print(os.path.exists('C:Python_26day14'))    # 判断路径是否存在
    print(os.path.isabs('day07'))    # 判断是否是绝对路径,如果是则返回True
    print(os.path.isfile('C:Python_26day15lib.py'))    # 判断是否是一个存在的文件,如果是则返回True    非常重要
    print(os.path.isdir('C:Python_26day15')    # 判断是否是一个存在的目录,如果是则返回True    非常重要
    print(os.path.join("C:\User",'Python_26',"day15","lib.py"))    # 将多个路径组合后返回    非常重要
    print(os.path.getsize('C:Python_26day15lib.py'))    # 获取文件大小
    

    其他操作

    os方法的其他操作:

    print(os.open('dir').read())    # 给终端发送指令
    print(os.environ)    # 获取环境变量
    

    总结

    os模块功能很多很杂,不可能全都记住,但是下面的这些功能我们日后会经常用到,一定要尽量学会使用:

    os.getcwd()
    os.mkdir()
    os.rmdir()
    os.makedirs()
    os.removedirs()
    os.rename()
    os.remove()
    os.path.abspath()
    os.path.dirname()
    os.path.basename()
    os.path.join()
    os.path.isfile()
    os.path.isdir()
    os.path.getsize()
    

    sys模块

    sys模块用来和Python解释器进行交互,我们只需要记住sys.path功能即可:

    import sys
    print(sys.path)
    

    除此之外,sys模块还有几个有意思的功能可以稍作了解:

    import sys
    if sys.platform == 'win32':    # sys.platform方法用来查看操作系统平台
        print('Windows')
    elif sys.platform == 'darwin':
        print('Mac')
        
    lst = sys.argv    # 在终端中模拟input输入,避免input函数阻塞
    print(lst[-1])
    
    print(sys.version)    # 用来查看Python的版本
    sys.exit(1)    # 修改Python结束后的报告代码
    
    print(sys.modules)   # 获取所有的模块
    
    sys.setrecuisionlimit()    # 设置递归深度
    
  • 相关阅读:
    局部地区类似淘宝设想
    eclipse中安装GWT插件
    MYSQL数据库设计和数据库设计实例(三)
    MYSQL数据库设计和数据库设计实例(二)
    微软万维天文望远镜(Microsoft World Wide Telescope)
    html学习列表
    java中多线程学习一二点
    win7 64位下完美安装64位oracle 11g
    eclipse运行时不能自动保存的解决方法
    MYSQL数据库设计和数据库设计实例(一)
  • 原文地址:https://www.cnblogs.com/shuoliuchina/p/11594209.html
Copyright © 2011-2022 走看看