zoukankan      html  css  js  c++  java
  • Python3简明教程(五)—— 流程控制之循环

    有些时候我们需要多次执行相同的任务,我们使用一个计数器来检查代码需要执行的次数。这个技术被称为循环。

    while循环

    while语句的语法如下:

    while condition:
        statement1
        statement2

    想要多次执行的代码必须以正确的缩进放在 while 语句下面。在表达式 condition 为真的时候它们才会执行。同 if-else 一样,非零值为真。

    例如,打印Fibonacci数列:

    #!/usr/bin/env python3
    a, b = 0, 1
    while b < 100:
        print(b)
        a, b = b, a + b

    学习其他语言的同学在这里可能有些困惑,你可以这样理解,Python 中赋值语句执行时会先对赋值运算符右边的表达式求值,然后将这个值赋值给左边的变量。而不是逐一赋值。

    print()函数的end参数

    上面程序的输出结果:

    rogn@ubuntu:~$ ./b.py
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89

    默认情况下,print() 除了打印你提供的字符串之外,还会打印一个换行符,所以每调用一次 print() 就会换一次行,如同上面一样。

    你可以通过 print() 的另一个参数 end 来替换这个换行符,就像下面这样(这里用空格填充了):

    #!/usr/bin/env python3
    a, b = 0, 1
    while b < 100:
        print(b, end=' ')
        a, b = b, a + b
    print()

    输出结果:

    rogn@ubuntu:~$ ./b.py
    1 1 2 3 5 8 13 21 34 55 89 

    同时,和C一样,可以在while语句中使用breakcontinue,以及嵌套while语句。

    列表

    在继续学习循环之前,我们先学习一个叫做列表的数据结构。它可以写作中括号之间的一列逗号分隔的值。列表的元素不必是同一类型:

    >>> a = [ 1, 342, 223, 'India', 'Fedora']
    >>> a
    [1, 342, 223, 'India', 'Fedora']

    你可以将上面的列表想象为一堆有序的盒子,盒子包含有上面提到的值,每个盒子都有自己的编号(红色的数字),编号从零开始,你可以通过编号访问每一个盒子里面的值。对于列表,这里的编号称为索引。

    索引

    我们可以通过索引来访问列表中的每个值,还有负数的索引,表示从列表的末尾开始计数,最后一个索引为-1。

     +---+-----+-----+---------+----------+
     | 1 | 342 | 223 | 'India' | 'Fedora' |
     +---+-----+-----+---------+----------+
       0    1     2       3        4          5
      -5   -4    -3      -2       -1

     例如:

    >>> a[0]
    1
    >>> a[4]
    'Fedora'

    切片

    你甚至可以把它切成不同的部分,这个操作称为切片,例子在下面给出:

    >>> a[0:-1]
    [1, 342, 223, 'India']
    >>> a[2:-2]
    [223]

    请注意,Python 中有关下标的集合都满足左闭右开原则,切片中也是如此,也就是说集合左边界值能取到,右边界值不能取到。因此,对于非负索引,如果上下都在边界内,切片长度就是两个索引之差。例如 a[2:4] 是 2。

    切片并不会改变正在操作的列表,切片操作返回其子列表,这意味着下面的切片操作返回列表一个新的(栈)拷贝副本:

    >>> a[:]
    [1, 342, 223, 'India', 'Fedora']

    切片的索引有非常有用的默认值:省略的第一个索引默认为零,省略的第二个索引默认为切片的字符串的大小:

    >>> a[:-2]
    [1, 342, 223]
    >>> a[-2:]
    ['India', 'Fedora']

    切片操作还可以设置步长,就像下面这样:

    >>> a[1::2]
    [342, 'India']

    它的意思是,从切片索引 1 到列表末尾,每隔两个元素取值。

    对异常情况的处理

    试图使用太大的索引会导致错误:

    >>> a[32]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range
    >>> a[-10]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range

    Python 能够优雅地处理那些没有意义的切片索引:一个过大的索引值(即大于列表实际长度)将被列表实际长度所代替,当上边界比下边界大时(即切片左值大于右值)就返回空列表:

    >>> a[2:32]
    [223, 'India', 'Fedora']
    >>> a[32:]
    []

    修改等操作

    列表允许修改元素:

    >>> cubes = [1, 8, 27, 65, 125]
    >>> cubes[3] = 64
    >>> cubes
    [1, 8, 27, 64, 125]

    也可以对切片赋值,此操作可以改变列表的尺寸,或清空它:

    >>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    >>> letters
    ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    >>> # 替换某些值
    >>> letters[2:5] = ['C', 'D', 'E']
    >>> letters
    ['a', 'b', 'C', 'D', 'E', 'f', 'g']
    >>> # 现在移除他们
    >>> letters[2:5] = []
    >>> letters
    ['a', 'b', 'f', 'g']
    >>> # 通过替换所有元素为空列表来清空这个列表
    >>> letters[:] = []

    前面不是说过切片操作不改变列表么?严格来说,这里并不算单纯的切片操作,还包括了赋值操作。

    列表是允许嵌套的(创建一个包含其它列表的列表),例如:

    >>> a = ['a', 'b', 'c']
    >>> n = [1, 2, 3]
    >>> x = [a, n]
    >>> x

    通过内建函数 len() 我们可以获得列表的长度:

    >>> len(a)
    3

    使用成员运算符in 或 not in,可以检查某个值是否存在于列表中:

    >>> a = ['ShiYanLou', 'is', 'cool']
    >>> 'cool' in a
    True
    >>> 'Linux' in a
    False

    如果你想要检查列表是否为空,请这样做:

    >>> a = ['a', 'b', 'c']
    >>> n = [1, 2, 3]
    >>> x = [a, n]
    >>> x
    [['a', 'b', 'c'], [1, 2, 3]]
    >>> x[0]
    ['a', 'b', 'c']
    >>> x[0][1]
    'b'

    for循环

    Python 里的 for 循环与 C 语言中的不同。这里的 for 循环遍历任何序列(比如列表、元组、字典和字符串)中的每一个元素。下面给出示例:

    >>> a = ['ShiYanLou', 'is', 'powerful']
    >>> for x in a:
    ...     print(x)
    ...
    ShiYanLou
    is
    powerful

    我们也能这样做:

    >>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    >>> for x in a[::2]:
    ...     print(x)
    1
    3
    5
    7
    9

    例如,遍历字符串中的每个字符:

    >>> str = 'shiyanlou'
    >>> for x in str:
    ...     print(x)
    ... 
    s
    h
    i
    y
    a
    n
    l
    o
    u
    

    range()函数

    如果你需要一个数值序列,内置函数 range() 会很方便,它生成一个等差数列(但并不是列表)。

    要特别注意的是,range()函数返回的并不是列表而是一种可迭代对象:

    >>> for i in range(5):
    ...     print(i)
    ...
    0
    1
    2
    3
    4
    >>> range(1, 5)      
    range(1, 5)
    >>> list(range(1, 5))
    [1, 2, 3, 4]
    >>> list(range(1, 15, 3))
    [1, 4, 7, 10, 13]
    >>> list(range(4, 15, 2))
    [4, 6, 8, 10, 12, 14]

    循环后的else语句

    我们可以在循环后面使用可选的 else 语句。它将会在循环完毕后执行,除非有 break 语句终止了循环。

    这有什么用呢?为我们提供了检测循环是否顺利执行完毕的一种优雅方法。

    >>> for i in range(0, 5):
    ...     print(i)
    ... else:
    ...     print("Bye bye")
    ...
    0
    1
    2
    3
    4
    Bye bye

    如果触发break而提前退出:

    >>> for i in range(5):
    ...     print(i)
    ...     i += 1
    ...     if i > 3:
    ...         break
    ... else:
    ...     print("Bye")
    ... 
    0
    1
    2
    3

    参考链接:

    1、https://www.shiyanlou.com/courses/596

    2、https://blog.csdn.net/u012814856/article/details/78723071

  • 相关阅读:
    利用vuex 做个简单的前端缓存
    EFcore 解决 SQLite 没有datetime 类型的问题
    dotnet 清理 nuget 缓存
    .net 5 单文件模式发布异常 CodeBase is not supported on assemblies loaded from a single-file bundle
    ubuntu 开启ip转发的方法
    Vue-ECharts 6 迁移记录
    System.Text.Json 5.0 已增加支持将Enum 由默认 Number类型 转换为String JsonStringEnumConverter
    Windows 10 LTSC 2019 正式版轻松激活教程
    Mac 提示Permission denied
    苹果手机代理 charles 提示(此链接非私人连接)
  • 原文地址:https://www.cnblogs.com/lfri/p/10369938.html
Copyright © 2011-2022 走看看