PYTHON-列表推导式「建议收藏」

PYTHON-列表推导式「建议收藏」1.列表推导式基本格式:[表达式for变量in旧列表]或者[表达式for变量in旧列表if条件]第一个表达式表示最终需要得到的形式#过滤长度小于等于3的人名names=[‘tom’,’lily’,’jack’,’bob’,’haha’]result=[namefornameinnamesiflen(name)>3]print(result)result=[name.capitalize()fo

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1.列表推导式

基本格式:[表达式 for 变量 in 旧列表] 或者 [表达式 for 变量 in 旧列表 if 条件]
第一个表达式表示最终需要得到的形式

# 过滤长度小于等于3的人名
names = ['tom','lily','jack','bob','haha']

result = [name for name in names if len(name) > 3]
print(result)

result = [name.capitalize() for name in names if len(name) > 3]  #capitalize()所有单词首字母大写
print(result)
----------------------------------------------------
['lily', 'jack', 'haha']
['Lily', 'Jack', 'Haha']

Jetbrains全家桶1年46,售后保障稳定

携带if条件

#0~5 偶数 0~9 奇数 构成列表
result = [(x,y) for x in range(5) if x%2 == 0 for y in range(10) if y%2 != 0]  #可以嵌套for循环
print(result)
-------------------------------------------------
[(0, 1), (0, 3), (0, 5), (0, 7), (0, 9), (2, 1), (2, 3), (2, 5), (2, 7), (2, 9), (4, 1), (4, 3), (4, 5), (4, 7), (4, 9)]

没有if 条件,注意 i 代表列表

list1 = [[2,5,3],[2,5,6],[3,8,9],[7,8,5]]
list2 = [i[-1] for i in list1]
print(list2)
-----------------------------------------------------
[3, 6, 9, 5]

if…else

dict1 = { 
   'name':'lili','salary':5000}
dict2 = { 
   'name':'lyly','salary':4000}
dict3 = { 
   'name':'tom','salary':3500}
dict4 = { 
   'name':'jack','salary':8000}
list1 = [dict1,dict2,dict3,dict4]
newlist = [{ 
   'name':dict['name'],'salary':dict['salary']+300} if dict['salary']>5000 else { 
   'name':dict['name'],'salary':dict['salary']+800} for dict in list1]
print(newlist)  #dict 表示取出对应键的值,运用dict把更改后的salary在原字典中进行更新
----------------------------------------------------
[{ 
   'name': 'lili', 'salary': 5800}, { 
   'name': 'lyly', 'salary': 4800}, { 
   'name': 'tom', 'salary': 4300}, { 
   'name': 'jack', 'salary': 8300}]

2.集合推导式

{}类似于列表推导式,在列表推导式的基础上添加一个去除重复项

list1 = [1,2,1,2,5,6,8,9,8,7,9]
set1 = { 
   x for x in list1 if x>5}
print(set1)
----------------------------------------------------
{ 
   8, 9, 6, 7}

3.字典推导式

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'}

4.生成器

通过列表生成式(列表推导式),我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的。而且,我们创建一个包含100万个元素的列表,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在python中,这种一边循环一边计算的机制,成为生成器:generator。
得到生成器的方式:
1.通过列表推导式得到生成器
[] 是列表推导式,()是生成器

g = (x*3 for x in range(20))
print(type(g))
------------------------------------------------
<class 'generator'>

通过使用g.next()方式得到元素,或者使用next(g)得到元素,每调用一次则会产生一个元素。
若生成器产生的元素用完,继续调用则会抛出异常StopIteration
利用try…except的方式解决异常

g = (x*3 for x in range(10))
while True:
    try:
        e = next(g)
        print(e)
    except:
        print('没有更过元素了')
        break

2.借助函数完成
只要函数中出现了yield关键字,说明函数就不是函数了,是一个生成器,借助于next(),next()得到元素

def func():
    n = 0
    while True:
        n += 1
        yield n

g = func()
print(g)  # generator
print(next(g))

斐波那契数列

def fib(length):
    n=0
    a,b=0,1
    while n < length:
        yield b    #return b 并且暂停
        a,b = b,a+b
        n+=1
    return '没有更多元素'   #当while循环执行完之后,返回return的值
g = fib(8)
print(next(g))

