Loading

流程控制语句


返回 我的技术栈(Technology Stack)



两种基本流程控制结构:

分支结构:用于实现根据条件来选择性地执行某段代码

循环结构:用于实现根据循环条件重复执行某段代码


if 语句


Python的 if 分支既可以作为语句使用,也可以作为表达式使用

问:if条件是不是只能 使用bool类型的表达式?

答:
不是!if条件可以是任意类型,当下面的值作为bool表达式时,会被解释器当作 False

False、None、0、""、()、[]、{}

可以看到,除了False本身,各种代表“空”的None、空字符串、空元组、空列表、空字典都会被当成False处理

# 定义空字符串
s = ""
if s :
print('s不是空字符串')
else:
print('s是空字符串')
# 定义空列表
my_list = []
if my_list:
print('my_list不是空列表')
else:
print('my_list是空列表')
# 定义空字典
my_dict = {}
if my_dict:
print('my_dict不是空字典')
else:
print('my_dict是空字典')

输出:
s是空字符串
my_list是空列表
my_dict是空字典

使用if else语句时的一条基本规则:总是先把包含范围小的条件放在前面处理。

例如age>60与age>20,明显age>60的范围更小,所以应该先处理age>60


while语句


【遍历元组】
a_tuple = ('fkit', 'crazyit', 'Charli')
i = 0
# 只有i小于len(a_list),继续执行循环体
while i < len(a_tuple):
    print(a_tuple[i]) # 根据i来访问元组的元素
    i += 1
    
输出:
fkit
crazyit
Charli

for-in循环


s_max = input("请输入您想计算的阶乘:")
mx = int(s_max)
result = 1
# 使用for-in循环遍历范围
for num in range(1, mx + 1):
    result *= num
print(result)
输出:
请输入您想计算的阶乘:6
720

循环遍历列表


isinstance(ele, int):判断某个变量是否为指定类型的实例,第一个参数是要判断的变量,第二个是参数的类型

src_list = [12, 45, 3.4, 13, 'a', 4, 56, 'crazyit', 109.5]
my_sum = 0
my_count = 0
for ele in src_list:
    # 如果该元素是整数或浮点数
    if isinstance(ele, int) or isinstance(ele, float):
        print(ele)
        # 累加该元素
        my_sum += ele
        # 数值元素的个数加1
        my_count += 1
print('总和:', my_sum)
print('平均数:', my_sum / my_count)
输出:
12
45
3.4
13
4
56
109.5
总和: 242.9
平均数: 34.7

循环遍历字典


my_dict = {'语文': 89, '数学': 92, '英语': 80}
# 通过items()方法遍历所有key-value对
# 由于items方法返回的列表元素是key-value对,因此要声明两个变量,【有一个序列解包的过程】
for key, value in my_dict.items():
    print('key:', key)
    print('value:', value)
print('-------------')
# 通过keys()方法遍历所有key
for key in my_dict.keys():
    print('key:', key)
    # 在通过key获取value
    print('value:', my_dict[key])
print('-------------')
# 通过values()方法遍历所有value
for value in my_dict.values():
    print('value:', value)
    
输出:
key: 语文
value: 89
key: 数学
value: 92
key: 英语
value: 80
-------------
key: 语文
value: 89
key: 数学
value: 92
key: 英语
value: 80
-------------
value: 89
value: 92
value: 80

词频统计


src_list = [12, 45, 3.4, 12, 'fkit', 45, 3.4, 'fkit', 45, 3.4]
statistics = {}
for ele in src_list:
    # 如果字典中包含ele代表的key
    if ele in statistics:
        # 将ele元素代表出现次数加1
        statistics[ele] += 1
    # 如果字典中不包含ele代表的key,说明该元素还未出现国
    else:
        # 将ele元素代表出现次数设为1
        statistics[ele] = 1        
# 遍历dict,打印出各元素的出现次数
for ele, count in statistics.items():
    print("%s的出现次数为:%d" % (ele, count))
    
    
输出:
12的出现次数为:2
45的出现次数为:3
3.4的出现次数为:3
fkit的出现次数为:2

for 表达式


for表达式与普通for循环的区别:

​ (1)在for关键字之前定义一个表达式,该表达式通常会包含循环计数器

​ (2)for表达式没有循环体,因此不需要冒号


列表推导式


对于[ ] 括号 for表达式最终返回的是列表,因此for表达式也被成为列表推导式

a_range = range(10)
# 对a_range执行for表达式
a_list = [x * x for x in a_range]
# a_list集合包含10个元素
print(a_list)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
b_list = [x * x for x in a_range if x % 2 == 0]
# a_list集合包含5个元素
print(b_list)  # [0, 4, 16, 36, 64]

生成器推导式

对于()圆括号的for表达式,它最终返回的是生成器,因此这种for表达式也被称之为生成器推导式

# 使用for表达式创建生成器
c_generator = (x * x for x in a_range if x % 2 == 0)
# 使用for循环迭代生成器
for i in c_generator:
    print(i, end='\t')  # 0  4  16  36  64
print()

两层嵌套:

