#科研筑基# python初学自用笔记 第六篇 高级特性

news2024/9/20 14:32:41

切片

  • 对列表和字符串都可以进行切片,切片的详细知识在第二篇中有讲,这里补充一个切片的新知识,那就是按间隔提取元素:

list=[1,2,3,4,5,6,7,8,9]
print(list[::2])#对列表中所有元素进行提取,从第一个元素开始,每间隔两个元素提取一个元素,输出提取出的元素组成的列表

迭代

  • 使用for循环遍历一个列表或元组,称为迭代。

  • 只要是可迭代对象,无论有无下标,都可以迭代,如字典dict就可以迭代:

dict={'a':1,'b':2,'c':3,'d':4}
for key in dict:#遍历输出字典的键
    print(key)
for value in dict.values():#遍历输出字典的值
    print(value)
for k,v in dict.items():#遍历输出字典的键值对
    print(k,v)
  • 判断一个对象是不是可迭代对象的方法是使用collections.abc模块的Iterable类型和isinstance函数:

from collections.abc import Iterable
print(isinstance('abc',Iterable))
print(isinstance([1,2,3],Iterable))
print(isinstance(123,Iterable))
'''
True
True
False
'''

列表生成式

  • 要生成list[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],可以用range实现:

L=[]
L=list(range(1,11))
print(L)
'''
[1,2,3,4,5,6,7,8,9,10]
'''
  • 要生成[1x1, 2x2, 3x3, ..., 10x10],用循环太繁琐,可以用列表生成式一句搞定:

list=[]
list=[x*x for x in range(1,11)]
print(list)
'''
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
'''

由上可知,写列表生成式时,把要生成的元素放在式子前面,后面跟for循环,就可以创建出list

  • 对生成的元素进行筛选,可以在for循环后加上if条件判断,这里的if语句是个筛选条件,后面不可以加else:比如要筛选出偶数的平方:

list=[]
list=[x*x for x in range(1,11) if x%2==0]
print(list)
'''
[4, 16, 36, 64, 100]
'''
  • 还可以使用两层循环,对两个字符串的所有元素生成全排列:

list=[]
list=[x+y for x in 'ABCDE' for y in 'FGHIJ']
print(list)
'''
['AF', 'AG', 'AH', 'AI', 'AJ', 'BF', 'BG', 'BH', 'BI', 'BJ', 'CF', 'CG', 'CH', 'CI', 'CJ', 'DF', 'DG', 'DH', 'DI', 'DJ', 'EF', 'EG', 'EH', 'EI', 'EJ']
'''
  • 由上可知列表生成式可以同时使用两个变量进行迭代,对字典也可以:

dict={'x':'1','y':'2','z':'3'}
list=[]
list=[k+'='+v for k,v in dict.items()]
print(list)
'''
['x=1', 'y=2', 'z=3']
'''
  • 还可以把一个list中所有字符串变成小写:

list=['Hello','My','Beautiful','World']
list2=[]
list2=[i.lower() for i in list]
print(list2)
'''
['hello', 'my', 'beautiful', 'world']
'''
  • 在列表生成式中,若if语句写在for语句前,则需要在其间加上else语句,以得到一个确定的判断结果:

L=[1,2,3,4,5,6,7,8,9]
list=[]
list=[x if x%2==0 else -x for x in L]
print(list)
'''
[-1, 2, -3, 4, -5, 6, -7, 8, -9]
'''

生成器

通过列表生成式来创建列表保存数据,在创建大列表却只使用一小部分的时候十分浪费空间,于是我们可以保存列表生成式中的算法到一个容器中,使其具备一边循环一边计算的机制,称其为生成器 generator:

list=[x*x for x in range(1,11)]
print(list)
g=(x*x for x in range(1,11))
print(g)
print(next(g))#可以使用next函数来打印出generator的下一个元素,当没有元素可以打印时,就会出现报错:StopIteration
print(next(g))
'''
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
<generator object <genexpr> at 0x0000016736752960>
1
4
'''

上面的g就是生成器generator,他的定义式就是把列表生成式的方括号改为圆括号。

  • 可以用for循环将g的值全部打印出来:

g=(x*x for x in range(1,11))
for i in g:
    print i
  • generator的实现方式不止类列表生成式的for循环这一种,较为复杂的算法还可以用函数来实现。

典例:用函数实现斐波那契数列。

