zoukankan      html  css  js  c++  java
  • 函数

    一:函数介绍

      1、不用函数会怎么样?什么是函数?

         1、组织结构不清晰,可读性差

         2、代码冗余

         3、管理维护难度极大

         4、函数就是事先准备工具的过程 

    二:函数定义

      1、语法

        def 函数名(参数一,参数二,.......):

        ‘’‘

        文档描述

     

        ’‘’       

        代码一

        代码二

        代码三

        return 值

    def:定义函数的关键字

    函数名:是用来调用函数的,函数名必须能反映函数的功能

    文档描述:推荐写上,来增强代码的可读性

    代码块:函数的功能实现代码

    return:函数的返回值

    def print_sym(sym,count): #print_sym=<function print_msg at 0x000001B2A33698C8>
          print(sym*count)

    函数在定义阶段值检测语法,不执行函数代码

         2、定义函数的三种类型

           1、有参函数:参数是函数体代码用来接收外部传入值的

    def sum(x,y):
         z=x+y
         print(z)
    
    
    sum(1,2)  

          2、无参函数:当函数的代码逻辑不需要函数的调用者掺入值的情况下,就无参

    def  interactive():
         name=input('请输入你的用户名')
         password=input('请输入你的密码')
           print(name,password)
    interactive()  

          3.空函数:函数体为pass

    def auth():
        """
        文档描述
        """  
        pass

    三:函数调用

        1、函数的使用必须遵循:先定义,后调用的原则  

        2、调用阶段:根据函数名找到函数的没存地址,然后执行函数体代码

          3、函数名加括号就是调用

        4、调用函数的三种形式

    1、直接调用
    def  func():
       print('钱大佬')
    
    
    2、返回值调用
    def sum(x,y):   
        z=x+y
        return z
    res=sum(z)
    print(res)
    
    
    3、运算调用
    def sum(x,y):   
        z=x+y
        return z
    res=sum(z)+50
    print(res)
    

    四:函数的返回值

        1、函数值:

                   return

      2、定义:

                     函数体运行结束后需要有一个返回结果给调用者

      3、返回值的三种方式

    1.没有return,返回值None
    def fun():
       pass
    res=func()
    print(res)
    
    2.return后跟一个值,返回值本身
    def func1
        return 1
    res=func1()
    print(res)
    
    3.return可以以逗号分隔,返回多个值,会返回一个元组给调用着
    def func2():
        return1,2,3,4,[1,2,3]
    res=func2()
    print(res)
    

       4、return返回值的值是没有类型限制的

          return是函数结束的标志,函数可以写多个return,但只执行一个return,

        函数就会结束,并把return后的值作为本次调用

    函数练习

    1、写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作
    def alter(x,y):
        import  os
        with open('x.txt.txt','r',encoding='utf-8') as read_f,
            open('x.txt.txt.swap','w',encoding='utf-8')as write_f:
            for i in read_f:
                if x in i:
                    i=i.replace(x,y)
                write_f.write(i)
        os.remove('x.txt.txt')
        os.rename('x.txt.txt.swap','x.txt.txt')
      
    print('修改成功')
    alter('sxx','王5') 
    2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
    def number(x):
        res = {
            'num': 0,
            'string': 0,
            'space': 0,
            'other': 0,
        }
        for i in x:
            if i.isalpha():
                res['string']+=1
            elif i.isdigit():
                res['num']+=1
            elif i.isspace():
                res['space']+=1
            else:
                res['other']+=1
        return res
    n=number('123sadasd......    家十九大')
    print(n)
    3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
    def length(x):
         if len(x)>5:
            print('长度大于5')
         else:
            print('长度小于5')
    length('dasdada')
    4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,
      并将新内容返回给调用者。
    def length(x):
        if len(x)>2:
            x=x[0:2]
            return  x
    c=[1,2,3,4,5,6]
    c=length(c)
    print(c)
     5、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其
      作为新列表返回给调用者。
    def odd(x):
        c=[]
        for i in range(len(x)):
            if i%2==1:
              c.append(x[i])
        return c
    n=(1,2,3,4,5,7,8,9,0)
    n=odd(n)
    print(n)
    6、写函数,检查字典的每一个value的长度, 如果大于2,那么仅保留前两个长度的内
      容,并将新内容返回给调用者。
    dic = {"k1": "v1v1", "k2": [11, 22, 33, 44]}
    def length(x):
        for i in x:
            if len(x[i])>2:
                x[i]=x[i][0:2]
        return x
    dic=length(dic)
    print(dic)
    7、编写认证功能函数,注意:后台存储的用户名密码来自于文件
    def attestation(c):
       l={}
       inp_name=input("请输入用户名")
       inp_password=input("请输入密码")
       with open(r'%s'%c,'r',encoding='utf-8') as f:
            for i in f:
                data=i.split(',')
                print(data)
                l.setdefault(data[0])
                l[data[0]]=data[1].strip('
    ')
            if inp_name in l and inp_password ==l[inp_name]:
                print('用户名密码正确')
            else:
                print('用户名密码错误')
    attestation('w.txt')
    8、编写注册功能函数,将用户的信息储存到文件中
    def login(x):
        inp_name=input("请输入用户名").strip()
        inp_paw=input("请输入密码").strip()
        inp_sex=input("请输入性别").strip()
        inp_age=input("请输入年龄").strip()
        with open('%s'%x,'w',encoding='utf-8') as f:
            f.write('%s,%s,%s,%s,0'%(inp_name,inp_paw,inp_sex,inp_age))
        print('注册成功,跳转登录')
    login('w.txt')
    9、编写查看用户信息的函数,用户的信息是事先存放于文件中的
    def check(c):
        l={}
        inp_name=input("请输入用户名")
        inp_password=input("请输入密码")
        with open(r'%s'%c,'r',encoding='utf-8') as f:
            for i in f:
                data=i.split(',')
                l.setdefault(data[0])
                l[data[0]]=data[1].strip('
    ')
            if inp_name in l and inp_password ==l[inp_name]:
                print(l)
            else:
                print('用户名密码错误,无法查看')
    check('w.txt')

     五、参数

        1、函数参数有两种分类方式:

          1)形参、实参

             形参:在定义时,括号内定义的参数,形参就是变量名              

             实参:在调用时,括号内传入的值,实参就是变量名

              

           2)位置参数、关键字参数、默认参数、可变长参数               

        2、位置参数

          1、定义:位置即顺序,位置参数值的就是按照从左到右的顺序依次定义的参数

          2、位置参数:位置形参、位置实参

            1)位置形参

               定义函数时,按照位置定义的形参,称为位置形参

            def foo(x,y,z):   #按照顺序
                print(x,y,z)
        #注意点:在掉用函数时,必须为其传值,而且多一个不行,少一个不行

            2)位置实参

               按照位置定义的实参,称为位置实参

            foo(1,2,3)#按照顺序传值
        #注意点:位置实参会与形参一一对应

        3、关键字参数

            1、定义:在调用函数时,按照key=value的形式定义的实参,

                称为关键字参数

            2、关键字参数:

                相当于指名道姓地为形参传值,以为着不按照顺序定义,

                仍然能为指定的参数传值

            def  foo(x,y,z):
               print('你好')
            foo(1,2,z=12)   #位置实参可以和关键字参数合用
            foo(1,z=12,2)  #错误用法,关键字参数必须在为参数后面
            foo(1,x=1,y=2,z=12)#错误用法,不能为同意个形参传值

        4、默认参数

          定义:在定义阶段已经为摸个形参赋值,这种形参就叫默认参数

          

          def register(name,age,sex='male'):
              print(name,age,sex)
    
          def func(y=1,x): #错误,默认函数必须在位置形参后面
              pass
    注意:默认参数只在定义阶段赋值一次,也就是说默认参数的值在定义阶段就固定死了
          m=10#次位传
          def foo(x,y=m):
          print(x,y)
          m='1213'#传不进去,因为已经到了调用阶段
          foo(1)
          foo(1,11)#最先传  

        5、可变长参数

          1、定义:实参不固定,如何将多于的实参传进去

          2、可变长位置参数:

              1)可变长位置参数*args:

                *将溢出的位置实参全部接收,然后保存为元组

                的形式赋值给args

              def foo(x,y,z,*args): #args=(4,5,6,7,8)
                  print(x,y,z)
                  print(args)
              foo(1,2,3,4,5,6,7,8,)

              2)可变长关键字参数**kwargs:

               *将溢出的关键字实参全部接收,然后保存为字典

               的形式赋值给args

              def foo(x,y,z,**kwargs): #kwargs={'a':1,'b':2,'c':3}
                  print(x,y,z)
                  print(args)
              foo(1,2,3,a=1,b=2,c=3)

          3、实参中包含*、**

              def s(x,y,z):
                  print(x,y,z)
            s(1,*'ds')
    
            #将加星的参打散成一个个元素传入形参
    
            def s(x,y,z):
                print(x,y,z)
    
            s(1,**{'y':1,'z':2})    
     

    六、函数嵌套

       1、定义

          在函数中有定义期他函数

        def func1():
            print('1')
            def func2(): #func2=内存地址
                print('2')

       2、嵌套调用

          函数的嵌套调用:在函数内又调用了其他函数

        def f1():
            print('f1')
            def f2():
                print('f2')
                def f3():
                    print('f3')
                f3()
            f2()
        f1()

    七、名称空间与作用域

       1、名称空间

          1)内置名称空间:存那python解释器自带的名字,在解释器启动时

            就生效,解释器关闭就失效

          2)全局名称空间:文件级别的名字,在执行文件的时候生效,在文

             件结束时失效

          3)局部名称空间:存放在函数内定义的名字(函数的参数以及函数内

             的名字都存放于局部名称空间),函数调用时临时生效,函数结束

            是失效

          5)名称存储空间优先级:内置名称空间>全局名称空间>局部名称空间

          4)名称查找优先级:局部名称空间>全局名称空间>内置名称空间

            len='global'
            def f1():
              # len=1
                def f2():
                    # len=2
                    print(len)
                f2()
    
            f1()

            

       2、作用域

          1)全局作用域:包含内置名称空间和全局空间的名字,在任何

            位置都能访问到

          2)局部作用域:包含的是局部空间的名字,只能在函数内访问

    八、函数对象

       1、定义:

            函数在python中是第一类对象      

      

        2.、作用:

            1)可以被引用

            def bar():
                print('from bar')
    
            f=bar
            f()

            2)可以当做参数传入

              def bar():
                  print('from bar')
              def wrapper(func): #func=bar
                  func() #bar()
              wrapper(bar)

            3)可以当做函数的返回值  

              def bar():
                  print('from bar')
              def foo(func):
                  print('from foo')
              f=foo(bar) 
              f()

            4)可以当做容器类型的元素

              def get():
                  print('from get')
              def put():
                  print('from put')
              l=[get,put]
              l[0]()

    九、闭包函数

           定义:

            在函数内部的函数并且该函数包含对外部函数作用域中名字的引

            用,该函数就称为闭包函数

            def outter():
                name='egon'
              def inner():
                  print('my name is %s' %name)
    
              return inner
            f=outter()

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【小宋】!

  • 相关阅读:
    手起刀落-一起来写经典的贪吃蛇游戏
    同步、异步、回调执行顺序之经典闭包setTimeout分析
    起步
    设计模式之单例模式与场景实践
    青春是如此美好,又怎忍平凡度过
    nvm管理不同版本的node和npm
    起步
    基础
    调用wx.request接口时需要注意的几个问题
    微信小程序实现各种特效实例
  • 原文地址:https://www.cnblogs.com/songxuexiang/p/8652145.html
Copyright © 2011-2022 走看看