day03

一、字符集编码解码

     编码与解码的流程:

     1、python2的编码与解码

          python2中在windows需要先解码在编码,比如现在是utf-8的编码,中文想在windows上显示,需要utf-8---->unicode---->gbk,因为windows默认支持gbk,如:'中国'.decode(encoding=utf-8).encode('gbk'),decode中的encoding是告诉系统当前的字符的字符集,decode会将字符转换成unicode

          在.py文件中,需要先进行编码声明(python2中的默认编码是ASCII,可以使用#coding=utf-8或#-*- coding: utf-8 -*-,这两种其实没有去被,只是有的编辑器支持的不同,建议使用后者),声明这个编码其实就是告诉解释器用什么字符集去解释

          在dos命令行中输入中文使用print打印出来的是中文,直接输入显示的是该编码的二进制的一种表现形式,就是python3中的bytes格式,在python2中bytes就是str,如:print('中国')打印出来的是中国,'中国'打印出来的是'\xd6\xd0\xb9\xfa',这个是gbk编码的中国这两个字符的bytes格式

     2、python3的编码与解码

          python3默认.py文件的编码就是unicode,所以不用再去声明,解释器是unicode,文件加载到内存后会自动解码成unicode,同时把字符转换成bytes(bytes = 8bits,就是8个二进制位)格式,编码(encode)后显示的是bytes,在python3中没有decode方法,因为解释器就是unicode所以不用解码,想要转码,直接就encode就可以了

          在dos中使用print和不使用打印输出的都是中文

     3、总结

          windows的dos就是unicode的,所以默认支持unicode,就是说可以中文字符可以在python2只进行decode一下就可以在dos中显示,因为上面已经说过了,decode后就是unicode格式,而dos直接支持unicode,所以可以直接显示,所以在windows上面默认支持unicode和gbk编码,所有系统中程序加载到内存中都是unicode,python2的str和bytes是一样的,python2的str就是python3的bytes,python3的str是unicode,bytes格式主要是为了将数据存储在硬盘上面,而在python中打开文件时,默认使用的是以操作系统的编码打开文件,如果文件不符合操作系统,需要先声明字符集,如:open(file_name,encoding='utf-8')

          在linux中的命令行中默认支持的是utf-8,所以在linux中默认支持utf-8和unicode

 

二、文件

     方法格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

     1、文件mode

          就是要对文件做什么操作,python3中常用的有r、w、a、r+、w+、a+、rb、wb

          r:将文件内容读出,不可以进行写操作

          w:清空文件,写入内容,不可以进行读操作

          a:在文件默认追加内容,不可以进行读操作

          r+:可以写入内容,从头开始写,但不清空内容,只是覆盖写入长度相等的内容,如内容是abc,现在要写入de,文件就会变成dec,可以进行读操作

          w+:清空文件内容,可以写入内容,可以读取

          a+:和r+相似,但是是在文件末尾进行追加,可以进行读操作

          rb:以二进制的方式进行读操作,并且不能使用encoding参数,因为已经使用二进制方式读取了,就不需要在指定字符集了

          wb:以二进制的方式写入,在写入的时候需要现在encoding一下,写入的是指定字符集中的字符的编号,因为在rb读出来后其实读取的也是bytes格式,需要使用wb时的encoding的字符集进行解码

     2、其他参数

         参数buffering是一个可选的参数,用来表示缓冲区的策略选择。设置为0时,表示不使用缓冲区,直接读写,仅在二进制模式下有效。设置为1时,表示在文本模式下使用行缓冲区方式。设置为大于1时,表示缓冲区的设置大小。如果参数buffering没有给出,使用默认时,会采用下面策略来选择:

1)对于二进制文件模式时,采用固定块内存缓冲区方式,内存块的大小根据系统设备的分配的磁盘块来决定,如果获取系统磁盘块的大小失败,就使用内部常量io.DEFAULT_BUFFER_SIZE定义的大小。一般的操作系统上,块的大小是4096或者8192字节大小。

2)对于交互的文本文件(采用isatty()判断为True)时,采用一行缓冲区的方式。其它文本文件使用跟二进制一样的方式。

         参数encoding是指明对文件编码,仅适用于文本文件。如果不明编码方式,默认是使用locale.getpreferredencoding()函数返回的编码方式。

         参数errors是用来指明编码和解码错误时怎么样处理。不能在二进制的模式下使用。

1)当指明为’strict’时,编码出错则抛出异常ValueError。

2)当指明为’ignore’时,忽略错误。

3)当指明为’replace’时,使用某字符进行替代模式,比如使用’?’来替换出错的。

