《疯狂Python讲义》读书笔记——第4章 流程控制

目录

 

4.1 顺序结构

4.2 if分支结构

4.2.1 不要忘记缩进

4.2.2 不要随意缩进

4.2.3 不要遗忘冒号

4.2.4 if条件的类型

4.2.5 if分支的逻辑错误

4.2.6 if表达式

4.2.7 pass语句(就是空语句)

4.3 断言(assert)

4.4 循环结构

4.4.1 while循环

4.4.2 使用while循环遍历列表和元组(通过列表或元组的索引)

4.4.3 for-in循环

4.4.4  使用for-in循环遍历列表和元组

4.4.5 使用for-in循环遍历字典

4.4.6 循环使用else

4.4.7 嵌套循环

4.4.8 for表达式

4.4.9 常用工具函数

4.5  控制循环结构

4.5.1 使用break结束循环(强行终止循环,跳出循环体,完全中止循环本身)

4.5.2 使用continue忽略本次循环的剩下语句

4.5.3 使用return结束方法(直接结束整个函数或方法)


4.1 顺序结构

——程序从上到下一行行地执行,中间没有任何判断和跳转。

4.2 if分支结构

Python的if语句有三种形式:

(1)、

if   expression  :
    statements...

(2)、

if  expression:
else :
    statements...

(3)、

if  expression  :
    statements...
elif expression :
    statements...
...    //可以有零条elif语句
else :
    statements...

4.2.1 不要忘记缩进

if条件后的条件执行体一定要缩进,只有缩进后的代码才能算条件执行体。

Python通常建议缩进4个空格。

4.2.2 不要随意缩进

位于同一代码块中的所有语句必须保持相同的缩进,既不能多,也不能少。

4.2.3 不要遗忘冒号

4.2.4 if条件的类型

可以是任意类型。

4.2.5 if分支的逻辑错误

在使用if...else分支语句时,一定要先处理包含范围更小的情形。

例如:

#*****************************
#***程序名称:ifcorrect_test.py
#***程序功能:if分支的正确逻辑
#***编写日期:2019-2-16		
#*****************************
age = 45
if age>60:
	print("老年人")
elif age>40:
	print("中年人")
elif age>20:
	print("青年人")

或者可以改为:

#*****************************
#***程序名称:ifcorrect_test2.py
#***程序功能:if分支的正确逻辑
#***编写日期:2019-2-16		
#*****************************
age = 45
if age>60:
	print("老年人")
#在原本的if条件中增加了else的隐含条件
if age > 40 and not(age > 60):
	print("中年人")
#在原本的if条件中增加了else的隐含条件
if age > 20 and not(age > 60) and not(age >40 and not(age >60)):
	print("青年人")

 

4.2.6 if表达式

相当于其他语言中的三目运算符。(略)

4.2.7 pass语句(就是空语句)

有时候程序需要占一个位,放一条语句,但又不希望这条语句做任何事情,此时就可以用pass语句实现。

例如:

#*****************************
#***程序名称:pass_test.py
#***程序功能:pass空语句可以使程序更完整
#***编写日期:2019-2-16		
#*****************************
s = input("请输入一个整数:")
s = int(s)
if s > 5:
	print("大于5")
elif s < 5:
	#空语句,相当于占位符
	pass
else:
	print("等于5")

4.3 断言(assert)

——和if分支语句有点类似,用于对一个bool表达式进行断言,如果该bool表达式为True,该程序可以继续向下执行;否则程序会引发AssertionError错误。

此外,断言还可以对逻辑表达式进行判断,实际上断言也相当于一种特殊的分支。

assert断言的执行逻辑是:
if 条件为False :
    程序引发AssertionError错误

4.4 循环结构

循环语句大概包含4个部分:

  • 初始化语句(init_statements):一条或多条语句。
  • 循环条件(test_expression):一个布尔表达式。
  • 循环体(body_statements):满足条件,反复执行的一段代码。
  • 迭代语句(iteration_statements):通常用于控制循环条件中的变量。

4.4.1 while循环

语法格式:

