python语⾔整除⽤什么_python如何整除
for 循环
本系列前⾯ “探索 Python,第 5 部分:⽤ Python 编程” ⼀⽂讨论了 if 语句和 while 循环,讨论了复合语句以及适当缩进 Python 语句来指⽰相关 Python 代码块。该⽂的结尾介绍了 Python for 循环。但就其使⽤和功能来说,for 循环更值得关注,所以本⽂单独讲述该循环。
for 循环有⼀个简单的语法,使您可以从容器对象中提取单个项⽬并对其进⾏某些操作。简单地说,使⽤ for 循环,可以迭代中对象集合的项⽬。对象集合可以是任何 Python 容器类型,包括前⾯⽂章中讨论的 tuple、string 和 list 类型。但是容器 metaphor 的功能⽐这三种类型更强⼤。metaphor 包括其他序列类型,如 dictionary 和 t,将来的⽂章中将对它们进⾏讨论。
但是请稍等!还有更多信息:for 循环可以⽤于迭代⽀持迭代 metaphor 的任何对象,这使 for 循环⾮常有⽤。
清单 1 中显⽰了 for 循环的基本语法,还演⽰了如何在 for 循环中使⽤ continue 和 break 语句。 清单 1. for 循环的伪代码
12345678910111213
for item in container:
if conditionA: # Skip this item
continue
elif conditionB: # Done with loop
break
# action to repeat for each item in the container
el:
# action to take once we have finished the loop.
本系列中的第⼆篇⽂章 “探索 Python,第 2 部分:探索 Python 类型的层次结构” 介绍了 Python tuple。如⽂中所述,tuple 类型是不可变的异构容器。这主要是说 tuple 可以存放不同类型的对象,但是它⼀旦创建,就⽆法更改。清单 2 演⽰了如何使⽤ for 循环迭代 tuple 的元素。 清单 2. for 循环和 tuple
1234567891011121314151617
t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) count = 0for num in t:
... count += el:... print count (45)
count = 0for num in t:
... if num % 2:... count += el:... print count (20)
本例⾸先创建了名为 t 的 tuple,存放整数 0 ⾄ 9(包含 9)。第⼀个 for 循环迭代此 tuple,在 count 变量中累计 tuple 中数值的和。⼀旦代码已经迭代了 tuple 中的所有元素,它将进⼊ for 循环的 el ⼦句,打印 count 变量的值。
清单 2 中显⽰的第⼆个 for 循环也迭代 tuple 中的所有元素。但是,它仅累计容器中能够被 2 整除的那些项的值(请记住如果表达式为⾮零,if 语句将确定为真,num 不能被 2 整除时使⽤ % 运算符会返回⾮零值)。此限制通过使⽤适当的 if 语句和 continue 语句来完成。如前⾯的⽂章中所述,continue 语句使包含它的循环开始下⼀次迭代。实现相同结果的另⼀种⽅法是测试 tuple 中的当前项是否是偶数(使⽤if not num % 2:),如果为真,那么将当前项添加到运⾏总和中。⼀旦代码完成 tuple 中的迭代,将调⽤ el ⼦句,打印总和。
本系列中的第三篇⽂章 “探索 Python:第 3 部分:探索 Python 类型的层次结构” 讨论了 Python string。string 是不可变的同构容器,这意味着它仅能存放字符且⼀旦建⽴将⽆法修改。清单 3 演⽰了如何使⽤ Python string 作为 for 循环的容器。 清单 3. for 循环和string
123456789101112131415161718192021
st = "Python Is A Great Programming Language!"for c in st:
... print c,... P y t h o n I s A G r e a t P r o g r a m m i n g L a n g u a g e !
count = 0for c in st:
... if c in "aeiou":... count += 1... el:... print count (10)
count = 0for c in st.lower():
... if c in "aeiou":... count += 1... el:... print count (12)
本例提供了三个不同的 for 循环,它们都迭代同⼀ string。第⼀个 for 循环迭代 string “Python Is A Great Programming
Language!” 并⼀次打印 string 中的⼀个字符。在此例中,print 语句变量 c 后加了⼀个逗号。这使 print 语句打印字符值时后⾯跟着空格字符,⽽不是换⾏字符。如果没有后⾯的逗号,字符将全部打印在单独的⾏中,会很难读。
下两个 for 循环迭代该字符串并计算其包含多少个元⾳字母(“a”、“e”、“i”、“o” 或 “u”)。第⼆个 for 循环在迭代原始 string 时仅查找⼩写元⾳字母。第三个 for 循环迭代通过调⽤ string 对象的 lower ⽅法返回的临时 string。lower ⽅法将 string 中的所有字符转换为⼩写。因此,第三个 for 循环可找到另外两个元⾳字母。
本系列中的第四篇⽂章 “探索 Python,第 4 部分:探索 Python 类型的层次结构” 介绍了 Python list。list 是异构可变容器,这意味着它可以存放不同类型的对象且创建后可以修改。清单 4 演⽰了如何使⽤ list 和 for 循环。 清单 4. for 循环和 list
12345678910
mylist = [1, 1.0, 1.0j, '1', (1,), [1]]for item in mylist:
... print item, "t", type(item))... 1 1.0 1j 1 (1,) [1]
既然 list 是很灵活的 Python 容器类型(您将在本系列其余的⽂章中多次看到它),本例看起来可能过于
简单了。但是,这是⼀部分要点:使⽤ for 循环使处理容器中的每个项⽬⾮常简单,甚⾄处理包含各种不同对象的 list 也是如此。本例迭代 Python list 中的所有项⽬,并在单独的⾏中打印每⼀项及其相对应的 Python 类型。 迭代和可变容器
Python list 是⼀个可变序列,提供了⼀种令⼈好奇的可能性:for 循环主体可以修改其正在迭代的 list。正如您可能认为的,这样并不好,如果进⾏此操作,Python 解释器将⽆法很好地⼯作,如清单 5 所⽰。 清单 5. 在 for 循环中修改容器
1234567891011121314151617
mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]for item in mylist:
... if item % 2:... mylist.inrt(0, 100)... ^CTraceback (most recent call last): File "", line 3, in ?KeyboardInterrupt
print mylist
[100, ...., 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Many lines deleted for clarity
mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]for item in mylist[:]:
... if item % 2:... mylist.inrt(0, 100)...
print mylist
[100, 100, 100, 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
本例中的第⼀个 for 循环只要在原始 list 中发现奇数,它就在 list 的开始插⼊数值 100。当然,这是⼀种演⽰此问题的不同寻常的⽅式,但却⾮常好。⼀旦在三个点的 Python 提⽰后按 Enter 键,Python 解释器就处于⽆限循环的混乱中。要停⽌这种混乱,必须通过按 Ctrl-C(其在 Python 输出中显⽰为 ^C)来中断进程,然后会出现 KeyboardInterrupt 异常。如果打印出修改的 list,将看到 mylist 现在包含⼤量的值为 100 的元素(新元素的准确数量取决于您中断循环的速度)。
本例中的第⼆个 for 循环演⽰了如何避免此问题。使⽤切⽚运算符创建原始 list 的副本。现在 for 循环将迭代该副本,⽽对原始 list 进⾏修改。最终的结果是修改后的原始 list,它现在以五个值为 100 的新元素开始。
for 循环和序列索引
如果您⽤过其他编程语⾔,Python for 循环可能看起来有点⼉古怪。您可能认为它更像 foreach 循环。基于 C 的编程语⾔具有 for 循环,但它的设计⽬的是对⼀系列操作执⾏特定次数。Python for 循
环可以通过使⽤内置的 range 和 xrange ⽅法来模拟该⾏为。清单 6
中演⽰了这两种⽅法。 清单 6. range 和 xrange ⽅法
12345678910
r = range(10)print r
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
type(r)
xr = xrange(10)print xr
xrange(10)
type(xr)
本例⾸先演⽰了 range ⽅法,它创建⼀个包含⼀系列整数的新 list。调⽤ range ⽅法的⼀般形式是提供单个值,⽤作整数 list 的上限。零为起始值。因此,调⽤ range(10) 将创建包含整数 0 ⾄ 9(包含 9)的 list。range ⽅法接受起始索引以及步长。所以,调⽤
range(11,20) 将创建从 11 ⾄ 19(包含 19)的整数 list,⽽调⽤ range(12, 89, 2) 将创建从 12 ⾄ 88 的偶数 list。
由于 xrange ⽅法也创建整数 list(其使⽤相同参数),所以它与 range ⽅法⾮常相似。但是,xrange ⽅法仅在需要时才在 list 中创建整数。例如,在清单 6 中,尝试打印出新创建的 xrange 时除了 xrange 的名称,不会显⽰任何数据。当需要迭代⼤量整数时,xrange ⽅法更适⽤,因为它不会创建极⼤的 list,那样会消耗⼤量计算机内存。
清单 7 演⽰了如何在 for 循环内使⽤ range ⽅法来创建整数 1 ⾄ 10(包含 10)的乘法表。 清单 7. 创建乘法表
123456789101112131415
for row in range(1, 11):
... for col in range(1, 11):... print "%3d " % (row * col),... 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90
100
本例使⽤两个 for 循环,外⾯的 for 循环关注乘法表中的每⼀⾏,嵌套的 for 循环关注每⾏内的列。每个循环都迭代包含整数 1 ⾄ 10(包含 10)的 list。最⾥⾯的 print 语句使⽤了⼀个名为 字符串格式化 的新概念来创建格式设置精美的表。字符串格式化是⼀种⾮常有⽤的技术,⽤于以格式设置精美的布局创建由不同数据类型组成的 string。现在详细信息并不重要,将来的⽂章中将讲述这些内容(了解 C 编程语⾔的 printf ⽅法的任何⼈都会很熟悉这些内容)。在本例中,字符串格式化指定将从整数创建新 string 且需要保留三个字符来存放该整数(如果该整数⼩于三个字符,将在左边⽤空格填补,从⽽使数据排列整齐)。第⼆个 print 语句⽤于打印新⾏,从⽽使乘法表中的下⼀⾏被打印在新的⾏中。
range ⽅法还可⽤于迭代容器,通过使⽤适当的索引访问序列中的每⼀项。要进⾏此操作,需要包含容器的允许范围索引值的整数 list,这可以通过使⽤ range ⽅法和 len ⽅法来轻松实现,如清单 8 所⽰。 清单 8. 在 for 循环内索引容器
1234567891011121314
st = "Python Is A Great Programming Language!"for index in range(len(st)):
... print st[index],... P y t h o n I s A G r e a t P r o g r a m m i n g L a n g u a g e !
for item in st.split(' '):
... print item, len(item)... Python 6Is 2A 1Great 5Programming 11Language! 9
这个最后的⽰例演⽰了如何使⽤ len ⽅法作为 range ⽅法的参数,创建可⽤于单独访问 string 中每个字符的整数 list。第⼆个 for 循环还显⽰了如何将 string 分割为⼦字符串的 list(使⽤空格字符来指⽰⼦字符串的边界)。for 循环迭代⼦字符串 list,打印每个⼦字符串及其长度。