目录:

  • 生成器
  • 迭代器
  • 模块
    • time
    • 序列化
    • 反序列化
    • 日志

一、生成器  

列表生成式;

  1. a = [1,2,3,3,4,5,6,7,8,9,10]
  2. a = [i+1 for i in a ]
  3. print(a)
  4. a = [i*1 if i > 5 else i for i in a]
  5. print(a)

生成器:generator
不能事先把元素全部加载到内存,可以是边使用边生成的方式来依次获取元素;

生成器的使用方法:
列表生成式生成的是列表;
将列表生成器中的[]改成()就成为了一个生成器;
示例:

  1. a = [1,2,3,3,4,5,6,7,8,9,10]
  2. a = (i+1 for i in a)
  3. 生成器的取值方法:
  4. 使用next
  5. next(a)或a.__next__()

函数一经调用必须执行完毕,中间不可停顿;生成器可解决这个问题;生成器yield保存了函数的中断状态;yield即可以中断也可以传参数;
生成器这种边执行边运算的方法被称为惰性运算;

next:只能唤醒不能传值;
send:即能唤醒又能传值;

在多个函数中不断切换来实现并发;

  1. 串行下实现并发示例:
  2. 代码:
  3. import time
  4.  
  5. def cost(name):
  6. print('%s 准备吃包子'%name)
  7.  
  8. while True:
  9. baozi = yield
  10. print('包子 [%s] 来了,被 [%s] 吃了'%(baozi,name))
  11.  
  12. def pro():
  13. c = cost('jerry')
  14. c1 = cost('tom')
  15. c.__next__()
  16. c1.__next__()
  17. print('开始做包子')
  18. for i in (range(10)):
  19. time.sleep(0.5)
  20. print('做了 %s 个包子'%i)
  21. c.send(i)
  22. c1.send(i)
  23.  
  24. pro()
  25.  
  26.  
  27. 运行结果:
  28.  
  29. jerry 准备吃包子
  30. tom 准备吃包子
  31. 开始做包子
  32. 做了 0 个包子
  33. 包子 [0] 来了,被 [jerry] 吃了
  34. 包子 [0] 来了,被 [tom] 吃了
  35. 做了 1 个包子
  36. 包子 [1] 来了,被 [jerry] 吃了
  37. 包子 [1] 来了,被 [tom] 吃了
  38. 做了 2 个包子
  39. 包子 [2] 来了,被 [jerry] 吃了
  40. 包子 [2] 来了,被 [tom] 吃了
  41. 做了 3 个包子
  42. 包子 [3] 来了,被 [jerry] 吃了
  43. 包子 [3] 来了,被 [tom] 吃了
  44. 做了 4 个包子
  45. 包子 [4] 来了,被 [jerry] 吃了
  46. 包子 [4] 来了,被 [tom] 吃了
  47. 做了 5 个包子
  48. 包子 [5] 来了,被 [jerry] 吃了
  49. 包子 [5] 来了,被 [tom] 吃了
  50. 做了 6 个包子
  51. 包子 [6] 来了,被 [jerry] 吃了
  52. 包子 [6] 来了,被 [tom] 吃了
  53. 做了 7 个包子
  54. 包子 [7] 来了,被 [jerry] 吃了
  55. 包子 [7] 来了,被 [tom] 吃了
  56. 做了 8 个包子
  57. 包子 [8] 来了,被 [jerry] 吃了
  58. 包子 [8] 来了,被 [tom] 吃了
  59. 做了 9 个包子
  60. 包子 [9] 来了,被 [jerry] 吃了
  61. 包子 [9] 来了,被 [tom] 吃了

我们创建了一个generator后,基本上永远不会调用next(),而是通过for循环来迭代它,并且不需要关心StopIteration的错误。

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

  1. 执行代码:
  2.  
  3. def fib(max):
  4. n,a,b=0,0,1
  5. while n < max:
  6. yield b
  7. a,b=b,a+b
  8. n+=1
  9. return 'done'
  10.  
  11. f=fib(10)
  12.  
  13. print(f.__next__())
  14. print(f.__next__())
  15. print(f.__next__())
  16. print(f.__next__())
  17. print(f.__next__())
  18. print(f.__next__())
  19. print(f.__next__())
  20. print(f.__next__())
  21. print(f.__next__())
  22. print(f.__next__())
  23.  
  24. 执行结果:
  25. 1
  26. 1
  27. 2
  28. 3
  29. 5
  30. 8
  31. 13
  32. 21
  33. 34
  34. 55

二、迭代器

