分支结构
思维导图如下:
if语句的三种方式
单分支结构
此结构可以用于字典的调用,提高健壮性
1 2 3 4 5 6 7 mydict = dict (name='xyq' ,age='21' ) if 'name' in mydict: mydict.pop('name' ) print (mydict)
列表中也可以使用
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 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 5 6 7 8 9 10 11 12 13 14 15 16 import randomanswer = 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)
结果演示 :
重点解析 :
random模块的使用。产生随机数。
while true 可以进行无限循环,直到退出。
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 randomnumber = [] 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 stringimport randomx = string.ascii_letters + string.digits + string.punctuation mystring='' for i in range (1 ,50 ): mystring+=random.choice(x) 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 ] ptint(list6)
结果演示 :
注意点 : 1、注意使用时的格式,要把输入元素放在第一位 。也可以使用if语句 进一步选择元素。 2、zip()可以 使多个列表的元素一一对应后成为一个新的列表,其中的每一个元素是一个元组。
生成器
采用生成器创建列表更加节省空间。
在列表生成式使用时,对于列表元素较多时,不建议使用。因为这种方法会实例化一个对象,占用内存空间。 而生成器是一边循环一边计算的,可以适用。
语法格式 :(表达式 for 循环计数器 in 可迭代对象)
输出方法 :(无法通过print直接输出元素)
通过next方法输出 会根据元素个数单个取出元素,但是这种方法太低效。
使用for in 循环输出
迭代器 可迭代对象 定义 :可迭代对象是指可以直接作用于for循环 的对象。分类 :
数据类型:tuple、list、dict、set、string
generator:生成器或者带yield的generator function
易错点 :有无下标不是 判断是否为可迭代对象的条件。如字典、集合等无下标 仍为可迭代对象。
如何判断是否为可迭代对象呢?
使用collections模型的Iterable类型判断是否为可迭代对象。
代码实例 :
1 2 3 4 5 6 import collections 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 i in g: print (i) while True : try : print (next (g)) except StopIteration: break
问题补充
主要记录在头歌实训和作业上的收获
应用实例
列表、循环–约瑟夫环问题
题干 : 有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()
打印三角形–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()生成的序列是前闭后开 的。若为单个参数,则其中数字个数就是参数值 。
随机数生成–双色球生成
题干 : 双色球选号由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, sampleimport randomdef 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 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().
单元测试
生成器
其类型都是生成器<class 'generator'> 可以使用for in 读取,但是不可以直接输出。
enumerate(x) 函数enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
实例 :
str.replace()方法
Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
注 :因为字符串是不可变序列,所以会生成一个新的字符串,源字符串不变,
排序问题
key参数:自定义比较规则。这里是比较字符串第二个字符
http://c.biancheng.net/view/2239.html
遍历列表
列表会动态变化的。