这篇文章上次修改于 855 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

[toc]

Python基础

1. python基础知识

1)环境搭建:

退出python环境的命令:exit()或ctrl+d
一般Linux系统中默认安装python2版本

2)Linux环境下源码安装Python

  • 解压源码安装包到指定路径:tar -zxf *.tgz -C /路径
  • 安装依赖包:yum install -y openssl-devel openssl-static zlib-devel lzma tk-devel xz-devel bzip2-devel ncurses-devel gdbm-devel readline-devel sqlite-devel gcc libffi-devel
  • 执行配置文件 ./configure
  • 编译安装
  • 设置环境变量或创建软连接到系统环境变量所示的路径中去
  • 测试是否成功

注意:因为脚本中会使用到中文,一般脚本的开头会生命中文编码格式:

#-*-coding:utf-8-*-    或   #coding=utf-8

python环境下安装第三方软件常用的管理命令(专属python):

pip3 install ipython

注释

单行注释:以#号开头       注意:选中文本的情况下,ctrl+?可以批量添加注释
多行注释:使用三个双单引号或者双引号来注释多行内容:'''内容'''  或  """内容"""

2.变量及数据类型

注意:python中运算的变量可以直接使用,不必像Linux中加$来调用

  • Numbers (数字型)
    int : 有符号整型
    long :长整型,也可代表八进制和十六进制
    float :浮点型
    complex :复数型
  • 布尔类型
    True 真
    False 假
  • String 字符串类型
  • List 列表类型
  • Tuple 元组
  • Directory 字典类型

注意:

浮点型除整数型的结果还是浮点型
整数型除整数型的结果还是整数型
声明字符串类型一般用单引号或双引号引起来
    例:password=input("***")   交互式输入
    password=int(input("***"))   将交互式输入的值的类型转换为整数型

3.标识符

命名原则:

由字母、下划线和数字组成,且数字不能开头,且区分大小写,不能用系统已设定的关键词作为标识符,要做到见名知意
  • 驼峰命名法
    小驼峰命名法:第一个单词字母小写开始,第二个单词的字母大写
    大驼峰命名法:每个单词的首字母都大写
    Python中更推荐使用下划线来连接所有单词

在交互模式下,查看已经定义的关键词

import keyword 
keyword.kwlist

4.函数

占位符:%d、%s等,前边有多个占位符时,后边调用的变量格式为%(变量1,变量2)

type(变量名)格式可以查看该变量的类型

交互输入函数

  • 在python2中,raw_input()函数接收的是字符串形式的,而input() 接受的是表达式形式的
  • 在python3中,只有input() 函数,功能与python中raw_input()函数一致,可以用int(input())来强制将输入的字符转换为整数型

输出函数:print()

递增可以用i+=1,无法使用i++形式
括号里可以指定最后输出完后不换行,格式为
print("需要输出的内容",end="x")      x可以为空,也可以为制表符,end的值默认为换行符

格式化输出(带%的操作符)

  • %c 字符格式
  • %s 通过str()字符串格式转换来格式化,即字符串格式
  • %d 有符号的十进制整数
  • %f 浮点实数

5.运算符

普通运算符

  • + 加
  • - 减
  • * 乘
  • / 除
  • // 取整除
  • % 取余
  • ** 幂

注意: "A" * N 表示对字符串A复制N遍输出,乘法对字符串来说是对字符串的复制

赋值运算符

  • = 赋值预算
  • += 加法赋值运算 c+=a -------c=c+a
  • -= 减法赋值运算 c-=a---------c=c-a
  • *= 乘法赋值运算 c=a--------c=ca
  • /= 除法赋值运算 c/=a---------c=c/a
  • %= 取模赋值运算 c%=a-------c=c%a
  • **= 幂赋值运算 c=a------c=ca
  • //= 取整赋值运算 c//=a-------c=c//a

6.条件判断语句

