三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

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

一 三元表达式

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)

posted on 2018-04-02 23:14  Josie_chen  阅读(276)  评论(0编辑  收藏  举报

导航