day27——流程控制——if条件、流程控制——for序列、流程控制——for字典、循环退出、流程控制——while

Python流程控制 if条件(一)
     以前脚本都是顺序执行脚本的,从第一行执行到最后一行,那么每一行都会执行一遍,有的时候根据需求呢符合条件才会去执行,不符合条件不会去执行,或者每某些行反反复复去执行,这些都是流程控制。流程控制主要是条件和循环,首先看下条件,条件语句是if。
     if后面是个表达式,后面跟冒号:(关键字后面都有冒号),后面是if的代码块,要有缩进,一般建议用4个空格作为缩进,凡是属于这个缩进里面的都是一个代码块。
 
#!/usr/bin/python
 
if   1:#后面是表达式,表达式可以有很多种的形式,比如if 1: ,1在这里就是一个数值,数值表达式。
    print 'hello python ' #如果上面成立了则打印一句话,
    print 'True'
     这个条件是成立的,所以打印后面两句话。
     如果if 0: 则不成立,1表示True,则0表示False不输出任何结果,这些条件不符合,不成立则不会去成立。
     写成字符串if 'a':则条件也会成立:
#!/usr/bin/python
 
if 'a':
    print 'hello python'
    print 'True'
     如果写空字符串if '': 则不行。
     如果写if None: 也不行
     如果写成if 1 < 2: 则会会有结果输出。
     如果写成if not 1 > 2: 则成立则打印输出语句。
     还可以写成if not 1 > 2 and 1 == 1: 两个True则打印输出语句(先判断not 1 >2然后再判断1 ==1 最后再and连接起来,因为逻辑非的优先级比较高)。
     除了if还有else ,如果这个条件不成立,
     如果1 < 2则会执行下面两条语句,如果条件不成立则加上else(if和else在同一缩进位置上)
#!/usr/bin/python
 
if 1 < 2:
    print 'hello python'
    print 'True'
else:
    print 'YJB_2'
     如果1 <2条件成立则不去判断else下面的条件,如果条件不成立则会去执行else后面的内容。
#!/usr/bin/python
 
if 10 < 2:
    print 'hello python'
    print 'True'
else:
    print 'YJB_2'
print 'main'
     不管上面两个条件成立不成立,最后的print始终会去执行的,因为缩进位置是跟if是平行的,表示不是if里的代码块。
     如果还有多个条件可以用elif
     如果if条件不成立,则看看elif条件,如果elif 'a': 条件成立的话则输出个a
     例:从键盘上输入一个数,输完之后去判断一下,如果是90的话则打印A再打印'very good',把分数存到一个score的变量里,
#!/usr/bin/python
 
score = raw_input("Please a num: ")
if score >= 90:
    print 'A'
    print 'very good'
elif score >= 80:
    print 'B'
    print 'good'
elif score >= 70:
    print 'C'
    print 'pass'
else:
    print 'D'
     上面结果应该返回D才对。因为通过raw_input输入的数把它当成一个字符串了,字符串跟数值比较是大于90的
     比如一个字符串'30',可以通过这种方式把它变成一个数值,在这里仅限于把一个数字的字符串变成数字,是不能把int('a')变成一个数值的。因为只有数字才能跟数字进行比较。
     流程:如果这个数字大于等于90则会输出A,如果数字在80和90之间呢第一个条件是不符合的,第二个条件就符合大于80了,符合这个条件之后就会执行这个条件下面的代码块,这个代码块执行完之后就不再进行判断了,就执行条件(程序后面的代码)后面的语句。如果这些条件都没有符合的话看else,如果有else则会执行else后面的代码块。条件的写法非常多。
 
