###############      常用模块   ################

  1. # 常用模块:
  2. # 1,collections模块
  3. # 2,时间模块,time模块,datatime模块
  4. # 3,random模块
  5. # 4,os模块
  6. # 5,sys模块
  7. # 6,序列化模块
  8. # 7,re模块
  9. # 8,hashlib模块
  10. # 9,configparse模块
  11. # 10,logging模块

###############      collections模块   ################

  1. # collections模块,
  2. # 在内置数据类型的基础上,collections提供了几个额外的数据类型
  3. # 1.namedtuple: 生成可以使用名字来访问元素内容的tuple
  4. # 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
  5. # 3.Counter: 计数器,主要用来计数
  6. # 4.OrderedDict: 有序字典
  7. # 5.defaultdict: 带有默认值的字典
  8.  
  9. from collections import namedtuple
  10. # 这个实现就是面向对象的思想实现的,
  11. point = namedtuple('point',['x','y']) # 这是定义了一个类,有一个类名,两个属性
  12. p=point(1,2) # 这是类的实例化
  13. print(p.x)
  14. print(p.y)
  15.  
  16. # 队列,
  17. # 在任何语言里面,队列都是一个非常有地位的数据类型,就像排队买票,
  18. # 特点就是先进先出,和列表不一样,列表是随意拿里面的元素,
  19. import queue
  20. # 栈,
  21. # 对应的是栈,先进后出,就像电梯,
  22. # 双端队列
  23. # 可以从两端存取,这个不常用,但是队列是非常常用的,
  24. from collections import deque
  25. dq = deque()
  26. dq.append(1)
  27. dq.append(2)
  28. dq.append(3)
  29. print(dq.pop()) # 取出来之后,队列里面就没有了,
  30. print(dq.popleft())
  31. dq.appendleft(4)
  32. dq.appendleft(5)
  33. print(dq)
  34.  
  35. # 有序字典
  36. from collections import OrderedDict
  37.  
  38. d = dict([('a', 1), ('b', 2), ('c', 3)])
  39. print(d) # 这是无序的
  40. od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
  41. print(od) # 这是有序的
  42.  
  43. # 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],
  44. # 将所有大于 66 的值保存至字典的第一个key中,
  45. # 将小于 66 的值保存至第二个key的值中。
  46. # : {'k1': 大于66 , 'k2': 小于66}
  47. list1 =[11,22,33,44,55,66,77,88,99,90]
  48. dict1 = {'k1':[],'k2':[]}
  49. for i in list1:
  50. if i > 66:
  51. dict1['k1'].append(i)
  52. elif i < 66:
  53. dict1['k2'].append(i)
  54. # print(dict1)
  55.  
  56. # 使用带有默认值的字典来解决上面的问题,
  57. from collections import defaultdict
  58. dict2 = defaultdict(list) # 这是给里面的每一个key,创建一个列表,这里面还可以是集合等其他的类型
  59. for i in list1:
  60. if i > 66:
  61. dict2['k1'].append(i)
  62. elif i < 66:
  63. dict2['k2'].append(i)
  64. print(dict2)
  65.  
  66. # Counter
  67. # Counter类的目的是用来跟踪值出现的次数。
  68. # 计数值可以是任意的Interger(包括0和负数)
  69. from collections import Counter
  70. c = Counter('abcdeabcdabcaba') # 它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。
  71. print(c)

例题

  1. # 利用collections库的Counter方法统计字符串每个单词出现的次数"kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"
  2. s = "kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"
  3. from collections import Counter
  4. ret = Counter(s)
  5. print(ret) # Counter({'l': 9, ';': 6, 'h': 6, 'f': 5, 'a': 4, 'j': 3, 'd': 3, 's': 2, 'k': 1, 'g': 1, 'b': 1})

