Python 3 基本语法(三)分支和循环

1.for循环

a = ['This', 'is', 'a', 'list', '!']
b = ['This', 'is', 'a', 'tuple', '!']
c = {'This': 'is', 'an': 'unordered', 'dict': '!'}
 
# 依次输出:'This', 'is', 'a', 'list', '!'
for x in a:
    print(x)
 
# 依次输出:'This', 'is', 'a', 'tuple', '!'
for x in b:
    print(x)
 
# 键的遍历。不依次输出:'This', 'dict', 'an'
for key in c:
    print(key)
 
# 依次输出0到9
for i in range(10):
    print(i)

注意到每个for循环中,print都有缩进,这是Python中一个让人爱恨交织的特点:强行缩进来表明成块的代码。这样做的好处是代码十分清晰工整,还有助于防止写出过长的函数或者过深的嵌套,坏处是有时候不知为什么tab和空格就一起出现了,又或是多重if-else不知怎得就没对齐,还是挺麻烦的。

回到for循环上,这种把每个元素拿出来的遍历方式叫做for_each风格,熟悉Java的话就不会陌生,C++11中也开始支持这种for循环方式。不过如果还是需要下标呢?比如遍历一个list的时候,希望把对应下标也打印出来,这时可以用enumerate:

names = ["Rick", "Daryl", "Glenn"]
 
# 依次输出下标和名字
for i, name in enumerate(names):
    print(i, name)
注:
1.enumerate() 函数
-描述
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

-语法
以下是 enumerate() 方法的语法:
enumerate(sequence, [start=0])

-参数
sequence -- 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置。

在使用for循环时,有时会遇到这样一种场景:我们需要对遍历的每个元素进行某种判断,如果符合这种判断的情况没有发生,则执行一个操作。举个例子某神秘部门要审核一个字符串列表,如果没有发现不和谐的字眼,则将内容放心通过,一种解决办法是下面这样:

wusuowei = ["I", "don't", "give", "a", "shit"]  # 无所谓
 
hexie = True                                    # 默认和谐社会
for x in wusuowei:
    if x == "f**k":
        print("What the f**k!")                 # 发现了不该出现的东西,WTF!
        hexie = False                           # 不和谐了
        break                                   # 赶紧停下!不能再唱了
 
if hexie:                                       # 未发现不和谐元素!
    print("Harmonious society!")                # 和谐社会!

这样需要设置一个标记是否发现不和谐因素的状态变量hexie,循环结束后再根据这个变量判断内容是否可以放心通过。一种更简洁不过有些小众的做法是直接和else一起,如果for循环中的if块内的语句没有被触发,则通过else执行指定操作:

wusuowei = ["I", "don't", "give", "a", "shit"]
 
for x in wusuowei:
    if x == "f**k":
        print("What the f**k!")
        hexie = False
        break
else:                            # for循环中if内语句未被触发
    print("Harmonious society!") # 和谐社会!

这样不需要一个标记是否和谐的状态变量,语句简洁了很多。

2.if和分支结构

上一个例子中已经出现if语句了,所以这部分讲讲if。Python的条件控制主要是三个关键字:if-elif-else,其中elif就是else if的意思。还是看例子:

pets =['dog', 'cat', 'droid', 'fly']
 
for pet in pets:
    if pet == 'dog':        # 狗粮
        food = 'steak'      # 牛排
    elif pet == 'cat':      # 猫粮
        food = 'milk'       # 牛奶
    elif pet == 'droid':    # 机器人
        food = 'oil'        # 机油
    elif pet == 'fly':      # 苍蝇
        food = 'sh*t'       # 
    else:
        pass
    print(food)

需要提一下的是pass,这就是个空语句,什么也不做,占位用。Python并没有switch-case的语法,等效的用法要么是像上面一样用if-elif-else的组合,要么可以考虑字典:

pets = ['dog', 'cat', 'droid', 'fly']
food_for_pet = {
    'dog': 'steak', 
    'cat': 'milk', 
    'droid': 'oil', 
    'fly': 'sh*t'
}
 
for pet in pets:
    food = food_for_pet[pet] if pet in food_for_pet else None
    print(food)

这里还用到了一个if-else常见的行内应用,就是代替三元操作符,如果键在字典中,则food取字典的对应值,否则为None。

注:if表达式中的小技巧
1.通过链式比较让语句简洁:

if -1 < x < 1:  # 相较于 if x > -1 and x < 1:
    print('The absolute value of x is < 1')

2.判断一个值是不是等于多个可能性中的一个:

if x in ['piano', 'violin', 'drum']:    # 相较于 if x == 'piano' or x == 'violin' or x =='drum':
    print("It's an instrument!")

Python中的对象都会关联一个真值,所以在if表达式中判断是否为False或者是否为空的时候,是无需写出明确的表达式的:

a = True
if a:		# 判断是否为真,相较于 a is True
    print('a is True')
 
if 'sky':	# 判断是否空字符串,相较于 len('sky') > 0
    print('birds')
	
if '':		# 判断是否空字符串,同上
    print('Nothing!')
 
if {}:		# 判断是否空的容器(字典),相较于len({}) > 0
    print('Nothing!')

隐式表达式为False的是如下状况:

  • None

  • False

  • 数值0

  • 空的容器或序列(字符串也是一种序列)

  • 用户自定义类中,如果定义了__len__()或者__nonzero__(),并且被调用后返回0或者False

3.while循环

while的就是循环和if的综合体,是一种单纯的基于条件的循环,本身没有遍历的意思,这是和for_each的本质差别,这种区别比起C/C++中要明确得多,用法如下:

i = 0
while i < 100:  # 笑100遍
    print("ha")

while True:     # 一直笑
    print("ha")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值