分支结构

思维导图如下:

if语句的三种方式

单分支结构

1
2
if 条件:
代码块
  1. 此结构可以用于字典的调用,提高健壮性
1
2
3
4
5
6
7

mydict = dict(name='xyq',age='21')

if 'name' in mydict:
mydict.pop('name')

print(mydict)
  1. 列表中也可以使用
1
2
3
4
5
6
mylist = [1,2,3,4]

if 2 in mylist:
mylist.remove(2)

print(mylist)

双分支结构

1
2
3
4
5

if 条件:
代码块
else:
代码块

代码示例

1
2
3
4
5
6
7
name = input("你的名字:")
age = int(input("你的年龄:"))

if name == 'xyq' and age == 21:
print("right!")
else:
print("wrong!")

多分支结构

1
2
3
4
5
6
7
if 条件1
代码块1
elif 条件2
代码块2
.....
else:
代码块n

代码示例

1
2
3
4
5
6
7
8
9
10
11

name = input("你的名字:")
age = int(input("你的年龄:"))

if name == 'xyq' and age == 21:
print("right!")
elif name == 'xyq' or age == 21:
print("little right!")
else:
print("wrong!")

if语句需要注意的问题

问题1:代码缩进

对于条件判断后的代码,处于同一个缩进的代码为一个代码块

1
2
3
4
5
6
7
8
9
10
11

if age >=21:
--------------
: m = 2 :
: print("yes"):
--------------
else:
------------
: m=3 :
------------
print("no")

问题2:条件判断

不一定是bool类型,也可以是:None , 0 , [] , {}

1
2
3
4
5
list  = []
if list:
print("yes")
else:
print("no")

问题3:if多分支情况

对于多分支情况,要注意条件的排布顺序


补充:pass语句

pass语句是空语句,它的作用是占位,使得程序看起来完整。

1
2
3
4
5
6

if 条件:
pass

else:
pass

循环结构

思维导图如下:

while循环结构

语句格式

本质上还是条件判断语句,只是条件成立时继续执行直到退出。(一般不知道循环次数时使用此循环)

1
2
3
4

while 条件判断 :
代码块

