Python 3 官方文档学习(1)
本文系官方文档翻译之作,不当之处,敬请原谅!
range()函数
如果需要遍历一个数字序列,可以使用内置的range函数。该函数会生成等差序列。
|
1
2
3
|
range(5)# 范围[0, 5)range(5,10)# 范围[5, 10)range(0,10,3)# [0, 3, 6, 9] |
若要依据索引迭代序列,可以使用range()和len()
|
1
2
3
|
a =['Mary','had','a','little','lamb']for idx in range(len(a)): print(idx, a[idx]) |
在这种情况下,使用enumerate()函数会更加方便
|
1
2
|
for idx, val in enumerate(a): print(idx, val) |
range()返回的对象的行为在很多方面很像一个列表,但实际上它并不是列表。当你迭代它的时候它会依次返回期望序列的元素,但是它不会真正产生一个列表,因此可以节省空间
for/while...else
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#----------------------------------------------------------------------
def test_for_else():
"""while/for...else
当循环是因为迭代完整个列表(for)或循环条件不成立(while)终止,
而不是由break语句终止时,else子句将被执行
"""
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print(n, 'equal', x, '*', n//x)
break
else: # for x in range(2, n)的else子句
# loop fell through without finding a factor
print(n, 'is a prime number')
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#----------------------------------------------------------------------def test_for_else(): """while/for...else 当循环是因为迭代完整个列表(for)或循环条件不成立(while)终止, 而不是由break语句终止时,else子句将被执行 """ for n in range(2, 10): for x in range(2, n): if n % x == 0: print(n, 'equal', x, '*', n//x) break else: # for x in range(2, n)的else子句 # loop fell through without finding a factor print(n, 'is a prime number') |
上述代码的输出结果如下:
|
1
2
3
4
5
6
7
8
|
2 is a prime number3 is a prime number4 equal 2 * 25 is a prime number6 equal 2 * 37 is a prime number8 equal 2 * 49 equal 3 * 3 |
与循环一起使用的 else 子句更类似于 try 语句的 else 子句而不是 if 语句的 else 子句:try 语句的 else 子句在没有任何异常发生时运行,而循环的 else 子句在没有 break 发生时运行。
默认参数值
最有用的形式是指定一个或多个参数的默认值。这种方法创建的函数被调用时,可以带有比定义的要少的参数。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#----------------------------------------------------------------------def ask_ok(prompt, retries=4, complaint='Yes or no, please !'): while True: ok = input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retries < 0: raise OSError('uncooperative user') print(complaint) #----------------------------------------------------------------------def test_default_param(): ask_ok ('Do you really want to quit ?') ask_ok ('OK to overwrite the file ?', 2) ask_ok ('OK to overwrite the file ?', 2, 'Come on, only yes or no !') |
重要的警告:默认值只计算一次。这在默认值是列表、字典或大部分类的实例等可变对象时又有所不同。
例如,下面的函数在后续调用过程中会累积传给它的参数。
|
1
2
3
4
5
6
|
def f(a, L=[]): L.append(a) return Lprint(f(1))print(f(2))print(f(3)) |
结果如下:
|
1
2
3
|
[1][1, 2][1, 2, 3] |
如果不想默认值在随后的调用中共享,可以像这样编写函数:
|
1
2
3
4
5
|
def f(a, L=None): if L is None: L = [] L.append(a) return L |
遍历的技巧
循环迭代字典的【key】/【value】/【key/value】
|
1
2
3
4
5
6
7
8
9
10
11
12
|
def test_iterate_dict(): """""" knights = {'gallahad': 'the pure', 'robin': 'the brave'} # 遍历[key, value] for key, val in knights.items(): print(key, val) # 遍历key for key in knights.keys(): print(key) # 遍历value for val in knights.values(): print(val) |
遍历序列,同时获得索引和对应的值
|
1
2
3
4
5
6
7
|
def test_for(): """""" a = ['Mary', 'had', 'a', 'little', 'lamb'] for idx in range(len(a)): print(idx, a[idx]) for idx, val in enumer |
同时遍历两个或者更多序列,使用zip()函数可以成对地读取元素
|
1
2
3
4
5
6
|
def test_zip(): """""" questions = ['name', 'quest', 'favorite color'] answers = ['lancelot', 'the holy grail', 'blue'] for q, a in zip(questions, answers): print('What is your {0}? \n It is {1}.'.format(q, a)) |
要反向遍历一个序列,首先正向生成这个序列,然后调用reversed()函数
|
1
2
|
>>> for i in reversed(range(1, 10, 2)):... print(i) |
按顺序遍历一个序列,可以使用sorted()函数。该函数返回一个新的排序列表,同时保证源列表不变。
|
1
2
3
|
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']>>> for f in sorted(set(basket)):... print(f) |
若要在循环内部修改正在遍历的序列(例如复制某些元素),一般先制作副本。在序列上循环不会隐式地创建副本。切片表示法使这尤为方便。
|
1
2
3
4
|
>>> words = ['cat', 'window', 'defenestrate']>>> for w in words[:]: # Loop over a slice copy of the entire list.... if len(w) > 6:... words.insert(0, w) |
深入条件控制
|
1
2
3
4
5
6
7
8
9
10
|
while 和 if 语句中使用的条件可以包含任意的操作,而不仅仅是比较。比较操作符 in 和 not in 检查一个值是否在一个序列中出现(不出现)。is 和 is not 比较两个对象是否为同一对象;这只和列表这样的可变对象有关。所有比较运算符都具有相同的优先级,低于所有数值运算符。可以级联比较。例如, a < b == c 测试 a 是否小于 b 并且 b 等于 c。可将布尔运算符 and 和 or 用于比较,比较的结果(或任何其他的布尔表达式)可以用 not取反。这些操作符的优先级又低于比较操作符;它们之间,not 优先级最高,or 优先级最低,所以 A and not B or C 等效于 (A and (not B)) or C。与往常一样,可以使用括号来表示所需的组合。布尔运算符 and 和 or 是所谓的 短路 运算符:依参数从左向右求值,结果一旦确定就停止。例如,如果 A 和 C 都为真,但 B 是假, A and B and C 将不计算表达式 C。用作一个普通值而非逻辑值时,短路操作符的返回值通常是最后一个计算的。可以把比较或其它逻辑表达式的返回值赋给一个变量。例如,>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'>>> non_null = string1 or string2 or string3>>> non_null'Trondheim'注意 Python 与 C 不同,在表达式内部不能赋值。C 程序员可能会抱怨这一点,但它避免了一类 C 程序中常见的问题: 在表达式中输入 = 而真正的意图是== 。 |
Python 3 官方文档学习(1)的更多相关文章
- Spring 4 官方文档学习(十二)View技术
关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...
- Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC
内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...
- Spring Data Commons 官方文档学习
Spring Data Commons 官方文档学习 -by LarryZeal Version 1.12.6.Release, 2017-07-27 为知笔记版本在这里,带格式. Table o ...
- Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图
接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...
- Spring 4 官方文档学习(十一)Web MVC 框架
介绍Spring Web MVC 框架 Spring Web MVC的特性 其他MVC实现的可插拔性 DispatcherServlet 在WebApplicationContext中的特殊的bean ...
- Spring Boot 官方文档学习(一)入门及使用
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)
题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)
接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...
- Spring boot官方文档学习(一)
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
随机推荐
- ansible指路篇-安装及基本命令使用
ansible指路篇-安装及基本命令使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是ansible ansible是新出现的自动化运维工具,基于Python开发,集合 ...
- python自动化运维之路~DAY7
python自动化运维之路~DAY7 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.客户端/服务器架构 C/S 架构是一种典型的两层架构,其全称是Client/Server,即 ...
- Unity NavMesh导航网格 初级教程
目的:要实现的功能就是你点击一下地图上的某个地方,人物就向着那个点移动.有点自动寻路的味道. 例子:三国群英传,三国赵云传之类的游戏里面的人物移动就可以用这个实现.还有一个我不太喜欢玩的游戏英雄联盟 ...
- Swift学习笔记5
1.你可以将一个继承来的只读属性重写为一个读写属性,只需要在重写版本的属性里提供 getter 和 setter 即可.但是,你不可以将一个继承来的读写属性重写为一个只读属性. 2.你可以通过把方法, ...
- Vue.js 模板指令
1. 数据渲染:v-text.v-html(保存了html结构).{{}}(自动更新): 2. 控制模块隐藏:v-if:直接不渲染 DOM 元素: v-show:css 里的 display:none ...
- python执行centos命令
import os improt sys import re import commands a = commands.getoutput("ls -al /") print a
- 汉化DotNetBar中控件的系统文本
作者:ComponentCN 出处:www.componentcn.com 2011年11月02日 阅读: DotNetBar很多子控件的系统文本.提示信息等都是可以本地化的,可以转化为多种语言,控件 ...
- Javaweb学习笔记——(一)——————进入html
1.html的简介 *什么是html? -HyperText Markup Language:超文本标记语言,网页语言 **超文本:超出文本的范畴,使用html可以轻松实现这些操作 **标记:html ...
- qemu基本使用
1.qemu的安装 请参考家用路由器0day漏洞挖掘技术这本书 2.基本使用 qemu有主要如下两种运作模式: 用户模式(User Mode),亦称使用者模式.qemu能启动那些为不同中央处理器编译的 ...
- JavaJavaScript之内存与变量初始化
0.搞清三个概念:预加载与执行期:js变量存储(栈区与堆区):js变量的类型(引用类型(对象)与基本数据类型); JS在预编译时,对于函数的预加载方面,浏览器仅仅选择编译声明式函数(function ...