zoukankan      html  css  js  c++  java
  • python3 发生器 迭代器 内置函数 协程 哈哈我又回来啦

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

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

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

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

    生成器 generator

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

    单线程并发效果  也叫 协程

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

    迭代器 

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

    内置函数

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