###############      时间模块   ################

  1. # time 模块
  2. # 在python中是经常使用到这个模块的,
  3. # 比如记录程序执行的时间
  4. # 让程序停留一段时间sleep
  5. # 记住三种时间,时间戳时间,格式化时间,结构化时间,还有一个sleep,
  6. import time
  7. print(time.time()) # 这是获取当前的时间戳,#计算时间差使用,
  8. # time.sleep(3)
  9. print(time.strftime('%Y-%m-%d %H:%M:%S')) # 字符串格式时间,给人看的,
  10. print(time.localtime()) # 结构化时间,这是格式化时间的基础,比如计算年和年的差,月和月的差,
  11.  
  12. # 把2019-12-18转化成时间戳时间
  13. # 先转成结构化时间,必须要这一步,不能直接格式化时间转换成时间戳时间,
  14. p=time.strptime('2019-12-17', '%Y-%m-%d')
  15. print(p)
  16. # 然后转换成时间戳时间
  17. print(time.mktime(p))
  18. # 计算从这个时间到现在过了多少秒了
  19. print(time.time()-time.mktime(p))
  20.  
  21. # 把1500000000转成成格式化时间,
  22. # 先把时间戳时间转换成结构化时间,
  23. p = time.localtime(1500000000)
  24. print(p)
  25. # 把结构化时间转化成格式化时间
  26. print(time.strftime('%Y-%m-%d %H:%M:%S',p))
  27.  
  28. # 时间戳转换成格式化时间,只有一种格式
  29. print(time.strftime('%c'))
  30. print(time.ctime(150000000)) # 为什么是ctime就是因为只能转换成%c的格式,
  31. ret = time.localtime(150000000)
  32. print(time.asctime(ret)) # asctime()必须传递一个元组,
  33.  
  34. # 现在要解决一个问题,就是如何把时间间隔,转换成年月日,比如你入职多久这样的,
  35. # 比如从1992-08-16 到今天过了多少年,多少月,多少日,多少时,多少分,多少秒了
  36. # 思路:
  37. import time
  38. def time_dif(oldtime,newtime):
  39. timestamp1 = time.strptime(oldtime,'%Y-%m-%d %H:%M:%S') # strptime 把格式化时间转化成结构化时间
  40. timestamp2 = time.strptime(newtime,'%Y-%m-%d %H:%M:%S')
  41. ti = time.localtime(time.mktime(timestamp2)-time.mktime(timestamp1)) # mktime 把结构化时间时间转化成时间戳时间 localtime 把时间戳时间转换成结构化时间
  42. print(ti)
  43. return '时间差是%s年,%s月,%s日,%s时,%s分,%s秒'%(ti.tm_year-1970,ti.tm_mon-1,ti.tm_mday-1,ti.tm_hour,ti.tm_min,ti.tm_sec)
  44. # 时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
  45.  
  46. print(time_dif('1992-8-16 0:0:0','2019-8-18 11:07:3'))

###############      random模块   ################

  1. # random模块
  2. import random
  3. r = random.random() # 生成一个0-1之间的小数
  4. r = random.uniform(1,4) # 生成一个1-4之间的小数 ,这个从来没有用过
  5. r = random.randint(50,100) # 生成一个50-100的一个整数,用的最多
    r = random.randint(5)  # 这是0-5
    r = random.randrange(1,20,2) # 1-20之间的奇数,
  6. print(r)

###############      os模块   ################

  1. # os模块
  2. # 这是和操作系统打交道的,
  3.  
  4. import os
  5. # print(os.getcwd()) # 获取当前文件的路径
  6. # 新建文件夹:
  7. # os.mkdir('12') # 在当前目录创建文件夹
  8. # os.mkdir('11/11') # 如果有父类目录,就会创建成功,否则就会失败,
  9. # os.makedirs('1/2/3') # 可以创建多层文件夹,
  10. # 删除文件夹
  11. # os.rmdir('1/2/3') # 这是删除目录3,# 删除的方法不常用,最好不要随便删除,会找不到的,
  12. # os.removedirs('1/2') # 目录下为空就会全部删除包括这整个路径上的所有的文件夹,文件下有文件就不会删除,
  13.  
  14. print(os.path.abspath(__file__)) # 获取当前文件的绝对路径,包含文件名
  15. print(os.path.dirname(os.path.abspath(__file__))) # 获取当前文件父级路径
  16. print(os.path.basename(os.path.abspath(__file__))) # 只有包含文件名
  17. print(os.path.exists(r'D:\AI\python_workspace\python-base')) # 如果这个路径存在就返回True,这个有用,如果没有就可以创建了,
  18. # r 是取消转译
  19. print(os.path.isdir(r'D:\AI\python_workspace\python-base')) # 判断是文件夹
  20. print(os.path.isfile(r'D:\AI\python_workspace\python-base')) # 判断是文件
  21. print(os.path.join(r'D:\AI\python_workspace\python-base','Helloworld.py')) # 自动拼接成为一个路径,这个可以根据不同的平台自动拼

###############      sys模块   ################

  1. # sys模块
  2. # 这个是和python解释器打交道的,
  3.  
  4. import sys
  5. print(sys.version) # 取Python解释程序的版本信息
  6. print(sys.platform) # 返回操作系统平台名称
  7. print(sys.path) # 返回模块的搜索路径
  8. print(sys.argv) # 返回一个列表,列表的第一项是
  9. print('*'*6)
  10. sys.exit() # 退出程序,
  11. print('-'*6) # 下面的是不会打印执行的,
  12. # 这个模块完全没有应用场景!学了和没学一样,