代码示例:(猜数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random

answer = random.randint(1,100)
count = 0
while True:
number = eval(input("your answer:"))
count += 1
if number > answer:
print("小一点")
elif number < answer:
print("大一点")
else:
print("对了")
break

print("你猜了%d次"%count)

结果演示

重点解析

  1. random模块的使用。产生随机数。
  2. while true 可以进行无限循环,直到退出。
  3. break可以跳出一个循环,可以作为结束条件。

练习:(计算平均分数)

for-in 循环结构

for in 语句格式

1
2
3
4

for 遍历 in 字符串、范围、列表等可迭代对象:
代码块

代码示例:(求和)

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

注意点
range()生成的数字为前闭后开区间,所以range(101)从0到100。
在python3中,range()函数生成一个等差序列,不可变。

for in 循环遍历列表和字典

遍历列表示例:


enumerate()内置函数介绍:

作用:将一个可遍历的数据对象(列表、元组、字符串等)组合为一个索引序列
格式enumerate(list1,start=0)

代码示例


zip()内置函数介绍:

作用:将多个对象打包成一个个元组,而后返回这些元组组成的列表

代码示例


for in 循环遍历字典:

在正式循环之前,先来回顾一下字典中items的相关知识:

看见,dict.items()将字典元素封装为元组,这也是for in 循环的基础。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
dict3 = {"name":'xyq',"age":22}

# 第一种方法:
for k,n in dict3.items():
print(k,n)

# 第二种方法:
for item in dict3.items():
print(item)

# 第三种方法:
for key in dict3:
print(key,dict3[key])

结果


sorted()内置函数介绍:

前面我们已经学习过了,这里提到这个函数是因为涉及到字典。对字典进行排序是依据键的大小,并且返回一个列表

break 与 continue

break:结束当前循环语句。
continue:立即返回到循环入口处。

代码实训–统计字符个数

重点有以下几个:

1、string内置模块的使用
2、random模块的使用
3、fromkeys()函数的使用–构建字典
4、字典的一些操作,如:遍历、取值等
5、for in 循环结构

下面是数字示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import random

number = []
result = {}
for i in range(100):
num = random.randint(0,100)
number.append(num)

for num in number:
if num in result.keys():
result[num]+=1
else:
result[num]=1

max_num = max(result.values())

for item in result.items():
if item[1] == max_num:
print("出现次数最多的是%d,出现次数为:%d"%(item[0],item[1]))


下面是字符示例:

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
import string
import random
#生成全部大小写字母、数字和符号
x = string.ascii_letters + string.digits + string.punctuation
mystring=''
for i in range(1,50):
mystring+=random.choice(x) #choice方法返回一个列表,元组或字符串的随机项
#利用fromkeys()形成一个字典,所有键的值均为0,重复的键将被自动忽略

mydict = dict.fromkeys(mystring,0)
for i in mystring:
mydict[i]+=1

max_num = max(mydict.values())


#输出字符以及次数,即字典的键和值
for key,value in mydict.items():
print('字符{}有{}次'.format(key,value))
#找到最大的次数
max_num = max(mydict.values())
print(max_num)

for key,value in mydict.items():
if value == max_num:
print("出现次数最大的字符为:%s,出现的次数为:%d"%(key,value))

列表生成式

这是一个python内置的强大功能,可以进行列表的生成,使得代码更为简洁。

语法格式:【表达式 for 循环计数器 in 可迭代对象】
代码实例

1
2
3
4
5
6
7
8
9
10
11
12
list1 = [1,2,3,4]
list2 = [x+1 for x in [pow(x,2) for x in list1]]
print(list2)

list3 = [1,2,3]
list4 = ['name1','name2','name3']
L = [x for x in zip(list3,list4)]
print(L)

list5 = [1,2,3,4,5,6]
list6 = [x for x in list5 if x%2==1] # 使用if语句进行筛选元素
ptint(list6)

结果演示

注意点
1、注意使用时的格式,要把输入元素放在第一位。也可以使用if语句进一步选择元素。
2、zip()可以使多个列表的元素一一对应后成为一个新的列表,其中的每一个元素是一个元组。

生成器

采用生成器创建列表更加节省空间。

在列表生成式使用时,对于列表元素较多时,不建议使用。因为这种方法会实例化一个对象,占用内存空间。
而生成器是一边循环一边计算的,可以适用。

语法格式(表达式 for 循环计数器 in 可迭代对象)

输出方法:(无法通过print直接输出元素)

  1. 通过next方法输出

    会根据元素个数单个取出元素,但是这种方法太低效。

  2. 使用for in 循环输出

迭代器

可迭代对象

定义:可迭代对象是指可以直接作用于for循环的对象。
分类

  • 数据类型:tuple、list、dict、set、string
  • generator:生成器或者带yield的generator function

易错点:有无下标不是判断是否为可迭代对象的条件。如字典、集合等无下标仍为可迭代对象。

如何判断是否为可迭代对象呢?

使用collections模型的Iterable类型判断是否为可迭代对象。

代码实例

1
2
3
4
5
6
import  collections 

# 使用isinstance()函数判断一个对象是否为已知类型
print(isinstance('abc',Iterable))
print(isinstance([1,2,3],Iterable))
print(isinstance(123,Iterable))

结果演示

什么是迭代器(Iterator)

迭代器就是具有next方法的对象。

list、dict、str、set、tuple虽然是一个Iterable,却不是Iterator

使用dir()查看上述类型,并没有next方法。


Iterator的解释

Iterator是一个数据流,可以看作是一个有序序列,但是不知道序列的长度。
在使用next()函数时可以实现数据的下一步计算,即只有需要返回时才会进行数据的计算(惰性计算

Iterator的创建方法

1、可以使用iter函数获得Iterator对象(如下图)

2、使用for循环或者while循环进行遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
L1 = [1,2,3]
g = iter(L1)
print(type(g))

# 使用for循环遍历
for i in g:
print(i)

# 使用while循环遍历(用到except捕获错误信息)
while True:
try:
print(next(g))

except StopIteration:
break

问题补充

主要记录在头歌实训和作业上的收获

应用实例

  1. 列表、循环–约瑟夫环问题

题干
有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。(用1代表基督徒,0代表非基督徒)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def main():
index = 0 # 用于下标索引
count = 0 # 记录非基督教徒人数
number = 0 # 记录当前数到的数字
list1 = [1]*30
while count<15:
if list1[index] == 1:
number += 1
if number == 9:
list1[index]=0 # 相当于扔到海里
count += 1
number = 0
index+=1
index%=30 # 将列表当做一个圆圈,当读到最后时返回第一位
for i in list1:
print(i,end='')

if __name__ == '__main__':
main()
  1. 打印三角形–for in 循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for i in range(1,row+1):
for j in range(i):
print("*",end='')
print("")

# 靠右三角形
for i in range(1,row+1):
for j in range(row-i):
print(" ",end='')
for m in range(i):
print("*",end='')
print("")

# 中间三角形
for i in range(row):
for j in range(row-i-1):
print(" ",end='')
for m in range(2*(i+1)-1):
print("*",end='')
print("")

注意事项
使用range()生成的序列是前闭后开的。若为单个参数,则其中数字个数就是参数值

  1. 随机数生成–双色球生成

题干
双色球选号由7个数字组成y,其中有6个红球,其号码的取值范围为[1,33],一个蓝球的取值范围为[1,16],要求6个红球从小到大排列,蓝球在最后输出。其输出格式为09 12 16 20 30 33 | 03。(注意,如双色球号码为3,则必须输出03)

代码:

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
from random import randrange, randint, sample
import random
def display(balls):

for i in range(6):
print("%02d "%balls[i],end='')
print("| %02d "%balls[i+1])

def random_select():

list1 = [x for x in range(1,34)]

select_num1 = sample(list1,6)
select_num1.sort()
select_num1.append(randint(1,16))
return select_num1

#n为注数
def main(n):

for _ in range(n):
display(random_select())

random.seed(3)
n = int(input())
if __name__ == '__main__':
main(n)

注意点
1、randint(1,15)在【1,15】中选择一个数。sample(list1,6)从list1中等可能选择6个数组成一个列表。
2、一定要分清列表的方法和函数的区别,例如:list1 = list1.sort()是错误的,要使用list1.sort().

单元测试

  1. 生成器

其类型都是生成器<class 'generator'>
可以使用for in 读取,但是不可以直接输出。


  1. enumerate(x) 函数
    enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

实例


  1. str.replace()方法

Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。

:因为字符串是不可变序列,所以会生成一个新的字符串,源字符串不变,


  1. 排序问题


key参数:自定义比较规则。这里是比较字符串第二个字符

http://c.biancheng.net/view/2239.html


  1. 遍历列表

列表会动态变化的。