zoukankan      html  css  js  c++  java
  • 函数

      一、函数 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) 控制函数调用的时候必须以关键字传参的时候就用命名关键字传参

  • 相关阅读:
    【CLR via C#】CSC将源代码编译成托管模块
    [转载]敏捷开发之Scrum扫盲篇
    UML图中经常用到几种的关系图例
    敏捷的12项原则,我们团队管理的方针
    JavaScript 记录页面停留时间-通过测试
    [转]Web App 框架选择之百度&腾讯
    c#,asp.net 开发 app 学习资料整理
    未能为数据库 '*'中得对象'*'分配空间,因文件组'PRIMARY'已满
    微支付开发过程中的注意点
    微支付的asp.net文档例子
  • 原文地址:https://www.cnblogs.com/jwl1/p/10560950.html
Copyright © 2011-2022 走看看