博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
笔记(十七)
阅读量:3934 次
发布时间:2019-05-23

本文共 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/

你可能感兴趣的文章
ant + svn 自动部署项目
查看>>
TCP/IP,http,socket,长连接,短连接
查看>>
java对html转移的语言反编译-org.apache.commons.lang3包有个StringEscapeUtils
查看>>
PostgreSQL 9.5 连接redis及其使用
查看>>
redis_fdw使用简介
查看>>
python在Eclipse中集成pydev,以及window安装settools、requests
查看>>
MySQL中的日期计算unix_timestamp
查看>>
redis的消息订阅/发布总结
查看>>
分布式开放消息系统(RocketMQ)介绍
查看>>
(转) RocketMQ与Kafka对比(18项差异)
查看>>
在Windows下搭建RocketMQ
查看>>
Kryo:快速、高效的序列化框架
查看>>
spring抛出BeanCreationException之@Autowired,@Qualifier
查看>>
Intellij IDEA 快捷键整理
查看>>
idea的基本Debug调试
查看>>
TCP: time wait bucket table overflow解决方法
查看>>
springmvc常用注解标签详解
查看>>
ffmpeg基本用法(转)介绍
查看>>
Java通过调用FFMPEG获取视频时长(已测试)
查看>>
java.lang.ProcessBuilder类(系统进程)
查看>>