每天一小时python官方文档学习(六)————循环和条件控制的进阶用法

学习完数据结构之后,我们就能够对之前在第二天中讲过的流程控制工具,添加更多的用法了,这里主要介绍的是for循环语句和ifwhile条件判断语句。

5.6. 循环的技巧

我们学过的遍历序列for i in range()for i in list()for i in tuple(),都是每次只取出一个元素。技巧性更强的是一次取出两个元素,尤其以字典为例:

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...     print(k, v)
...
gallahad the pure
robin the brave

在字典中循环,用 items() 方法可将关键字对应的值同时取出。不仅是字典,当在序列(list, tuple, range)中循环时,用 enumerate() 函数可以将索引位置和其对应的值同时取出,用法如下:

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe

还有更强的用法,用到昨天讲到的zip()函数。当同时在两个或更多序列中循环时,可以用 zip() 函数将每个序列中的元素按位置逐一进行匹配。如下例就实现了问题和回答的匹配:

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...     print('What is your {0}?  It is {1}.'.format(q, a))
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.

接下来是一些针对序列循环的小技巧,如果想逆向循环一个序列时,应该先正向定位序列,然后调用 reversed() 函数:

>>> for i in reversed(range(1, 10, 2)):
...     print(i)
...
9
7
5
3
1

如果要按某个指定顺序循环一个序列,可以用 sorted() 函数,即先排序再循环。之所以用sorted()而不用.sort(),是因为sorted()可以在不改动原序列的基础上返回一个新的排好序的序列,而.sort()会对原序列本身进行排序。如下例就是对集合中的单词按照首字母从小到大的顺序进行循环:

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...     print(f)
...
apple
banana
orange
pear

有时可能会想在循环时修改列表内容,一般来说改为创建一个新列表是比较简单且安全的。如下例就是把列表中的NaN去掉:

>>> import math
>>> raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8]
>>> filtered_data = []
>>> for value in raw_data:
...     if not math.isnan(value):
...         filtered_data.append(value)
...
>>> filtered_data
[56.2, 51.7, 55.3, 52.5, 47.8]

5.7. 深入条件控制

whileif 条件句中,除了常见的> < >= <= ==这些比较操作以外,其他任意操作也是允许的,这里主要讲解一些常用的操作和原则:

  • 操作符 innot in 可以校验一个值是否在(或不在)一个序列里。
  • 操作符 isis not比较两个对象是不是同一个对象,这只对像列表这样的可变对象比较重要。注意它们是根据id进行比较的,不同id的列表即使内容相同is也会返回False;而与之对应的,==是根据值进行比较,只要内容相同==就会返回True
  • 所有的比较操作符都有相同的优先级,且这个优先级比数值运算符低
  • 比较操作可以传递。例如 a < b == c 会校验是否 a 小于 b 并且 b 等于 c。
  • 比较操作可以通过布尔运算符 andor 来组合,并且比较操作(或其他任何布尔运算)的结果都可以用 not来取反。这些操作符的优先级低于比较操作符;在它们之中,not 优先级最高, or 优先级最低,因此 A and not B or C等价于 (A and (not B)) or C。和之前一样,你也可以在这种式子里使用圆括号。
  • 布尔运算符 andor 也被称为短路运算符:它们的参数从左至右解析一旦可以确定结果解析就会停止。例如,如果 A 和 C 为True而 B 为False,那么 A and B and C 不会解析 C,而直接返回False。当用作普通值而非布尔值时,短路操作符的返回值通常是最后一个变量,例如:
>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'

string1空字符串相当于False,而string2True,故直接短路,表达式返回string2赋给non_null

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

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

相关文章

跟我一起学.NetCore之依赖注入作用域和对象释放

前言上一小节简单阐述了依赖注入及Asp.NetCore中自带依赖注入组件的常规用法&#xff0c;其中提到容器管控了自己创建对象的生命周期&#xff0c;包含了三种生命周期&#xff1a;Singleton、Scoped、Transient&#xff0c; 对于Singleton、Transient相对于Scoped来说比较好理解…

leetcode738. 单调递增的数字

一:芭比Q了 又掉一个粉 啊呜呜呜呜呜 如果作为一个领导者来说&#xff0c;首先就是要以身作则&#xff0c;自己都做不到 &#xff0c;那就没什么威信去要求手下人按照要求去做 二:题目 三:上码 class Solution { public:int monotoneIncreasingDigits(int n) {/**思路:1.这…

每天一小时python官方文档学习(七)————模块与包

6. 模块 模块是一个包含Python定义和语句的文件&#xff0c;实际上就是一个正常的.py文件。但是作用和普通需要运行的程序不一样&#xff0c;它实际上有点像函数。如果说函数实现了代码的重用&#xff0c;模块则是实现了函数的重用。我们如果想在不同的程序中使用同一个函数&a…

大揭秘| 我司项目组Gitlab Flow DevOps流程

长话短说&#xff0c;本文全景呈现我司项目组gitlab flow && devopsGit Flow定义了一个项目发布的分支模型&#xff0c;为管理具有预定发布周期的大型项目提供了一个健壮的框架。DevOps 强调的是团队通过自动化的工具协作和高效地沟通来完成软件的生命周期管理&#xf…

leetcode714.买卖股票的

一:题目 二&#xff1a;上码 class Solution { public:int maxProfit(vector<int>& prices, int fee) {/**思路:*/int ans 0;int minPrice prices[0];//最低时买入for(int i 1; i < prices.size(); i) {//低价买入minPrice min(minPrice,prices[i]);if(price…

C++ 学习之旅(1)——编译器Compiler