###############     序列化模块   ################

  1. # 序列化模块
  2.  
  3. #############################################################
  4. # 序列化是什么?
  5.  
  6. # 现在的序列化都是转向一个字符串数据类型,
  7. # 我们说的序列就是字符串,
  8.  
  9. # 为什么要千方百计的转换成为字符串呢?
  10. # 如果一个字典{"k":"v"}为什么要转成字符串
  11. # 我往文件或者数据库里面写内容的时候是不能写入字典的,可以写入字符串,
  12. # 还有在网络上传输的时候,我需要传递的是byte类型,怎么把字典转换成为一个byte类型呢,
  13. # 就要先转换为字符串,然后字符串转换为byte类型,
  14. # 基本就是这两种情况,需要序列化,
  15.  
  16. # 这种从数据类型转为字符串,就是序列换,
  17. # 把字符串转换为数据类型的操作,就是反序列化,
  18.  
  19. ################################################################
  20. # json模块
  21.  
  22. # 现在有一个模块就是json模块, 这是非常重要的一个模块
  23. # 你和别人进行数据交换的时候一定要使用这个,
  24. # 还有这个模块pickle,这个也可以序列化,
  25. # 这个模块shelve,没有这个模块不影响,这是你要知道,
  26.  
  27. # 不是所有的类型都能通过json模块 转换为字符串的,
  28. # 这是json模块的弊端,但是json是一个通用的模块,别的语言可以解开,
  29.  
  30. # pickle这个模块可以把所有的数据类型,转换成为字符串形式,
  31. # 但是有问题,序列化的内容只能Python来解开,别的语言不识别,
  32. # 而且反序列化需要依赖Python代码,
  33.  
  34. # shelve,使用句柄直接操作非常方面,但是这个模块是一个新模块,
  35.  
  36. ##########################################################################
  37.  
  38. # 序列化代码
  39. # 我就是想要把一个字典转换成为一个字符串,
  40. # import json
  41. # dic = {"k":'v'}
  42. # print(type(dic),dic)
  43. # ret = json.dumps(dic) # 这就是序列化
  44. # print(type(ret),ret)
  45. # ret =json.loads(ret)
  46. # print(type(ret),ret)
  47. # dumps是序列化方法,loads是反序列化方法,
  48.  
  49. # 可以序列化的数据类型,数字,字符串,列表,字典,元组,
  50. # 但是在json里面就只认识列表和字典,
  51.  
  52. ############################################
  53. # json还有两个方法, dump和load
  54. # 要使用这两个,需要打开一个文件,
  55.  
  56. # dic = {1:"a",2:"b"}
  57. # f = open("fff","w",encoding="utf-8")
  58. # json.dump(dic,f)
  59. # # 正常是不能把一个字典写入文件的,但是使用这个方法,可以把字典序列化然后存入字典,
  60. # f = open("fff","r")
  61. # ret = json.load(f)
  62. # # 这是往文件外边取
  63. # f.close()
  64. # print(ret)
  65.  
  66. # 使用这个dump和load,必须是一次性的写进去,然后一次性的读出来,
  67. # 如果你写入两次,然后读取两次,会报错的,

###############     hashlib模块   ################

  1. import hashlib
  2.  
  3. # 不加盐
  4. md5 = hashlib.md5() # 创建一个md5算法的对象
  5. md5.update(''.encode('utf-8'))
  6. print(md5.hexdigest()) # 这个值永远不会变,容易被人暴力破解,要加盐
  7.  
  8. # 固定加盐
  9. md5 = hashlib.md5('SOS'.encode('utf-8')) # 固定的盐还是可以破解的,
  10. md5.update(''.encode('utf-8'))
  11. print(md5.hexdigest())
  12.  
  13. # 动态加盐
  14. user = 'sos'
  15. print(user[1::-1])
  16. md5 = hashlib.md5(user[1::-1].encode('utf-8'))
  17. md5.update(''.encode('utf-8'))
  18. print(md5.hexdigest())
  19.  
  20. # sha算法,和md5的用法一样,不过常用的还是md5,sha算法会慢一点
  21. sha1 = hashlib.sha1('SOS'.encode('utf-8'))
  22. sha1.update(''.encode('utf-8'))
  23. print(sha1.hexdigest())
  24.  
  25. # 文件一致性校验
  26. def md5file(file):
  27. md5=hashlib.md5() # 做文件一致性校验不需要加盐
  28. with open(file,'rb') as f:
  29. # text = f.read()
  30. # md5.update(text)
  31. # 对于大文件,不能一次性读取,
  32. while True:
  33. text = f.read(1024) # 每次读取1024字节
  34. if text:
  35. md5.update(text)
  36. else:
  37. break
  38.  
  39. return md5.hexdigest() # 一次性读取和循环读取的结果是一样的
  40.  
  41. print('*' * 50)
  42. print(md5file('test.txt'))
  43. print(md5file('text2.txt'))

