zoukankan      html  css  js  c++  java
  • 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    一 三元表达式、列表推导式、生成器表达式

    一 三元表达式

    name=input('姓名>>: ')
    res='SB' if name == 'alex' else 'NB'    #把表达式的值写在if之前,else直接写另一返回值
    print(res)

    二 列表推导式,列表解析

    #1、示例
    egg_list=[]
    for i in range(10):
        egg_list.append('鸡蛋%s' %i)
    
    # 把上述三行合并成一行,简化代码。此方法数据太大这样内存会很卡。
    egg_list=['鸡蛋%s' %i for i in range(10)]      #两元表达式
    #['鸡蛋0','鸡蛋1','鸡蛋2','鸡蛋3','鸡蛋4','鸡蛋5','鸡蛋6','鸡蛋7','鸡蛋8','鸡蛋9']
    # 还可以加入if判断语句:egg_list=['鸡蛋%s' %i for i in range(10) if i>5]   # 三元表达式
    # 输出结果为 ['鸡蛋6','鸡蛋7','鸡蛋8','鸡蛋9']
    ##不可以再加一个else了,否则就成了四元表达式了。
    ###egg_list=['鸡蛋%s' %i for i in range(10) if i>5 else i+1] 这句就是错误的
    #2、语法 [expression for item1 in iterable1 if condition1 for item2 in iterable2 if condition2 ... for itemN in iterableN if conditionN ] 类似于 res=[] for item1 in iterable1: if condition1: for item2 in iterable2: if condition2 ... for itemN in iterableN: if conditionN: res.append(expression) #3、优点:方便,改变了编程习惯,可称之为声明式编程

    三 生成器表达式

    #1、把列表推导式的[]换成()就是生成器表达式
    
    #2、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性
    # 把列表解析的中括号变成圆括号 >>> chicken=('鸡蛋%s' %i for i in range(5)) >>> chicken <generator object <genexpr> at 0x10143f200>
    # 此表达式得到的结果与生成器函数的print(chicken)结果一样 >>> next(chicken)      # next本质就是就是调用_next_ '鸡蛋0'
    ###等价于print(chicken_next_()) >>> list(chicken) #因chicken可迭代,因而可以转成列表 ['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',] #3、优点:省内存,一次只产生一个值在内存中

    四 声明式编程练习题

    1、将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写

    2、将names=['egon','alex_sb','wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度

    3、求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数)

    4、求文件a.txt中总共包含的字符个数?思考为何在第一次之后的n次sum求和得到的结果为0?(需要使用sum函数)

    5、思考题

    with open('a.txt') as f:
        g=(len(line) for line in f)
    print(sum(g)) #为何报错?

    6、文件shopping.txt内容如下

    mac,20000,3
    lenovo,3000,10
    tesla,1000000,10
    chicken,200,1

    求总共花了多少钱?

    打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...]

    求单价大于10000的商品信息,格式同上

    复制代码
    #题目一
    names=['egon','alex_sb','wupeiqi','yuanhao']
    names=[name.upper() for name in names]
    
    #题目二
    names=['egon','alex_sb','wupeiqi','yuanhao']
    names=[len(name) for name in names if not name.endswith('sb')]
    
    #题目三
    with open('a.txt',encoding='utf-8') as f:
        print(max(len(line) for line in f))
    
    #题目四
    with open('a.txt', encoding='utf-8') as f:
        print(sum(len(line) for line in f))
        print(sum(len(line) for line in f)) #求包换换行符在内的文件所有的字符数,为何得到的值为0?
        print(sum(len(line) for line in f)) #求包换换行符在内的文件所有的字符数,为何得到的值为0?
    
    #题目五(略)
    
    #题目六:每次必须重新打开文件或seek到文件开头,因为迭代完一次就结束了
    with open('a.txt',encoding='utf-8') as f:
        info=[line.split() for line in f]
        cost=sum(float(unit_price)*int(count) for _,unit_price,count in info)
        print(cost)
    
    
    with open('a.txt',encoding='utf-8') as f:
        info=[{
            'name': line.split()[0],
            'price': float(line.split()[1]),
            'count': int(line.split()[2]),
        } for line in f]
        print(info)
    
    
    with open('a.txt',encoding='utf-8') as f:
        info=[{
            'name': line.split()[0],
            'price': float(line.split()[1]),
            'count': int(line.split()[2]),
        } for line in f if float(line.split()[1]) > 10000]
        print(info)
  • 相关阅读:
    SpeedPHP多入口设置 前台和后台入口分开
    php重定向 htaccess文件的编写
    SpeedPHP关于一对一和一对多关联关系的建立 model建立
    SpringMVC与Struts2关于controller线程安全问题
    编码问题 关于hibernate jdbc数据库连接在xml配置与在properties文件配置的差异
    SpringMVC可以配置多个拦截后缀*.html和.do等
    JavaSE replaceAll 方法
    Promise.race 的原理
    Promise.all 的原理
    标签联合
  • 原文地址:https://www.cnblogs.com/Josie-chen/p/8693600.html
Copyright © 2011-2022 走看看