d_list = [(x, y) for x in range(5) for y in range(4)]
# d_list列表包含20个元素
print(d_list)
# [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]
等价于:
dd_list = []
for x in range(5):
    for y in range(4):
        dd_list.append((x, y))
print(dd_list)
# [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]

三层嵌套:

            
e_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(6)]
# 3_list列表包含120个元素 【5*4*6】
print(e_list)
# [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 0, 5], [0, 1, 0], [0, 1, 1], [0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 1, 5], [0, 2, 0], [0, 2, 1], [0, 2, 2], [0, 2, 3], [0, 2, 4], [0, 2, 5], [0, 3, 0], [0, 3, 1], [0, 3, 2], [0, 3, 3], [0, 3, 4], [0, 3, 5], [1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 0, 3], [1, 0, 4], [1, 0, 5], [1, 1, 0], [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 1, 5], [1, 2, 0], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 0], [1, 3, 1], [1, 3, 2], [1, 3, 3], [1, 3, 4], [1, 3, 5], [2, 0, 0], [2, 0, 1], [2, 0, 2], [2, 0, 3], [2, 0, 4], [2, 0, 5], [2, 1, 0], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 1, 4], [2, 1, 5], [2, 2, 0], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 2, 4], [2, 2, 5], [2, 3, 0], [2, 3, 1], [2, 3, 2], [2, 3, 3], [2, 3, 4], [2, 3, 5], [3, 0, 0], [3, 0, 1], [3, 0, 2], [3, 0, 3], [3, 0, 4], [3, 0, 5], [3, 1, 0], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 1, 4], [3, 1, 5], [3, 2, 0], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 2, 4], [3, 2, 5], [3, 3, 0], [3, 3, 1], [3, 3, 2], [3, 3, 3], [3, 3, 4], [3, 3, 5], [4, 0, 0], [4, 0, 1], [4, 0, 2], [4, 0, 3], [4, 0, 4], [4, 0, 5], [4, 1, 0], [4, 1, 1], [4, 1, 2], [4, 1, 3], [4, 1, 4], [4, 1, 5], [4, 2, 0], [4, 2, 1], [4, 2, 2], [4, 2, 3], [4, 2, 4], [4, 2, 5], [4, 3, 0], [4, 3, 1], [4, 3, 2], [4, 3, 3], [4, 3, 4], [4, 3, 5]]
src_a = [30, 12, 66, 34, 39, 78, 36, 57, 121]
src_b = [3, 5, 7, 11]
# 只要y能整除x,就将它们配对在一起
result = [(x, y) for x in src_b for y in src_a if y % x == 0]
print(result)
# [(3, 30), (3, 12), (3, 66), (3, 39), (3, 78), (3, 36), (3, 57), (5, 30), (11, 66), (11, 121)]

常用工具函数


zip()函数

zip()函数可以把两个列表“压缩”成一个zip对象(可迭代对象)

a = ["a","b","c"]
b = [1,2,3]
print([x for x in zip(a,b)])
输出:
[("a",1),("b",2),("c",3)]

可以看出,zip()函数压缩得到的可迭代对象所包含的元素是由原列表元素组成的元组

注意:如果zip()函数压缩两个长度不相等的列表,那么zip函数将以长度更短的列表为准

a = ["a","b","c"]
b = [1,2]
print([x for x in zip(a,b)])
输出:
[("a",1),("b",2)]

还可以压缩多个列表

a = ["a","b","c"]
b = [1,2,3]
c = [11,22,33]
print([x for x in zip(a,b,c)])
输出:
[("a",1,11),("b",2,22),("c",3,33)]

reversed()函数和sorted()函数

有时候,如果程序需要反向遍历,此时可以通过 reversed()函数,该函数不会改变参数本身,sorted()排序函数也是,其默认升序排序,设置参数reverse=True ,为

降序排序;传入参数key=len,表示按字符串长度排序。

a  =range(10)
print([x for x in reversed(a)])
print(a)
输出:
[9,8,7,6,5,4,3,2,1,0]
range(0,10)

reversed()函数也可以对列表、元组进行反转

b = ["a","fkit",20,3.4,50]
print(x for x in reversed(b))
输出:
[50,3.4,20,"fkit","a"]

break、continue


exit_flag = False
# 外层循环
for i in range(0, 5) :
    # 内层循环
    for j in range(0, 3 ) :
        print("i的值为: %d, j的值为: %d" % (i, j))
        if j == 1 :
            exit_flag = True
            # 跳出里层循环
            break
    # 如果exit_flag为True,跳出外层循环
    if exit_flag :
        break   
        
输出:
i的值为: 0, j的值为: 0
i的值为: 0, j的值为: 1
# 一个简单的for循环
for i in range(0, 3 ) :
    print("i的值是: ", i)
    if i == 1 :
        # 忽略本次循环的剩下语句
        continue
    print("continue后的输出语句")
    
输出:
i的值是:  0
continue后的输出语句
i的值是:  1
i的值是:  2
continue后的输出语句

posted @ 2021-04-09 15:27  言非  阅读(51)  评论(0编辑  收藏  举报