经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
python3 发生器 迭代器 内置函数 协程 哈哈我又回来啦
来源:cnblogs  作者:晓风小峰  时间:2019/4/1 8:59:02  对本文有异议

唉 犯傻了,干了一件虽有一点点道理的事情,但是却完全没有效果,我是不是傻,浪费了这么多时间在一件不可能的事情上,果然效果比道理更重要。。。

被一些琐事耽搁几天,python的学习都给我停了,擦!不过一切都结束了,我又回来学习python喽  先来个小知识点:

导入模块是字符串名字咋办? 用__import__("name")

今天的内容如下草稿,NLP今天就不抄了,碎觉碎觉。

生成器 generator

  1. 1 #!usr/bin/env/ python
  2. 2 # -*- coding:utf-8 -*-
  3. 3 # Author: XiaoFeng
  4. 4
  5. 5
  6. 6 def func(i):
  7. 7 i = (i + 2)*3
  8. 8 return i
  9. 9
  10. 10
  11. 11 # 列表生成式
  12. 12 list_test = [func(i) for i in range(5)] # 这还不是生成器 只是列表 数据式全部计算完了再打印
  13. 13 print(list_test)
  14. 14
  15. 15 # 生成器 generator 把列表生成式的中括号改成小括号就是一种生成器的表达方式了
  16. 16 list_test2 = (func(i) for i in range(5)) # 生成就是要用就用现有的数据生成下一个
  17. 17 print(list_test2)
  18. 18 # print(list_test2.__next__()) # generator 有且只有一个用法:list,__next__()返回下一个值
  19. 19 # print(list_test2.__next__()) # 一般用for循环来输出
  20. 20 # print(list_test2.__next__()) # 生成器的用处就在于 想用的时候就生成数据 类似于中断一样
  21. 21 # print(list_test2.__next__())
  22. 22 # print(list_test2.__next__())
  23. 23 # print(list_test2.__next__()) # 这里再多来一个next就抛出异常了 因为超过了5个
  24. 24 for i in list_test2: # 这里通过循环的方式输出就没事儿。。。不用担心超出5个
  25. 25 print(i)
  26. 26
  27. 27
  28. 28 # 来个斐波拉契数列
  29. 29 def fib(max_f):
  30. 30 n, a, b = 0, 0, 1
  31. 31 while n < max_f:
  32. 32 # print(b)
  33. 33 yield b # 用关键字yield就能让函数变为生成器 类似中断 从这里出去
  34. 34 a, b = b, a+b # 相当于元组(a, b) 然后b,a+b分别赋值 或者说先执行右边,再赋给左边
  35. 35 n += 1 # 即先算b 还有a+b 算好了以后再把结果 赋给a,b 与a=b b=a+b不一样
  36. 36 return "done"
  37. 37
  38. 38
  39. 39 fib(6)
  40. 40 print(fib(6)) # 看看生成器长啥样
  41. 41 for i in fib(6): # 调用生成器输出
  42. 42 print(i) # 然而没得返回值。。。 假的吧
  43. 43
  44. 44 # 试试一个一个的输出
  45. 45 # f = fib(6)
  46. 46 # print(f.__next__())
  47. 47 # print(f.__next__())
  48. 48 # print(f.__next__())
  49. 49 # print(f.__next__())
  50. 50 # print(f.__next__())
  51. 51 # print(f.__next__())
  52. 52 # print(f.__next__()) # 超了6个 抛出异常 返回 StopIteration: done 那就捕获异常来得到返回值
  53. 53
  54. 54
  55. 55 t = fib(6) # 生成器t
  56. 56 while True:
  57. 57 try: # 第一次next会进入生成器t执行 然后碰到yield就出来 后面的next会直接进入yield 接着执行然后碰到yield再出来
  58. 58 x = next(t) # next() 会返回迭代器的下一项。。。 和__next__()一样 利用next() 回到yield
  59. 59 print(x)
  60. 60 except StopIteration as e: # 之前抛出的异常 StopIteration: done 可以理解为字典。。。
  61. 61 print(e.value)
  62. 62 break