简单来说&#xff0c;由C代码文件生成可执行文件的过程如下&#xff1a; #mermaid-svg-GQamCVEXMVkYEemz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GQamCVEXMVkYEemz .error-icon{fill:#552222;}#mermaid-svg-…

掌握Rabbitmq几个重要概念,从一条消息说起

RabbitMQ 是功能强大的开源消息代理。根据官网称&#xff1a;也是使用量最广泛的消息队列。就像他的口号“Messaging that just works”&#xff0c;开箱即用使用简单&#xff0c;支持多种消息传输协议&#xff08;AMQP、STOMP、MQTT&#xff09;。一个应用程序或者服务如何使用…

122. 买卖股票的时机

一&#xff1a;题目 二&#xff1a;上码 class Solution { public:int maxProfit(vector<int>& prices) {/**思路:1.这里用的是贪心算法&#xff08;我们每隔两天计算一次赚的钱 只要大于0的话 那就是赚的&#xff09;2.我们手里最多只能有一只股票,所以我们可以当…

C++ 学习之旅(2)——链接器Linker

每一个.cpp文件经过编译之后都会生成对应的.obj文件&#xff0c;然后通过链接器把它们进行链接&#xff0c;最后就可以生成.exe可执行文件了。 举个例子&#xff0c;假设我们有一个 Math.cpp 文件和 Log.cpp 文件&#xff1a; Math.cpp #include <iostream>void Log(c…

使用 WPF 版简易 SIP 服务器向 GB28181 摄像头发送直播请求

使用 WPF 版简易 SIP 服务器向 GB28181 摄像头发送直播请求目录一、引言二、项目渊源三、软件使用及 SIP INVITE 流程(一) 注册和心跳(二) 直播 INVITE四、注意事项五、资源独立观察员 2020 年 9 月 16 日一、引言之前写过一篇博客《使用 GB28181.Solution ZLMediaKit MediaSe…

leetcode968. 监控二叉树

一:论语 这个有意思,我们可以从中得出的是&#xff0c;一个人过错 其实是潜意思决定的 行为见品质 但知错更改也是nice的 二:题目 三:上码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* Tr…

C++ 学习之旅(3)——头文件Header

我们知道&#xff0c;在 C 中&#xff0c;函数只能定义一次&#xff0c;而在 cpp 文件中如果想使用其他 cpp 文件中定义了的函数&#xff0c;就必须声明&#xff0c;这样才能通过编译&#xff0c;然后链接器才会在调用函数时找到该函数的定义。那么当函数声明很多的时候&#x…

虚虚实实,亦假亦真的 ValueTuple,绝对能眩晕你

一&#xff1a;背景 1. 讲故事前几天在写一个api接口&#xff0c;需要对衣物表进行分页查询&#xff0c;查询的output需要返回两个信息&#xff0c;一个是 totalCount,一个是 clothesList,在以前我可能需要封装一个 PagedClothes 类&#xff0c;如下代码:public class PagedClo…

session.setAttribute和request.setAttribute的区别

一&#xff1a;问题的引出 我在设置拦截器的时候&#xff0c;将登录信息存在了request作用域当中&#xff0c;我设置登录页面的时候是放行 的登录页面的请求的&#xff0c;同时将登录信息是设置在request的作用域中的&#xff0c;可是进入主页面后&#xff0c;我再进入其他页面…

C++ 学习之旅(4)——调试Debug

调试 Debug 程序&#xff0c;首先应该确保处于 Debug 模式而不是 Release 模式下&#xff0c;因为后者会优化你的程序&#xff0c;也就是对你的程序作出了改变&#xff0c;这样你很难找出问题所在。记得在 Debug 之前确保优化是已禁用的&#xff1a; 我们有以下的文件&#xff…

关于脑机接口该如何实现的考虑

脑机接口&#xff0c;已经是最近最热门的科技热点了&#xff0c;因为埃隆马斯克的炒作和推动&#xff08;炒作说的是他本人并不懂技术&#xff0c;宣传中有了很多夸大和不实之词&#xff0c;推动说的是因为他的炒作和带动&#xff0c;有了更多的资金进入了这个领域&#xff0c;…

C++ 学习之旅(5)——设置Setup文件目录

使用过Visual Studio的朋友都应该知道&#xff0c;VS对于编译后的obj文件以及链接生成的exe文件的存放方式是非常反人类的&#xff0c;所以我们有必要对这个设置进行更改。 首先要分清Filter和Folder的概念&#xff0c;在默认的文件目录中&#xff0c;我们看到的实际上是Filte…

JVM笔记详解之垃圾回收器

一&#xff1a;什么是垃圾回收机制&#xff08;GC&#xff09; 在C/C程序中&#xff0c;程序员在内存中主动开辟一段相应的空间来存值。由于内存是有限的&#xff0c;所以当程序不再需要使用该内存空间时&#xff0c;就需要销毁对象并释放其所占用的内存资源&#xff0c;好重新…

跟我一起学.NetCore之配置初体验

前言配置对于程序来说&#xff0c;绝对是必不可少&#xff0c;毕竟配置是应用或组件动态适应各种环境的最优方案&#xff0c;没有之一(我还年轻&#xff0c;我是这么认为的)&#xff1b;之前可能用的最多的配置源是命令行、文件(XML、Json、INI)&#xff0c;Web中对于Asp.Net程…

C++ 学习之旅(6)——循环loop

C中最为常用的三种循环&#xff1a;for 循环、while 循环和 do-while 循环&#xff0c;直接上代码&#xff1a; for循环 for ( init; condition; increment ) {statement(s); }init 会首先被执行&#xff0c;且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也…