zoukankan      html  css  js  c++  java
  • Python-函数

    1. 函数也叫方法,比如你用手机打电话就是一个函数,你只管用就好,里面的功能别人已经帮你研发好了,你只需要输入手机号,按下拨打电话就好了,这个概念用在代码里尤为重要,比如重复某个功能,比如用户输入,你要判断用户输入,你要判断用户的输入不能为空,那么这个你可以定义一个函数,就是用来判断用户的输入是否为空,每次调用一下就可以,假如现在校验用户输入的需求变化了,那么你直接维护这个函数就好了,没必要再去所有的代码里找这个校验,一个个的去改,所有函数有以下两个显而易见的优点:
      1. 重复代码精简,简化复用性代码的编写,将重复性代码写成函数,要用的时候调用即可;
      2. 方便以后维护,你改一个函数,所有调用这个函数的地方的功能都能及时更新,避免修改代码遗漏
    2. 函数在前面的字符串方法已经接触过了,像strip()这些,就是python内置的一些函数,当然还有很多,这些函数python已经帮我们写好了,直接用就好了,这样是不是很方便,什么时候需要什么时候就调用。显而易见,函数要调用的时候才会执行,调用函数就是在函数名后加()就可以调用了,像strip()这些。
    3. 函数初识
      1. 定义函数的时候,写的入参叫形参;
      2. 调用函数的时候,传的值叫实参;
      3. 1 def sayName(name,age,sex):  #name,age,sex就是形式参数
        2     # name,age,sex函数的参数类型是位置参数、必填参数
        3     print('姓名:%s'%name)
        4     print('年龄:%s'%age)
        5     print('性别:%s'%sex)
        6     #上面这个就是函数体
        7 
        8 
        9 sayName('星星',18,'男')  #'星星',18,'男'这三个就是实际参数,调用的时候传进来的参数
        

          

    4. 函数ruturn
      1. 函数如果需要返回值,用return即可,有两点需要注意:
        • 函数里,只要遇到return就结束,不会再往下运行
        • 如果函数没有指定return返回值,那么函数默认返回的是None
        •  1 def call(a,b):
           2     return a+b
           3     return a*b
           4 def call2(a,b):
           5     print('函数内a,b运行结果:',a+b)
           6 
           7 print('call函数return结果:',call(1,2))
           8 print('call2函数return结果:',call2(1,2))
           9 
          10 #call函数return结果: 3    #因为函数里return了a+b的结果,所以这里的结果是3
          11 #函数内a,b运行结果: 3     #这个是call2函数体里运行的结果
          12 #call2函数return结果: None    #因为函数里没有return,所以这里的结果是None
          

            

    5. 函数即变量
      1. 之前接触过变量,在内存里开放一个地方存变量,函数也是一样的,也是变量,存在内存里的某个地方,调用直接就是函数名(),就调用了,看一个有趣的调用方法,先定义一个字典,value存函数名,根据key来调用相应的函数
        1.  1 def play():
           2     print('出去浪')
           3 def study():
           4     print('好好学习')
           5 def_method={'1':play,'2':study}
           6 while True:
           7     choice = input('请输入你的选择:1代表出去浪,2代表好好学习')
           8     if choice =='1' or choice =='2':
           9         def_method[choice]()
          10         print(type(def_method[choice]()))
          11         break
          12     else:
          13         print('请输入正确的选择')
          14         continue
          

            

        2. while True:是死循环,这里只是写一个循环,真实的工作场景中,需要填写正确的条件判断
            

    6. 入参类型
      1. 函数的入参有很多类型,上面已经了解过位置参数,还有默认参数,可变参数,关键字参数
      2. 注意参数有顺序,如果上述四种参数你都有用,那么参数类型顺序必须是:位置参数 -> 默认参数 -> 可变参数 -> 关键字参数,否则报错
        • 位置参数:这个参数就和格式化输出里的占位一样,形参先把位置站好,然后就等着用户调用的时候输入实参,排队填坑,如果实参和形参个数不一致,多了或者少了都会报错,如下:
          • 1 def add(a,b):
            2     print('%s+%s=%s'%(a,b,a+b))
            3     return a*b
            4 add(1,2)    #打印结果:1+2=3
            5 add(6,2)    #打印结果:6+2=8
            6 add(1,2,3)  #打印结果:报错,参数多了
            7 add(2)      #打印结果:报错,参数少了
            

              

        默认参数:
          这个参数就是程序会先给一个默认的,不传不会报错,会直接使用默认的这个参数值,如果传了就用你传的这个值;等于是定义函数的时候先定义了一个参数变量,调用的时候没传就用之前定义好的,如果传了就是覆盖之前的值,用传入的参数值:
          • 1 def multi(a,b=2):
            2     print('%s**%s=%s'%(a,b,a**b))
            3 
            4 multi(3)   #不传参的时候默认b=2,这里求的是平方
            5 multi(4,3) #传的时候b=3,这里求的是立方
            6 multi(2,b=4) #和上面的这个调用是一样的,但是一般这样写,如果默认参数较多时,不会因为位置而出错
            7 multi(b=4,2) #报错,位置参数必须在前(positional argument follows keyword argument)
            

              

        • 可变参数:这里一般用的少,可变就是参数是变化的,考虑到了程序的扩展性,定义函数的时候并不确定会有多少个参数,这里就用到了可变参数,既然可变,那么在调用函数的时候也是可以不输入的:
          •  1 # 可变参数
             2 def user(name,passwd,*args):   #一般是用args来命名的,当然也可以用其他你想要的名字
             3     print('用户名:%s,密码:%s'%(name,passwd))
             4     print('还有如下属性:
            ',args)   #这里的args,就是用户输入参数的一个元祖
             5 
             6 user('chenmeng',12334,'男','180cm','60kg')
             7 # 打印结果:
             8 # 用户名:chenmeng,密码:12334
             9 # 还有如下属性:
            10 # ('男', '180cm', '60kg')
            

              

              
        • 关键字参数,也不是必填的,他是一个key-value的字典形式:
          • 1 # 关键字参数:也不是必填的,他是一个key-value的字典形式
            2 def user(name,passwd,**args):
            3     print('用户名:%s,密码:%s'%(name,passwd))
            4     print('还有如下属性:
            ',args)
            5 user('xingxing',123456,sex='男',height='180cm')
            6 # 打印结果:
            7 # 用户名:xingxing,密码:123456
            8 # 还有如下属性:
            9 # {'sex': '男', 'height': '180cm'}
            

              

    7. 变量作用域
      1. 变量作用域有四种:全局作用域,局部作用域,内建作用域,闭包函数外的函数中,后两者用的少,全局作用域和局部作用域概念用的多。全局作用域就是变量在所有的范围都可以用,比如在代码开始定义一个变量,那么不论是在函数外部还是内部都可以用这个变量;局部作用域就是只能在某个区域内才能用,除了这个区域就用不了了,比如函数内定义的变量只能在函数体内用,出了函数就用不了 了。(建议不要使用全局变量,不安全,所有人都可以修改)
      2. 全局作用域
        • 1 # 全局作用域
          2 hys=['屏幕','主机'] #全局变量
          3 def add(thing):
          4     hys.append(thing)
          5 add('麦克')
          6 print(hys)  #打印结果为:['屏幕', '主机', '麦克'
      3. 局部作用域
        1 # 局部作用域
        2 def add(thing):
        3     desk=['显示器','鼠标']  #局部变量
        4     desk.append(thing)     #函体内修改局部变量      
        5 add(223)
        6 print(desk)                #函数体外调用局部变量报错
        

          

        • 值得一提的是,当全局变量是一个不可编辑的参数时,需要先申明才可以用全局变量(str/int/float等不可变变量函数在调用全局变量时,需要global才可以修改)

        •  1 # 不可变变量的全局变量引用,如int、float、str
           2 money = 500
           3 def chage():
           4     money=1000
           5     print('函数内的money:',money)   #打印结果是1000,因为函数内部作用域中money=1000,不能修改外面的money
           6 chage()
           7 print('函数外的money:',money)   #打印结果为500,因为函数不可修改外部作用域中不可变变量的全局变量引用,如int、float、str
           8 
           9 def chage():
          10     global money    #global后就可以引用了,这就声明了money是一个全局变量,函数内可以修改
          11     money =1000
          12     print('函数内的money:',money)   #打印结果是1000
          13 chage()
          14 print('函数外的money:',money)     #打印结果是1000,因为global声明了全局变量,所以可以修改
          

            

        1. 函数迭代,就是自己调用自己,一个死循环,一直调用下去,最多迭代999次,超过999次程序自动停止运行(while没有次数限制)
    8. 函数迭代
      1. 函数迭代,就是自己调用自己,一个死循环,一直调用下去,最多跌倒999次,超过999次程序自动停止运行(while没有次数限制)。既然这样,那么迭代肯定要有一些特性才可以正常调用:
        1. 必须有一个明确的结束条件
        2. 每次进入更深一层递归时,问题规模相比上次递归都因有所减少
        3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
        4. 1 # 函数迭代,就是自己调用自己,一个死循环,调用下去
          2 def dd():
          3     print('学习学习努力学习')
          4     dd()    #函数内,又调用了函数本身,那么就会一直调用下去
          5 dd()   #迭代函数最多会调用999次,这里会打印999次'学习学习努力学习'
          

            

        5. 用函数迭代写斐波拉契数列:[1, 1, 2, 3, 5, 8, 13, 21, 34],数列从第3项开始,每一项都等于前两项之和。
        6. 先用之前的知识来写
          1.  1 list=[]
             2 def fb(num):
             3     a=1
             4     b=1
             5     while num >0:
             6         list.append(a)
             7         a,b=b,a+b
             8         print(b)
             9         num-=1
            10 fb(9)
            11 print(list)
            

              

        7. 用迭代来写
          1.  1 list=[]
             2 a=1
             3 b=1
             4 def fb(num):
             5     global a,b
             6     list.append(a)
             7     a,b=b,a+b
             8     num-=1
             9     if num>0:
            10         fb(num)
            11 
            12 fb(9)
            13 print(list)
            

              

  • 相关阅读:
    Oracle 11g SQL Fundamentals Training Introduction02
    Chapter 05Reporting Aggregated data Using the Group Functions 01
    Chapter 01Restriicting Data Using The SQL SELECT Statemnt01
    Oracle 11g SQL Fundamentals Training Introduction01
    Chapter 04Using Conversion Functions and Conditional ExpressionsConditional Expressions
    Unix时代的开创者Ken Thompson (zz.is2120.bg57iv3)
    我心目中计算机软件科学最小必读书目 (zz.is2120)
    北京将评估分时分区单双号限行 推进错时上下班 (zz)
    佳能G系列领军相机G1X
    选购单反相机的新建议——心民谈宾得K5(转)
  • 原文地址:https://www.cnblogs.com/vc123/p/14024269.html
Copyright © 2011-2022 走看看