send 方法 和__next__()一样 都可以让生成器执行到下一个yield,send可以向yield的位置传递参数,向每次生成器调用中传值,不能给最后一个yield发送值 会报错,第一次执行函数是不能用send,第一次调用sned(None)

5.生成器的应用

进程 > 线程 > 协程
概念:比如迅雷下载1.0G的电影,叫做进程,然后迅雷将1.0G的电影按顺序分为10份,这10份叫做线程,然后其中的一份再分为5份,每一份就叫做协程。

def task1(n):
    for i in range(n):
        print("正在搬第{}块砖!".format(i))
        yield None
def task2(n):
    for i in range(n):
        print("正在听第{}首歌!".format(i))
        yield None
g1 = task1(6)
g2 = task2(6)
while True:
    try:
        g1.__next__()
        g2.__next__()
    except:
        break
# 交替输出

6.迭代器

可迭代的对象:生成器、元组、列表、集合、字典、字符串
如何判断一个对象是否可迭代?

from collections import Iterable
list1 = [1,4,5,6,8]
f = isinstance(list1,Iterable)
print(f)  #True

生成器是可迭代的,并且是迭代器;列表是可迭代的,但不是迭代器。
迭代器只能往前不能往后
可以被next()函数调用,不断返回下一个值得对象称为迭代器:Iterator。

list1 = [1,4,5,6,8]
list1 = iter(list1)
print(next(list1))

通过iter()函数将可迭代的变成一个迭代器

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203666.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python deepcopy_python中的深拷贝(deepcopy)和浅拷贝(copy)介绍及代码参考「建议收藏」

    python deepcopy_python中的深拷贝(deepcopy)和浅拷贝(copy)介绍及代码参考「建议收藏」在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。以下分两个思路来分别理解浅拷贝和深拷贝:(1)利用切片操作和工厂方法list方法拷贝(2)利用copy中的deepcopy方法进行拷贝1、利用切片操作和工厂方法list方法拷贝代码场景:有一个小伙jack,tom通过切片操作拷贝jack,anny通…

    2022年10月2日
    0
  • 计算机网络协议(三)——UDP、TCP、Socket[通俗易懂]

    计算机网络协议(三)——UDP、TCP、Socket[通俗易懂]底层网络知识详解:最重要的传输层概述一、UDP协议二、TCP协议2.1TCP的三次握手概述这个专栏的计算机网络协议,我是在极客时间上学习已经有三万多人购买的刘超老师的趣谈网络协议专栏,讲的特别好,像看小说一样学习到了平时很枯燥的知识点,计算机网络的书籍太枯燥,感兴趣的同学可以去付费购买,绝对物超所值,本文就是对自己学习专栏的总结,评论区可以留下你的问题,咱们一起讨论!传输层中有两…

    2022年6月7日
    48
  • 搭建SDN网络——mininet[通俗易懂]

    好久没来写不博客,感觉自己不写写博客,就完全想不起当天干了什么。前几天参加了小米的面试,整个人被打击的不行,还是要好好学习,不然工作都找不到。这学期选了SDN的课,只有六周,学完有点懵,这这这等于什么都没学呀。难过。官网给出了四种搭建mininet的方法。我试了前两种第一种是直接下载mininet虚拟机,然后用virtualbox导入。老师在课程网上上传了64位的mininet…

    2022年4月11日
    215
  • 线程的用户态和内核态_缺页发生在用户态还是内核态

    线程的用户态和内核态_缺页发生在用户态还是内核态(1)用户态和内核态的概念?—>内核态:CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡.CPU也可以将自己从一个程序切换到另一个程序—>用户态:只能受限的访问内存,且不允许访问外围设备.占用CPU的能力被剥夺,CPU资源可以被其他程序获取(2)为什么需要用户态和内核态?—>由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,…

    2022年9月18日
    0
  • 手把手撸个博客网站

    手把手撸个博客网站node-webserver-blog-public源码地址博客地址CSDN运行项目前必读三个项目中各种各样的授权参数已全部修改成自己的授权参数,忘悉知!!!!忘悉知!!!!忘悉知!!!!自己创建一个数据库名称就可以了,表是运行node时候自动创建好以myblog3为数据库名称,admin登录页面有个一键生成地方生成账号:admin密码:123,只能生成一次,因…

    2022年7月14日
    9
  • 为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?

    为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。一、事件起因关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看…

    2022年10月20日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号