[init_statements]
while test_expression  :
    body_statements
    [iteration_statements]

例如:

#*****************************
#***程序名称:while_test.py
#***程序功能:一个简单的while循环
#***编写日期:2019-2-16		
#*****************************
#循环的初始化条件
count_i = 0
#当count_i小于10时,执行循环体
while count_i < 10:
	print("count:",count_i)
	#迭代语句
	count_i += 1
print("循环结束!")
#下面是一个死循环
count_i2 = 0
while count_i2 < 10:
	print("不停执行的死循环:",count_i2)
	count_i2 -= 1
print("永远无法跳出的循环体")

4.4.2 使用while循环遍历列表和元组(通过列表或元组的索引)

例如:

#*****************************
#***程序名称:while_tuple.py
#***程序功能:使用while循环遍历元组
#***编写日期:2019-2-16		
#*****************************
a_tuple = ('fkit','crazyit','Charlie')
i = 0
#只有i小于len(a_list),继续执行循环体
while i < len(a_tuple):
	print(a_tuple[i])	#根据i来访问元组的元素
	i += 1

又:

#*****************************
#***程序名称:while_list.py
#***程序功能:使用while循环遍历列表
#***编写日期:2019-2-16		
#*****************************
src_list = [12,45,34,13,100,24,56,74,109]
a_list = []	#定义保存整除3的元素
b_list = []	#定义保存除以3余1的元素
c_list = []	#定义保存除以3余2的元素
#只要src_list还有元素,就继续执行循环体
while len(src_list) > 0 :
	#弹出src_list的最后一个元素
	ele = src_list.pop()
	#如果ele % 3不等于0
	if ele % 3 == 0:
		a_list.append(ele)	#添加元素
	elif ele % 3 == 1:
		b_list.append(ele)	#添加元素
	else:
		c_list.append(ele)	#添加元素
print("整除3:",a_list)
print("除以3余1:",b_list)
print("除以3余2:",c_list)

4.4.3 for-in循环

——专门用于遍历范围、列表、元素和字典等可迭代对象包含的元素。

语法格式:

for  变量  in  字符串 |  范围 | 集合等:
    statements

for-in循环可用于遍历任何可迭代对象。所谓可迭代对象,就是指该对象中包含一个_iter_方法,且该方法的返回值对象具有next()方法。

例如:

#*****************************
#***程序名称:for_test.py
#***程序功能:使用for-in循环来计算指定整数的阶乘
#***编写日期:2019-2-16		
#*****************************
s_max = input("请输入您想的计算的阶乘:")
mx = int(s_max)
result = 1
#使用for-in循环遍历范围
for num in range(1,mx + 1):
	result *= num
print(result)

又如:

#完整格式输出九九乘法表
for i in range(1,10):
     for j in range(1,10):
         print("%d*%d=%2d" % (i,j,i*j),end=" ")
     print("")
print('--------------------------------------------')
#左上三角格式输出九九乘法表
for i in range(1,10):
    for j in range(i,10):
        print("%d*%d=%2d" % (i,j,i*j),end=" ")
    print("")
print('--------------------------------------------')

4.4.4  使用for-in循环遍历列表和元组

(1)遍历元组

a_tuple = ('crazyit','fkit','Charlie')
for ele in a_tuple:
	print('当前元素时:',ele)

(2)遍历列表

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)

(3)根据索引遍历列表或元组:只要让循环计数器遍历0到列表长度的区间,即可通过该循环计数器来访问列表元素。

a_list = [330,1.4,50,'fkit',-3.5]
#遍历0到len(a_list)的范围
for i in range(0,len(a_list)):
	#根据索引访问列表元素
	print("第%d个元素是%s" % (i,a_list[i]))

4.4.5 使用for-in循环遍历字典

字典包含三个方法:

(1)、items():返回字典中所有key-value对的列表;

(2)、keys():返回字典中所有key的列表;

(3)、values():返回字典中所有value的列表。

所以要遍历字典,可以先调用以上方法之一来获取字典的所有key-value对、所有key、所有value,再进行遍历。

