zoukankan      html  css  js  c++  java
  • 生成器,迭代器,列表生成式,随机数

    1.生成器  

    1.1                                                                        2016-09-22   18:52:55

    生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个
    可用于生成连续x值的生成器【Generator】,简单的说就是在函数的执行过程中,
    yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候
    又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。
    1 s=[x*2 for x in range(100)]
    2 print(s)
    3 l=[1,2,3]
    4 a=l[1]
    5 b=l[2]
    6 print(a)
    7 print(b)

    1.1   生成器一共2种创建方式

       (1) (x*2 for i in range(5))

        (2) yield

    1.1.1首先我们来看一个例子

    s=(x*2 for x in range(100))
    print(s)               #<generator object <genexpr> at 0x000000E30D087888>   这是一个生成器对象,现在拿到的仅仅是一个对象,值取不到,要取值的话可以这样
    s=[x*2 for x in range(100)]
    l=[1,2,3]
    a=l[1]
    b=l[2]
    print(a)
    print(b)
     1 # s=(x*2 for x in range(5))
     2 #
     3 # print(s)    #<generator object <genexpr> at 0x0000000000A0C0F8>
     4 # print(next(s)) # 等价于s.__next__()                               in Py2:  s.next()因为有好多公司还是用的2版本
     5 # print(next(s))
     6 # print(next(s))
     7 # print(next(s))
     8 # print(next(s))
     9 
    10 # print(next(s))#        只有5个超过就会报错 StopIteration

    生成器就是一个可迭代对象

    #生成器就是一个可迭代对象(Iterable)
    # s=(x*2 for x in range(5))
    # for i in s:
    #     print(i)      第一次 打印的i是0,但是第二次打印的时候 第一次的i就被当成垃圾处理了,就是一次只有一个i

    关于这一块 我有点迷糊,后续会补充

    def foo():
        print('ok')
    
        yield 1
        print('ok2')
        yield  2
        return None
    
    g=foo()
    print(g)#<generator object foo at 0x0000000000B3D0A0>
    
    a=next(g)
    b=next(g)
    print(a,b)
    #next(g)
    
    # for i in foo():
    #     while True:
    #         i=next(foo())
    #
    #     print(i)

    1.1.2可迭代对象

     1 #什么是可迭代对象(对象拥有iter方法的成为可迭代对象)
     2 l=[1,2,3]
     3 l.__iter__()
     4 
     5 t=(1,2,3)
     6 t.__iter__()
     7 
     8 d={'name':'123'}
     9 d.__iter__()
    10 
    11 for i in [1,2,3]:
    12     print(i)

    1.1.3  来看一下菲波那切数列的 一个例子

     1 # 0 1 1 2 3 5 8 13 21
     2 def fib(max):
     3     n, before, after = 0, 0, 1
     4     while n < max:
     5         print(before)
     6         #yield before
     7         before,after=after,before+after
     8         n = n + 1
     9 g=fib(8)
    10 print(g)#<generator object fib at 0x0000000000B3D0A0>
     1 # def bar():
     2 #     print('ok1')
     3 #     count=yield 1
     4 #     print(count)
     5 #
     6 #     yield 2
     7 #
     8 # b=bar()
     9 # # b.send(None)#next(b)  第一次send前如果没有next,只能传一个send(None)
    10 # next(b)
    11 # # print(s)
    12 # ret=b.send('eeee')
    13 # print(ret)

      (2) yield伪并发

     1 import time
     2 
     3 # def consumer(name):
     4 #     print("%s 准备吃包子啦!" %name)
     5 #     while True:
     6 #        baozi = yield
     7 #
     8 #        print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
     9 
    10 
    11 # def producer(name):
    12 #     c = consumer('A')
    13 #     c2 = consumer('B')
    14 #     c.__next__()
    15 #     c2.__next__()
    16 #     print("alex开始准备做包子啦!")
    17 #     for i in range(10):
    18 #         time.sleep(1)
    19 #         print("做了2个包子!")
    20 #         c.send(i)
    21 #         c2.send(i)
    22 # producer("alex")

    3.列表生成式

    def f(n):
        return n**3
    
    a=[f(x) for x in range(10)]
    
    print(a)
    print(type(a))
    结果显示为:
    [0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
    <class 'list'>
    1 t=['123',8]
    2 a,b=t
    3 a=t[0]
    4 b=t[1]
    5 print(a)
    6 print(b)
    结果为:
    123
    8

    4.  随机数(random)

    4.1  生成随机数

    1 import random
    2 print(random.random())   显示结果为:
    0.4752407699919545

    4.2

    import random
    print(random.randint(1,8))#  这里是包括8的  产生一个1到8之间随机的整数
    print(random.randrange(1,3))#这里是不包括3的

    4.3

    import random
    print(random.choice("hello"))#产生这个字符的一个随机字母
    print(random.choice([[1,23],1,5])) # 产生这个列表中的随机一个值
    print(random.sample(['123',4,[1,2]],2)) #随机取出2个元素

    4.4  产生一个5位的验证码(字母加数字)

     1 def v_code():
     2     code=''
     3     for i in range(5):
     4         add=random.choice([random.randrange(10),chr(random.randrange(65,91))])
     5         # if i==random.randint(0,3):
     6         #     add = random.randrange(10)
     7         #
     8         # else:
     9         #     add=chr(random.randrange(65,91))
    10         code+=str(add)
    11     print(code)
    12 v_code()
    结果为:随机一个
    FR2HN

  • 相关阅读:
    短信发送流程
    aidl
    tail
    RIL层传输的方式就是socket
    adb s <设备> <命令>
    Shell
    你好,色彩 android:background="@color/white" [create file color.xml at res/values/]
    [C#]在C#中使用NUnit进行单元测试
    [ASP.NEt] IE6布署NET网站时,Oracle 抛出异常
    [ASP.NET]如何Response.Redirect新的页面到指定的框架中(原创)
  • 原文地址:https://www.cnblogs.com/mars527/p/5893832.html
Copyright © 2011-2022 走看看