zoukankan      html  css  js  c++  java
  • 一 函数定义

    一 函数基础
      一、 为何要用函数之不用函数的问题
      二、 函数分类
    二 函数定义
      一、 如何自定义函数?
      二、 函数使用的原则:先定义,再调用
      三、 函数在定义阶段都干了哪些事?
      四、 定义函数的三种形式
    三 函数调用
      一、 调用函数
      二、 函数返回值
      三、 函数调用的三种形式
    四 函数参数
      一、 形参与实参
      二、 具体应用

    一 函数基础 

    一、 为何要用函数之不用函数的问题

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

    二、 函数分类

      1、内置函数
    为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数即内置函数。对于内置函数,我们可以拿来就用而无需事先定义,如len(),sum(),max()
    ps:我们将会在最后详细介绍常用的内置函数。

      2、自定义函数
    很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,以后,在遇到应用场景时,调用自定义的函数即可。

    二 函数定义

    一 、如何自定义函数?

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

    二、 函数使用的原则:先定义,再调用

     1 函数即“变量”,“变量”必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名
     2 #测试一
     3 def foo():
     4 print('from foo')
     5 bar()
     6 foo() #报错
     7 
     8 #测试二
     9 def bar():
    10 print('from bar')
    11 def foo():
    12 print('from foo')
    13 bar()
    14 foo() #正常
    15 
    16 #测试三
    17 def foo():
    18 print('from foo')
    19 bar()
    20 
    21 def bar():
    22 print('from bar')
    23 foo() #会报错吗?
    24 
    25 
    26 #结论:函数的使用,必须遵循原则:先定义,后调用
    27 #我们在使用函数时,一定要明确地区分定义阶段和调用阶段
    28 
    29 #定义阶段
    30 def foo():
    31 print('from foo')
    32 bar()
    33 def bar():
    34 print('from bar')
    35 #调用阶段
    36 foo()

    三、 函数在定义阶段都干了哪些事?

    # 只检测语法,不执行代码 
    # 也就说,语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道

    四、 定义函数的三种形式

    #1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
    #2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
    #3、空函数:设计代码结构

    三 函数调用

    一、 调用函数

    # 函数的调用:函数名加括号
    # 1 先找到名字
    # 2 根据名字调用代码

    二、 函数返回值

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

    三、 函数调用的三种形式

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

    四 函数参数

    一 、形参与实参

    # 形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定

     二、 具体应用

     1 #1、位置参数:按照从左到右的顺序定义的参数
     2 位置形参:必选参数
     3 位置实参:按照位置给形参传值
     4 
     5 #2、关键字参数:按照key=value的形式定义的实参
     6 无需按照位置为形参传值
     7 注意的问题:
     8 1. 关键字实参必须在位置实参右面
     9 2. 对同一个形参不能重复传值
    10 
    11 #3、默认参数:形参在定义时就已经为其赋值
    12 可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
    13 注意的问题:
    14 1. 只在定义时赋值一次
    15 2. 默认参数的定义应该在位置形参右面
    16 3. 默认参数通常应该定义成不可变类型
    17 
    18 
    19 #4、可变长参数:
    20 可变长指的是实参值的个数不固定
    21 而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
    22 
    23 ===========*args===========
    24 def foo(x,y,*args):
    25 print(x,y)
    26 print(args)
    27 foo(1,2,3,4,5)
    28 
    29 def foo(x,y,*args):
    30 print(x,y)
    31 print(args)
    32 foo(1,2,*[3,4,5])
    33 
    34 
    35 def foo(x,y,z):
    36 print(x,y,z)
    37 foo(*[1,2,3])
    38 
    39 ===========**kwargs===========
    40 def foo(x,y,**kwargs):
    41 print(x,y)
    42 print(kwargs)
    43 foo(1,y=2,a=1,b=2,c=3)
    44 
    45 def foo(x,y,**kwargs):
    46 print(x,y)
    47 print(kwargs)
    48 foo(1,y=2,**{'a':1,'b':2,'c':3})
    49 
    50 
    51 def foo(x,y,z):
    52 print(x,y,z)
    53 foo(**{'z':1,'x':2,'y':3})
    54 
    55 ===========*args+**kwargs===========
    56 
    57 def foo(x,y):
    58 print(x,y)
    59 
    60 def wrapper(*args,**kwargs):
    61 print('====>')
    62 foo(*args,**kwargs)
    63 
    64 #5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
    65 可以保证,传入的参数中一定包含某些关键字
    66 def foo(x,y,*args,a=1,b,**kwargs):
    67 print(x,y)
    68 print(args)
    69 print(a)
    70 print(b)
    71 print(kwargs)
    72 
    73 foo(1,2,3,4,5,b=3,c=4,d=5)
    74 结果:
    75 2
    76 (3, 4, 5)
    77 3
    78 {'c': 4, 'd': 5}
  • 相关阅读:
    java 语言里 遍历 collection 的方式
    struts2启动报错com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
    mysql 查看表的类型
    memcached—向memcached中保存Java实体需注意的问题
    一个关于 UIPickerView 的 bug
    Wireshark数据抓包教程之安装Wireshark
    Mysql第四天 数据库设计
    产品经理怎样才干把一件事做出色
    Tokyo Tyrant(TTServer)系列(三)-Memcache协议
    Unity3D
  • 原文地址:https://www.cnblogs.com/eric_yi/p/8449129.html
Copyright © 2011-2022 走看看