#*****************************
#***程序名称:for_dict.py
#***程序功能:使用for-in循环来遍历字典。
#***编写日期:2019-2-16		
#*****************************
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)

又例如:

#*****************************
#***程序名称:count_element.py
#***程序功能:统计列表中各元素出现的次数。
#定义一个字典,以列表的元素为key,该元素出现的次数为value。
#***编写日期:2019-2-16		
#*****************************
src_list = [12,45,3.4,12,'fkit',45,3.4,'fkit',45,3.4]
#定义一个字典statistics
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))

4.4.6 循环使用else

Python的循环都可以定义else代码块,当循环条件为False时,程序会执行else代码块。其主要作用是便于生成更优雅的Python代码。

例如:

#*****************************
#***程序名称:while_else.py
#***程序功能:循环使用else代码块
#***编写日期:2019-2-16		
#*****************************
count_i = 0
while count_i < 5 :
	print('count_i小于5:',count_i)
	count_i += 1
else:
	print('count_i大于或等于5:',count_i)

for循环同样可以使用else代码块。

#*****************************
#***程序名称:for_else.py
#***程序功能:循环使用else代码块
#***编写日期:2019-2-16		
#*****************************
a_list = ["锄禾日当午,","汗滴禾下土。","谁知盘中餐?","粒粒皆辛苦!"]
for ele in a_list :
	print('元素:',ele)
else:
	#访问循环计数器的值,依然等于最后一个元素的值
	print('else块:',ele)

4.4.7 嵌套循环

一个循环放在另一个循环体内,就可以形成嵌套循环。既可以是for-in循环嵌套while循环,也可以是while循环嵌套do while循环......

《疯狂Python讲义》读书笔记——第4章 流程控制_第1张图片

 

例如:

#*****************************
#***程序名称:nested_loop_test.py
#***程序功能:嵌套循环
#***编写日期:2019-2-17
#*****************************
#外层循环
for i  in range(0,5):
	j = 0
	#内层循环
	while j < 3 :
		print("i的值为:%d,j的值为:%d" % (i,j))
		j += 1

4.4.8 for表达式

for表达式用于利用其他区间、元组、列表等可迭代对象创建新的列表。

语法格式:

[表达式  for  循环计数器   in  可迭代对象]    ——>列表推导式

(表达式  for  循环计数器   in  可迭代对象])   ——>生成器推导式

与普通for循环的区别:

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

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

for之前的表达式相当于循环体,最终返回的是列表,也被称为列表推导式

如果将for表达式的方括号改为圆括号,for表达式将不再生成列表,而是生成一个生成器(generator),该生成器同样可以使用for循环迭代。(生成器推导式

for表达式可是使用多个循环,就像嵌套循环一样。,而且可以指定if条件。

 

例如:

#*****************************
#***程序名称:for_expr.py
#***程序功能:for表达式——利用其他区间、元组、列表等可迭代对象创建新的列表。
#语法格式:[表达式  for  循环计数器  in  可迭代对象  (if条件)]
#***编写日期:2019-2-17
#*****************************
a_range = range(10)
#对a_range执行for表达式
a_list = [x * x for x in a_range]
#a_list集合包含10个元素
print(a_list)
#可在for表达式后面添加if条件
b_list = [x * x for x in a_range if x % 2 == 0]
#a_list集合包含5个元素
print(b_list)
#下面将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')
print()
#for表达式可以使用多个循环
d_list = [(x,y) for x in range(5) for y in range(4)]
#d_list列表包含20个元素
print(d_list)
#上面的表达式相当于如下嵌套
dd_list = []
for x in range(5):
	for y in range(4):
		dd_list.append((x,y))
print(dd_list)
#又或者如下
e_list = [[x,y,z] for x in range(5) for y in range(4) for z in range(6)]		#5*4*6=120
#e_list列表包含120个元素
#print(e_list)
#包含多个for循环的for表达式,同样可以指定if条件
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)

4.4.9 常用工具函数

1、zip()函数:可以把两个列表“压缩”成一个zip对象(可迭代对象),可以使用一个循环并行遍历两个列表。

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

