zoukankan      html  css  js  c++  java
  • 函数(六)——生成器,面向过程编程,三元表达式,生成式,内置函数

    今日内容概要:

    一、生成器(掌握)

    二、面向过程编程(重点)

    三、三元表达式(重点)

    四、生成式(重点)

    五、内置函数(掌握)

    内容详解:

    一、生成器

    生成器:就是一种自定义的迭代器,是用来返回多次值
    自定义迭代器的好处:节省内存
    return只能返回一次值,函数就立即结束了
    yield
    1、可以挂起函数,保存函数的运行状态
    2、可以用来返回多次值
    如何得到生成器(自定义的迭代器):
    函数内但凡存在yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是我们自定义的生成器
    def func():
        print('111')
        yield 1, 2
        print('222')
        yield
        print('333')
        yield 3
        print('444')
    
    
    # 如何得到生成器(自定义的迭代器):
    #     函数内但凡存在yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是我们自定义的生成器
    
    
    g = func()#必须要运行fun()后才会有下面其他执行
    print(g) #打印出来<generator object func at 0x00000000022DA890>  generator说明产生一个生成器
    
    g.__iter__()
    g.__next__()#迭代器对象运行后打印 111
    
    res1 = next(g)#打印222
    print(res1)# 返回yield 的返回值 None
    
    res2 = next(g)#打印333
    print(res2)# 返回yield 的返回值3
    
    res3 = next(g)#打印444后报错
    # print(res3)
    
    next(g)#报错
    示范一:
    def my_range(start, stop, step=1):
        while start < stop:
            yield start
            start += step
    
    g=my_range(1,5)
    print(next(g))#1
    print(next(g))#2
    print(next(g))#3
    print(next(g))#4
    print(next(g))#报错
    
    
    示范二:
    def my_range(start, stop, step=1):
        while start < stop:
            yield start
            start += step
    for i in my_range(1,5000):
        print(i)#打印出1到4999不会报错

    二、面向过程编程

    1、编程思想就是编写程序的套路,与具体的技术点无关
    2、面向过程
    核心是过程二字,过程就是解决问题的步骤,即先干啥、再干啥、后干啥
    基于面向过程编程就好比在设计一条条的流水线

    优点:将复杂的问题流程化、进而简单化
    缺点:所有环节耦合到一起,环环相扣,如果要修改某个环境,有可能会牵一发而动全身,扩展性差
    ps:函数编程,不是面向过程编程,因为函数是技术点,二编程与具体技术点无关

    三、三元表达式

    传统:
    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    
    
    res=max2(1,2)
    print(res)
    三元表达式:
    x=1
    y=2
    
    res=x if x > y else y
    print(res)
    #res=条件成立时返回的值 if 条件 else 条件不成立时的返回值

    四、生成式

    1、列表生成式
    传统:
    l=[]
    for i in range(11):
        if i > 3:
            l.append("x")
    print(l)
    列表生成式:
    l = ["x" for i in range(11) if i > 3]
    print(l)
    # 示范1:
    names = ["egon_nb", "lxx_sb", "猴子_sb", "jason_sb"]
    """
    传统:
    l=[]
    for name in names:
        if name.endswith("sb"):
            l.append(name)
    """
    l = [name for name in names if name.endswith("sb")]
    print(l)
    # 示范2:
    names = ["lxx", "猴子", "jason"]
    print([name+"_sb" for name in names])
    2、字典生成式
    dic = {"name": "egon", "age": 18, "gender": "male", "level": 10}
    
    new_dic = {k.upper(): v for k, v in dic.items() if k != "level"}
    print(new_dic)#{'NAME': 'egon', 'AGE': 18, 'GENDER': 'male'}
    
    new_dic = {k+"_": str(v) for k, v in dic.items() if k != "level"}
    print(new_dic)#{'name_': 'egon', 'age_': '18', 'gender_': 'male'}
    3、集合生成式
    s = {i for i in "hello" if i != "l"}
    print(s)#{'e', 'h', 'o'}
    4、生成器表达式
    res = (i for i in range(5))
    print(res)#<generator object <genexpr> at 0x000000000230A890>说明生成了一个迭代器
    
    print(next(res))#0
    print(next(res))#1
    print(next(res))#2
    print(next(res))#3
    print(next(res))#4
    print(next(res))#报错

    五、内置函数

    1、abs 取绝对值

    print(abs(-1))#1
    print(abs(1))#1

    2、all()

    2.1、传入的可迭代对象取出的值,全真则真,一假则假
    2.2、如果传入的可迭代对象取不出任何值,默认返回True
    print(all([1,1,1,True,"abc"]))#True
    print(all([1,"",1,True,"abc"]))#False
    print(all([]))#True

    3、any()

    3.1、传入的可迭代对象取出的值,一真则真,全假才假
    3.2、如果传入的可迭代对象取不出任何值,默认返回False
    print(any([0,None,False,"",1]))#True
    print(any([]))#False

    4、callable   

    def func():
        pass
    print(callable(func))#True
    print(callable(len))#True
    print(callable(10))#False
    
    print(bin(11))  # 0b1011
    print(oct(11))  # 0o13
    print(hex(11))  # 0xb

    5、chr与ord   ASCII码中英文与数字转换

    print(ord("a"))
    print(chr(97))

    6、divmod 取商和余数

    print(divmod(10,3))#(3, 1)

    7、enumerate 对应位  取值

    #列表
    l=[111,222,333]
    for i,item in enumerate(l): #i,item=(0,111)  对应位 取值
        print(i,item) # 0 111   1 222  2 333
    #字典
    for i,item in enumerate({"k1":111,"k2":222}): #i,item=(0,111)  对应位 取值
        print(i,item)  #0 k1  1 k2
  • 相关阅读:
    P2207 Photo
    P1022 计算器的改良
    P1003 铺地毯
    P3014 [USACO11FEB]牛线Cow Line && 康托展开
    P4180 【模板】严格次小生成树[BJWC2010]
    P2776 [SDOI2007]小组队列
    P2426 删数
    P1948 [USACO08JAN]电话线Telephone Lines
    P1978 集合
    P1564 膜拜
  • 原文地址:https://www.cnblogs.com/guojieying/p/13184162.html
Copyright © 2011-2022 走看看