zoukankan      html  css  js  c++  java
  • python条件与循环-循环

    1 while语句

    while用于实现循环语句,通过判断条件是否为真,来决定是否继续执行。

     1.1 一般语法

     语法如下:

    1 while expression:
    2 
    3   suite_to_repeat

    1.2 计数

     1  2 
     3 >>> cnt = 0
     4 
     5 >>> while(cnt < 9):
     6 
     7 ... print 'the index is ', cnt
     8 
     9 ... cnt += 1
    10 
    11 ...
    12 
    13 the index is 0
    14 
    15 the index is 1
    16 
    17 the index is 2
    18 
    19 the index is 3
    20 
    21 the index is 4
    22 
    23 the index is 5
    24 
    25 the index is 6
    26 
    27 the index is 7
    28 
    29 the index is 8

    代码块里包含print和自增语句,将被重复执行,知道cnt不下于9。

     1.3 无限循环

    1  while True:
    2   suite_to_repeat

    条件表达式一直为真。

     2  for语句

     for语句是python提供的另一个循环机制,可以用于遍历序列,可以用在列表解析和生成器表达式中。

     2. 1 一般语法

     for循环会访问一个可迭代对象(例如序列或叠加器)中的所有元素,并在所有条目处理过后结束循环。语法如下:

    1 for iter_var in iterable:
    2   suite_to_repeat

    每次循环,iter_var迭代变量被设置为可迭代对象(序列、迭代器或其他支持迭代的对象)的当前元素,提供给suite_to_repeat语句块使用。

     2.2 用于序列类型

     主要介绍for循环迭代不同的序列对象:字符串、列表及元组。

    迭代序列的三种方法:

    (1)通过序列项迭代

    每次迭代,eachName变量都被设置为列表中特定的某个元素。

    (2)通过序列索引迭代

    1 >>> namelist = ['Bob', 'Lisa', 'Henry']
    2 >>> for nameIndex in range(len(namelist)):
    3 ... print namelist[nameIndex]
    4 ...
    5 Bob
    6 Lisa
    7 Henry

    使用len()函数获取序列长度,使用range()函数创建了要迭代的序列。

    (3)使用项和索引迭代

    使用内建的enumerate()函数

    1 >>> namelist = ['Bob', 'Lisa', 'Henry']
    2 >>> for i, eachName in enumerate(namelist):
    3 ... print i,eachName
    4 ...
    5 0 Bob
    6 1 Lisa
    7 2 Henry 

    3 range()内建函数 

    range()完整语法如下:

    range([start,] stop[, step])

    range()会返回一个包含所有k的列表(start<=k<end),从start到end,k每次递增step,step不能为0。

    1 >>> range(3, 7)
    2 [3, 4, 5, 6] 

    4 与序列相关的内建函数 

    sorted()、reversed()、enumerate()、zip()

    reversed():返回一个反序访问的迭代器;

     1 >>> namelist = ['Bob', 'Lisa', 'Henry']
     2 
     3 >>> years = [1978, 1989, 1990, 2003]
     4 
     5 >>> for name in sorted(namelist):
     6 
     7 ... print name,
     8 
     9 ...
    10 
    11 Bob Henry Lisa
    12 
    13 >>> namelist
    14 
    15 ['Bob', 'Lisa', 'Henry']
    16 
    17 >>> for name in reversed(namelist):
    18 
    19 ... print name,
    20 
    21 ...
    22 
    23 Henry Lisa Bob
    24 
    25 >>> for i, name in enumerate(namelist):
    26 
    27 ... print i, name
    28 
    29 ...
    30 
    31 0 Bob
    32 
    33 1 Lisa
    34 
    35 2 Henry
    36 
    37 >>> for name, year in zip(namelist, years):
    38 
    39 ... print year, name
    40 
    41 ...
    42 
    43 1978 Bob
    44 
    45 1989 Lisa
    46 
    47 1990 Henry

    5 break语句 

    break语句用于结束当前循环跳转到下条语句。 

    6 continue语句 

    当遇到continue语句时,程序终止当前循环,并忽略剩余的语句,然后回到循环的顶端。在开始下一次迭代前,如果是条件循环(while循环),将验证条件表达式;如果是迭代循环(for循环),验证是否还有元素可以迭代,只有在验证成功的情况下,才开始下一次迭代。

    >>> valid = False
    >>> count = 3
    >>> while count > 0:
    ...     input = raw_input('Enter passsword:')
    ...     for eachPasswd in passwdList:
    ...         if input == eachPasswd:
    ...             valid = True
    ...             break
    ...         if not valid:
    ...             print "invalid input"
    ...             count -= 1
    ...             continue
    ...         else:
    ...             break

    7 pass语句 

    pass语句不做任何事情(即NOP,No Operation,无操作),用于在需要有语句块的地方不写任何语句。

    8 迭代器和iter()函数

    从根本上来说,迭代器就是有一个next()方法的对象,而不是通过索引来计数。当你或是一个循环机制需要下一项时,调用迭代器的next()方法就可以获得它。

    迭代器为类序列对象提供了一个类序列的接口,它们是一组数据结构,可以利用它们的索引从0开始一直"迭代"到序列的最后一个条目。

    8.1 使用迭代器

    (1)序列

    >>> i = iter(myTuple)
    >>> i.next()
    123
    >>> i.next()
    'abc'
    >>> i.next()
    45.600000000000001
    >>> i.next()
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    StopIteration

    序列会自动的产生它们字节的迭代器。

    1 for I in seq:
    2     do_something_to(i)

    (2)字典

    字典也是可迭代的python数据类型。字典的迭代器会遍历它的键(key)。语句for eachKey in myDict.keys()可以缩写为for eachKey in myDict。

    1 >>> myDict = {'a':10, 'b':20, 'c':30}
    2 >>> for eachKey in myDict:
    3 ... print eachKey, myDict[eachKey]
    4 ...
    5 a 10
    6 c 30
    7 b 20

    另外,python还有三个新的内建字典方法来定义迭代:myDict.iterkeys()(通过键迭代)、myDict.itervalues()(通过值迭代)及myDict.iteritems()(通过键-值对迭代)。

    (3)文件

    文件对象生成的迭代器会自动调用readline()方法,这样循环可以访问文本文件的所有行,就可以使用for eachline in myFile替换for eachline in myFile.readlines()

    1 >>> myFile = open('testfile.txt')
    2 >>> for eachline in myFile:
    3 ... print eachline
    4 ...

    8.2 创建迭代器

    对一个对象调用iter()就可以得到它的迭代器。语法如下:

    iter(obj)

    iter(func, sentinel)

    如果传递一个参数给iter(),会检查传递的参数是不是一个序列,如果是,根据索引从0一直迭代到序列结束。如果是传递的两个参数给iter(),会重复的调用func,直到迭代器的下个值等于sentinel。

    9 列表解析

    列表解析可用于动态的创建列表,语法如下:

    [expr for iter_var in iterable]

    前面的expr应用于序列的每个成员,最后的结果值是该表达式产生的列表。迭代变量并不需要是表达式的一部分。

    1 >>> [x**2 for x in range(6)]
    2 [0, 1, 4, 9, 16, 25]

    还可以和if表达式结合使用,扩展语法如下:

    [expr for iter_var in iterable if cond_expr]

    这个语法会过滤或"捕捉"满足条件表达式cond_expr的序列成员。

    1 >>> [x for x in range(6) if x % 2]
    2 [1, 3, 5]

    (1)举例:矩阵样例

    如一个3行5列的矩阵

    1 >>> [(x+1, y+1) for x in range(3) for y in range(5)]
    2 [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]

    10 生成器表达式

    生成器表达式是列表解析的一个扩展。生成器是特定的函数,允许你返回一个值,然后"暂停"代码的执行,稍后恢复。

    列表解析的不足是必须生成所有的数据,用以创建整个列表。生成器的基本语法和列表相似,不过不是真正的创建数字列表,而是返回一个生成器,这个生成器每次计算出一个条目后,把这个条目"产生"(yield)出来。

    生成器表达式如下:

    (expr for iter_var in iterable if cond_expr)

    (1)举例:交叉配对样例

    >>> rows = [1, 2, 3, 17]
    >>> def cols():
    ...     yield 56
    ...     yield 2
    ...     yield 1
    >>> x_product_pairs = ((i, j) for i in rows for j in cols())
    >>> for pair in x_product_pairs:
    ...     print pair
    ... 
    (1, 56)
    (1, 2)
    (1, 1)
    (2, 56)
    (2, 2)
    (2, 1)
    (3, 56)
    (3, 2)
    (3, 1)
    (17, 56)
    (17, 2)
    (17, 1)

    (2)重构样例

    获取文件中长度最大的行:

    1 f = open('/etc/motd','r')
    2 
    3 longest = max(len(x.strip()) for x in f)
    4 
    5 f.close()
    6 
    7 return longest

    简化如下:

    1 return max(len(x.strip()) for x in open('/etc/motd')) 
  • 相关阅读:
    得到内网可用的SqlServer 及某数据库下的表及其他的架构
    VS2005 XML注释生成XML文档文件
    华表 单元格公式设定与计算
    自定义控件开发示例二
    自定义控件的 Enum类和Color类 属性的公开设定
    入门者初试 Cell(华表)结合C#的应用
    VS2005 + VSS6.0 简单应用示例
    SQL2000联机丛书:使用和维护数据仓库
    VS2005 通过SMO(SQL Management Objects) 管理 数据库的作业 警报 备份 等任务
    SQL2000联机丛书:基本 MDX
  • 原文地址:https://www.cnblogs.com/mrlayfolk/p/12000495.html
Copyright © 2011-2022 走看看