day18.条件,循环和其他语句

导入模块
  import modu
  import modu1,modu2,...
  from modu import func1
  from modu import func1,func2,func3,...
  from modu import *
 
为导入的模块或函数起别名
  import math as mymath
  from math import fabs as aa, sqrt as bb
 
赋值魔法:
  序列解包:
    多个复制操作同时进行:x,y,z = 1,2,3
    交换两个或更多变量:x,y = y,x
    序列解包:sequence unpacking--将多个值的序列解开,然后放到变量的序列中,当函数或方法返回元组(或其他序列或可迭代对象)时,这个特性尤其有用。
    它允许函数返回一个以上的值并且打包成元组,然后通过一个赋值语句很容易访问。
    放置在赋值=号左边的变量个数必须与所解包的序列中的元素数量完全一致。
    py3中新增了另一个解包特性:可以像函数在参数列表中一样使用星号运算符。
    a,b,*rest = [1,2,3,4] ==> a = 1,b = 2,x = [3,4]
    星号*代表将所有其他的元素都收集到rest中
 
  链式赋值:
    x = y = 5 ===> x = 5,y = 5
    x,y是对用一个值的引用,互不干扰
 
  增量赋值:
    x += 1 ===> x = x + 1
    对于+-*/%等标准运算符都适用
    对于其他类型的数据也适用,只要二元运算符本身适用于这些数据类型
    x = 'abc'
    x *= 2 ===> 'abcabc'
    增量赋值可以使代码更加紧凑简练。
 
语句块:缩排的乐趣
  语句块是在条件为真(条件语句)时执行,或者执行多次(循环语句)的一组语句。
  在代码前放置空格来缩进语句即可创建语句块。
  块中的每行都应该缩进相同的量。
  很多语言使用特殊单词或字符({)来表示一个语句块的开始,用另外的单词或字符(})表示语句块的结束。
  在python中,用冒号(:)来标识语句块的开始,块中的每一个语句都是缩进的(缩进量相同)。
  当回退到和已经闭合的块一样的缩进量时,就表示当前块已经结束了。
 
条件和条件语句:
  1.布尔变量的作用
  2.条件执行和if语句
  3.else子句
  4.elif子句
  5.嵌套代码块
  6.更复杂的条件

1.比较运算符
  ==,>,<,>=,<=,!=,is,is not,in,not in
  只有在比较两个相同或近似类型的对象,比较才有意义。
  在py3中,比较不兼容类型的对象已经不再可行。
  在python中,比较运算和赋值运算一样是可以连接的: 0<age<100
 
2.相等运算符:判断两个值是否相等
 
3.同一性运算符is:是否为同一个对象(id相同)
 
4.成员资格运算符in
 
5.字符串和序列比较:
  相同索引的元素进行比较
  字符串可以按照字母排列顺序比较A<Z<a<z
 
6.布尔运算符(逻辑运算符):and or not

短路逻辑(惰性求值):避免了无用的执行代码,可以作为一种技巧使用。
  name = input('').strip() or 'unknown'
  这类短路逻辑可以用来实现三元运算符的作用:
  a if b else c
  如果b为真,返回a,否则返回b
 