4)其它相应还有surrogateescape/xmlcharrefreplacs/backslashreplace。

         参数newline是用来控制文本模式之下,一行的结束字符。可以是None,’’,\n,\r,\r\n等。

当在读取模式下,如果新行符为None,那么就作为通用换行符模式工作,意思就是说当遇到\n,\r或\r\n都可以作为换行标识,并且统一转换为\n作为文本输入的换行符。当设置为空’’时,也是通用换行符模式工作,但不作转换为\n,输入什么样的,就保持原样全输入。当设置为其它相应字符时,就会判断到相应的字符作为换行符,并保持原样输入到文本。

当在输出模式时,如果新行符为None,那么所有输出文本都是采用\n作为换行符。如果设置为’’或者\n时,不作任何的替换动作。如果是其它字符,会在字符后面添加\n作为换行符。

        参数closefd是用来当给一个文件句柄传进来时,而当退出文件使用时,而不对文件句柄进行关闭。如果传递一个文件名进来,这个参数无效,必定为True方式。

     3、方法        

          fileno在操作系统文件句柄的下标,叫文件描述符
          isatty判断是否是一个终端
          seekable,seek只能用于文本,这个用来判断是否可寻找
          truncate(),截断,从头开始截断
          writeable是否可写
          flush刷新数据到硬盘

四、集合

     1、语法及特点

          语法:set1 = {1,2,3,4,5},就是大括号中用','进行分隔

          特点:集合是用hash的原理去重的,就是说候集合没有重复的元素,集合是无序的

     2、集合的操作及方法

          a = {1,2,5,7,8,9}

          b = {1,3,4,6,8,9}

          使用a & b 或 a.interseciton(b)是求交集

          使用b - a(就是在b中有,在a中没有)或 a.difference(b)是求差集

          使用a | b或a.union(b)是求并集

          使用a ^ b或a.symmetric_difference(b)是求对称差集,对称差集(在其中一个集合里面,不同时出现在两个集合中,其实就是并集减交集)

          a.intersection_update(b)    就是a等于a和b的交集

          a.difference_update(b)    就是a等于a和b的差集

          a.union_update(b)    就是a等于a和b的并集

          a.symmetric_difference_update(b)    就是a等于a和b的对称差集

          a.issubset(b)  a是否是b的子集

          a.issuperset(b)  a是否是b的父集

          a.add()  可以想a集合里面添加元素

          a.remove()  可以删除指定元素

          a.clear()  清空集合

          a.update()  必须传入一个可迭代的对象,将每次迭代作为一个元素添加进a

 

五、函数

    1、参数与局部变量

实参:有确定值的参数,所有的数据类型都可以被当做参数传给函数
形参:只有被调用时才分配内存,调用结束后立刻释放内存,值仅在函数内部有效(局部变量,形参的作用域只在函数内部有效)
局部变量的作用域只能在当前函数,外部变量不能被局部变量修改(就是不能被函数内部修改),只能引用
如果想在函数中修改全局变量,可以使用global声明,一般不要这么使用,函数内部可以修改字典、列表、集合、实例,因为他们修改其中的元素,本身的内存地址是不会变的,只要是本身内存地址不改变,都可以在函数中修改其中的元素
字符串这种是改变内存地址的,所以不行

    2、参数类型

        位置参数:按照顺序,如func(a,b,c),调用时就是func(1,2,3),1对应a,2对应b,3对应c

        默认参数:必须放在位置参数后面(在形参中写好了a=b),如func(a,b,c=4),调用时就是func(1,2,3)如果不写第3个参数,则在函数中c的值就是4,写了就按照写的值进行操作

       关键参数:也是必须放到位置参数后面,非固定参数,*args是一个元组,以位置参数传入,**args是一个字典,以关键参数传入

 
       return的作用,代表函数结束,并返回结果
    3、匿名函数:
         a = lambda n: n**n   最复杂运算就是三元运算
         print(a(10))
         map(函数,迭代器)
         迭代器中的每个元素都是函数的参数
 
    4、高阶函数:
        把一个函数的内存地址传给另外一个函数当做参数,就叫高阶函数
        def test()
        print(test)是传的test的内存地址,print(test())传的是test这个函数的返回值
        高阶函数的特点(只要满足任意一点就是高阶函数):
        1、把一个函数的内存地址传给另外一个函数当做参数
        2、一个函数把另外一个函数当做返回值返回
 
六、递归

      递归特性:

      最大层数是999层
      递归必须有一个明确的结束的条件
      问题规模相比上次递归都应该有所减少
      递归的效率是不高的,递归层次过多会导致栈溢出

 

 

 

 

 

 

 

 

 

 

posted @ 2017-02-08 18:18  000冰封000  阅读(116)  评论(0)    收藏  举报