Python流程控制 if条件(二)
     首先这些条件呢是逻辑值(也叫bool值),逻辑值 (bool)包含了两个值:
     True(表示True的有哪些呢?):表示非空的量(比如:string(但是字符串里必须有值,空值是不行的),tuple(空元组也是不行的),list(非空的列表),set(非空的集合),dictonart(非空的字典)),所有非零数
     False:表示0,None,空的量等。
          if else
     ● else语句(else是可选的):
     if不成立的时候才会执行else后面的语句。
     ● elif语句(多个条件)
     只要符合其中某一个条件,就会执行这个条件下面的代码块,代码块可以是一行或者很多行,只要在同一缩进里就属于同一个代码块,执行完之后整个条件就退出,退出之后接着执行程序后面的代码。
     if else
     ● 多个条件判断
     可以用and、or去连接多个条件。
     例:写这样一个程序,执行一个脚本,脚本之后它让我们输入Y或者N(不管大写小写),如果输入yes的话输出程序runing,如果输入N或no,提示程序退出。
     #!/usr/bin/python
     从键盘的输入存到yn这个变量里,之后又把这个变量的值通过yn.lower()方法都变成小写的,然后再判断从键盘的输入是什么,是y还是yes,然后print "programe is runing ...",如果是n or not则print "programe is exit",如果都不是则 print "please input [Yes/No]"
     yn = raw_input("Please input [Yes/No] : ")从键盘上读取存到一个变量,如果这个变量yn 等于y(这个y可以是yes),在字符串里有一个专门的方法,可以把大写的字符串都变成小写或者都把小写的变成大写。想看一个字符串有什么方法,可以在python中输入'a'加一个小数字然后按Tab键可以查看有哪些方法。
     yn = yn.lower()
     if yn == 'y' or yn == 'yes':   #先把字母变成小写的再进行判断,或者直接在上一行写yn = yn.lower()先进行转换,这一行就不用调用yn.lower方法了
         print "programe is runing ..."
     elif yn == 'n' or yn =='no':
         print "programe is exit"
     else:
         print "please input [Yes/No]"
 
字符串的方法:
     a.lower()方法就是把字母变成小写的。
     这里面用到了一个字符串的方法,a.lower()转换成小写的,也可以转换成大写:a.upper()
 
 
流程控制循环——for序列
     在Python下循环主要有两种:一种for循环,另外一种是while循环。for循环是一个结构,程序会重复一定的次数,而while循环一般是一个条件,当条件为假时循环结束
     for循环可以用在序列里,用在序列里可以对序列做遍历。序列有字符串、元组还有列表,都可以通过for循环呢对它们进行遍历。
     a = 'ABC' #比如定义一个字符串,
     for i in  #遍历a。for的语法结构是:for后面跟(迭代的)变量,in是关键字,后面a是序列,
     print i   #把迭代变量i打印出来
     默认情况下print后面带一个换行符,可以加一个逗号,没有换行符而且中间是空格分开的。有逗号就没有换行符,就是抑制换行符输出。
     创建一个列表:
     函数:range(),它就是一个序列,它的结果就是一个序列,很方便生成一个列表。
     help(range):start和step都放到中括号里,表示是可选的,stop是必须的,list of integers表示一个整数的列表,这个列表有多少元素(没有start和step的话)是随着stop决定的,
     例:产生0到10(10不会包含在内会产生0到9共10个数,10个数放到列表里),会产生一个数字列表。
     第三个参数step是步长,默认情况步长是1,表示顺序来产生这些值,
     步长为3走3步取一个值。
     例:用for写到一个脚本里
#!/usr/bin/python
for i in range(10)  #range返回的是一个列表,如果不想要0,可以从1开始range(1,11),11不包含在内,有点类似于切片,切片的第二个数是不包含在内的。这是最常用的for循环,对序列做遍历。
     也可以这么写,加上一个条件:只打印偶数,如果是这个条件(判断这个数跟2取余等于0那就是偶数)的话print i(注意缩进,缩进是在if里面,)
   
     上面取偶数只需要一句话,
range(1,11)只是对列表做遍历,range返回是列表,对列表用i来做遍历(通过for循环),print [i for i in range(1,11)]和range(1,11)的结果一模一样。对列表进行遍历,遍历的每一个值用i显示,每个值都放到列表里。
     print [i *2 for i in range(1,11)]每个值乘以2输出如下图。
     print [i *2 for i in range(1,11) if i % 2 == 0]判断是否是偶数,并且输出也放到列表里。
     如把输出结果的每个值都乘方,print [i ** 2 for i in range(1,11)]
     凡是列表的都可以重写,for循环这个列表,for循环之后可以得到它的每一个元素。前面i**2是它的每一个元素,接下来还可以对它的每一个元素进行操作,这里面只作了乘方,还可以加一些条件,如i不等于0,
     也就是只对基数做乘方。
     先看for i in range(1,11)这块,就是对列表进行遍历,遍历之后得到的值呢可以对它进行操作,如果没有操作就是i了,在这里做的操作是i**2,在显示这个值的时候是有条件的,只有符合这个if i % 2 != 0条件(跟2取余之后不等于0,意味着是基数),只要是基数的部分再去乘方i**2,这叫列表重写。
     例:1+2+3+4+5......+100的值
     就是循环100次
#!/usr/bin/python
 