可以直接作用于for循环的对象统称为可迭代对象;Iterable 所谓可迭代就是可循环、可遍历;
可以使用isinstance()判断一个对象是否是Iterable对象;
生成器即可以for循环,又可以被next()不断调用返回下一个值;
可以被next()方法 调用并不断返回下一个值的对象称为迭代器;Iterator; 可迭代对象只能循环,迭代器即可循环又可以被next;
可以说所有的生成器就是迭代器,但迭代器不仅限制为生成器;迭代器的一个判断条件是只要可以被next就是一个迭代器;
生成器是迭代器的子集;
生成器都是迭代器对象,但list、dict、str虽然是可迭代(Iterable),却不是迭代器(Iterator)

  1. 示例:
  2. >>> from collections import Iterable
  3. >>> isinstance([],Iterable)
  4. True
  5. >>> isinstance((),Iterable)
  6. True
  7. >>> isinstance({},Iterable)
  8. True
  9. >>> isinstance(100,Iterable)
  10. False
  11.  
  12. # python3中的for循环range,range都是迭代器;

三、模块

代码的级别:
  函数 --》类 --》模块 --》包
模块分为三种:
  自定义模块;
  内置标准模块(又称标准库);自带200多个标准库;
  开源模块;

模块安装:
  pip install 模块名 即可下载安装;
  python官方开源库
    pypi.python.org/pypi

  1. 1、时间模块
  2. import time
  3.  
  4. print(time.time) #返回时间戳;从1970年1月1日开始至现在计时;
  5.  
  6. print(time.altzone) #查看格林威治标准时间;
  7. -32400
  8. print(time.altzone/60/60)
  9. -9.0
  10.  
  11. print(time.asctime()) #返回时间格式;
  12. Sat Feb 18 15:12:02 2017
  13.  
  14. print(time.localtime()) #返回本地时间的struct time对象格式;
  15. time.struct_time(tm_year=2017, tm_mon=2, tm_mday=18, tmhour=15, tm_min=12, tm_sec=43, tm_wday=5, tm_yday=49, tm_isdst=0)
  16.  
  17. t = time.localtime(time.time() - (60*60*24))
  18. print('t',t)
  19. t time.struct_time(tm_year=2017, tm_mon=2, tm_mday=17, tm_hour=15, tm_min=21, tm_sec=1, tm_wday=4, tm_yday=48, tm_isdst=0)
  20.  
  21. t = time.localtime()
  22. print(t.tm_year,t.tm_mon)
  23. 2017 2
  24.  
  25. print(time.gmtime()) #返回utc时间的struc时间对象格式;即英国时间;
  26. time.struct_time(tm_year=2017, tm_mon=2, tm_mday=18, tm_hour=7, tm_min=14, tm_sec=39, tm_wday=5, tm_yday=49, tm_isdst=0)
  27.  
  28. print(time.ctime()) #打印当前时间;
  29. Sat Feb 18 15:22:18 2017
  30.  
  31. 自定义时间格式:
  32. print(time.strftime('%Y-%m-%d %H:%M:%S'))
  33. 2017-02-18 15:24:15
  34.  
  35. 显示一天前的时间:
  36. struct_time = time.localtime(time.time() - 86400)
  37. print(time.strftime('%Y-%m-%d %H:%M:%S',struct_time))
  38. 2017-02-17 15:27:03
  39.  
  40. 将字符串转成时间;
  41. print(time.strptime("2017-02-17","%Y-%m-%d"))
  42. time.struct_time(tm_year=2017, tm_mon=2, tm_mday=17, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=48, tm_isdst=-1) #变成时间对象;
  43.  
  44. 字符串转成时间戳:
  45. s_time = time.strptime("2017-02-17","%Y-%m-%d"))
  46. print(time.mktime(s_time))
  47.  
  48. s_time = time.strptime("2017-02-17","%Y-%m-%d")) --> time.mktime(struct_time)
  49.  
  50. 时间戳车成字符串:
  51. time.gmtime(143322224000) --> time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime())
  52.  
  53. import datetime
  54. print(datetime.datetime.now()) #打印当前时间;
  55. print(datetime.date.fromtimestramp(time.time())) #时间戳直接转成日期格式;
  56. 缺点:没有办法定制时间格式;
  57.  
  58. print(datetime.datetime.now() + datetime.timedalta(3)) #直接加三天;
  59. print(datetime.datetime.now() + datetime.timedalta(hours=3,minutes=-20)) #加三天,再减20分钟
  60.  
  61. c_time = datetime.datetime.now()
  62. print(c_time.replace(minute=3,hour=2))

  63. print(datetime.datetime.now().replace(year=2016,month=3)) #时间替换;

  

