语句和语法2------if 语句,while和for循环语句

if 语句                                                          
  真值测试
    1.任何非零或非空对象都为真;
    2.None,数字0,空对象都为假;
    3.比较和相等测试会返回真或假;
    4.布尔and和or运算符会返回真或假的操作“对象”;
    4.1 and(两者同时为真才为真) ,or(一个为真即为真) ,not 都是短路运算,即在得出结果后,就会马上使表达式其余部分终止;
      比如: [] and () ,[]是假,这时候就已经可以得出结果最终表达式为假,所以返回[];
          [] or () ,[]为假,这时还得不出结果,()也为假,这时得出结果,所以最终返回();



while和for循环语句                                             
  while :
    1.可以直接测试对象,比如 while x:..会比while x!='':..简洁高效得多
    2.break,continue,pass,else
      break:跳出最近所在的“循环”;
      continue:跳到最近所在循环的开头处(来到循环的首行);
      pass:什么都不做,只是空占位语句;
      else:只有当循环正常离开时才会执行(也就是说如果没有碰到break语句,执行完while再执行else)
        1.循环else分句时Python特有的,
          while x:        while x:
          ..      相当于     ..
          else:          if not x:
            ..            ..

    3.python不允许赋值这类语句出现在表达式出现的地方,比如没有while (x=1)!='':这和c语言不一样
  

  for:
    1.可以遍历任何有序的序列对象内的元素;
    2.for循环中的元组赋值,
      for (a,b) in [(1,2),(2,3),(3,4)]:
        print(a,b)

      for 循环把序列对象元素赋值给目标,而赋值运算在任何地方工作都是相同的(即两边个数相同)。
    3.循环else分句,同while。

迭代器:                        
    1.可迭代对象:可以在迭代工具环境中(例如for)一次产生一个结果的对象,就被看做可迭代。
          (专业说法:)对象里面包含__iter()__方法的实现,对象的iter函数经调用之后会返回一个迭代器,里面包含具体数据获取的实现。
    1.1 迭代器:包含有next方法的实现,在正确范围内返回期待的数据以及超出范围后能够抛出StopIteration的错误停止迭代。
    2.文件迭代器(每次next返回一行):
      打开文件对象是可迭代对象,比如它有readline方法,每次读取一行,也有个next方法,效果相似,
      唯一值得注意的区别是:到达文件结尾时,next会引发StopIteration异常,而ReadLine是返回空字符串。
      2.1其实这个接口就是Python中的迭代协议:
        2.1.1 有next方法的对象会前进到下一个对象,而在结果的末尾则会引发StopIteration异常。
        2.1.2 Python中所有的迭代工具内部工作原理都是在每次迭代中调用next,并且捕捉StopIteration异常来确定何时离开

      2.2 逐行读取文件的最佳方式就是根本不要去读取,直接在for循环中每轮自动调用next从而前进。
        普通方法:
          f= open ('sss.py')
          f.readline() # 此时把文件内容加载到内存里了,然后再取出来打印
        最佳方法:
          for line in open('sss.py'):
          print (line ), # 此时直接通过for内部的next直接打印

      2.3 while循环同样可以读取,但可能运行会比for慢,因为迭代器在Python中是以c的速度运行的,而while则是通过Python虚拟机,
        所以总体来说,for会比while快。
      3.其他内置类型的迭代器
        3.1 for循环的内部工作,列表的迭代器:
          L=[1,2,3]
          i = iter(L) # 列表的iter方法,返回一个迭代器对象 i
          i.next()
          for这个语法背后的逻辑差不多就是上面例子中代码所示的那样:首先获取可迭代对象返回的迭代器对象,
          然后调用迭代器对象的next方法获取每个值,在获取值的过程中随时检测边界-也就是检查是否抛出了StopIteration这样的错误,
          如果迭代器对象抛出错误则迭代停止.

        3.2 字典的迭代器:字典有一个迭代器,在迭代环境中每次内部调用next,会自动一次返回一个键
          D={'a':1,'b':2}
          for key in D:
        print key,D[key]
      4.其他迭代环境(除for外其他的):
        4.1 in成员关系测试,map内置函数,
        4.2 sorted:采用迭代协议,返回新的已排序的可迭代对象(sorte是自身排序,是列表的一个方法 ,L.sorte();sorted(L))


range,zip,enumerate与for:
    1.range函数返回一个连续整数的列表(一次参数一个元素),可做为for中的索引;
      1.1 在Python中最好使用for,不用while,并且不要在for循环中使用range调用(因为直接使用简单地for,Python会内部自动帮我们处理迭代的细节,而
        使用range是手动进行索引),只视其为最后的手段。
      1.2 在遍历的过程中跳过一些元素:
        for i in range(0,len(s),2):
        更简单地方法(使用分片);
        for i in s[::2]:
      1.3 使用range和for的组合最常见的场合是在循环中遍历列表时对其进行“修改”(也就是说除了这种情况,一般少用range,多用简单地for,不过这种情况使用列表解析会更简洁)。
        比如:
        for x in L:
        x +=1 # 这时并没有修改列表,修改的只是x
        for x in range(len(L)):
        x +=1 # 这时才是真正的修改列表,如果需要遍历列表时对其进行修改,我们需要使用索引

    2.zip函数返回并行的元组元素的列表,可用于在for循环中遍历“多个”序列
      2.1 zip可以接受任何类型对象的序列,当参数长度不同时,zip会以最短序列的长度为准来截取所得到的元组
        for (x,y) in zip([1,2,3],[4,5,6]): # zip([1,2,3],[4,5,6])>>[(1,4),(2,5),(3,6)]
          print x,y # >>>(1,4)

      2.2 使用zip构造字典
        dict(zip(key,value))

    3.enumerate: 产生偏移和元素
        enumerate函数会返回一个生成器对象,这个对象支持迭代协议,它有个next方法,每次遍历列表时,会返回一个(index,value)元组;
      for (offset,item) in enumerate(s):
        print (offset,item) # >>> 0,s 1,p ...

列表解析:                                  
  1.列表解析内会比for循环 写代码少,而且运行起来也更快,因为它在解析器中以c的速度执行,比Python的for循环在PVM中步进要快得多。;
    列表解析内部做的事情:
    res=[]
    for x in L:
    res.append(x+10)
  2.列表解析和for循环并不完全相似,因为其创建新的列表对象;
  3.基础语法:
    L=[x+10 for in L]
    表达式像倒过来的for循环,前面是循环的变量x+10,后面是循环变量的名称x和可迭代对象L.
  4.当我们开始想要对序列中每个元素执行一种运算时,都可以使用列表解析
    比如文件:
    lines= [line.rstrip() for line in open('script.py')]

  5.嵌套if:
    lines= [line.rstrip() for line in open('script.py') if line[0]=='p']
    相当于:
    for line in open('ss.py'):
      if line [0]=='p':
      res.append (line.rstrip())

posted @ 2017-09-14 23:38  yangyongbo  阅读(119)  评论(0)    收藏  举报