断言(assert):
  断言的工作方式有点像if的变形:
  if not condition:
    print(1111)
  在我们调试代码或者初期测试时,与其在程序在晚些时候崩溃,不如在错误条件出现时直接让它崩溃。
  如果需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert语句就有用了。它可以在程序中设置检查点。
  age = input('请输入年龄').strip()
  assert 0<int(age)<150#在age不满足条件时直接报错
  条件后可以添加字符串,用来解释断言。
  assert 0<int(age)<150,'年纪大了'

 循环:为了在条件为真时,使代码重复执行多次。
  1.while循环:在任何条件为真的情况下重复执行一个代码块
  2.for循环:为一个可迭代对象的每一个元素都执行一个代码块
  3.循环遍历字典元素:
    for key in dict
    for key in dict.keys()
    for val in dict.values()
    for k,v in dict.items()
  4.一些迭代工具:
    1.并行迭代
      程序可以同时迭代两个序列:
      names = ['egon','alex','mxt']
      ages = [18,19,20]
      for i in range(len(ages)):
        print(names[i],ages[i])
      内置函数zip可以用来进行并行迭代,可以把多个序列压缩在一起,返回一个元祖的列表。zip可以应付不等长的序列,当最短序列用完时就会停止。
      list(zip(names,ages)) == [('egon', 18), ('alex', 19), ('mxt', 20)]
    2.编号迭代
      有时想要迭代序列中的对象,还要获取当前对象的索引。
      for x,y in enumerate(list):
        print(x,y)
    3.翻转和排序迭代
      reversed,sorted这两个内置函数,等同于列表的reverse和sort,但是可以作用于任何序列和可迭代对象上,不是修改原对象,且返回翻转或排序后的副本。
 
 
  跳出循环:
    1.break:跳出本层循环
    2.continue:跳出本次循环(跳过剩余的循环体,但不结束循环)
 
 
pass
什么都没有发生,在代码中做占位符使用

del
一般来说,python会删除那些不再使用的对象(因为使用者不会再通过任何变量和数据结构引用它们)。
python的垃圾回收机制:python解释器会删除在内存中引用计数为0的值
del语句会移除一个对象的引用和那个名字本身。
 exec+eval执行和求值字符串:
有时可能会需要动态地创造python代码,然后将其作为语句执行或作为表达式计算。
使用exec或eval可以执行存储在字符串中的python代码
1.exec()
  exec('print(123)')
  exec函数可以执行存储在字符串中的python代码,但也可能会干扰命名空间。
  from math import sqrt
  exec 'sqrt = 5'
  print(sqrt(4))
  很多情况下,需要给它提供命名空间,使它不会干扰已有的变量。
  exec函数最有用的地方在于可以动态的创建代码字符串。
  如果字符串是从其他地方获得的,比如用户输入,那么几乎不能确定其中包含什么代码。
  为了安全起见,可以增加一个字典,起到命名空间的作用。
  from math import sqrt
  dd = {}
  exec 'sqrt=1' in dic
  sqrt(4)
 
2.eval()
  eval(用于求值)是类似exec的内建函数。
  exec会执行一系列python语句。
  eval会计算python表达式,并且返回结果值。

 总结:
  1.打印:print也已打印由逗号隔开的多个值。参数有sep和end
  2.导入:import module
      import fun from module as xx
  3.赋值:通过序列解包和链式赋值功能,多个变量可以一次性赋值。
      增量赋值可以原地改变变量。
  4.块:块是通过缩排语句组成的一种方法。他们可以在条件和循环语句中使用。
  5.条件:条件语句/布尔表达式
      if/elif/else
      三元表达式: a if x==1 else b
  6.断言:assert 简单来说就是肯定某事为真。如果条件为假,断言会让程序报错。
  7.循环:可以为序列中的每一个元素执行一段语句块。
      continue跳出本次循环;break跳出本层循环。
  8.列表推导式:它不是真正的语句--是看起来像循环的表达式。
         可以基于已有列表根据各种条件生成新的列表。
  9.pass,del,exec,eval

 涉及到的函数:
  chr(n):当传入序号n时,返回一个字符(0<=n<256)
  eval(source[,globals[,locals]]):将字符串作为表达式计算,并返回结果
  enumerate(seq[,start]):产生用于迭代的(索引,值)对
  ord(c):返回单个字符的int值
  range(start,end,step):类似于列表切片,返回一个包含整数的序列
  reversed(seq):产生seq的反向版本,用于迭代
  sorted(seq,key,reverse):返回seq排序后的列表
  zip(seq1,seq2,...):创造用于并行迭代的心序列
原文地址:https://www.cnblogs.com/maxiaotiaoshishui/p/7281015.html