Directive Meaning Notes
%a Locale’s abbreviated weekday name.  
%A Locale’s full weekday name.  
%b Locale’s abbreviated month name.  
%B Locale’s full month name.  
%c Locale’s appropriate date and time representation.  
%d Day of the month as a decimal number [01,31].  
%H Hour (24-hour clock) as a decimal number [00,23].  
%I Hour (12-hour clock) as a decimal number [01,12].  
%j Day of the year as a decimal number [001,366].  
%m Month as a decimal number [01,12].  
%M Minute as a decimal number [00,59].  
%p Locale’s equivalent of either AM or PM. (1)
%S Second as a decimal number [00,61]. (2)
%U Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. (3)
%w Weekday as a decimal number [0(Sunday),6].  
%W Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. (3)
%x Locale’s appropriate date representation.  
%X Locale’s appropriate time representation.  
%y Year without century as a decimal number [00,99].  
%Y Year with century as a decimal number.  
%z Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59].  
%Z Time zone name (no characters if no time zone exists).  
%% A literal '%' character.

  1. 2、随机模块
  2. import random
  3. print(random.randint(1,10))
  4. 6 生成随机数;
  5. print(random.randrange(1,20,2))
  6. 不包含10,可以加步长;会跳着显示;
  7. print(random.sample([1,2,3,4,5,6,7],2)) #随机取两个值;
  8. [3, 1]
  9. print(random.sample(range(100),5)) #随机取五个值;
  10. [2, 3, 7, 5, 1]
  11.  
  12. print(string.ascii_lowercase) #打印所有小写
  13. print(string.digits)
  14. print(string.upper)
  15.  
  16. 示例:

  生成随机验证码

  import random
  checkcode = ''
  for i in range(4):
    current = random.randrange(0,4)
    if current != i:
      temp = chr(random.randint(65,90))
    else:
      temp = random.randint(0,9)
    checkcode += str(temp)
  print checkcode

  1. 3、系统模块
  2. import os
  3. os.getcwd()
  4. os.chdir('dirname') #切换目录;
  5. os.chdir('/')
  6. os.curdir: 返回当前目录;
  7. os.mkedirs('dir/dir',exist_ok=True) #创建多级目录;
  8. os.removedirs('dirname') #删除目录
  9. os.listdirs('dirname') #列出当前目录下文件夹
  10. os.stat('zip_test.zip') #列出文件详细信息;
  11. os.stat('zip_test.zip').st_size #取出文件大小;
  12. os.sep #输出操作系统特定的路径分隔符;可动态拼路径;
  13. os.linesep #打印当前平台使用的行终止符;
  14. \r\n
  15. os.pathsep #分隔文件路径的字符串;
  16. os.name #输出字符串指示当前使用秤台;
  17. os.system('df') #运行命令;
  18. a = os.popen('df').read
  19. print(a)
  20. os.system只返回命令的执行结果的状态;
  21. os.popen('df').read #可以拿到命令的执行结果;
  22. os.path.abspath(__file__) #返回一个文件的绝对路径;
  23. os.path.split(path) #将path分割成目录和文件名二元组返回;
  24. print(os.path.split(file_path))
  25. os.path.dirname(file_path) #显示上一级目录名;
  26. print(os.path.dirname(file_path))
  27. os.system('ipconfig') #运行shell命令;
  28. os.path.basename(file_path) #取基名;
  29. os.path.exists(path) #判断是否存在;
  30. print(os.path.join('c:\/','programs','python27')) #路径的拼接;
  31.  
  32. 4、平台模块
  33. import platform
  34. platform.platform() #显示当前平台;
  35. platform.system() #判断是什么操作系统;
  36. Windows
  37.  
  38. 5sys模块
  39. import sys
  40. sys.argv
  41. sys.exit(n) #sys.exit() == exit()
  42. sys.exit('jfkldjsl') 参数的传入;
  43. sys.path #返回python的整个环境变量;
  44. sys.maxsize #最大的Int值;
  45. sys.platform #显示系统平台名称;
  46. sys.stdout(n) #标准输出到屏幕;
  47. print(sys.stdout('fjsdklj'))
  48.  
  49. a = sys.stdin.readline()
  50. print(a) 

6、用于序列化的两个模块

  • json,用于字符串 和 python数据类型间进行转换
  • pickle,用于python特有的类型 和 python的数据类型间进行转换

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

文件写入只能接受:字符串、bytes

序列化:pickle.dumps
内存 --》 字符串
反序列化:pickle.loads
字符串 --》 内存

  1. import pickle
  2. f = open('account.db','wb')
  3. print(pickle.dumps(account))
  4. f.write(pickle.dumps(account))
  5. f.close
  6.  
  7. f = open('account.db','rb')
  8. account=pickle.loads(f.read())
  9. print(account['id'])
  10.  
  11. import json
  12. 两个程序之间的内存不能共享;
  13. json只支持strintfloatsetdictlisttuple
  14. pickle只有python支持,只是适用于python自己的;
  15. json是一个通用的序列化的格式,可以在各开发程序中使用;

