python流程控制for while

for

for 序列

1
2
3
4
5
6
list1 = [1,2,3,4]
for i in list1:
print i

for i in list1:
print i,

print默认输出每行都带换行符,加逗号可以抑制换行符。

  • tange()函数,返回列表

    1
    2
    3
    for i in range(1,11):
    if i % 2 == 0:
    print i
  • 列表重写(列表表达式)

    1
    2
    3
    print [i for i in range(1,11)]

    print [i**2 for i in range(1,11) if i % 2 == 0]
  • 实例
    计算1+2+….+100

    1
    2
    3
    4
    sum = 0
    for i in range(1,101):
    sum = sum + i
    print sum

xrange()函数返回对象,不占用内存资源,比range()更快更高效。

for 字典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
In [7]: dic1 = dict.fromkeys('abcde',100)

In [8]: dic1
Out[8]: {'a': 100, 'b': 100, 'c': 100, 'd': 100, 'e': 100}

In [9]: for i in dic1:print i
a
c
b
e
d

In [10]: for i in dic1:print i,dic1[i]
a 100
c 100
b 100
e 100
d 100

In [11]: for i in dic1.items():print i
('a', 100)
('c', 100)
('b', 100)
('e', 100)
('d', 100)

In [12]: for v,k in dic1.items():print v,k
a 100
c 100
b 100
e 100
d 100
  • 乘法口诀实现
    1
    2
    3
    4
    for i in xrange(1,10):
    for j in xrange(1,i+1)
    print “%sx%s” %(j, i, j*i),
    print

循环的退出

  • for
    循环正常结束才会执行else。
  • if
    出现多个时,每个都会判断。
  • elif
    当前面有if满足条件时,该条件不再判断。
  • break
    直接退出循环,不再执行。
  • continue
    退出该次循环,执行下一次循环。
  • pass
    占位符,无意义
  • sys.exit()
    退出整个脚本

    示例1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # cat 2_1_5.py 
    #!/usr/bin/python

    import sys
    import time

    for i in xrange(10):
    if i == 3:
    continue
    elif i == 6:
    pass
    elif i == 7:
    sys.exit()
    print i
    else:
    print "main end"
    print "hahaha"

输出结果

1
2
3
4
5
6
7
# python 2_1_5.py 
0
1
2
4
5
6

示例2

  • 系统生成一个20以内的随机整数
    玩家有6次机会进行猜猜看,每次猜测都有反馈(猜大了,猜小了,猜对了,结束)
    6次中,猜对了,玩家赢了
    否则系统赢
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # cat 2_1_6.py 
    #!/usr/bin/python

    import random

    flag = 0
    digt = random.randint(1,20)
    print digt
    for i in xrange(1,7):
    in_num = int(raw_input("Please input a number:"))
    if in_num > digt:
    print "too big;"
    elif in_num < digt:
    print "too small;"
    elif in_num == digt:
    print "you are right."
    flag = 1
    break

    if flag == 0:
    print "have no change,system win!"
    elif flag == 1:
    print "congratulation!You win!"

while循环

说明

for循环用在有次数的循环上。
while循环用在有条件的控制上。
while循环,直到表达式为假才退出;表达式是一个逻辑表达式,必须返回一个True或False。
while循环后的else用法同for循环,当while条件正常结束时执行,否则不执行。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat 2_2_2.py
#!/usr/bin/python

in_put = ''
while in_put != "q":
print "hello"
in_put = raw_input("Please input something,q for quit:")
# if in_put == ''
if not in_put:
break
if in_put == "quit":
continue
print "continue"
else:
print "world"

输出结果

1
2
3
4
5
6
7
8
9
10
11
12
# python 2_2_2.py 
hello
Please input something,q for quit:a
continue
hello
Please input something,q for quit:quit
hello
Please input something,q for quit:quit
hello
Please input something,q for quit:q
continue
world

实例1

  • 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
    程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    i = 0
    list1 = []
    for a in range(1, 5):
    for b in range(1, 5):
    for c in range(1, 5):
    if((a != b) and (a != c) and (b != c)):
    i += 1
    d = a + b*10 + c*100
    list1.append(d)
    print("满足条件的三位数共有{}个,如下列表所示".format(i))
    print(list1)

输出结果

1
2
满足条件的三位数共有24个,如下列表所示
[321, 421, 231, 431, 241, 341, 312, 412, 132, 432, 142, 342, 213, 413, 123, 423, 143, 243, 214, 314, 124, 324, 134, 234]

  • 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
    程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
1
2
3
4
5
6
7
list2 = []
for i in range(100, 1000):
str1 = str(i)
a, b , c = str1[0], str1[1], str1[2]
if(int(a)**3 + int(b)**3 + int(c)**3 == i):
list2.append(i)
print(list2)

输出结果

1
[153, 370, 371, 407]

  • 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
    1
    2
    3
    4
    5
    import itertools
    list1 = ['x', 'y', 'z']
    for i in itertools.permutations(list1):
    if(i[0] != 'x' and i[2] != 'x' and i[2] != 'z'):
    print('a vs {0}, b vs {1}, c vs {2}'.format(i[0], i[1], i[2]))

输出结果

1
a vs z, b vs x, c vs y

实例2

  • 将一个正整数分解质因数。例如:输入90,打印出90=233*5。
    程序分析:对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成:
    (1)如果分解后商为1,则说明分解质因数的过程已经结束,打印出即可。
    (2)如果商不为1,则应打印出i的值,并用n除以i的商,作为新的正整数进行分解,重复执行第一步。
    (3)如果n不能被i整除,则i的值加1,重复执行第一步。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    num = int(input("input a integer:"))
    list1 = [num]
    str1 = ''
    while num != 1:
    for i in range(2, int(num+1)):
    if num % i == 0:
    list1.append(i)
    num = num / i
    break
    for j in range(1, len(list1)):
    str1 += str(list1[j])
    print("{0}=".format(list1[0]), end='')
    print('*'.join(str1))

输出结果

1
2
input a integer:175
175=5*5*7

  • 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
    程序分析:采取逆向思维的方法,从后往前推断。
    1
    2
    3
    4
    p = 1
    for i in range(9, 0, -1):
    p = (p+1)*2
    print(p)

输出结果

1
1534

Recommended Posts