1)关系运算符

  • 比较关系运算符
    == 比较两个数值是否相等,相等为真
    != 比较两个数值是否不相等,不相等为真
    > 左边大于右边
    < 左边小于右边
    >= 左边大于等于右边
    <= 左边小于等于右边
  • 逻辑关系运算符
    and 逻辑与
    or 逻辑或
    not 逻辑非
  • if条件判断语句

    if是用来进行判断的,格式为:

    if  要判断的条件 :条件成立时,需要做的事情

    注意:代码缩进为一个tab键,或者是4个空格
    if - else 语句的使用格式

        if   条件  :  
            满足条件时要做的事情1、2、3.......
        else  :    
            不满足条件时需要做的事情1、2、3.......

    elif 语句的格式

    if  条件1  :
        事情1
    elif   条件2 :
        事情2
    elif   条件3 :
        事情3
    注意:elif必须和if一起使用,否则会出错

    if 嵌套

    if 条件1 :
        满足条件1时需要做的事情1、2。。。。。
    if  条件2 :
        满足条件2时需要做的事情1、2........
    else :
          不满足条件2时需要做的事情

    if 真假判断

    if 后边条件为 “空”、“none”、“0”、“[ ]”、“{  }”时,则输出结果为假,非空值的情况下为真
    注意:import random  声明变量random  , import的作用是来声名变量
        a=random.randint(0,5)   在0到5之间随机取一个值赋给a,print(a)  打印出a的值
    注意:若print输出的内容包含两个或以上的运算式,则它们之间用逗号“    ,”分隔
  • while嵌套
    外层循环一次,内层循环一遍
  • for循环
    一般用于便历
    格式:
    for 临时变量 in 列表或字符串等 :

    循环满足时执行的代码

    else :

    不满足条件时执行的代码
  • 特殊函数标识
    break

    作用是用来结束整个循环,若break在嵌套循环中,则退出的是离break最近的一层循环

    continue

    作用是跳出本次循环,继续下次循环
    在有continue的语句中,自增一定写在continue的前边,否则程序会陷入死循环