sum = 0 #设一个初始值,等于0
for i in range(1,101): #从1到100,
    sum = sum + i  #第一次循环时i=1,这个sun就等于0+1,第二次循环时i=2,sun=1+2了,然后存到sum里了,
print sum
     也可以把sum = sum +i这样写:sum += i,跟刚才的写法是一样的,
     range返回的就是一个序列,产生一个列表,xrange跟range比较相似,
for i in a:
    print i
     这就有值了,跟range一样的,只不过没有事先产生一个列表,需要把它赋值给一个变量,对这个变量做一个遍历。
help(xrange):它返回的是一个对象,跟range的用法是一模一样的,不过返回的却不是一个数值的列表,而是一个object对象,可以对这个对象做一个遍历,跟range()非常相似,但是不是返回一个list,返回的是一个object,类似于一个生成器(按需产生了一个数字),可以通过for循环来对这个对象做一个遍历,做遍历也能取到每一个值。
     比如执行一个range(100)会在内存中产生一个这么大的列表,这些值都在内存中。当执行完xrange(100)后呢不会占用内存(不会占用太多的内存资源,不像range(100)会有100个列表,列表里有100个元素会占很大的内存资源)。什么时候xrange才会占用内存资源呢,当我们对它进行遍历的时候,遍历一个出来一个,可以通过for循环像range一样对xrange做遍历。更多的时候用xrange比较好点,因为它产生的是一个对象,只有对这个对象做遍历的时候才能取到时候的值,这个时候才会把值释放到内存中去。
    
 
 
    循环不仅能遍历序列,还可以遍历字典,下面怎么通过用遍历的方式来访问字典。dic.fromkeys后面一个序列加一个值
    对字典做个遍历:可以通过for来遍历,for k(随便定义字典key的名字) in 字典
    如果想取到值怎么办呢?
    还可以进行格式化的输出:
    如果想显示在一行,在最后加个逗号,
    字典还有个方法items(),可以对它做遍历,取到每个元素,每个元素又是一个元组,返回的值为列表:
    又可以把元组进行拆分,拆分就是通过两个变量来接收它的值:
    字典里还有一个iteritems()方法,用法跟items一样,只不过返回的是对象,可以对这个对象做遍历,通过两个值来接收,这样就得到了字典的key和value
    如果直接访问的话,没对字典加任何的方法,其实遍历的是字典的key,
    如果想访问value的话加上,字典名[key名],通过索引(下标)来取
    第二种方法就是通过字典的方法items来访问字典,需要两个值,一个值也可以,它是一个列表中的元组,通常要把这个元组拆分一下,元组里面有两个元组,所以用两个值来拆分元组
    例:写一个乘法口诀:就是嵌套,两个循环,内层一个外层一个,
比如要循环9行,0不参与计算,所以start从1开始,第一行是控制行数的,共9行,在每一行里,1*1=1,第二行是1*1=1 1*2=2,每一行的列都不一样,第二行是控制列,列也是从1开始的,如果i=1,进入内层循环,j是1,xrange取值应该也是1,1*1,stop结束值应该是i+1,则xrange(1,2)只取一个值1,最后一个值是不包含在内的,第三行直接打印结果,来个格式化的输出,三个%后面必须有三个值来替换,第一个%s对应后面第一个变量。比如i=1时,进入到内层循环,j=1第一次就是1*1等于1,内层循环只循环1次就结束退出了,接着进入外层循环第2次,i=2时xrange(1,i+1)是xrange(1,3)取1,2这两个值,当j=1时,1*2,内层循环进入第2次循环,j=2了,就成2*2了,这里不需要换行符,当内层循环结束时再输出换行符,直接print就可以
 
#!/usr/bin/python
 
for i in xrange(1,10):
    for j in xrange(1,i+1):
        print "%s*%s = %s" %(j,i,j*i),
    print
 
 
    在Python的for循环中有一个可选项else,在for循环正常结束时,才会执行else语句。
    比如循环10个数,
 
#!/usr/bin/python
 
for i in xrange(10):
    print i
    执行后正常输出10个数,
#!/usr/bin/python
 
for i in xrange(10):
    print i
else:
    print "main end"
 
插入一个模块,模块中也有很多方法,Python中一切皆对象,对象有方法和属性,time中有一个sleep的方法,time.sleep(1),打印出一个数字后睡眠1秒,
import time
    执行代码中按Ctrl+C强制退出,则else后面的代码语句未执行,因为for循环未正常执行完,退出后抛出一个异常。
    有的时候可以通过一些语句来控制一下不让这个循环执行完,
    break是退出整个循环,后面的数字不会再遍历了。后面的else语句也不会再执行了,因为没有正常的循环完。只有正常循环结束了,没有人为的去干预表示循环结束才会去执行else
