本文系官方文档翻译之作,不当之处,敬请原谅!

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
2 is a prime number
3 is a prime number
4 equal 2 * 2
5 is a prime number
6 equal 2 * 3
7 is a prime number
8 equal 2 * 4
9 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 L
print(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)的更多相关文章

  1. Spring 4 官方文档学习(十二)View技术

    关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...

  2. Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC

    内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...

  3. Spring Data Commons 官方文档学习

    Spring Data Commons 官方文档学习   -by LarryZeal Version 1.12.6.Release, 2017-07-27 为知笔记版本在这里,带格式. Table o ...

  4. Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图

    接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...

  5. Spring 4 官方文档学习(十一)Web MVC 框架

    介绍Spring Web MVC 框架 Spring Web MVC的特性 其他MVC实现的可插拔性 DispatcherServlet 在WebApplicationContext中的特殊的bean ...

  6. Spring Boot 官方文档学习(一)入门及使用

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  7. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)

    题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...

  8. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)

    接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...

  9. Spring boot官方文档学习(一)

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

随机推荐

  1. GO语言的进阶之路-初探GO语言

    GO语言的进阶之路-初探GO语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么我们需要一门新语言 Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难 ...

  2. Python基础【day03】:集合入门(三)

    本节内容 1.集合常用方法总结2.定义3.关系测试 集合是无序的,天生不重复的数据组合,它的作用如下: 去重,即:把一个列表变成集合,就去重了 关系测试,即:测试两组集合的交集.并集和差集等 一.集合 ...

  3. JAVA-大白话探索JVM-类加载器(一)

    JVM??? Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.JVM是Java Virtual Machine(Java虚拟机)的缩写,Java程序编译后 ...

  4. 解决Sublime Text中文标题出现异常情况

    打开首选项-设置-用户 用以下覆盖原来配置,保存之后重新打开编辑器即可 {        "dpi_scale": 1.0,        "font_face" ...

  5. This dependency was not found: * !!vue-style-loader!css-loader?

    npm install stylus-loader css-loader style-loader --save-dev 猜测这两个组件发布时是不需要的,所以要加上-dev

  6. Grooming Meeting及测试人员所扮演的角色

    Grooming Meeting的中文翻译是“梳理会议”,它并不是Scrum框架中标准的会议(标准会议为Planning Meeting, Daily Scrum Meeting, Review Me ...

  7. kali安装以及配置

    1.https://klionsec.github.io/2017/04/29/kali-config/ 2.http://www.freebuf.com/sectool/133526.html

  8. Linux - sort 排序

    -t # 指定排序时所用的栏位分隔字符 -n # 依照数值的大小排序 -r # 以相反的顺序来排序 -f # 排序时,将小写字母视为大写字母 -d # 排序时,处理英文字母.数字及空格字符外,忽略其他 ...

  9. J - Long Long Message (最长公共子串)

    题目链接:https://cn.vjudge.net/contest/283743#problem/J 题目大意:给你两个字符串,问你两个字符串的最长的公共子串. 具体思路:把两个字符串合在一起,然后 ...

  10. Android BroadcastReceiver解析

    目录   示意图 1. 定义 即 广播,是一个全局的监听器,属于Android四大组件之一 Android 广播分为两个角色:广播发送者.广播接收者 2. 作用 监听 / 接收 应用 App 发出的广 ...