###############     configparser模块   ################

  1. # 配置文件,
  2. # python中ini结尾,django中使用py文件来用,学习这个ini模式,保证别人用的时候你能看懂,
  3. # 在配置文件中必须要有分组,
  4. # 组名可以随便取,也可以是DEFAULT,DEFAULT有特殊的意义
  5. # 每一组是一个小节,section,小节里面的每一项,叫做option,
  6.  
  7. # 使用python创建一个配置文件
  8. import configparser
  9. config = configparser.ConfigParser()
  10. config["DEFAULT"] = {'ServerAliveInterval': '',
  11. 'Compression': 'yes',
  12. 'CompressionLevel': '',
  13. 'ForwardX11':'yes'
  14. }
  15. config['bitbucket.org'] = {'User':'hg'}
  16. config['topsecret.server.com'] = {'Host Port':'','ForwardX11':'no'}
  17. with open('example.ini', 'w') as f:
  18. config.write(f)
  19.  
  20. # 查找配置文件
  21. import configparser # 导入模块
  22. config = configparser.ConfigParser() # 创建一个对象
  23. config.read('example.ini') # 读取文件
  24. print(config.sections()) # 查找所有的小节,default是不会返回的,
  25. print('bytebong.com' in config) # False # 判断一个小节是否在配置文件中,
  26. print('bitbucket.org' in config) # True
  27. # print(config['bitbucket.org']["user"]) # hg # 取配置文件中某一个小节,某一个项的值,字典的操作格式,config[section']["option"]
  28. # print(config['bitbucket.org']) #<Section: bitbucket.org> 这是一个可迭代对象
  29. for key in config['bitbucket.org']: # 注意,有default会默认default的键,会把default的key也打印出来,
  30. print(key)
  31. # print(config.options('bitbucket.org')) # 同for循环,找到'bitbucket.org'下所有键
  32. # print(config.items('bitbucket.org')) #找到'bitbucket.org'下所有键值对
  33. # print(config.get('bitbucket.org','compression')) # yes
  34. # get方法Section下的key对应的value。但是通过任何一个section都可以去访问default下面的option
  35.  
  36. # 配置文件的修改,删除,新增
  37. import configparser
  38. config = configparser.ConfigParser()
  39. config.read('example.ini')
  40. config.add_section('yuan') # 新增一个section,但是记住最后要write,
  41. config.remove_section('bitbucket.org')
  42. config.remove_option('topsecret.server.com',"forwardx11")
  43. config.set('topsecret.server.com','k1','') # K1有值就是修改k1的value值,没有就是添加,
  44. config.set('yuan','k2','')
  45. config.write(open('new2.ini', "w"))

###############    logging模块   ################

  1. # logging
  2. # 日志,用来保持增删查改的记录,一个记录没有了是没有创建,还是创建了又删除了,需要记录日志
  3. # 有了log,就可以使用这个来替代print来调试程序,线上也需要日志来定位错误,排查问题,这是必须的,
  4. # 这些日志都是程序员写出来的,而且都是要输出到文件的,
  5.  
  6. # 使用logging日志两种方式
  7. # 1,简单配置,但是受到的局限比较大,
  8. # 2,配置logger对象,
  9. # 这两个是独立的,
  10.  
  11. # 简单配置
  12. # 默认情况下只显示警告级别及以上信心
  13. import logging
  14. file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
  15. logging.basicConfig(
  16. format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
  17. datefmt='%Y-%m-%d %H:%M:%S',
  18. handlers=[file_handler,], # 这种简单配置有一个大问题就是不能同时输出到文件和屏幕,
  19. level=logging.DEBUG # 这样都显示出来了,但是不能只打印某一种信息,只能说是打印这个级别以上的信息
  20. )
  21. logging.debug('debug message') # 调试模式,这个级别最低,
  22. logging.info('info message') # 显示正常的信息
  23. logging.warning('warning message') # 显示警告信息
  24. logging.error('error message') # 显示错误信息
  25. logging.critical('critical message') # 显示严重错误信息
  26.  
  27. # 配置logger对象,这是工作中常用的
  28. import logging
  29. logger = logging.getLogger() # 实例化一个logger对象
  30. fh = logging.FileHandler('test.log',encoding='utf-8') # 实例化一个文件句柄,创建一个handler,用于写入日志文件
  31. ch = logging.StreamHandler() # 再创建一个handler,用于输出到控制台
  32. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  33.  
  34. fh.setLevel(logging.DEBUG)
  35. fh.setFormatter(formatter)
  36. ch.setFormatter(formatter)
  37. ch.setLevel(logging.INFO)
  38.  
  39. logger.addHandler(fh) # logger对象可以添加多个fh和ch对象
  40. logger.addHandler(ch)
  41.  
  42. logger.debug('logger debug message')
  43. logger.info('logger info message')
  44. logger.warning('logger warning message')
  45. logger.error('logger error message')
  46. logger.critical('logger critical message')