单线程并发效果  也叫 协程

  1. 1 #!usr/bin/env/ python
  2. 2 # -*- coding:utf-8 -*-
  3. 3 # Author: XiaoFeng
  4. 4 import time
  5. 5
  6. 6
  7. 7 def consumer(name):
  8. 8 print("%s准备吃包子啦!" % name)
  9. 9 while True:
  10. 10 baozi = yield # 这是出入口
  11. 11 print("包子\033[31;1m[%s]\033[0m来了,被[%s]吃了一半!" % (baozi, name))
  12. 12
  13. 13
  14. 14 def producer(name):
  15. 15 c_1 = consumer("A")
  16. 16 c_2 = consumer("B")
  17. 17 c_1.__next__() # 执行到yield
  18. 18 c_2.__next__() # 执行到yield
  19. 19 print("\033[41;1m我开始做包子啦!\033[0m")
  20. 20 for i in range(10):
  21. 21 time.sleep(2)
  22. 22 print("两个热包子出炉喽!")
  23. 23 c_1.send(i) # 直接找到yield并赋值给他
  24. 24 c_2.send(i) # 直接找到yield并赋值给他
  25. 25
  26. 26
  27. 27 producer("xiaofeng")

迭代器 

  1. 1 #!usr/bin/env/ python
  2. 2 # -*- coding:utf-8 -*-
  3. 3 # Author: XiaoFeng
  4. 4 from collections.abc import Iterable
  5. 5 from collections.abc import Iterator
  6. 6
  7. 7
  8. 8 print(isinstance((i+2 for i in range(10)), Iterable)) # 判断是否可迭代
  9. 9 print(isinstance((i+2 for i in range(10)), Iterator)) # 判断是否是迭代器
  10. 10 # 事实证明list tuple dict set str可迭代 但不是迭代器
  11. 11 print(isinstance("str", Iterable))
  12. 12 print(isinstance("str", Iterator))
  13. 13 # 将他们转为迭代器 使用iter()函数
  14. 14 print(isinstance(iter("str"), Iterator))
  15. 15 print(iter("str").__next__())
  16. 16 print("--" * 10)
  17. 17 print(next(iter("str")))

内置函数

  1. 1 #!usr/bin/env/ python
  2. 2 # -*- coding:utf-8 -*-
  3. 3 # Author: XiaoFeng
  4. 4
  5. 5 print(dir([])) # 查看能用什么方法
  6. 6 print(all({0, 1, 2})) # 列表元组字典(键)集合 内的所有元素做 与运算
  7. 7 print(any({0: "0", "a": "3"})) # 做或运算
  8. 8 print(bin(0x13)) # 转二进制 0b二进制
  9. 9 print(oct(0b1111)) # 转八进制 0o八进制
  10. 10 print(hex(0o17)) # 转十六进制 0x十六进制
  11. 11 print(bool([])) # 布尔运算 非零即真 空即False
  12. 12 # 以二进制形式改字符串。。。不知道有啥用
  13. 13 d = bytearray("qwer",encoding="utf-8")
  14. 14 print(d)
  15. 15 print(d[2])
  16. 16 d[1] = 101
  17. 17 print(d)
  18. 18
  19. 19 print(ascii([1, 2, 3])[0]) # 把括号内所有内容都变成字符串
  20. 20 print(callable(d)) # 判断能否调用
  21. 21 print(chr(90), ord("Z")) # ascii码转换
  22. 22 print(divmod(10, 4)) # 10/4 商2 余2
  23. 23 print(eval("1 + 2")) # 执行简单字符串转为代码
  24. 24 print("---" * 5)
  25. 25 act = """
  26. 26 for i in range(4):
  27. 27 print(i)
  28. 28 """
  29. 29 exec(act) # 将复杂字符串转换为代码
  30. 30 print("---" * 5)
  31. 31 res = filter(lambda n: n > 5, range(10)) # filter用作筛选过滤一组数据
  32. 32 for i in res:
  33. 33 print(i)
  34. 34
  35. 35 frozenset({1, 2, 3, 4}) # 变为不可变集合
  36. 36 print(globals(), locals()) # 打印当前文件全部全局变量 , 局部变量 以字典的方式
  37. 37 a = "2"
  38. 38 print(id(a)) # 查看地址
  39. 39 print(hash(a)) # 查看a的哈希映射
  40. 40 print(max(1, 2, 4), min(1, 2, 4))
  41. 41 print(repr(["w", "e", "e"])[0]) # 将括号里内容变为字符串
  42. 42 print(round(3.1415926, 2)) # 保留几位小数
  43. 43 a = {0: "6", 1: "4", 3: "1"}
  44. 44 print(sorted(a))
  45. 45 print(sorted(a.items())) # 按键排序
  46. 46 print(sorted(a.items(), key=lambda x: x[1])) # 按值排序
  47. 47 x = [1, 2, 3]
  48. 48 y = ["a", "s", "d"]
  49. 49 for i in zip(x, y): # 拉链
  50. 50 print(i)

 

原文链接:http://www.cnblogs.com/xf1262048067/p/10629849.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号