学过python的都知道if和else搭配使用,可还有几种else的用法少有人知,下面说说这几种少有人知的else用法。
for和else
for可以和else搭配使用,for循环代码块正常完成后执行else代码块,若在for循环代码块中执行了break那么else代码块不会被执行。
代码案例:
某果园有销售数据如下:
sell_list = [ {'客户': '张三', '种类': '苹果','数量':100}, {'客户': '李四', '种类': '苹果','数量':200}, {'客户': '李四', '种类': '香梨','数量':200}, {'客户': '李四', '种类': '香梨','数量':300}, {'客户': '张三', '种类': '苹果','数量':100}, {'客户': '王五', '种类': '香蕉','数量':500}, {'客户': '王五', '种类': '香蕉','数量':150}, {'客户': '王五', '种类': '香蕉','数量':150}, {'客户': '王五', '种类': '苹果','数量':500}, {'客户': '赵六', '种类': '葡萄','数量':300}, {'客户': '李四', '种类': '葡萄','数量':300}, {'客户': '赵六', '种类': '苹果','数量':300}, ]
客户希望对数据进行整理,期待得到的数据集格式类似如下这样:
result_list = [ ['张三', {'苹果': 300, '香蕉': 200, }], ['李四', {'苹果': 100, '香蕉': 200, }], ['王五', {'苹果': 100, '香蕉': 200, }], ]
代码:
def merge_by_for(table): result = [] for i in table: for j in result: if j[0] == i['客户']: if i['种类'] not in j[1]: j[1][i['种类']] = i['数量'] else: j[1][i['种类']] = j[1][i['种类']] + i['数量'] break else: re([i['客户'], {i['种类']: i['数量'], }]) return result sell = merge_by_for(sell_list) for i in sell: print(i)
输出:
['张三', {'苹果': 200}] ['李四', {'苹果': 200, '香梨': 500, '葡萄': 300}] ['王五', {'香蕉': 800, '苹果': 500}] ['赵六', {'葡萄': 300, '苹果': 300}]
说明:
在上述代码中运用了for和else的组合。在for i in table中遍历列表;在for j in result中遍历result列表,假设for j in result正常结束(若result为空时也算正常结束)那么会执行re([i[‘客户’], {i[‘种类’]: i[‘数量’], }]),表示在reslut列表中添加一条记录;在for j in result内部判断当前记录客户是否和table中的客户同名,若同名则且种类存在累加数量,若同名且种类不存在则新建该种类,之后跳出循环且包括for的else部分。
在这个案例中可以看到通过for和else的精妙配合的效果,各位可以尝试不用for和else的结构写一遍,那样会多好几行代码。
while和else
while和else也可以搭配使用,while循环代码块正常完成后执行else代码块,若在while循环代码块中执行了break那么else代码块不会被执行。
上述案例中写成while和else版本的代码:
def merge_by_while(table): result = [] for i in table: j = 0 length = len(result) while j < length: if result[j][0] == i['客户']: if i['种类'] not in result[j][1]: result[j][1][i['种类']] = i['数量'] else: result[j][1][i['种类']] = result[j][1][i['种类']] + i['数量'] break j += 1 else: re([i['客户'], {i['种类']: i['数量'], }]) return result sell = merge_by_while(sell_list) for i in sell: print(i)
说明:
上述代码运行结果与for和else的版本完全一致,但while循环要多写2-3行代码,没有for循环方便。
try、except和else
try、except和else也可以搭配,而且同样少有人知道。try尝试执行可能报错的代码;except截取指定类型的报错,若截取成功则执行except内部的代码块;else指未发生报错时要执行的代码块。
代码:
try: f = open(';, mode='r') # 尝试只读模式打开文件 except FileNotFoundError: # 捕获文件不存在的报错 print('文件不存在,新建文件!') # 打印文件不存在的提示 f = open(';, mode='w') # 新建文件 else: prin()) # 假如没报错,会执行该语句,打印f文件;如果报错则该语句不会被执行
说明:
try代码块中的代码应该尽可能地少,它是为了尝试执行可能会报错的代码并用except语句捕获和用except代码块进行处理;else代码块是在try代码块执行时未报错后执行的,若try代码块执行时报错了则else代码块不会被执行。