本文共 5063 字,大约阅读时间需要 16 分钟。
'''异常情况3: try: 有可能有异常的代码 except 异常的类型1: pass else: 如果try中没有发生异常则进入的代码注意:如果使用else则在try代码中不能出现return'''
def func(): try: n1=int(input('输入数字:')) print(n1) return 1 except ValueError: print('必须是数字...') return 2 else: print('输入数字完毕!') #没有异常才会执行的代码块func()'''输入数字:44 #else不执行'''
虽然else不可到达,但能正常运行
'''异常情况4: try: pass except: pass finally: #报 不报 异常都会进入 pass数据库操作 close() 会放在finally中'''
def func(): stream=None try: stream = open(r'C:\Users\gszhu\Desktop\p1\aa.txt') container = stream.read() print(container) except Exception as err: print(err) finally: print('---finally---') if stream: stream.close()func()'''ab---finally---'''
报异常也会打印---finally---
def func(): stream=None try: stream = open(r'C:\Users\gszhu\Desktop\p1\aa.txt') container = stream.read() print(container) return 1 except Exception as err: print(err) return 2 finally: print('---finally---') if stream: stream.close() return 3x=func()print(x)'''ab---finally---3 #return 3 覆盖了 return 1 #报错也是返回3'''
没有return 3,收到的就是1
raise 抛出异常
#注册,用户名长度必须大于6位#系统没有异常,异常是根据自己需要定义的def register(): username=input('输入用户名:') if len(username)<6: raise Exception('用户长度必须6位以上!') #主动往外扔异常 else: print('输入的用户名是:',username)register()'''输入用户名:dException: 用户长度必须6位以上!(红色)'''
def register(): username=input('输入用户名:') if len(username)<6: raise Exception('用户长度必须6位以上!') #手动往外扔异常 else: print('输入的用户名是:',username)try: register()except Exception as err: print(err) print('注册失败!')else: print('注册成功')'''输入用户名:admin用户长度必须6位以上!注册失败!'''
主要是掌握四种情况的结构,在用别人代码的时候才需要用到
————————分割线————————
列表推导式
旧的列表--->新的列表
列表推导式格式
[表达式 for 变量 in 旧列表] 或者 [表达式 for 变量 in 旧列表 if 条件] --->新列表场景1 携带if条件
任务:过滤掉长度小于或者等于3的人名
names=['tom','lily','jack','tuo','taotao']result=[name for name in names if len(name)>3]print(result)'''列表推导式为了简化以下过程def func(names) newlist=[] for name in names: if len(name)>3: name= name.title() #每个单词的首字母大写 newlist.append(name) return newlist'''#新列表首字母大写result=[name.capitalize() for name in names if len(name)>3]print(result)#将1-100中能被3和5整除的数构成一个新的列表newlist=[i for i in range(1,101) if i%3==0 and i%5==0]print(newlist)'''['lily', 'jack', 'taotao']['Lily', 'Jack', 'Taotao'][15, 30, 45, 60, 75, 90]'''
进阶练习
#0-3的偶数,0-3的奇数#元组列表[(偶数,奇数),(),()...)] [(0,1),(0,3),(2,1),(2,3),...]newlist=[(x,y) for x in range(4) if x%2==0 for y in range(4) if y%2!=0]#后一个for嵌套在if判断里print(newlist)'''相当于def func(): newlist=[] for i in range(4): if i%2==0: for j in range(4): if j%2!=0: newlist.append((i,j)) return newlistx=func()print(x)''''''[(0, 1), (0, 3), (2, 1), (2, 3)]'''
场景2 直接推导,不带条件
#list1=[[1,2,3],[4,5,6],[7,8,9]]--->[1,2,3]list1=[[1,2,3],[4,5,6],[7,8,9]]newlist=[i[-1] for i in list1]print(newlist)'''[3, 6, 9]'''
场景3 携带if else结构
dict1={'name':'tom','salary':5000}dict2={'name':'lucy','salary':8000}dict3={'name':'jack','salary':6000}list1=[dict1,dict2,dict3]#如果薪资大于5000加200,低于等于5000加500newlist=[employee['salary']+200 if employee['salary']>5000 else employee['salary']+500 for employee in list1]print(newlist)'''[5500, 8200, 6200] #只改变薪资 没有在原列表做更改'''
集合推导式
形式同列表推导式,在列表推导式的基础上添加一个去重功能。 [ ]变为{ }
list1=[1,5,9,5,2,4,7,8,7]set1={x for x in list1}print(set1) #去重功能,集合不能有重复元素set1={x+1 for x in list1}print(set1)set1={x+1 for x in list1 if x>5}print(set1)'''{1, 2, 4, 5, 7, 8, 9}{2, 3, 5, 6, 8, 9, 10}{8, 9, 10}'''
字典推导式
dict1={'a':'A','b':'B','c':'C','d':'C'}newdict={value:key for key,value in dict1.items()}print(newdict)'''{'A': 'a', 'B': 'b', 'C': 'd'} #后面一个覆盖前面一个'''
两个同名的value,而字典里的关键字是唯一的,所以后面一个覆盖前面一个(俗称更新)
通过列表生成式(列表推导式),我们可以直接创建一个列表。但是受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元紊占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
创建生成器的方式:
1.通过列表推导式得到生成器 g=(表达式 for 变量 in 列表),此时g就是生成器
2.函数+yield
格式:def func():
...
yield
得到元素的方式:
1.利用next()函数 builtins,系统内置函数
2.生成器自带函数
_ _next_ _()
send()
#[0,3,6,...12] 得到0-4各自乘3后的数#方式1 通过列表推导式得到生成器newlist = [x*3 for x in range(5)]print(type(newlist))#得到生成器g=(x*3 for x in range(5))print(type(g))print(g) #打印g不会出现所有元素#通过调用__next__()方式得到元素print(g.__next__())print(g.__next__())#方式2:next()print(next(g))print(next(g))#每调用一次next则会产生一个元素'''at 0x000001EAA003E970>0369'''
注意:元素产生完毕,再次调生成器会报异常StopIteration
g=(x*3 for x in range(5))while True: try: e=next(g) print(e) except: print('没有更多元素') break'''036912没有更多元素'''
函数中出现yield关键字,函数不再是函数,而是变成生成器
yield= return n + 暂停
def func(): n=0 while True: n+=1 #print(n) yield ng=func()print(g)print(next(g))print(next(g))'''12'''
步骤:
1.定义一个函数,函数中使用yield关键字
2.调用函数,接受调用的结果
3.得到的结果是生成器
4.借助next(),_ _next_ _()得到元素 (_ _中间的空格要省略)
转载地址:http://mzegn.baihongyu.com/