1、列表元祖字典集合
  列表 list = ["a", "b", "c", "d","a"]
  元祖 tup = (1, 2, 3, 4, 5 )
  字典 dict = {key1 : value1, key2 : value2 } ;dict ={}
  集合 set = {'a', 'r', 'b', 'c', 'd'} ;set = set()
  特点:
  1.元组与列表类似,不同之处在于元组的元素不能修改,不允许删除;可以使用list() 和 tuple()方法相互转换;当需要使用一组数据且数据不用修改时用元祖
  2.集合是一个无序的不重复元素序列,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等
    set1.intersection(set2) #返回两个或更多集合中都包含的元素,即交集
    set1.union(set2) #方法返回两个集合的并集
  区别:
  1.使用场景不一样,列表可修改可删除,元祖不可修改不可删除
  2.数据存储不一样,由于列表可增删对应的key不可删除,占内存多

  isinstance(obj, class) #判断一个对象是否是一个已知的类型,类似type()。如果是则返回 True,否则返回 False
  issubclass(cls, class) #方法用于判断参数cls是否是类型参数class的子类。如果是则返回 True,否则返回 False

  enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列
    print(list(enumerate([2,4,6,6])))

  counter() 计数器用于追踪值的出现次数
    from collections import Counter
    print(Counter([2,4,6,6])

callable(add)判断是可执行函数,返回True

2、字符串
  s1="abcdefg"
  s2="123"
  s3 = 456
  print(s1+s2)
  print(s1*2)
  print(len(s1))
  print(s1[0])
  print(s1[1:])
  print(s1[1:3])
  print(s1[:6])
  print("%s是字符串,%s是字符串,%d"%(s1,s2,s3))

3、字符池
  import string
  string.ascii_letters #字符池a-zA-Z
  string.digits #字符池0-9
  str = string.ascii_letters+string.digits #字符池a-zA-Z0-9
  ran_str = ''."join(random.sample(str, 8)) #在字符池随机取八个连接成字符串
  ran_str.isalpha() #方法检测字符串是否只由字母组成
  ran_str.isdigit() #方法检测字符串是否只由数字组成

4、切片
  L = ['Adam', 'Lisa', 'Bart', 'Paul']
  print(L[0])     #Adam
  print(L[-1])    #Paul
  print(L[:])      #['Adam', 'Lisa', 'Bart', 'Paul'] #复制
  print(L[:2])     #['Adam', 'Lisa'] 前两个
  print(L[:-1])     #['Adam', 'Lisa','Bart'] 前三个
  print(L[::])     #['Adam', 'Lisa', 'Bart', 'Paul']
  print(L[::2])     #['Adam', 'Bart'] 每隔两个取一个
  print(L[::-1])     #['Paul', 'Bart', 'Lisa', 'Adam'] 逆序
  L[0]="shuzf"    #['shuzf', 'Lisa', 'Bart', 'Paul'] 替换
  del L[0]      #['Lisa', 'Bart', 'Paul'] 删除
  L[:0]="Adam"    #['A', 'd', 'a', 'm', 'Lisa', 'Bart', 'Paul'] #插入

5、列表推导式
  [ 表达式 for 变量 in 可迭代对象 ]
  [ 表达式 for 变量 in 可迭代对象 if 筛选条件 ]
  [真的值 if 条件 else 假的值 for 变量 in 可迭代对象 ]
  print([f(x) for x in a])
  print([f(x) for x in a if x%2==1 ])
  print([x-10 if x in [11,12,13] else x for x in a])
  print([s[0].upper() + s[1:].lower() for s in ['adam', 'LISA', 'barT']]) #第一个字母大写,其他都小写

6、lambda匿名函数
  lambda语法: lambda argument_list: expression
    argument_list是参数列表,它的结构与Python中函数(function)的参数列表是一样的(输入)
    expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的(输出)
  lambda用法:
    lambda x, y: x*y;函数输入是x和y,输出是它们的积x*y
    lambda:None;函数没有输入参数,输出是None
    lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
    lambda **kwargs: 1;输入是任意键值对参数,输出是1

  Lambda表达式最大的意义不在于代码优雅,而是这个表达式可以作为参数在不同的函数中传递,只有当需要的时候,lambda才会被真正展开循环

7、filter()、sorted()、map()、reduce()函数 与lambda配合使用,结果加list()使用
  from functools import reduce
  filter函数
    filter(lambda x: x % 3 == 0, range(1,11))
    此时lambda函数用于指定过滤列表元素的条件。
  sorted函数    
    sorted(range(1,11), key=lambda x: abs(5-x)),abs为绝对值函数,与5距离从小到大进行排序 
    此时lambda函数用于指定对列表中所有元素进行排序的准则。默认按key由小到大排序
  map函数
    map(lambda x: x+1, range(1,11))
    此时lambda函数用于指定对列表中每一个元素的共同操作。
  reduce函数
    reduce(lambda x,y:x+y,range(1,11))
    此时lambda函数用于指定列表中两两相邻元素的结合条件。

8、大小写、分割、删除、替换、连接
  '%02d'%i #以两位输出字符:01,02
  '%.2f'%i #以小数输出字符:1.00,2.00
  str.lower() #转小写
  str.upper() #转大写
  str.split(s,num) #分割       分割符s,分割次数;默认以空字符分割,返回list
  str.strip(s) #删除       删首尾字符s;默认删除首尾空白符(包括'\n', '\r', '\t', ' ')
  str.replace(olds,news,1) #替换 news替换olds,替换一次:默认所有替换
  str.join(list) #连接 以str连接list
  str.lstrip() 方法用于截掉字符串左边的空格或指定字符
  str.rstrip() 删除 string 字符串末尾的指定字符(默认为空格)
  str.startswith(s, beg=0,end=len(string)) #判断str以s开头 startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回False
  str.endswith(s, beg=0,end=len(string)) #判断str以s结尾 startswith() 方法用于检查字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False

9、过滤
  crazy_str = 'dade142.!0142f[., ]ad' #print("".join(list(new_crazy))),以list(filter())进行输出
  new_crazy = filter(str.isdigit, crazy_str) #只保留数字
  new_crazy = filter(str.islower, crazy_str) #保留小写字母
  new_crazy = filter(str.isupper, crazy_str) #保留大写字母
  new_crazy = filter(str.isalpha, crazy_str) #只保留字母
  new_crazy = filter(str.isalnum, crazy_str) #只保留字母和数字
  new_crazy = filter(lambda i: i in '0123456789.', crazy_str) #保留数字0-9和小数点'.' 则需要自定义函数
  newlist = filter(None,list) #过滤list为空的元素

10、求和
  print([i for i in range(11)])        #0至10列表
  print(sum(range(1,11)))            #1至10求和
  print(sum([i for i in range(1,11)]))        #1至10求和
  print(reduce(lambda x,y:x+y,range(1,11)))    #1至10求和
  print(sum([i for i in range(1,101) if i%2==1]))#1至100奇数求和
  print(sum([x for x in range(2, 101) if all([x%y!=0 for y in range(2, x)])])) #1至100质数求和
  print(range(1,101)[10:90])   #rang(11,91),在list中取10-90下标的值
  print(range(1,101,3))      #1至100,每三个取一个(间隔2)
  import numpy as np
  print(np.mean(range(1,101))) #1至100均值

11、globals()、locals()、global、local、nonlocal
  locals()函数返回一个当前位置的所有局部变量的字典
  globals()函数返回一个全局变量的字典,包括所有导入的变量
  local设置局部变量,local需在函数体内设置;在函数体内声明的变量,默认都是局部变量
  global设置为全局变量,global需在函数体内设置; global同时还可以定义新的全局变量
  nonlocal内层函数改变外层函数变量值,nonlocal需在内层函数中使用 ;nonlocal不能定义新的外层函数变量

12、eval()、exec()、complie()函数
  eval() 函数用来执行一个字符串表达式,并返回表达式的值。
    参数必须是str,当参数为函数名时加()获取返回值
    a=eval('str')()
  exec() 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。
  compile() 函数将一个字符串编译为字节代码。

13、choice()函数
  print (random.choice(a)) #随机取值,a可以是列表也可以是字符串

14、os
  import os
  print( os.path.basename('/root/runoob.txt') ) # 返回文件名
  print( os.path.dirname('/root/runoob.txt') ) # 返回目录路径
  print( os.path.split('/root/runoob.txt') ) # 分割文件名与路径
  print( os.path.join('root','test','runoob.txt') ) # 将目录和文件名合成一个路径
  print(os.path.realpath(__file__)) #获取当前文件绝对路径

15、re
  re.sub(pattern, repl, string, count=0, flags=0)   #re.sub(a,b,s,1) 把s字符串中的a替换成b,次数一次

16、replace
  str.replace('a','A') #str.replace(old, new[, max]) 方法把字符串中的 old(旧字符串) 替换成 new(新字符串)

17、in
  if res not in res_list:
    res_list.append(res)
  if res in res_list:
    print(res)

18、if else
  真c=a,假c=b
  c = a if a > b else b

19、迭代器(iterator)
  a = iter(range(10)) #迭代器类似于for循环,具有__iter__()和next()方法
  print(next(a))

20、生成器(generator)
  生成器是一种特殊的迭代器,具迭代器特性,还具有有惰性,每次你去访问就给你返回一个值,不会一次性全部遍历出来
  yield生成器,yield相当于return返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始

  a = [i for i in range(10)] #返回列表
  b = iter(range(10)) #返回了一个迭代器iterator
  c = (i for i in range(10)) #返回了一个可迭代的generator (生成器)对象
  print(type(a),b.__iter__(),c.__iter__())
  print(next(b),list(b))
  print(next(c),list(c))

  生成器表达式和列表推导式的区别
  1.列表推导式比较耗内存一次性加载,生成器表达式几乎不占内存,使用的时候才分配和使用内存
  2.得到的值不一样 列表推导式得到的是一个列表,生成器表达式获取的是一个生成器

21、递归
  在某些条件下函数自己调用自己,不需要自己得到部分结果。如果需要得到所有结果列表:
    1、可以结合yield生成器;
    2、也可以将每次结果保存,当参数传至函数

22、断言assert
  assertEqual
  assertNotEqual
  assertTrue
  assertFalse
  assertIsNone
  assertIsNotNone

23、list和dict

  # +=还是在原来的基础上进行修改
  # ls = ls +["x"]会返回ls一个新创建的对象
  #集合里加元素
  lis = [123]
  lis+=[456]
  lis.append(789)
  print(lis)

  #字典里加元素
  dic = {'shuzf':123}
  dic.update({'zhifu':456})
  print(dic)

24、reverse()和reversed() 反转
  #reverse() 用于列表中数据的反转,返回None
  #reversed() 反转迭代器的序列值,返回反向迭代器

  lista = [1, 2, 3, 4]
  lista.reverse()
  print(lista)

  listb = [1, 2, 3, 4]
  print(list(reversed(listb)))