zoukankan      html  css  js  c++  java
  • Python学习【第7篇】:Python之函数(参数的介绍)

      一、函数
    1.为什么要使用函数?
    减少代码的冗余
    2.函数先定义后使用(相当于变量一样先定义后使用)
    3.函数的分类:
    内置函数:python解释器自带的,直接拿来用就行了
    自定义函数:根据自己的需求自己定义的函数
      def func(): #函数名打印出来的是内存地址
        '''注释'''
        函数体
    4.函数定义都干了些什么事?
    只检测语法,不执行代码
    5.函数就是一段功能,尽量把函数名定义的有意义
    6.定义函数的三种方式:
      有参数的函数:就是接受外部传进来的值,进行一系列的运算,最后吧结果返回出来
      无参数的函数:通常只是做一下操作而已
      空函数:什么事情都不做就是一个空函数(即便是一个空函数,他也会有如下属性)
    7.函数的返回值:可返回任意类型的值
      什么时候需要有返回值:具体情况具体分析
      什么时候没有返回值:具体情况具体分析
    8.yield和return的区别
      yield 停在那呢,挂起了
      yield 能返回多次值;return 返回一次值
      yield 保存函数状态
    9.函数的调用:函数名加()
    10.函数参数
      形参:定义函数时括号内写的参数
      形参在定义阶段是不占内存空间的,在调用的时候才占用内存空间
      实参:在调用函数时括号内传进来的值
    函数参数的具体用法
      1.位置参数:
        1.按照位置传参
          按位置定义的形参必须要传值
          按位置定义的实参按照位置与形参一一对应的传
        2.按照关键字传数:按照key=value的形式定义的实参,传的时候与位置没有关系
          def foo(x,y):
            pass
          foo(1,2) #与形参一一对应
          foo(y=2,x=1) #关键字参数,指名道姓的传
          foo(1,y=2) #混用位置实参和关键字实参
               #混着用时:注意:1.不能给同一个形参重复赋值
                         2.位置实参必须在关键字实参的前面
      2.默认参数:在定义阶段就已经为形参赋值了,意味着在调用阶段就可以不为默认参数传值
            如果给默认参数传值了,就把一开始设置的给替换了。
        默认参数定义的场景:大多数都是男性,女性很少时就可以设置个默认,当然还有其他场景
        注意:1.默认参数必须在位置形参后面
           2.默认参数的值只在函数定义阶段生效一次,定义之后的修改不会影响它的值
           3.默认参数不要弄成可变类型的,就像是列表,就是一个坑
      3.动态参数
        可变长度的参数(长度指的是参数的个数):参数*,**
        1.*会把多出来的值传给z,并且以元组的形式返回   
        2.**会把多出来的值传给z,并且以字典的形式返回
        3.在实参中只要碰到*(),就是打散了
         只要是可迭代的就可以用*
           *就相当于for循环的操作,遇到*先打散
           *args,**kwargs(可传任意值)
    可变长度的参数:从实参的角度推算出形参对应的形式*和**
    针对按照位置定义的实参多出来的那部分,会被形参中的*处理,并且保存成元组的形式复制给args
    针对按照关键字定义的实参多出来的那部分,会被形参中的**处理,并且保存成字典的形式复制给kwargs

    复制代码
     1 # 1.举例一、
     2 def foo(x,y,*args):
     3     print(x,y)
     4     print(args)#args相当于(3, 4, 5, 6, 7, 8, 9),那么*args相当于*(3, 4, 5, 6, 7, 8, 9)
     5     print(args[0])
     6     print(*args) # 加个*就是把上面的元组给打散了,就还是和原来传实参的时候的形式一样了
     7 
     8 foo(1,2,3,4,5,6,7,8,9)
     9 foo(1,2,3,*(4,5,6,7,8,9)) #也可以这样传 就相当于foo(1,2,3,4,5,6,7,8,9)
    10 
    11 # 2.举例二、
    12 def bar(x,y,z):
    13     print(x,y,z)
    14 bar(1,2,3)
    15 bar(*['b','a','c']) #bar('b','a','c')
    16 bar(*'hel') #bar('h','e','l')
    17 bar(*{'a':1,'b':2,'c':3}) #bar('b','a','c')
    18 # 强调:如果实参中出现了*和**,第一时间打散了去看
    19 
    20 # 3.举例三、
    21 def foo(x,y,**kwargs):
    22     print(x,y)
    23     print(kwargs) #{'c': 3, 'd': 4, 'f': 6} 吧多余的元素以字典的形式返回了
    24     print(*kwargs) #输出c d f ,就是把字典打散了
    25 #
    26 # foo(1,y=2,c=3,d=4,f=6)
    27 
    28 # 4.举例四、
    29 def index(x,y,z=1):
    30     print(x,y,z)
    31 def wrapper(*args,**kwargs):
    32     index(args,kwargs)
    33     index(*args, **kwargs) #就是打散了
    34 wrapper(1,2,3)
    35 wrapper(1,2)
    36 wrapper(x=1,y=2)
    37 wrapper(1,y=2)
    38 '''可变长度的参数:从实参的角度推算出形参对应的形式 * 和 **
    39 针对按照位置定义的实参冗余的部分,会被形参中的 * 保存成元组的形式赋值给args
    40 针对按照关键定义的实参冗余的部分,会被形参中的 ** 保存成字典的形式赋值给kwargs
    41 强调:
    42 如果实参中出现了 * 和 **,第一时间打散了去看。
    43 '''
    复制代码

    强调:
    如果实参中出现了*和**,第一时间打散了去看

    11.命名关键字参数(了解):在定义阶段,在*之后定义的形参称为命名关键字参数
    特点是:在调用阶段,该参数必须以关键字的形式被传值
    def foo(x,y,*,a,b):
    print(x)
    print(y)
    print(a)
    print(b)
    foo(1,2,b=20,a=10)
    控制函数调用的时候必须以关键字传参的时候就用命名关键字传参

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/kcwxx/p/10144666.html
Copyright © 2011-2022 走看看