def fib(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b=b,a+b
        n+=1
    return 'done'

只需一步就可以将这个普通函数转化为generator函数,那就是把print()改为yield:

def fib(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
        n+=1
    return 'done'
g=fib(10)
for i in g:
    print(i)
  • generator函数的执行流程和普通函数不一样

  1. 普通函数是顺序执行,遇到return语句或最后一行函数语句返回

  1. generator函数在每次调用next()时执行,遇到yield语句返回,再次执行时从上次的返回语句后一句处继续执行

  1. 每次调用generator函数都会建立一个generator对象,多次调用建立的对象是相互独立的,而普通函数的调用都只是会返回一个准确结果。

迭代器

  • 可直接作用于for循环的数据类型包括:

  1. 集合数据类型,如列表、元组、字典、集合、字符串等;

  1. generator,包括生成器和带yield的generator函数。

  • 上述对象统称为可迭代对象Iterable;可以使用isinstance函数来判断一个对象是否是Iterable对象:

from collections.abc import Iterable
print(isinstance([],Iterable))
print(isinstance({},Iterable))
print(isinstance('abc',Iterable))
print(isinstance((x for x in range(10)),Iterable))
print(isinstance(100,Iterable))
'''
True
True
True
True
False
'''
  • 而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值。

  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator;可以使用isinstance()函数判断一个对象是否是Iterator对象:

from collections.abc import Iterator
print(isinstance((x for x in range(10)),Iterator))
print(isinstance([],Iterator))
print(isinstance({},Iterator))
print(isinstance('abc',Iterator))
'''
True
True
True
False
True
False
False
False
'''
  • 生成器都是Iterator对象,但那些集合数据类型虽然都是Iterable对象,却不是Iterator对象;因为Python的Iterator对象表示的是一个数据流,我们无法提前得知它的长度,只能按需计算出下一个数据。

  • 把list、dict、str等Iterable变成Iterator可以使用iter()函数:

print(isinstance(iter([]),Iterator))
'''
True
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#开发的OpenRA游戏加载界面的实现

C#开发的OpenRA游戏加载界面的实现 游戏的UI是一个游戏必备, 但是游戏的UI都是自己处理的,不能使用像Windows自带的UI。 这样游戏的UI,其实也是使用游戏的方式来显示的, 只不过使用了低帧率的方式来显示。 比如OpenRA游戏界面,就会显示如下: 游戏的界面有很多,先从一个简…

2023美赛F题全部代码+数据+结果 数学建模

2023年美赛F题全部思路 数据代码都已完成 全部内容见链接&#xff1a;https://www.jdmm.cc/file/2708700/ 1.根据文献选的GGDP的指标&#xff0c;发现GGDP与水资源等有关&#xff0c;由此可以筛选出影响GGDP的所有因子&#xff0c;并可以用所有因子利用层次分析法建立评价体…

小白指南:手把手教你用低代码开发一个应用页面

一、什么是低代码开发 在了解低代码开发之前&#xff0c;我们先看看使用低代码开发的效果。 低代码开发效果示例 低代码开发是DevEco Studio为HarmonyOS开发者提供的可视化页面的开发方式&#xff0c;具备丰富的UI页面编辑能力&#xff0c;开发者可以在图形化的用户界面上自由拖…

项目质量要怎么保持? 如何借助系统软件进行管理

对于任何项目型的企业总是很关心项目成本的话题&#xff0c;但不知从什么时候开始&#xff0c;高质量等于高成本成了各个企业的一种潜意识。 如果交付的项目产品不符合质量标准&#xff0c;即使企业使用最好的项目管理工具或者每个里程碑都达到并在预算范围内完成项目&#xf…

基于springboot的餐饮管理系统

摘 要本设计以真实场景的菜品信息及相关餐桌预定为设计依据&#xff0c;结合了餐饮管理系统的需求及反映的问题&#xff0c;对系统做出合理的需求分析和界面设计。同时本系统使用了JAVA语言、Springboot框架以及MYSQL作为后台数据库进行开发。从系统描述、系统设计及系统实现等…

【Kubernetes】第二篇 - 购买阿里云 ECS 实例

一&#xff0c;前言 上一篇&#xff0c;简单介绍了 CI/CD 的概念以及 ECS 服务规划&#xff0c;搭建整套服务需要三台服务器&#xff0c;配置如下&#xff1a; ECS 配置启动服务说明2核4GJenkins Nexus Dockerci-server2核4GDocker Kubernetesk8s-master1核1GDocker Kube…

Outcome VS. Output:研发效能提升中,谁会更胜一筹?

2007 年&#xff0c;网景通信公司&#xff08;Netscape&#xff09;的联合创始人 Marc Andreessen 在博客 The Pmarca Guide to Startups 中提出 「Product/Market Fit」 &#xff0c;他写道&#xff0c; 「这意味着在一个良好的市场中&#xff0c;拥有能够满足该市场的产品。」…

SYN480R 解码

目录1.空载情况下2.当有按键被按下3.数据帧分析4.同步码5.数据码6.对24位数据帧分析1.空载情况下 在空载情况下&#xff0c;syn480r 输出引脚&#xff0c;输出的是杂乱无序的波形 2.当有按键被按下 按下按键&#xff0c;会连续输出相同的脉冲波形&#xff0c;放大分析 3.数据…

ParallelsDesktop安装【亲测可行】

我这边安装的是macos最新系统 (Ventura13.2) 本文参考这篇文章安装&#xff0c;但是你完全按照这篇文章会报错&#xff0c;具体可行操作记录如下 一、下载软件和补丁 1、点这里去下载补丁18.0.1 2、点这里去下载对应版本的ParallelsDesktop18.0.1&#xff0c;安装上到试用这里…

RocketMQ 初步了解

RocketMQ 初步了解 前言&#xff1a; ​  近期&#xff0c;因公司使用 RocketMQ 作为消息队列中间件&#xff0c;特此了解。  RocketMQ 是阿里巴巴在 2012 年开发的分布式消息中间件&#xff0c;专为万亿级超大规模的消息处理而设计&#xff0c;具有高吞吐量、低延迟、海量…

计算机图形学:中点BH算法对任意斜率的直线扫描转换方法

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、问题提出二、…

通俗易懂的机器学习——sklearn鸢尾花分类(KNN)

前言 KNN算法是机器学习中较为简单的入门算法&#xff0c;其主要思想是选取k个与待预测点相近的数据&#xff0c;观察他们的类别&#xff0c;本着离谁近就更像谁的思路对于待预测点进行预测&#xff0c;本文将针对使用sklearn进行KNN算法的使用进行详解 数据预处理 在正式开…

测试开发之Django实战示例 第十二章 创建API

第十二章 创建API在上一章里&#xff0c;创建了一个学生注册系统和选课系统。然后创建了展示课程内容的视图&#xff0c;以及学习了如何使用Django缓存框架。在这一章里有如下内容&#xff1a;建立RESTful API管理API视图的认证与权限建立API视图集和路由1创建RESTful API你可能…

【设计模式】创建型模式

简单工厂模式 系列综述&#xff1a; xxxxxxxxx 文章目录对象创建型模式简单&#xff08;静态&#xff09;工厂模式工厂方法模式参考博客&#x1f60a;点此到文末惊喜↩︎ 对象创建型模式 简单&#xff08;静态&#xff09;工厂模式 抽象原理 抽象产品基类 &#xff1a;定义了…

35岁测试工程师被辞退,给你们一个忠告

一&#xff1a;前言&#xff1a;人生的十字路口静坐反思 入软件测试这一行至今已经10年多&#xff0c;承蒙领导们的照顾与重用&#xff0c;同事的支持与信任&#xff0c;我的职业发展算是相对较好&#xff0c;从入行到各类测试技术岗位&#xff0c;再到测试总监&#xff0c;再转…

silicon labs平台通过串口升级固件方案

开发环境 windowssimplicity studio 5geck sdk 4.1 一 bootloader 新建BGAPI UART DFU工程 工程新建完成以后看一下linkerfile.ld文件的flash和ram的配置跟自己的application工程是否对应得上 配置串口波特率和引脚 默认使用PB0进入bootloader模式&#xff0c;这里改成Non…

CleanMyMac清理工具软件功能优势介绍

CleanMyMac更新最新版本x4.12&#xff0c;完美适配新版系统macOS10.14&#xff0c;拥有全新的界面。CleanMyMac可以让您安全、智能地扫描和清理整个系统&#xff0c;删除大型未使用的文件&#xff0c;减少iPod库的大小&#xff0c;最精确的应用程序卸载&#xff0c;卸载不必要的…

多传感器融合:MVP和PointPainting

多传感器融合相关的理论真的可以非常复杂&#xff0c;而在感知方面&#xff0c;由于可以和深度学习做结合&#xff0c;所以很多工作可以变得简单有效&#xff0c;有时候一个简单的特征融合都会有很好的效果。本文结合 3D 物体检测&#xff0c;为大家带来两篇工作&#xff0c;一…

城市管网监测系统,保障城市血管生命线!

各种不同的管网线路组成了城市的供血管道&#xff0c;管网对于维持正常的社会生活、生产秩序和公共安全至关重要。我国城市平均漏损率达到38%&#xff0c;部分城市甚至超过50%&#xff0c;远超发达国家的平均水平&#xff08;10%&#xff09;。对于管道状态的监测&#xff0c;是…

Unreal Engine08:Pawn的实现

写在前面 Pawn继承于Actor&#xff0c;增加了一些用于控制和提供玩家视角的功能&#xff0c;这里主要是介绍一下Pawn类的实现。 一、创建一个Pawn的C类 创建的C类也是放在Source文件夹中的Public和Private文件夹中&#xff1b;选择Pawn作为继承的父类&#xff1b;头文件中除…