#!/usr/bin/python
 
import time
for i in xrange(10):
    print i
    if i ==5:
        break
else:
    print "main end"
continue:
    除了有break外还有continue,continue也是退出循环,但是呢是退出当前层的循环,如再加个条件if i == 3时,当i=3时,出现continue下面的语句(语句有i=5和print i)就不会去执行了,也就不会再去打印3了,还没来得及执行print i(i=3)就退出了,然后重新下一次循环,下一次循环当然是i=4了,i ==3和i == 5都不满足,直接就打印print i了,当i=5时又break了。
    
    如果把if i ==5: 写成elif i ==5: 时,会判断再次,先判断i == 3再判断i == 5,效率会更好些,elif是当其中一个条件满足时下一个条件就不会去判断了,还可以写很多elif,加很多条件,当i ==6时,可能还没想好要做啥,可以加pass相当于占位的效果
    当想等于7时直接退出程序,下面的语句都不会去执行了,sys也是模块需要导入,要想用exit方法必须导入sys模块
 
 
    模块无外乎就是涵数、类或者是一个包(包就是目录)
 
作业:
    猜数字游戏
    系统生成一个20以内的随机整数,
    玩家有6次机会进行猜猜看,每次猜测都有反馈(猜大了,猜小了,猜对了,结束)
    6次中,猜对了,玩家赢了。
    否则系统赢了
    里面要用到一个随机的模块random,random模块有randint涵数,
 
 
    for循环主要用在遍历序列上,比如遍历一个字符串、列表、字典,for循环还可以遍历文件,去遍历文件的每一行。
    for循环用在有次数的循环上。
    while循环用在有条件的控制上。
    while循环,直到表达式变为假,才退出,或者循环内有一个break也会退出循环
    while循环,表达式是一个逻辑表达式,必须返回一个True或False。
语法:
while expression:
    statement(s)
    expression为表达式,如果是True的话会执行循环体内的内容,也是有缩进的,
 
例:
    while后面是一个条件,1就是True,这样写就是一个死循环了,因为表达式一直都成立,while循环很容易写成死循环,如果是死循环CPU负载(uptime命令查看系统平均负载值)也会上去,比较大
    while 1中的1写成True也是一样的,
    while也可以让它循环多少次结果,比如循环10次,设置一个变量的初始值为0,然后去判断一下,等于10时退出循环,跟for一样用break,如果n不等于10,除了打印n的值、"Hello"外并能把n的值+1
    例:执行这个脚本呢不限定次数,可以去等待从键盘的输入,如果这个键盘的输入是q则退出这个循环,
    这个是没有次数限制的,等待键盘的输入,只有输入符合了条件就break,
while input != 'q': 当输入不等于q的时候会执行循环体里面的内容,当input输入q时这个条件为False条件为假时退出循环
    在定义变量的时候千万要注意不要使用关键字,input是一个内建函数,
    报NameError,x没有被定义,因为程序是顺序执行的,先执行x != 'q'时x变量确实没有定义,所以这一行会有个异常,程序有异常就会退出了,下面根本就不会去执行了,虽然在最下面有定义x = raw_input,但程序还没来得及执行到这,所以在前面可以把x给一个初始值为空:x = ""
    当x = 'q'时条件就变成False了,下面就退出循环不执行了,
    当x = ''为空字符串时用break退出循环
    if x = ''
        break
    也可以这么写,当x为空时,在bool中属于False,not x结果就是True,意味着这种写法跟上面等于空字符串一样的,表示x为空时break退出循环了
    while后面还有一个可选项,跟for一样的
    for后面加else:只有for循环还结束了,才执行else语句后面的代码,所谓不是正常结束,表示这里面会有一个break,或者没有执行完Ctrl+C了,这都属于不正常结束for循环,while循环也是一样的,正常结束了(条件变为假这个循环就结束了)然后会执行else后面的代码,如果没有正常结束,else后面的语句是不会执行的。也支持continue,跟for循环的continue一样,退出当前层的循环。如当条件为'quit'时continue,contunue是针对下面的代码,有了contunue循环体下面的代码不会执行。
    输入a后会输出continue、hello及等待从键盘输入,
    输入quit后continue没有输出,直接输出了hello和等待从键盘输入,
    输入q退出循环,并且把else后面的代码打印出来
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2017-11-30 10:00  落后乞丐  阅读(71)  评论(0)    收藏  举报