7.函数

  • range函数 :range()

    作用:生成一个数字区间
    格式:range (start ,stop ,step ),其中,range的取值范围包含start值,但是不包含stop的值,即 [ start , stop )
    若不写step和start的值,则默认从0开始,step的值为1
    Python2和Python3中的区别
        python2中返回的是一个列表,python3中返回的是一个取值范围,在2中还有一个xrange()函数和3中的range()函数的效果相同
  • len函数:

    作用:返回对象(字符、列表、元组、字典等)的长度或者个数
    组成字符串的另外一种方式
        字符串会拼接,数字会相加(变量a和变量b    “a+b”)
  • 字符串的输入输出

    格式化的方式展示数据,并可以通过多种方式展示数据,如通过位置、关键字参数、映射list等
        例:print("姓名:%s\n职业%s\n地址%s" %(a,b,c))
    在python3中input获取的数据,都以字符串的方式进行保存,即使输入的是数字,那么也是以字符串方式保存
  • 字符串表示方法:

        字符串:a="1234"
        列表:a=[1,2,3,4]
        元组:a=(1,2,3,4)
        字典:a={1,2,3,4}

    下标介绍:就是编号,就好比超市中的存储柜的编号,通过这个编号就能找到相应的存储空间。
    通过下标取出部分字符

        例:num='abcdef' 则num[0]表示字符中第一个字母,即num[0]=a
        取连续的值:num[2:4]
        从后往前取值:num[-1}    取倒数第一个值
  • 字符串的切片
    含义:切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作
    语法:[起始:结束:步长]

        例:a='asdfghj'    则a[2:4:1]=dfg 即取下标为2到4的值
    注意:选取的区间属于左闭右开型,即从"起始"位开始,到"结束"位的前一位结束(不包含结束位本身),注意,如果不写步长默认是1.步长是控制方向的,正数从左往右取,负数是从右到左取

    切片的应用

            [:] 提取从开头(默认位置0)到结尾的整个字符串
            [start:] 从start 提取到结尾
            [:end] 从开头提取到end - 1
            [start:end] 从start 提取到end - 1
            [start:end:step] 从start 提取到end - 1,每step 个字符提取一个
            [::-1]逆序
  • find()函数:搜索查找命令,如果存在则返回字符串的下标,否则返回-1

    例:
        mystr='hello world yanzilu and yanziluPython'
        mystr.find("yanzilu")
        | 输出为 :12
    
    指定区域查找:从第二个字符开始查找,到字符串长度的位置结束
        mystr.find("yanzilu",20,len(mystr))
        | 输出为24
  • rfind() 函数:功能和find相同,只是从右往左查找

    例:
        mystr='hello world yanzilu and yanziluPython'
        mystr.rfind("yanzilu")
        | 输出值:24
  • index() 函数:和find方法一样,只不过如果搜索内容不存在会报错

    例:
        mystr='hello world yanzilu and yanziluPython'
        mystr.index("yanzilu")
        | 输出值:12
  • rindex函数,同index函数一样,只不过是从右向左查找
  • replace( 旧,新) 函数:字符串内容的替换

    例:
        mystr='hello world yanzilu and yanziluPython'
        mystr.replace("world","xxx")
        | 'hello xxx yanzilu and yanziluPython'
    
    指定次数替换
        mystr.replace("yan","abc",1) 
        | 'hello world abczilu and yanziluPython'
  • split( “切割符”) 函数: 字符串分割,切割符本身不会被保留,默认按照空格切割

    例:
        mystr='hello world yanzilu and yanziluPython'
        mystr.split()  
        | ['hello', 'world', 'yanzilu', 'and', 'yanziluPython']
        mystr.split("yan")   以“yan”作为分割符
        | ['hello world ', 'zilu and ', 'ziluPython']
        mystr.split("yan",2)   指定切割的次数,若切割符的数量小于指定的数量,则按切割符的最大数量进行切割
        | ['hello world ', 'zilu and ', 'ziluPython']
  • parttion (“切割符”) 函数: 把字符串按照指定切割符分成三个部分, str前,str自身和str后

    例:
        mystr='hello world yanzilu and yanziluPython'
        mystr.partition("and")
        | ('hello world yanzilu ', 'and', ' yanziluPython')
  • rparttion (“切割符”) 函数:和partition相同,只不过是从右往左查找切割符

    例:
        mystr='hello world yanzilu and yanziluPython'
        mystr.rpartition("yan")
        | ('hello world yanzilu and ', 'yan', 'ziluPython')
  • splitlines() 函数:按照行分隔。返回一个列表。

    例:
        mystr1 = 'hello\nworld\nyanzilu\nand\nyanziluPython'
        mystr1.splitlines()
        | ['hello', 'world', 'yanzilu', 'and', 'yanziluPython']
  • startswith (“关键字”) 函数:检查字符串是否以设定的关键字开头,是则返回True,否则返回False

    mystr='hello world yanzilu and yanziluPython'
    mystr.startswith("hello")
    | True
  • endswith (“关键字”) 函数:检查字符串是否以 obj结尾,是则返回True,否则返回False

    mystr='hello world yanzilu and yanziluPython'
    mystr.startswith("Python")
    | True
  • upper() 函数: 将所有字母全部变为大写
  • lower() 函数: 将所有字母全部变为小写
  • center ("左右空格数量之和") 函数:给字符串两边添加空格
  • lstrip() 函数: 去除字符串左边的空格
  • rstrip() 函数:去除字符串右边的空格
  • strip() 函数:去除字符串两边的空格
  • count("字符") 函数:统计一个字符串出现的次数

    例:
        mystr = "abcd abcd aaa bb"
        mystr.count("a")
        | 5
  • isspace() 函数:查看是否只包含空格,是则输出True
  • isalpha() 函数:查看是否只包含字母,是则输出True
  • isdigit () 函数:查看是否只包含数字,是则输出True
  • isalnum () 函数:是否只包含数字和字母,是则输出True
  • title() 函数: 把字符串中每个单词的首字母大写,其余小写
  • capitalize() 函数:把字符串一行的首字母大写,其余小写
  • join() 函数: 在一直字符串中每个字符后面插入一个连接符,构造出一个新的字符串

    注意:拼接符号赋值的变量在前,要拼接的字符串变量在后边括号内
    格式:a(拼接符号).join(b(需要拼接的字符串))
    也可以写成“—”.join(b),即将拼接符号赋值的变量直接引用

