一 三元表达式、列表推导式、生成器表达式
一 三元表达式
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)