python控制结构---条件分支和循环结构

本章和下一章讲解python控制结构;

  • 条件分支
  • 循环
  • 函数
  • 异常处理

要编写程序代码需要有数据类型、变量和保存变量的数据结构,也需要控制结构,比如分支结构和循环等,以提供程序流程和遍历的控制功能。在这一章中我们将学习如何使用 if 语句,如何使用while和for循环 进行程序的循环。

下一章我们也会讲解如何定义函数,因为功能封装的一个基本方法就是把功能放到函数和方法之中。异常则可以影响到流程的控制,所以也会学习异常的处理和异常的创建。


一、条件分支

python提供了一个和C++、Java等语言具有相同意义的 if 语句,语法形式如下;

if expression1:
    suite1
elif expression2:
    suite2
else:
    suite3

示例:

x = int(input('please input a num:'))
if x > 0:
    print(x)

python 提供了pass关键字,因为有时候我们需要说明正在处理一个‘什么也没有’的状态,就用pass来表示这个情况;

if x == 5:
    pass

当循环语句只有一句的时候,我们可以直接写在冒号的后面;

if x == 5: pass

逻辑运算符;

组别运算符说明
Comparison<, <=, ==, !=, >=, >用来判断大小相等关系
Identityis, is not这些用来判断两个对象引用是否引用到同一隐含对象上
Membershipin, not in这些用在列表、字典和字符串上
Logicalnot, and, orand 和 or都是短路逻辑,它们的位的等效数有:~(not), &(and), |(or) 和 ^(xor)

python使用elif 和else 来提供多种形式的分支;python中没有case或者switch。

if x < 10:
    print('small')
elif x < 100:
    print('medium')
elif x < 1000:
    print('large')
else:
    print('huge')

当然也可以嵌套使用;

num = int(input('Please input an number:'))
if num % 2 == 0:
    if num % 3 == 0:
        print('num可以被2和3整除')
    else:
        print('num可以被2整除,不能被3整除')
else:
    if num % 3 == 0:
        print('num可以被3整除,不能被2整除')
    else:
        print('num既不可以被2整除,也不可以被3整除')

条件表达式;

形式如下:
trueResult if expression else falseResult
即条件为真时输出结果,if条件表达式,else条件为假时的输出结果

示例;

print('x is zero or positive') if x >= 0 else print('x is negative')

二、循环

python提供了两种循环(loop)结构。

while循环

其基本语法是;

while expression:
    suite

示例;

count = 10
while count != 0:
    print(count, end=' ')
    count -= 2
输出:
10 8 6 4 2

这里由于使用了end=‘ ’ 所以会在同一行打印出数字。

循环是可以提前结束的,这可以使用 break 语句。这在循环中来说是特别有用的,否则如果条件表达式总为True,循环会一直进行下去;

while True:
    item = input('please input:')
    if item == 'q':
        break
    else:
        print("程序继续。")

python的while循环也可以和else语句联合使用;

while expression:
    suite1
else:
    suite2

else语句可有可无。如果循环在某一条件下终止,而不是由break语句提前终止的,就会执行else语句。
示例;

mylist = ['a','b','c','d','e']
i = 0
while i < len(mylist):
    if mylist[i] == 'f':
        print('Found the item.')
        break
    i += 1 
else:
    print("Don't find")

for 循环

其基本语法是;

for variable in iterable:
    suite1
else:
    suite2

对于经常需要遍历列表上的元素或对某个特定的数循环多次,我们可以使用for循环。else 的工作方式与while循环中的else 工作工作方式相同。如果for 循环完成,就执行else里面的语句,但如果是背break 语句终止了,就不会执行else里面的语句了。

primes = [2]
for x in range(2,10):
    if x % 2:
        for p in primes:
            if x % p == 0:
                break
        else:
            primes.append(x)
print(primes)
输出:
[2, 3, 5, 7]

只有当primes列表迭代完才会调用append( )方法,也就是说,只有x不能被之前的任何素数除尽的时候才会执行它。

iterable是一个可被遍历的对象,比如字符串、列表、元组、字典或者迭代器。如果是字典,则迭代的是字典的键。
示例;

for char in 'aeiou':
    print('%s=%d'%(char,ord(char)))