8.列表及循环遍历

  • 列表的格式:name_list = ["刘备","孙权","曹操"]
    打印多个姓名:print(name_list[0])
    列表中,字符串格式必须用引号引起来,其他的可不必
  • 列表的添加元素:(增:append,extend,insert)
    append可以向列表添加元素(将整个列表作为一个元素添加)

    例:原变量为names
        tmp=input("请输入需添加的内容”)
        print(names.append(tmp))
        | [ “元数据”,“需要添加的数据” ]

    extend将另一个集合中的元素逐一添加到列表中

    例:原变量为names
        tmp1=["张飞","孙权","曹操"]
        print(names.extend(tmp))
        | [ “元数据”,“需要添加的数据1”, “需要添加的数据1”]

    insert在指定位置index前插入元素

    格式:原变量.insert(0,"插入的元素")
    例:原变量为names
        names.insert(0,"张飞")
        | 在第一个名片前边插入“张飞”
  • 列表的删除元素(del,pop,remove)定义原变量名为names
    del 根据下标进行删除

     格式:del names[n]   n代表下标序号

    pop 删除最后一个元素

    格式:names.pop()
    注意,如果需要知道删除的元素是什么,可以采用如下格式
        name = names.pop()
        print("删除的元素是:" , name)
        print("删除之后的列表为:" , names)

    remove 根据元素的值进行删除

    格式:names.remove("要删除的元素名")
    拓展:
        tmp=input("请输入需要删除的元素名:")
        names.remove(tmp)
        print("删除之后的列表为:" , names)
    
    注意:若要删除同一个列表里的多个相同的元素,可以使用while循环来实现
  • 列表的修改
    通过下标修改元素:定义列表名为names

    names[n]="新的元素"
  • 列表的查找(in,not in ,index,count)
    in和not in:查看所要查找的元素是否在列表中

    用法,定义列表为names
        if  “findname” in  names   若存在则返回值为真
        if  “findname” not in  names   若不存在则返回值为真

    index :利用此方法搜索,会返回元素所在列表中的下标

    用法: 
        若搜索的值只有一个:names.index("要搜索的值")
        若搜索的值有多个,可以指定搜索范围:
            names.index("要搜索的值",开始下标,结束下标)

    count : 利用此方法搜索,会返回此元素在列表中存在的数量

    用法
        names.count("要搜索的值")
  • 列表的排序(sort,reverse)
    sort:升序排序

    用法:names.sort()

    reverse:颠倒排序,即将原有的顺序头尾倒置

    用法:names.reverse()

    组合用法:升序排序后再进行倒序排序

    names.sort(recerse=True)
  • 列表的嵌套
    类似while循环的嵌套,列表也是支持嵌套的一个列表中的元素又是一个列表,那么这就是列表的嵌套
    示例:

    school_names = [['北京大学','清华大学'],['南开大学','天津大学'],['贵州大学','青海大学']]
    print(school_names[0][1]),输出结果为外层第一个值里面的第二个结果,两个中括号分别代表外层列表和内层列表
    

9.元组:

  • 元组的定义:
    Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组和字符串都是不可变序列
    语法:定义元组的语法包括小括号()和逗号”,” 其中,逗号必须有
  • 访问元组,和访问列表一样的方法
  • 修改元组:Python中不允许修改元组的数据,包括不能删除其中的元素。元组是不可变的,也就是说,元组中的元素在被赋值后不能改变。但是,如果元素本身是一个可变数据类型的列表,那么其嵌套项可以被改变
  • 列表和元组的相互转化:a为列表,b为元组
    tuple函数:列表转元组

    b=tuple(a)

    list函数:元组转列表

    a=list(b)

    join 两者转字符

    “”join(a或b)
  • 元组的嵌套
    a1...
  • 元组的优点(与列表相比)

    1. 通常将元组用于不同的数据类型,将列表用于相同(或相似)的数据类型。
    2.由于元组不可变,所以遍历元组比列表要快(较小的性能提升)
    3. 元组可以用作字典的Key,而列表不行。因为字典的Key 必须是不可变的,元组本身就是不可变的
    4.如果数据不需要更改,将其作为元组来实现,可以确保“写保护”

10.字典

定义
  • 表示方法:directory={key1:value1,key2:value2}
    表示用键值对的方法来表示,每一个key的值是唯一的,每一个key对应一个value值,所有key的值都要用引号引起来
    访问方法1:print(directory[key1]),输出结果为value1的值
    访问方法2(更推荐)print(directory.get(key1,default)),输出结果为value1的值,若key1多对应的值不存在,则会输出一个默认的值default(此默认值可写可不写,不写的时候会返回空值)
    注意:如果访问不存在的key值,则会报错
  • 字典的增删改查
    添加元素和修改:如果在使用 变量名['键'] = 数据 时,这个“键”在字典中,不存在,那么就会新增这个元素

    使用方法:对key对应的值进行修改,若不存在,则新增
    info = {'name':'宋江', 'id':100, 'sex':'男生', 'address':'中国梁山'}
    info[name]=李四

    删除元素:

    通过key来删除字典的指定的值
        del directory[key1]
    del删除整个字典
        del directory
    clear清空整个字典
        directory.clear()
    . pop删除字典指定元素并且得到值
        directory.pop(key1)
    popitem随机返回并删除字典中的一对键和值(项)
        atuple=direcory.popitem()

    查找元素

    diretory.get("key1")
    if "key1" in directory
    | print("值为真,存在")
    if "name" in info:       #定义字典info 
        print("使用in根据key从字典中查找name是存在的")
    if "name" in info.keys():
        print("使用in根据key从字典中的info.keys()查找name是存在的")
    if "宋江" in info.values():
        print("使用in根据'值'从字典中的info.values()查找宋江是存在的")
    directory.keys()
        返回一个包含所有key的列表
    directory.values()
        返回所有的值
    directory.items()
        返回列表中所有的key和value组成的元组所组成的列表
    len() 测量字典中,键值对的个数
  • 字典的遍历
    通过for ... in ...:的语法结构,我们可以遍历字符串、列表、元组、字典等数据结构
    遍历字典的key值

    for key in dict1.keys()

    遍历字典的value值

    for value in dict1.values()

    遍历字典的元素item

    for value in dict1.items()

    遍历字典的键值对

    for key,value in dict1.items()
    

11.集合

集合的创建
    创建集合使用 { } 加数据或者set(),但是如果要创建空集合只能使用set(),因为{ } 是用来创建空字典的
        集合的特点:去重
集合的增加数据:
    注意:集合具有去重功能,如果追加的数据已存在于集合中,那么集合不会有任何的变化
    add():不能追加数据序列
        定义一个集合s1={1,2}
        增加数据:s1.add(2)      注意:括号里追加的数据带引号和不带引号是不一样的
    update():只可以追加数据序列的格式
        增加一个数据序列
        例:s1.update([10,20,30])
集合的删除操作  :s1={10,20,30,40,50}
    remove() ,  删除集合中的指定数据,如果数据不存在,则报错
        s1.remove(10)
    discard()  ,删除指定数据,如果数据不存在,也不报错
        s1.discard(10)
    pop()  ,随机删除某个数据,并返回这个数据的值
        del-num=s1.pop()
集合的数据查找
    in :判断数据在集合序列
        print(10 in s1)      返回值:True
    not  in :判断数据不在集合序列
    

12.函数

函数的定义
    函数就是将一段具有独立功能的代码块整合到一个整体并命名,在需要的位置调用这个名称即可完成对应的需求。函数在开发过程中,可以更高效的实现代码重用
函数的使用
    定义函数:
        def 函数名(参数):
            代码... ...
    调用函数
        函数名(参数)
            不同的需求,参数可有可无
            在python中,函数必须先定义后调用,如果不调用的话,定义好的函数是不会执行的
    函数的执行流程
        当调用函数时,解释器回到定义函数的地方去执行下方缩进的代码,当这些代码执行完,回到调用函数的地方继续向下执行;定义函数的时候,函数体内部缩进的代码并没有被执行
函数参数
    作用
        让函数变得更加灵活,将真实的数据带入到函数中进行计算
    参数类型
        形参:定义函数的同时定义了接收用户数据的参数a和b,用来接收参数用的,叫做形参
        实参:调用函数时传入了真实的数据10和20,用来传递给函数用的,那么这个就叫做实参
            形参和实参的数量要一一对应
            格式:def  函数名 ( 参数1,参数2,缺省值... )
            调用时:函数 ( 参数1,参数2 ,.....)
        缺省参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值
            注意:带有默认值的参数一定要位于参数列表的最后面,否则不会运行
            例:格式为括号里面(a,b,c=默认值)
                def printInfo(name,age=18):
                    print(printInfo)
        不定长参数:有时可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,声明时不会命名
            格式:不定长参数  *args是元组类型 , **kwargs是字典类型
                注意:args这个名字可以换成别的名字,但是*不能少
                def   test(a,b,c=0,*args,**kwargs): 此格式为固定格式,括号里边的顺序不能颠倒
                    注意,怎么从args中取出值:for i in args()
                    给kwxargs传参数时需要写成    变量=“值”   的形式
            拆包方式传参:
                A=(40,50,60)
                B={"name":"张三","age":18}
                test(11,22,33,*A,**B)
    带有参数的返回值:
        想要在函数中把结果返回给调用者,需要在函数中使用return
        return可以返回多种形式的值
         return a,b,c   返回结果默认是一个元组
        例:
            def add_2_num(a, b):  
            c = a+b
            return c
        或者
            def add_2_num(a, b):
            return a+b
函数的类型
    根据有没有参数,有没有返回值,一共四种类型
    无参数,无返回值
    无参数,有返回值
    有参数,无返回值
    有参数,有返回值
函数的说明文档
    添加的方式格式:
        def   函数名(  ):
            "文档说明"
            代码
    调用,通过写文档说明,可以生成工作中的文档
        print(help(函数名))
函数的嵌套及变量
    函数的嵌套即在函数中调用其他的函数
        例:嵌套的应用-打印一条线和打印多条线
    函数的局部变量
        定义:就是在函数内部定义的变量
            不同的函数,可以定义相同的名字的局部变量,各用个的不会产生影响
    函数的全局变量
        定义:如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
        注意:在单个函数内部的,变量前添加global后则此变量修改为全局变量
    总结:
        在函数外边定义的变量叫做全局变量,全局变量能够在所有的函数中进行访问
        如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
        如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇
        全局变量要定义在函数调用前,否则会报错
        在函数中不使用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。
        对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。
        对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量
递归函数
    如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
匿名函数
    用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
    语法:
        lambda函数的语法只包含一个语句,如下:lambda [arg1 [,arg2,.....argn]]:表达式
    应用场合:
         作为内置函数的参数-表达式
            def fun(a, b, opt):
                print("a =%d"%a)
                print("b =%d"%b)
                print("result=%d"%opt(a, b))
            fun(1, 2, lambda x,y:x+y)
        作为内置参数传递-排序
            stus = [
                {"name":"zhangsan", "age":18}, 
                {"name":"lisi", "age":19}, 
                {"name":"wangwu", "age":17}
            ]
            print("原来的列表=",stus)#根据name排序
            stus.sort(key=lambda x: x["name"])
            print("排序后的列表=",stus)
            stus.sort(key=lambda x: x["name"],reverse=True)
            print("排序后的列表=",stus)
            

13.文件操作相关

文件的作用
    把一些数据存放起来,可以让程序下一次执行的时候直接使用,加载到内存中,而不必重新制作一份,省时省力
文件的打开与关闭
    打开文件f.open()
        在Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件open(文件名,访问模式)
        例:f = open('test.txt', 'w')
            注意:访问模式分类
                w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
                r  以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。如果文件不存在会崩溃
                a  打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
                三个字母后边带b是以二进制格式进行操作;后边带+是增强版,带有读写功能
    关闭文件f.close()
文件数据的读写
    写入数据f.write
        使用write可以向文件写入数据
    读取数据:f.readline
        读取一行的数据
    读取整行数据:f.readlines
        就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
    读取数据f.read
        使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
文件数据的定位
    获取当前读写的位置  tell
        在读写文件的过程中,如果想知道当前的位置,可以使用tell来获取
    定位到某个位置 seek
        格式:seek(偏移量,偏移方向)
        偏移方向:
            0:表示文件开头
            1:表示文件当前位置
            2:表示文件末尾
使用OS模块对文件进行操作:使用前需要先声明该模块(import os)
    重命名:rename()    
        格式:os.rename(需要修改的文件名, 新的文件名)
    删除文件:remove ( ) 
        格式:   os.remove(待删除的文件名)
    创建文件夹:mkdir(不能递归创建文件夹)
        格式:os.mkdir("张三")
    创建多层目录  makedirs
        格式:os.makedirs("张三/李四/王二")
    获取当前目录
        格式:os.getcwd()
    进入到某个目录,或者是切换目录
        格式:os.chdir("./../")
    获取目录列表,包含文件和目录
        格式:print(os.listdir("./"))
    删除文件夹(要求文件夹必须为空)
        格式:os.rmdir("张三")
批量修改文件名
    例:
        import os
        folder=input("请输入要批量修改的目录名称")
        os.chdir(folder)    #进入该目录
        fielname = os.listdir   #得到目录下的所有文件名
        for filename in filenames    #遍历这个列表,并重命名
        print(filename)
        oldfilename=filename
        newfilename="[出品]-"+filename
        os.rename(oldfilename,newfilename)
换行符问题
    在Linux系统和mac系统上读写文本文件和二进制文件时都是一样的,所以使用r和w模式或者rb或wb模式都是一样的
    在Windows上的换行符是\r\n,在文本程序中,默认会自动加上\r,所以在使用文本文件时,使用r或w模式;在读二进制文件时,使用rb和wb模式
    不同系统的换行符

14.面向对象相关知识

面向过程和面向对象的区别:
    面向过程:根据业务逻辑从上到下写代码
        面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑
    面向对象编程(Object OrientedProgramming,OOP,面向对象程序设计)
        这种方法把软件系统中相近相似的操作逻辑和操作应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用
类和对象
    类的含义:
        具有相似内部状态和运动规律的实体的集合(或统称为抽象)。 具有相同属性和行为事物的统称
    对象的含义:
        某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。可以是直接使用的
    类的构成
        类的名称:类名
        类的属性:一组数据
        类的方法:允许对进行操作的方法 (行为)
    类的抽象
        拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
            方法:一般名词都是类(名词提炼法)
    定义类和对象
        定义类
            经典类:class 类名:
            | 方法列表
            新式类:class 类名(object):
            | 方法列表
        创建对象:当创建一个对象时,就是用一个模子,来制造一个实物
             格式:
                对象名=类名()
        调用对象:
            格式:
                对象.方法名()
理解self和init方法
    self方法
        从创建多个对象引入self:某个对象调用其方法时,Python解释器会把这个对象作为第一个参数传递给self.
    类的__init__()方法
        当创建实例对象成功后,由Python解释器来调用该方法,这个方法不用我们手动调用;
        使用方法:
            class 类名:     #初始化函数,用来完成一些默认的设定
                def  __init__(self):
                pass
        使用__init__()传递参数
魔法方法
    id(): 打印出函数或类在内存中的地址
    定义__str__()方法
        当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据.
类属性和实例属性
    在类的属性中,分为公有类属性和私有类属性
        公有类属性:所有对象都可访问
        私有类属性:只能在类内部访问,不能通过实例对象访问
    实例属性(对象属性):
    通过实例(对象)去修改类属性:
     __del__()方法
        创建对象后,Python解释器默认调用__init__()方法。当删除一个对象时,Python解释器也会默认调用一个方法,这个方法为__del__()方法。在Python中,对于开发者来说很少会直接销毁对象(如果需要,应该使用del关键字销毁)。Python的内存管理机制能够很好的胜任这份工作。也就是说,不管是手动调用del还是由Python自动回收都会触发__del__方法执行
面向对象四大特征
    抽象
        就是把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来的一般叫做类或者接口
        数据抽象(类的属性) -->表示世界中一类事物的特征,就是对象的属性.比如鸟有翅膀,羽毛等
        过程抽象(类的方法) -->表示世界中一类事物的行为,就是对象的行为.比如鸟会飞,会叫
    封装
        封装类:有些时候我们不希望把对象的属性公开,就可以把它设为私有,要设成私有,则在前面加双下划线
            定义:
                面向对象的程序设计中,某个类把所需要的数据(也可以说是类的属性)和对数据的操作(也可以说是类的行为)全部都封装在类中,分别称为类的成员变量和方法(或成员函数)。这种把成员变量和成员函数封装在一起的编程特性称为封装。
            公有成员变量和私有成员变量(以名字来区分)
                Python中,以两个下划线‘__’开头的变量都是私有成员变量,而其余的变量都属于公有成员变量。
                私有的成员变量只能在类的内部访问,而共有的公有的成员变量可以在类的外部进行访问。
            公有方法和私有方法
                公有的成员方法和私有的成员方法也是通过名字来区分的,双下划线‘__’开头的方法是私有成员方法
                类的私有方法只能通过对象名(在类内部也就是self)在类的内部进行访问;而公有方法可以在类的外部通过对象名进行访问
    继承:在程序中,继承描述的是事物之间的所属关系
        继承可以使子类拥有父类的属性和方法,并且可以重写这些方法,加强代码的复用性
        重写父类方法与调用父类方法
            Super().方法名,可以调用父类的方法(不用传参,作用是调用父类的方法,传的是子类实例的值)
            重写父类,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法
    多态:定义时的类型和运行时的类型不一样,此时就成为多态
        多态指的是一类事物有多种形态,指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式(一个抽象类有多个子类,因而多态的概念依赖于继承)
        当子类和父类都存在相同的print_self()方法时,我们说,子类的print_self()覆盖了父类的print_self(),在代码运行的时候,总是会调用子类的print_self()。这样,我们就获得了继承的另一个好处:多态
        新式类和经典类的区别
            新式类都从object继承,经典类不需要
            

15.模块

模块的介绍
    为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里;在Python中,一个.py文件就称之为一个模块(Module)
使用模块的好处:
    最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用;包括Python内置的模块和来自第三方的模块。
查看模块位置:
    模块名.__file__
模块的引用:模块名.函数名
模块的意义:
    模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块
引入方式
    from 模块名 import 函数名1,函数名2....
        例:from modname import name1[, name2[, ... nameN]]
    __all__:
        如果一个文件中有__all__变量,那么也就意味着这个变量中的元素,会被from xxx import *时导入
        

16.包的简介

包的定义
    包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包
__all__在包中的作用:
    在__init__.py文件中,定义一个__all__变量,它控制着 from 包名 import *时导入的模块
    可以在__init__.py文件中编写内容
    嵌套的包
打包模块:
    编辑setup.py文件,填写我们需要的信息以完成打包工作
    生成发布压缩包
        python setup.py sdist
    模块安装、使用
        解压tar -zxvf xxx.tar.gz
        2.进入文件夹
        3.执行安装命令sudo python setup.py install
    使用安装好的模块
        在程序中,使用from import 即可完成对安装的模块使用
            from 模块名 import 模块名或者*