如果zip()函数要压缩N个列表,那么zip()函数返回的可迭代对象的元素就是长度为N的元组。

例如:

#*****************************
#***程序名称:zip_test.py
#***程序功能:zip()函数实现并行遍历的效果
#***编写日期:2019-2-17
#*****************************
books = ['疯狂Kotlin讲义','疯狂Swift讲义','疯狂Python讲义']
prices = [79,69,89]
#使用zip()函数压缩两个列表,从而实现并行遍历
for books,prices in zip(books,prices):
	print("%s的价格是:%5.2f" % (books,prices))

2、reversed()函数:用于反向遍历,可接受各种序列(元组、列表、区间等)参数,返回一个“反序排列”的迭代器,对参数本身不会产生任何影响。

#*****************************
#***程序名称:reversed_test.py
#***程序功能:reversed()函数实现反序排列
#***编写日期:2019-2-17
#*****************************
a = range(10)
a_list = [x for x in reversed(a)]
print(a_list)
b = ['a','fkit',20,3.4,50]
b_list = [x for x in reversed(b)]
print(b_list)
#对str序列字符串进行反序遍历
c = 'Hello,Charlie'
c_list = [x for x in reversed(c)]
print(c_list)

3、sorted()函数:该函数接受一个可迭代对象作为参数,返回一个对元素排序的列表。

该函数可以传入以下两个参数:

(1)reverse参数:设置为True,表示反向排序;

(2)key参数:指定一个函数来生成排序的关键值。(如len函数)

例如:

*****************************
#***程序名称:sorted_test.py
#***程序功能:sorted()函数的用法
#***编写日期:2019-2-17
#*****************************
#sorted()函数接收一个可迭代对象作为参数,返回一个新的、排序好的列表
a = [20,30,-1.2,3.5,90,3.6]
a_list = sorted(a)
print(a_list)
#传入一个reverse参数,设置为True,表示反向排序。
b_list = sorted(a,reverse=True)
print(b_list)
#传入一个key参数,可指定一个函数来生成排序的关键值。
#如传入len函数,根据字符串长度排序。
c = ['fkit','crazyit','Charlie','fox','Emily']
c_list = sorted(c,key=len)
print(c_list)
#对迭代对象按照由小到大的顺序进行遍历
for s in sorted(c,key = len):
	print(s)

 

4.5  控制循环结构

Python可以通过continue、break、return控制循环结构。

4.5.1 使用break结束循环(强行终止循环,跳出循环体,完全中止循环本身)

例如:

#*****************************
#***程序名称:break_test.py
#***程序功能:使用break结束循环
#***编写日期:2019-2-17
#*****************************
#一个简单的for循环
for i in range(0,10):
	print("i的值是:",i)
	if i == 2:
		#执行该语句时将结束循环
		break

对于带else块的for循环,使用break强行终止循环,程序不会执行else块。此外,它只可以结束期所在的循环,不可以结束嵌套循环的外层循环

例如:

#一个简单的for循环
for i in range(0,10):
	print("i的值是:",i)
	if i == 2:
		#执行该语句时将结束循环
		break
	else:
		print('else块:',i)

print('-------------------------')
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

4.5.2 使用continue忽略本次循环的剩下语句

例如:

#*****************************
#***程序名称:continue_test.py
#***程序功能:continue语句用法——忽略当次循环的剩下语句,接着开始下一次循环。
#***编写日期:2019-2-18
#*****************************
#一个简单的for循环
for i in range(0,3):
	print("i的值是:",i)
	if i == 1:
		#忽略当次循环的剩下语句
		continue
	print("continue后的输出语句")

4.5.3 使用return结束方法(直接结束整个函数或方法)

return用于从包围它的最直接方法、函数或匿名函数返回。

例如:

def test():
	#外层循环
	for i in range(10):
		for j in range(10):
			print("i的值是:%d,j的值是:%d" % (i,j))
			if j == 1:
				return
			print("return后的输出语句")
test()

 

你可能感兴趣的:(学习笔记,Python语言)