zoukankan      html  css  js  c++  java
  • Python基础第三篇

    一、collections系列

    Counter是对字典类型的补充,用于追踪值的出现次数,具备字典的所有功能 + 自己的功能

    1.计数器Counter

    import collections
    a='abababsbsbhh'
    c=collections.Counter(a) #直接列出每个元素出现了几次,传入列表和元组也一样
    print(c)
    #输出:Counter({'b': 5, 'a': 3, 'h': 2, 's': 2})
    
    #most_common 列出Counter内的前几个
    print c.most_common()
    print c.most_common(1)
    print c.most_common(3)
    '''
    输出:
    [('b', 5), ('a', 3), ('h', 2), ('s', 2)]
    [('b', 5)]
    [('b', 5), ('a', 3), ('h', 2)]
    '''
    
    #update 相加
    c=collections.Counter(a)
    c1=collections.Counter(a)
    c.update(c1)
    print(c)
    #输出:Counter({'b': 10, 'a': 6, 'h': 4, 's': 4})
    
    #subtract 减
    aa=collections.Counter("as")
    bb=collections.Counter("htw")
    aa.subtract(bb) #c-c1
    print(aa)
    #输出:Counter({'a': 1, 's': 1, 'h': -1, 't': -1, 'w': -1})
    
    #elements  返回包含所有元素集合的迭代器
    for item in c.elements():
        print item
    Counter

    2、有序字典(orderedDict )

    import collections
    #有序字典,是对字典类型的补充,他记住了字典元素添加的顺序
    #具备字典的所有功能 + 自己的功能
    dic=collections.OrderedDict()   #定义有序字典
    dic["a1"]=1
    dic["a2"]=2
    dic["a3"]=3
    di={}
    di["a1"]=1
    di["a2"]=2
    di["a3"]=3
    print(dic)
    print(di)
    #输出:
    # OrderedDict([('a1', 1), ('a2', 2), ('a3', 3)]) #有序
    #{'a1': 1, 'a3': 3, 'a2': 2}    #无序
    View Code

    3、默认字典(defaultdict) 

    import collections
    #默认字典
    #defaultdict    是对字典的类型的补充,他默认给字典的值设置了一个类型。
    dic=collections.defaultdict(list) #默认字典的value,也可以是元组(tuple)或字典(dict)
    #相当于
    dic={}
    dic["k1"]=[]
    View Code

    4、可命名元组

    #tupled的扩展
    #可命名元组
    import collections
    t=(1,2)
    #创建一个扩展tuple的类,Mytuple
    Mytuple=collections.namedtuple('Mytuple',['x','y'])
    tu=Mytuple(1,2) #相当于给原来的值赋了一个key
    print(t)
    print(tu)
    print tu.x,tu.y
    '''
    输出:
    (1, 2)
    Mytuple(x=1, y=2)
    1 2
    '''
    View Code

    5、双向队列、单向队列

    #双向队列,两头都可以取可以插
    #线程安全
    import collections
    q=collections.deque() #创建队列
    q.append(1)
    q.append(2)
    q.append(3)
    print(q)
    
    #单向队列,一个方向拿
    #线程安全
    import Queue
    q=Queue.Queue(10) #创建队列,指定最多放10个数据
    q.put(1)    #
    q.put(2)
    q.put(3)
    print q.get()   #
    print q.get()
    '''
    队列和栈的结构:
        队列:先进先出
        栈:弹夹,后加先出
    '''
    View Code

    二、迭代器和生成器

    1.迭代器

    '''
        只能通过循环从迭代器里拿数据
        next方法:返回迭代器的下一个元素
        __iter__方法:返回迭代器
    '''
    
    i=iter(range(3)) #使用内建的iter方法创建迭代器
    print i.next()
    print i.next()  #next()方法可以访问下一个元素
    print i.next()
    print i.next()  #python处理迭代器越界抛出StopIteration异常
    '''
    输出:
    0
    1
    2
    Traceback (most recent call last):
      File "E:/index.py", line 82, in <module>
        print i.next()
    StopIteration
    '''
    #在for循环中,Python将自动调用iter()函数获得迭代器,自动调用next()获取元素,自动完成检查StopIteration异常的工作
    迭代器

    2.生成器

    #生成器(生成器只有使用时才创建,从而避免内存浪费)
    '''
        range不是生成器 和 xrange 是生成器
        readlines不是生成器 和 xreadlines 是生成器
    '''
    for i in range(100): #返回100个元素的列表
        print(i)
    for i in xrange(100):#每次迭代中返回一个元素
        print(i)
    
    #带有 yield 的函数在 Python 中被称之为 generator(生成器)
    
    #yield  记住上一次的操作,下次在执行时继续执行
    def aaa(arg):
        seed = 0
        while True:
            seed=seed+1
            if seed > arg:
                return
            else:
                yield seed  #每次经过yield都会返回到print输出i,然后回到原来位置继续执行
    for i in aaa(10):
        print i
    生成器

    冒泡算法

    #练习
    #下标式循环
    '''
    有列表li=[13, 22, 6, 99, 11]
    按照以下规则计算:
    13 和 22 比较,将大的值放在右侧,即:[13, 22, 6, 99, 11]
    22 和 6 比较,将大的值放在右侧,即:[13, 6, 22, 99, 11]
    22 和 99 比较,将大的值放在右侧,即:[13, 6, 22, 99, 11]
    99 和 11 比较,将大的值放在右侧,即:[13, 6, 22, 11, 99,]
    13 和 6 比较,将大的值放在右侧,即:[6, 13, 22, 11, 99,]
    '''
    #冒泡算法 依次用下标对应的两个数字进行比较,大的放右边,从而进行排列
    li=[13, 22, 6, 99, 11]
    aa=(len(li)-1)
    while aa>0:
        for m in range(aa):
            if li[m]>li[m+1]:
                temp=li[m]
                li[m]=li[m+1]
                li[m+1]=temp
        aa=aa-1
    print(li)
    #输出:[6, 11, 13, 22, 99]
    View Code

    三、函数

    1.内置函数

    常用内置函数

    #常用内置函数
    '''
    基础
        help()
        dir()       不带参数时,返回当前范围内的变量、方法和定义的类型列表,带参数时,返回参数的属性、方法列表
        print vars()  当前模块的所有变量
        type()
        reload(temp)    真正的在导入一次一个模块
        id()
        is()
        range       产生一个序列,默认从0开始
        xrange
    类型转换
        int()
        long()
        float()
        complex()
        str()
        list()
        tuple()
    计算
        cmp(x,y)    x<y返回-1 x==y返回0 x>y返回1
        abs()
        boll()
        divmod()    #分别取商和余数
        max()
        min()
        sum()
        pow(x,y)  返回x的y次幂
        len()   长度
        all()   接受一个序列,如果所有都是真返回真,否则返回假
        any()   接受一个序列,只要有一个真就是真
        eval(dic) 把传入的字符串转换成字典
    assic码转换
        chr() 接收数字返回字符
        ord() 接收字符返回数字
    进制转换
        hex()  10转16
        oct()  10转8
        bin()  10转2
    
    #enumerate
    自动生成一列数字对应列表里的值,从0开始
    li=[11,22,33,44]
    for k,v in enumerate(li,1):#从1开始
        print(k,v)
    输出:
    (1, 11)
    (2, 22)
    (3, 33)
    (4, 44)
    '''
    View Code

    isinstance

      isinstance:判断一个对象是不是某个类的实例,这个类可以是创建该对象的类,也可以是创建该对象的类的基类

    在python中,判断对象类型的方法有两种,typeisinstance

    a=2
    print(isinstance(a,int))     #Ture
    print(isinstance(a,str))     #False
    
    print(type(a)==int)         #Ture
    print(isinstance(a,str))    #False

      (2)isinstance还能判断一个对象是不是某个类的实例

    class test:
        pass
    class AA(test):
        pass
    class BB:
        pass
    
    obj=AA()
    #判断obj对象是不是AA类的实例
    print(isinstance(obj,AA)) #Ture
    print(isinstance(obj,BB)) #False
    
    #判断obj对象是不是test类的实例
    print(isinstance(obj,test)) #Ture

    issubclass

      issubclass:判断一个类是不是另一个类的派生类

    class test:
        pass
    class AA(test):
        pass
    class BB:
        pass
    
    #判断AA是不是test的派生类
    print(issubclass(AA,test))  #True
    #判断BB是不是test的派生类
    print(issubclass(BB,test))  #False

    map遍历序列

    #map遍历序列,对序列中每个元素进行操作,最终获得新的序列
    li=[11,22,33,44]
    li1=[1,2,3,4]
    def func(arg):
        return arg+10
    print map(func,li)
    #输出:[21, 32, 43, 54]
    
    def func1(a1,a2):
        return a1+a2
    print map(func1,li,li1)
    #输出:[12, 24, 36, 48]
    
    print map(lambda a1,a2:a1+a2,li,li1) #lambda一句实现
    #输出:[12, 24, 36, 48]
    map

    filter筛选

    #filter 筛选
    li=[11,22,33,44,"",False,True,0]
    print filter(None,li)   #传入None,返回是True的序列
    #输出:[11, 22, 33, 44, True]
    
    li1=[11,22,33,44,55,66]
    print filter(lambda a:a>22,li1)#返回是True的序列
    #输出:[33, 44, 55, 66]
    filter

    reduce累积

    #reduce 累积操作
    li=[1,2,3,4,5,6]
    print reduce(lambda a1,a2:a1+a2,li)
    #输出:21   就是((((1+2)+3)+4)+5)+6
    #print reduce(lambda a1,a2:a1+a2,li,xxx)#累加  最后还可以加参数作为初始值
    print reduce(lambda a1,a2:a1*a2,li)#来乘
    #输出:720
    reduce

    每个文件模块自己的变量

    #__file__
    print __file__  #当前文件路径
    
    #__doc__
    import index
    print index.__doc__ #index是模块名,可查看一个文件模块的顶部注释
    
    #__name__  用来判断是不是程序的主文件
    #当主程序执行时__name__="__main__"
    if __name__=="__main__":
        pass

    2.自定义函数

      def 函数名(参数):

          函数体
    1.return 当函数执行完毕后,可以给调用者返回数据
    2.参数
      普通参数:参数可以有n个,但必须传入指定个数的参数
      默认参数:如果默认参数不传值,则使用默认值,并且默认参数只能放在最后
      动态参数:
        动态参数一:*args
    #接受多个参数,内部自动构造元组
    #传入序列要加*,避免内部构造元组
    li=[11,22,33]
    def func(*args):
        print(args)
    func(li)    #把传的列表当成元组的元素
    func(*li)   #加*把传的列表内的每个元素当成元组的元素
    #输出:
    #([11, 22, 33],)
    #(11, 22, 33)

        动态参数二:**kwargs

    #构造字典(两*)
    dic={"a":1,"b":2}
    def func1(**kwargs):
        print(kwargs)
    func1(a=11)
    func1(**dic)
    #输出:
    #{'a': 11}
    #{'a': 1, 'b': 2}

    结合上面两种:

    def func2(*args,**kwargs):
        print(args)
        print(kwargs)
    func2(1,2,3,a=1,b=2)
    #输出:
    #(1, 2, 3)
    #{'a': 1, 'b': 2}

    四、文件操作

    1.打开文件

    文件句柄 = file('文件路径''模式')

    模式:

    '''
    r   只读模式
    w   只写模式(不可读,不存在则创建,存在则删除内容)
    a   追加模式(可读,不存在则创建,存在则只追加内容)
    "+" 表示可以同时读写某个文件
    
    r+  可读写文件(可读,可写,可追加)
    w+  写读
    a+  同a
    
    rU  表示在读取时,可以将 
     
     
    自动转换成 
     (只能与r或r+模式一起使用)
    
    "b" 表示处理二进制文件
    rb  以2进制方式去读取文件
    wb
    ab
    '''
    View Code

    2.操作文件

    '''
    close()     关闭文件
    fileno()    文件描述符
    flush()     刷新文件内部缓冲区
    isatty()    判断文件是否是同意tty设备
    next()      获取下一行数据,不存在,则报错
    read()      读取指定字节数据
    readline()  仅读取一行数据
    readlines() 读取所有数据,并根据换行保存到列表
    xreadlines()可用于逐行读取文件,非全部
    seek()      指定文件中指针位置
    tell()      获取当前指针位置
    truncate()  截断指针后面的内容只留前面的
    write()     写
    writelines()将一个字符串列表写入文件
    '''
    View Code

    with

      为了避免打开文件后忘记关闭,当with代码块执行完毕时,内部会自动关闭并释放文件资源

    with open('','r') as obj:
        obj.read()

    Python 2.7后with还支持多个文件管理

    with open('','r') as obj1,open('') as obj2:
        pass

    五、lambda 表达式

    lambda和三元运算类似,是为了简化函数,不过只能用于处理简单函数,并且能自动return

    #正常函数
    def lam1(arg):
        return  arg+1
    print lam1(10)
    
    #lambda表达式
    lam2=lambda arg:arg+1#(lam2等于上面的函数名,arg等于上面的参数)
    print lam2(10)
    
    lam3=lambda a,b:a+b
    print lam3(2,3)

     六、递归

    1、递归:在运行的过程中调用自己就叫做递归

    下面举个最典型的递归案例:斐波纳契数列(1、1、2、3、5、8、13、21.....)

    #用递归实现
    def func(arg1,arg2):
        if arg1 == 0:
            print(arg1)
            print(arg2)
        arg3=arg1+arg2
        print(arg3)
        if arg3>1000:
            return
        func(arg2,arg3) #在函数内部调用自身
    func(0,1)

    上面的代码可以实现斐波纳契数列的输出

    2、递归的返回值

    #递归的返回值
    def func(arg1,arg2):
        if arg1 == 0:
            print(arg1)
            print(arg2)
        arg3=arg1+arg2
        if arg3>1000:
            return arg3 #返回值
        func(arg2,arg3)
    result=func(0,1)
    print(result)   #输出:None

    上面代码可以看到,输出的是None,是因为函数第一次执行时的返回值才是result,当函数一直被调用时,return arg3 的返回值是返回给了他上一次

    调用的函数func(arg2,arg3),以此往前推

    如果代码如下:递归函数就能返回最后一次的返回值

    def func(arg1,arg2):
        if arg1 == 0:
            print(arg1)
            print(arg2)
        arg3=arg1+arg2
        if arg3>1000:
            return arg3
        ret=func(arg2,arg3) #把内部调用的函数的返回值赋值给ret
        return ret
    
    result=func(0,1)
    print(result)   #输出:1597
  • 相关阅读:
    子字符串substring 问题
    [Coding Practice] Maximum number of zeros in NxN matrix
    挖一挖unsigned int和补码
    1. 概览
    1. 概览
    Linux sudo 命令的应用
    将秒转化为时分秒
    PHP 信号管理
    HTTP Cache
    Linux 文件压缩与归档
  • 原文地址:https://www.cnblogs.com/melonjiang/p/5090504.html
Copyright © 2011-2022 走看看