1. 文件操作

        文件读

        f = open('a.txt', encoding='utf-8', mode='r')  #只读方式打开文件

        data = f.read()  #read函数读取所有文件内容,光标移动到末尾

        data2 = f.read()  #这次都不到内容,因为光标在文件末尾

        f.seek(0)   #seek函数使光标移动到文件开始位置 

        data3 = f.read()  #读到文件所有内容,因为光标移动到开始位置   

        f.close()   #close关闭文件

        f.closed  #判断文件是否关闭,关闭返回True,否则返回False

        f.encoding  #打印编码格式

        f.readable()  #判断文件是否已r模式打开,是则返回True,否则返回False

        f.readline()  #一次读取一行

        f.readlines()  #读取所有行,按照行存成列表

        

        文件写

        f = open('a.txt', 'w', encoding='utf-8')  #没有则创建,有则清空

        print(f.writable())   #writable我文件是否可写,可写返回True, 否则返回False

        f.write('11111111\n222')  #write写文件

        f.wirtelines(['\n5555\n', '6666666666\n', '777777\n'])  #写入多行文件

        文件修改

        read_f = open('b.txt', 'r')

        write_f = open('.b.txt.swap', 'w')

        for line in read_f.readlines():

            if line.startswith('1111'):

                line = '2222222\n'

            write_f.write(line)

        read_f.close()

        write_f.close()

        os.remove('b.txt')      #用到os模块,remove函数删除文件

        os.rename('.b.txt.swap', 'b.txt')  #rename重命名文件

        f = open('a.txt', 'r+')  #读写模式打开文件

        f = open('a.txt', 'w+')  #写读模式打开文件

        f = open('a.txt', 'a+')   #追加并且可读

        为了避免忘记用close关闭文件,可以使用以下方法来操作文件

        with open('a.txt','r', encoding='utf-8'):

            print(f.read())

        补充知识:for循环可以使用带else语句,for循环结束没被打断,会进入else,否则不执行else

        for i in range(1,11):

            if i == 1:

                break

            print(i)

        else:

            print("打印完毕")

        i = 0

        while i < 5:

            print(i)

            i += 1

            if i == 3:

                break

        else:

            print("打印完毕")

        with open('a.txt', 'r', encoding='utf-8') as f:      #从文件读到的内容是字符

            f.seek(3)    #数字3代表光标移动3个字节,默认是文件起始位置

            f.seek(2,1)  #1代表光标从当前位置移动2个字节

            seek()的三种模式:

            (1)f.seek(p,0)  移动当文件第p个字节处,绝对位置

            (2)f.seek(p,1)  移动到相对于当前位置之后的p个字节

            (3)f.seek(p,2)  移动到相对文章尾之后的p个字节

            print(f.tell())    #打印光标所在的位置

            print(f.read())

        python实现tail -f 功能

         with open('access.log', 'r') as f:

            f.seek(0,2)

            while True:

                line = f.readline()

                if line:

                    print("新增一行:" + line)

2. 函数

        函数实现代码冗余,可读性强,有效统一管理维护成本低.

        语法:

        def  函数名(参数1,参数2,...):

            """文档注释"""

            函数体

            return  value

        自定义函数,必须先定义后引用,否则相当于应用一个没有定义的变量

        无参函数

        def print_star():

            print('*' * 6)

        print_star()

        有参函数

        def  my_max(x,y):

            if x > y:

                return x

            else:

                return y

        print(my_max(1,2))

        三元表达式

        res = x if x > y else y

        空函数

        def insert()

            """功能"""

            pass

        函数分为形参和实参

        定义阶段

        def foo(x, y):

            print(x,y)

        调用阶段

        foo(1,2)

        函数的参数分为5种:位置参数,关键字参数,默认参数,可变长参数(*args, **kwargs),命名关键字参数

        位置参数:

        def foo(x,y,z):    #必须被传值的参数

            print(x,y,z)

        关键字参数:  key=value

        def foo(x,y,z):

            print(x,y,z)

        foo(z=3,y=2,x=1)

        关键字实参必须在位置实参后面,不能重复给一个形参传值

        默认参数

        def register(name, age, sex='male'):

            print(name, age, sex)

        register(alex, 18)

        register(alex, 19, 'female')

        register(alex, 20, sex='male')

        默认参数必须跟在非默认参数后面,默认参数只在定义时赋值一次,默认参数的值通常定义成不可变类型

        可变长参数

        def  foo(x, y , *args):   #会把溢出的按位置定义的实参都接收,以元组的形式赋值给args

            print(x, y)

            print(args)

        foo(1,2,3,4,5)

        def foo(x, y, **kwargs):  #会把溢出的按位置定义的实参都接收,以字典的形式赋值给kwargs

            print(x, y)

            print(kwargs)

        foo(1, 2, a=3, c=4, b=5)

        命名关键字参数

        def foo(name,age=10,*args,sex='male',height,**kwargs):

           print(name)             print(age)             print(args)             print(sex)             print(height)             print(kwargs)         foo('alex',1,2,3,4,5,sex='female',height='150',a=1,b=2,c=3)                  以下方式等价         foo(*[1,2,3,4])   <==> foo(1,2,3,4)         foo(**{a:1, b:2})  <==>foo(a=1,b=2)                  def wrapper(*args, **kwargs):                 print(args)                 print(kwargs)         wrapper(1,2,3,4, a=5, b=6)

        函数返回值有三种方式

        没有return关键字,返回None

        有关键字return  返回一个值

        有关键字return  返回多个值

        def foo():

           print('from foo:')             return 1, [2,3], (4,5), {
'a':1,'b':2}        v = foo()        print(v)