###############    结束线   ################

python语法基础-常用模块-长期维护的更多相关文章

  1. python语法基础-异常操作-长期维护

    ###############    python-异常的操作  ############### # 异常:python解释器遇到一个错误,会停止程序的执行,并且提示错误信息,这就是异常, # 抛出异 ...

  2. python语法基础-文件操作-长期维护

    ###############    python-简单的文件操作  ############### # python中文件的操作 # 文件操作的基本套路 # 1,打开文件,默认是是只读方式打开文件 ...

  3. python语法基础-面向对象-进阶-长期维护

    ###############    @property定义属性    ############## # 所以对于定义属性你有好几种方式了和种类了,# 静态属性,动态属性, # property # ...

  4. python语法基础-常用模块-re模块

    ###############     re模块   ################ 正则表达式的规则: # re模块 # 正则表达式,就是做字符串匹配的,在re模块出现之前就有这个正则表达式了,任 ...

  5. python语法基础-函数-进阶-长期维护

    ###############    函数的命名空间和作用域    ############## """ # 函数进阶 命名空间和作用域 命名空间 全局命名空间——我们自 ...

  6. python语法基础-函数-递归函数-长期维护

    ###############    递归   ############## # 递归的定义——在一个函数里再调用这个函数本身 # 递归的最大深度——998 # 二分查找算法 # 你观察这个列表,这是 ...

  7. (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md

    第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...

  8. python笔记之常用模块用法分析

    python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...

  9. Python自动化 【第五篇】:Python基础-常用模块

    目录 模块介绍 time和datetime模块 random os sys shutil json和pickle shelve xml处理 yaml处理 configparser hashlib re ...

随机推荐

  1. 实验吧web-易-Forms

    打开网页,查看源码, 第二行,showsource的value是0,我们在查看器中将showsource的value值改为1,然后随便输入一个数,可以看到页面出现 意思就是我们输入的PIN的值应该是代 ...

  2. ZJNU 2351 - 快乐

    由题意得,如果有个人从前往后能找到第一个不低于自己等级的任务,就会接取其后所有任务 那么就可以让输入数据处理成递增数列 例如1 3 5 4 6 2 7 7 3 可以处理成1 3 5 5 6 6 7 7 ...

  3. ZJNU 2342 - 夏华献要回家

    (夏华献在学校也要做一次梦!) 把5的答案手动算出 会发现从学校开始,兔子的数量呈斐波那契数列(第2项开始)增长 假如现在有n盏路灯 那么睡觉的时间可以得到为 但是n有1e18大,明显使用标准数学公式 ...

  4. PowerDesigner 表格导出为excel(转载)

    选中tablesctrl + shift +x 然后运行脚本 '******************************************************************** ...

  5. Linux下常用的3种软件安装方式—rpm、yum、tar

    一:Linux源码安装    1.解压源码包文件    源码包通常会使用tar工具归档然后使用gunzip或bzip2进行压缩,后缀格式会分别为.tar.gz与.tar.bz2,分别的解压方式:   ...

  6. 106.HttpResponse对象详解

    HttpResponse对象 Django服务器接收到客户端发送过来的请求之后,会将提交上来的这些数据封装成一个HttpResquest对象传给视图函数.那么视图函数在处理完成相关的逻辑后,也需要返回 ...

  7. 关于wireshark的使用

    1.简介 Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直 ...

  8. 如何在 main() 执行之前先运行其它函数

    摘要:我们知道 C++ 的全局对象的构造函数会在 main 函数之前先运行,其实在 c 语言里面很早就有啦,在 gcc 中可以使用 __attribute__ 关键字指定如下(在编译器编译的时候就绝决 ...

  9. [mark]C# 异常处理

    https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/programming-guide/exceptions/index

  10. java添加后台缓存

    public class Cache { private String key;//缓存ID private Object value;//缓存数据 private long timeOut;//更新 ...