输出结果:
a=97
e=101
i=105
o=111
u=117

变量char会依次遍历循环变量中的每个值,每个遍历值都会执行相应的循环语句。

range( )内置函数则会返回一个整数列表,因而可以方便的应用于for循环中。

for i in range(5):
    print(i)
输出:
0
1
2
3
4

默认情况下,range( )函数会返回一个从整数0开始,每次加1直至但不包括给定值的列表。
该函数还有其他两种形式;

range(3,7)#return[3,4,5,6]
range(-4,12,3)#return[-4,-1,2,5,8,11]

python 还提供了一个与range( )函数具有相同语义的xrange( )函数,在for循环中该函数的内存利用率能够更高些,因为在每次调用中,它都只是简单地进行一次计算,而不是一次就生成一个完整的整数列表。通常情况下,都会使用range() ,而只有在需要大幅提升性能时,才会用xrange( )代替range()。

如果for 循环的遍历值是是可变的(比如是列表或字典),必须保证在循环体内不去改变它的值。如果在遍历列表或字典时又需要更改它的值,就必须去遍历由列表索引值构成的列表或者是遍历由字典的键构成的列表,或者是使用浅赋值,而不是直接对集合本身进行操作。
示例;

presidents = dict(Washington=(1789,1797),Adams=(1797,1801),
                Jefferson=(1801,1809),Madison=(1809,1817))
for key in presidents.keys():
    if key == 'Adams':
        del presidents[key]
    else:
        print(key,presidents[key])

由于字典保存这许多的键值对,python就提供了一些键、值、键值对的遍历方法。如果只是简单遍历字典,甚至都不需要调用keys( )方法来获得字典的各个键;

presidents = dict(Washington=(1789, 1797), Adams=(1797, 1801),
                Jefferson=(1801,1809),Madison=(1809,1817))
for key in presidents:
    print('%s: %d-%d' %(key,presidents[key][0],presidents[key][1]))
输出:
Washington: 1789-1797
Adams: 1797-1801
Jefferson: 1801-1809
Madison: 1809-1817

在for循环遍历字典时,变量就会被依次设置成字典的每个键。字典时无序的,所以会以不确定的顺序返回字典的键。

如果想要得到值,可以使用values( )方法

for item in presidents.values():
    print(item)
输出:
(1789, 1797)
(1797, 1801)
(1801, 1809)
(1809, 1817)

如果想要得到键值对,则可以使用items( )方法;

for item in presidents.items():
    print('%s: %d-%d' % (item[0],item[1][0],item[1][1]))
输出:
Washington: 1789-1797
Adams: 1797-1801
Jefferson: 1801-1809
Madison: 1809-1817

当然还可以这样遍历;这样会打开items( )方法返回的每一个键值对,dates会成为二元素日期元组。

for key, datas in presidents.items():
    print('%s: %d-%d' %(key, datas[0], datas[1]))

其他内置函数:

  • 内置函数 zip 返回一系列并行元素的元组,可用在for循环中遍历多个序列;
for (ch, x) in zip(l1,l2):
    print(ch,x)
输出:
a 1
b 2
c 3
d 4
  • 内置函数 enumerate 同时生成可迭代对象中元素的值和索引,因而我们可以不用手动计数;
s = 'spam'
for (offset,item) in enumerate(s):
    print(item,'appears at offset',offset)
输出:
s appears at offset 0
p appears at offset 1
a appears at offset 2
m appears at offset 3

列表解析和生成器
python还提供了另一个生成列表的表达式—称为列表解析。

l1 = [x for x in range(10)]
l2 = [x for x in range(50) if x % 5 == 0]
print(l1)
print(l2)
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45]

列表解析的一个缺点是,运行一次就会生成整个列表,而如果列表很大的话,就会消耗大量的内存空间。可以使用python生成器
不同的是这里用的是圆括号而不是方括号。

fives = (x for x in range(50) if x % 5 == 0)
print(fives)
for x in (x for x in range(50) if x % 5 == 0):
    print(x)
输出:
<generator object <genexpr> at 0x7f8cb0224410>
0
5
10
15
20
25
30
35
40
45
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他是只猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值