7、日志模块

  1. import logging
  2. 五个日志级别:
  3. debug()、info()、warning()、error()、critical()
  4. logging.warning
  5. logging.warning("user [alex] attempted wrong password more than 3 times")
  6. logging.critical("server is down")
  7.  
  8. logging.basiConfig(filename='example.log',level=logging.INFO) #达到level后写入文件;

  

python基础编程:生成器、迭代器、time模块、序列化模块、反序列化模块、日志模块的更多相关文章

  1. python基础(八)生成器,迭代器,装饰器,递归

    生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...

  2. python基础之生成器迭代器

    1 生成器: 为什么要有生成器? 就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止.如果我们要创建 ...

  3. python基础学习1-json,pickle的序列化和反序列化

    import requests import json dic={'k1':'v1'} print(dic,type(dic)) result = json.dumps(dic)#调用dumps方法把 ...

  4. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  5. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

  6. 十三. Python基础(13)--生成器进阶

    十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...

  7. 十二. Python基础(12)--生成器

    十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...

  8. 《Python编程第4版 下》高清PDF|百度网盘免费下载|Python基础编程

    <Python编程第4版 下>高清PDF|百度网盘免费下载|Python基础编程 提取码:tz5v 当掌握Python的基础知识后,你要如何使用Python?Python编程(第四版)为这 ...

  9. 《Python编程第4版 上》高清PDF|百度网盘免费下载|Python基础编程

    <Python编程第4版 上>高清PDF|百度网盘免费下载|Python基础编程 提取码:8qbi  当掌握Python的基础知识后,你要如何使用Python?Python编程(第四版)为 ...

随机推荐

  1. Data - 大数据分析学习之路

    一.大数据分析的五个基本方面 可视化分析 大数据分析的使用者有大数据分析专家,同时还有普通用户,但是他们二者对于大数据分析最基本的要求就是可视化分析,因为可视化分析能够直观的呈现大数据特点,同时能够非 ...

  2. 企业证书发布app到七牛云服务

    ---恢复内容开始--- 最近在做企业证书发布app,从申请企业证书,到测试程序发布到七牛云存储.整了几天终于实现了,整理一下资料. 1.首先,申请企业证书. 到苹果开发网站申请企业证书 https: ...

  3. 【POJ - 3262】Protecting the Flowers(贪心)

    Protecting the Flowers 直接中文 Descriptions FJ去砍树,然后和平时一样留了 N (2 ≤ N ≤ 100,000)头牛吃草.当他回来的时候,他发现奶牛们正在津津有 ...

  4. 某CTF比赛writeup

    看到群里别人参加比赛发上来的附件,自己尝试解了一下. 1.提示RSA,提供flag.enc和pub.key附件 一看就是解RSA,公钥分解得到n和e n=86934482296048119190666 ...

  5. 加入域之后,【Internet 时间】选项没有了

    这是加入域之前的截图,这时可以看见[Internet 时间]选项. 这是加入域之后的截图,这时就看不到[Internet 时间]选项了. 那这到底是为什么呢?别急,结合概念一看就明白啦. NTP全称网 ...

  6. D3 GEO应用专题(一):绘制旋转的3D地球

    https://gallery.echartsjs.com/explore.html#sort=rank~timeframe=all~author=all 雷达图 https://blog.csdn. ...

  7. XSS练习平台-XSS Challenges

    XSS Challenges http://xss-quiz.int21h.jp/   XSS基础不好的建议优先查看 关于XSS中使用到的html编码 js编码各种场景用法 http://su.xmd ...

  8. Redis(1.10)Redis主从复制下的哨兵模式

    [0]哨兵 sentinel 的作用 其概念参考:Redis高可用(理论篇) 中的[2] [0.1]监控:监控主从是否正常 [0.2]通知:出现问题时,可以通知相关人员 [0.3]故障转移:自动主从切 ...

  9. provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.

    通常情况下,要解决这个,你去SQL Server配置管理器(SSCM)和: [1]在SSCM中设置 [1.1]确保共享内存协议启用 [1.2]确保命名管道协议 [1.3]确保TCP / IP被启用,和 ...

  10. Linux软链接的创建,删除,修改

    Linux软链接,类似于windows系统的快捷键.譬如你将windows系统的D盘中某一个文件夹放在桌面上当做快捷键. 一.软链接创建 1.创建软链接 ln -s [目标目录] [软链接地址] [目 ...