• (3)P_PY(草稿)


     目录:

    1、文件操作

    2、函数

    3、全局变量 局部变量   递归

    4、函数式编程

    5、高阶函数

    一、文件操作

    对文件操作流程

    1. 打开文件,得到文件句柄并赋值给一个变量
    2. 通过句柄对文件进行操作
    3. 关闭文件 

    现有文件如下:

     1 我爱北京 
     2 天门上太阳升
     3 Somehow, it seems the love I knew was always the most destructive kind
     4 不知为何,我经历的爱情总是最具毁灭性的的那种
     5 Yesterday when I was young
     6 昨日当我年少轻狂
     7 The taste of life was sweet
     8 生命的滋味是甜的
     9 As rain upon my tongue
    10 就如舌尖上的雨露
    11 I teased at life as if it were a foolish game
    12 我戏弄生命 视其为愚蠢的游戏
    13 
    14 when i was yong i am a beautiful
    15 --------------diao----------
    View Code

    现对对文件进行各种操作:

    #读文件:
    
    '''
    f = open("yesterday",'r',encoding="utf-8")    #相当于打开是一个内纯对象  给他赋值给一个变量,通过变量去操作内容
    data = f.read()
    print(data)            #读文件 光标已经到了最后
    '''
    
    
    
    #写文件
    #f.write("我爱北京")      # w 的形式是创建一个文件,如果以前有一个同名文件会被覆盖  要小心
    '''
    f = open("yesterday2",'w',encoding="utf-8")    #打开是一个内纯对象  给他赋值给一个变量,通过变量去操作内容
    #print(data)            #读文件 光标已经到了最后      r 读只能读   w 写只能写  a 追加
    f.write("我爱北京 
    ")   #
     换行
    f.write("天门上太阳升")
    '''
    
    
    
    #追加
    '''
    f = open("yesterday2",'a',encoding="utf-8")
    #a = append 追加
    f.write("
    when i was yong i am a beautiful
    ")
    #data = f.read()
    #print('------read',data)
    f.close()
    '''
    
     
    #只读前5行
    '''
    f = open("yesterday",'r',encoding="utf-8")
    #print(f.readline())
    for i in range(5):
        print(f.readline())
    '''
    
    
    
    #把文件编列一遍
    '''
    f = open("yesterday",'r',encoding="utf-8")
    #print(f.readlines())
    for line in f.readlines():
        print(line.strip())          #.strip()把空格和换行都去掉
    '''
    
    
    
    # 只打印10行   low loop
    '''
    f = open("yesterday",'r',encoding="utf-8")
    #print(f.readlines())                       #读出内容变成一个列表
    for index,line in enumerate(f.readlines()):
        if index == 9:
            print("-------分割-------")
            continue
        print(line.strip())          #.strip()把空格和换行都去掉
    '''
    # 高级循环
    '''
    f = open("yesterday",'r',encoding="utf-8")
    for line in f:
        print(line.strip())
    '''
    
    #高级循环
    '''
    count = 0
    f = open("yesterday",'r',encoding="utf-8")
    for line in f:
        if count == 9:
            print('--------分割-----')
            count += 1
            continue
        print(line.strip())
        count += 1
    '''
    
    
    
    '''
    f = open("yesterday",'r',encoding="utf-8")
    print(f.tell())            #打印出光标指针在哪儿
    print(f.read(5))     #只读5个字符
    print(f.readline())
    print(f.readline())
    print(f.readline())
    print(f.tell())            #打印出光标指针在哪儿
    f.seek(0)       #让光标回到某个位置   0 就是回到开头   配合tell使用
    print(f.readline())          #又会打印第一行
    print(f.encoding)   #打印文件编码
    print(f.fileno())   #返回一个文件编号    这个文件在内存里的一个编号
    print(f.name)     #返回文件名
    print(f.readable())   #判断文件是否可读
    print(f.flush())    #当缓存满了把数据刷到磁盘里
    '''
    
    
    
    #读写   有些地方是可用到的
    '''
    f = open("yesterday2",'r+',encoding="utf-8")    #文件句柄     r+    读写
    print(f.readline())
    print(f.readline())
    print(f.readline())
    f.write("--------------diao----------")
    print(f.readline())
    '''
    
    
    
    #写读     基本没用
    '''
    f = open("yesterday3",'w+',encoding="utf-8")    #文件句柄     w+    写读
    #先创建文件在写三行
    f.write("--------------diao----------
    ")
    f.write("--------------diao----------
    ")
    f.write("--------------diao----------
    ")
    print(f.tell())
    f.seek(10)          #虽然光标会回到10处,但后面再写的时候还是会在最后面追加,防止覆盖
    print(f.readline())
    f.write("shoud be at the begining of the second line")
    f.close()
    '''
    
    #追加读写
    #f = open("yesterday3",'a+',encoding="utf-8")    #文件句柄
    
    #二进制格式去读这个文件
    '''
    #f = open("yesterday3",'rb',encoding="utf-8")    #文件句柄
                                    #ValueError: binary mode doesn't take an encoding argument
    f = open("yesterday3",'rb')  #文件句柄  二进制文件
    print(f.readline())
    print(f.readline())
    print(f.readline())
    
    #在1、网络传输时只能用二进制格式   (在2.x里还可以字符)
    #在2、当文件是二进制时  用字符模式打开有可能损坏文件
    '''
    
    f = open("yesterday3",'wb')  #文件句柄  二进制文件   在3.x里一定要明确的区分二进制 和 字符串
    f.write("hello binary
    ".encode())
    f.close()             #打开文件一定要记得关闭,不然占用内存  或误操作
    
    # 文件修改
    '''
    f = open("yesterday2",'r',encoding='utf-8')
    f_new = open("yesterday2.bak","w",encoding="utf-8")
    
    for line in f:        #从f 文件里循环的读,然后吧每一行又写到另一个文件里,
                               #如果有“雨露”那就替换
        if "雨露" in line:
            line = line.replace("雨露","gaofan")
        f_new.write(line)
    f.close()
    f_new.close()
    '''
    
    
    
    # 通过传参数修改
    '''
    import  sys
    find_str = sys.argv[1]
    replace_str = sys.argv[2]
    f = open("yesterday2",'r',encoding='utf-8')
    f_new = open("yesterday2.bak","w",encoding="utf-8")
    
    for line in f:        #从f 文件里循环的读,然后吧每一行又写到另一个文件里,
                               #如果有“雨露”那就替换
        if find_str in line:
            line = line.replace(find_str,replace_str)
        f_new.write(line)
    f.close()
    f_new.close()
    '''
    
    #with 语句    避免打开文件忘记关闭   如果不关闭造成不必要的空间浪费,
    '''
    with open("yesterday2","r",encoding="utf-8") as f:
        for line in f:
            print(line)
    '''
    
    #同时打开多个文件
    with open("yesterday2","r",encoding="utf-8") as f,
        open("yesterday2","r",encoding="utf-8") as f2:
        for line in f:
            print(line)
    

     二、函数

      三种编程方式:
    1、面向对象:--》class定义
    2、面向过程:过程--》def 定义
    3、函数式编程:函数--》def 定义

    # Author:land
    #定义一个函数
    def func1():
        """testing"""
        print("in the func1")
        return 0
    
    #定义一个过程
    def func2():
        """testinf2"""
        print("in the func2")
    
    #区别 两者都是可以调用的  过程只是没有返回值的函数
    
    #调用函数
    x = func1()
    y = func2()
    
    print("from func1 return is %s" %x)
    print("from func1 return is %s" %y)
    
    #函数的调用
    import time
    def logger_test():
        time_format = '%Y-%m-%d %X'
        time_current = time.strftime(time_format)
        with open('a.txt','a+') as f:
            f.write("time %s end action
    " %time_current)
    
    def test1():
        print("in the test1")
    
    logger_test()                  #前面只需定义一次logger_test()的代码
    def test2():
        print("in the test2")
    
    logger_test()
    def test3():
        print("in the test3")
    logger_test()
    
    test1()
    test2()
    test3()
    

     函数:是定义一段代码的执行过程

    1、为何要用函数?
    #1、代码的组织结构不清晰,可读性差
    #2、遇到重复的功能只能重复编写实现代码,代码冗余
    #3、功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大

      2、函数分类

    #1、内置函数
    为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数即内置函数。对于内置函数,我们可以拿来就用而无需事先定义,如len(),sum(),max()
    ps:我们将会在最后详细介绍常用的内置函数。
    
    #2、自定义函数
    很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,以后,在遇到应用场景时,调用自定义的函数即可

    3、如何自定义函数?

    #语法
    def 函数名(参数1,参数2,参数3,...):
        '''注释'''
        函数体
        return 返回的值
    
    #函数名要能反映其意义
    

      函数返回值:

    无return->None
    
     return 1个值->返回1个值
    
    return 逗号分隔多个值->元组
    
    什么时候该有返回值?
        调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
        通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
    什么时候不需要有返回值?
        调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
        通常无参函数不需要有返回值
    

     函数的调用形式:

    1 语句形式:foo()
    2 表达式形式:3*len('hello')
    3 当中另外一个函数的参数:range(len('hello'))
    

     函数的参数:

    1、形式参数与实际参数

    #形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定
    
    '''
    def test(x,y):       # 形式参数
        print(x)
        print(y)
    
    test(1,2)          #1,2,是实际参数,这是在内存实际存在的
    # 实参 跟 形参一一对应的  个数不能超,
    test(y=1,x=2)   #与形参位置无关
    test(1,y=22)    #位置 和 关键 参数都有时以位置参数为准
                     #还有关键参数不能再位置参数前面
    '''
    

     2、默认参数

    '''
    def test(x,y=2):    #默认参数
        print(x)
        print(y)
    
    test(1,3)
    #默认参数特点:调用函数的时候,默认参数可有可无,
    #用途:1,默认安装值  2、
    '''
    

     3、参数组

    可变长参数:

        可变长指的是实参值的个数不固定
        而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
    #参数组
    #*args 接受位置参数
    '''
    def test(*args):
        print(args)
    
    test(1,2,3,)
    test(*[1,2,3,4,5,])   # args=tuple([1,2,3,4,5])
    '''
    
    # def test(x,*args):
    #     print(x)
    #     print(args)
    #
    # test(1,2,3,4,5,6,7,)
    

     

    #**kwargs  把n个关键字参数转换成字典的方式
    # 接受关键字参数
    #
    # def test(**kwargs):
    #     print(kwargs)
    #
    # test(name='laiang',age=3,sex='F')
    
    def test(name,**kwargs):
        print(name)
        print(kwargs)
    
    test('laiang',age=3,sex='F')
    

     test:

    1写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批量修改操作

    # -*- coding:utf-8 -*-        #在python2.x上执行时声明utf-8
    # Author:land
    
    import os
    def modify_file(filename,old,new):
        with open(filename,'r') as read_f,
            open('.bak_file','w') as write_f:
            for line in read_f:
                if old in line:
                    line = line.replace(old,new)
                write_f.write(line)
        os.remove(filename)
        os.rename('.bak_file',filename)
    
    modify_file('/root/python_test/a.txt','雨露','露水')
    

     下面是在python3上执行:

    # Author:land
    def modify_file(filename,old,new):
        import os
        with open(filename,'r',encoding='utf-8') as read_f,
            open('.bak_file','w',encoding='utf-8') as write_f:
            for line in read_f:
                if old in line:
                    line = line.replace(old,new)
                write_f.write(line)
        os.remove(filename)
        os.rename('.bak_file',filename)
    
    modify_file('a.txt','雨露','露水')
    

     2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数

    def check_str(msg):
        res = {                            #定义一个字典
            'num':0,
            'string':0,
            'space':0,
            'other':0,
        }
        for i in msg:                     #把传入的字符串进行遍历,然后判断 写入字典
            if i.isdigit():
                res['num'] += 1
            elif i.isalpha():
                res['string'] += 1
            elif i.isspace():
                res['space'] += 1
            else:
                res['other'] += 1
        return res
    res = check_str('hello,my name is tiger 666')
    print(res)
    

    3、 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者

    def func1(seq):
        if len(seq) > 4:
            seq = seq[0:4]
        return seq
    print(func1([1,2,3,4,5,6,7,]))
    

     

     4、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

    def func2(seq):
        return seq[::2]
    print(func2([4,43,2,54,3,1,66,]))
    

     

    5、写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

    def check_dic(dic):
        d = {}
        for k,v in dic:
            if len(v) > 2:
                d[k] = v[0:2]
            return d
    print(check_dic({'k1':'ab','k2':'12','k3':'ert'}))
    

    三、全局变量 局部变量   递归

    在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数

    #递归
    def cale(n):
        print(n)
        if int(n/2) > 0:
            return cale(int(n/2))
        print("--->>",n)
    
    cale(10)
    

    递归特性:

    1. 必须有一个明确的结束条件

    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    总结:1、明确的结束条件

              2、问题规模逐渐减少

              3、效率不高

    递归应用二分查找:

     1 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
     2 
     3 def binary_search(dataset, find_num):
     4     print(dataset)
     5 
     6     if len(dataset) > 1:
     7         mid = int(len(dataset) / 2)
     8         if dataset[mid] == find_num:  # find it
     9             print("找到数字", dataset[mid])
    10         elif dataset[mid] > find_num:  # 找的数在mid左面
    11             print("33[31;1m找的数在mid[%s]左面33[0m" % dataset[mid])
    12             return binary_search(dataset[0:mid], find_num)
    13         else:  # 找的数在mid右面
    14             print("33[32;1m找的数在mid[%s]右面33[0m" % dataset[mid])
    15             return binary_search(dataset[mid + 1:], find_num)
    16     else:
    17         if dataset[0] == find_num:  # find it
    18             print("找到数字啦", dataset[0])
    19         else:
    20             print("没的分了,要找的数字[%s]不在列表里" % find_num)
    21 binary_search(data, 66)
    View Code

    四、函数式编程

    Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言

    一、定义

    简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。

    主要思想是把运算过程尽量写成一系列嵌套的函数调用

    (1 + 2) * 3 - 4

    传统的过程式编程,可能这样写:

      var a = 1 + 2;

      var b = a * 3;

      var c = b - 4;

    函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:

      var result = subtract(multiply(add(1,2), 3), 4);

    五.高阶函数

    变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    def add(a,b,f):
        return f(a) + f(b)
    
    res = add(10,100,abs)
    print(res)
    
  • 相关阅读:
    content-type
    文件上传
    注册案例
    20 行代码极速为 App 加上聊天功能
    一步一步带你安装史上最难安装的 vim 插件 —— YouCompleteMe
    iOS 调试心得
    Playground 你不知道的小技巧, CoreData 的使用
    令人眼前一亮的下拉式终端 Tilda & Guake
    代码可读性提升指南
    iOS 推送问题全解答《十万个为啥吖?》
  • 原文地址:https://www.cnblogs.com/lxqr/p/8567322.html
Copyright © 2020-2023  润新知