函数:一个工具,随调随用

  降级代码冗余

  增加代码的复用性,提高开发效率,为了不成为cv战士

  提高程序扩展性

函数有两个阶段:定义阶段,调用阶段。

定义时:只检查函数体内代码语法,不执行函数体内代码。

函数参数:

  参数分形参、实参

  形参:函数定义时括号内的参数

  实参:函数调用时括号内的参数

  形参相当于变量,实参相当于变量的值。

  定义时:

      def func(a, b, c):

        pass

      a, b, c为形参

  调用时:

      func(1, 2, 3)

      1, 2, 3 为实参

形参:

  只在被调用时,才分配内存单元。调用结束,立刻释放所分配的内存。

  形参只在函数内部有效。

实参:

  可以是:常量、变量、表达式、函数。

  进行函数调用时,实参必须是确定的值。

位置参数:

  位置形参:函数定义时,从左往右写的参数,比如上面的 a, b , c

  位置实参:函数调用时,从左往右写的参数,  比如上面的 1,2,3

  位置形参定义多少个,调用时位置实参必须写上多少个,多一个少一个都不行。

关键参数:

  正常情况下,给函数传参数,要按顺序。如果不想按顺序,就用关键参数。

  指定参数名的参数,就叫做关键参数。

  函数调用时:func(a=1, b=2),  这种指定了参数名的参数,就是关键参数。

  调用函数时,关键参数可以和位置参数一起用,但是关键参数必须在位置参数的后面。不然会报错。

默认参数:

  函数定义时,默认参数必须在位置形参的后面。

  函数调用时,指定参数名的参数,叫关键参数。

  而在函数定义时,给参数名指定值的时候,这个参数叫做默认参数。

  关键参数,和默认参数两个参数写法一样,区别在于:

    关键参数是在函数调用时,指定实参的参数名,也可以说指定值的参数名。

    默认参数是在函数定义时,指定参数名的值。

  写法:

    def (a, b=100):

      pass

  定义时,有默认参数的话,调用时,这个实参可以不写。如果实参不写的话,这个形参的参数值是他的默认值。

动态参数:*args  **kwargs

  *args

  针对函数定义时的*:

    def func(a, b, *args):

      pass

    *args会接收函数调用时,传入的多余的位置实参。

    *args 是一个元组

    例子:

      func(1, 2, 3, 4, 5, 6) 函数调用,因为函数定义时,*args前面有形参a, 形参b, *args就接收调用时多余的位置实参

      a为1, b为2, *args 为: (3, 4, 5, 6),是一个元组。

  

  针对函数调用时的 *:

    func(1, 2, *[1, 2, 3, 4])  ==  func(1, 2, 1, 2, 3, 4)

    函数调用时有*, 就应该立马将*后面的列表,元组,字符串之类的迭代器,打散成位置参数来看。

    注意,如果 *后面是一个字典的话,那么打散成的位置参数就是字典的key

    *可以看做是for循环。

  形参中 *args 只能接收多余的位置实参,成为一个元组。不能接收关键实参。

  

  **kwargs:

  针对函数定义时,站在形参的角度看 **:

    接收多余的关键实参,成为一个字典dict。

    字典的key是关键实参的变量名,字典的value是关键实参的值。

    将字典交给**后面的变量名,这里是kwargs

  站在实参的角度看 ** :

    d = {'x':1, 'y':2, 'z':333}

    func(**d)  # 等价于func(x=1,y=2,z=333)

    函数调用时,**后面可以接一个字典,然后**会把字典打散成关键参数的形式,也就是key=value的形式。

      

函数定义时:

  从左往右:位置形参 > *args > 默认参数 > **kwargs

   位置形参 > 默认参数 > *args > **kwargs  也可以。

   因为函数调用时给的实参满足了位置形参、默认参数之后,会把多余的位置实参给args。这样并不会报错。

   但是 **kwargs 必须在 *args后面

   默认形参必须在位置形参后面

函数调用时:

  从左到右:位置实参 > *args > 关键参数 > ** kwargs

   因为 * args 在函数调用时,会被打散成位置实参,而关键参数必须在位置实参的后面,否则会报错。SyntaxError: positional argument follows keyword argument

   *args 必须在 **kwargs后面, 否则会报语法错误:SyntaxError: iterable argument unpacking follows keyword argument unpacking

    

  

Python中的函数及函数参数的使用的更多相关文章

  1. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

  2. Python中的高阶函数与匿名函数

    Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...

  3. python中enumerate()函数用法

    python中enumerate()函数用法 先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6]  请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输 ...

  4. Python中sort和sorted函数代码解析

    Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...

  5. Python中进制转换函数的使用

    Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...

  6. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用

    Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...

  7. Python中的内置函数

    2.1 Built-in Functions The Python interpreter has a number of functions built into it that are alway ...

  8. python中的一等对象--函数

    一等对象 什么是一等对象: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传递给函数 能作为函数的返回结果 python中的字符串,列表什么的都是一等对象,但对如果之前只是使用c++.jav ...

  9. Python学习之---Python中的内置函数(方法)(更新中。。。)

    add(item)   #将item添加到s中,如果item已经在s中,则无任何效果 break        #退出循环,不会再运行循环中余下的代码 bool()     #将参数转换为布尔型 by ...

  10. python中的高阶函数

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...

随机推荐

  1. 1407251735-hd-美素数.cpp

    #include<stdio.h> int s1[1005000],s2[1005000]; //如果main该阵列外部函数中定义,全局变量的数组,自己主动初始化数组0: //在main里 ...

  2. gitlab 添加文件到新建git库

    1. 账号拥有master权限 2.执行操作 git clone git@IP:Group/project.gitcd projecttouch README.mdgit add README.mdg ...

  3. WPF DispatcherTimer(定时器应用) 无人触摸60s自动关闭窗口

    原文:WPF DispatcherTimer(定时器应用) 无人触摸60s自动关闭窗口 如果无人触摸:60s自动关闭窗口 xmal:部分 <s:SurfaceWindow x:Class=&qu ...

  4. 一个RPC的demo (good)

    从下面的例子中可以看到,Consumer(client)的代码中引用了Provider部分的class,本例中是 com.provider.EchoServiceImpl和com.provider.E ...

  5. WPF编游戏系列 之九 物品清单再优化

    原文:WPF编游戏系列 之九 物品清单再优化        在"第三篇"和"第四篇"中通过用户控件和数据绑定功能对物品清单进行一些优化减少了部分C#代码,但感觉 ...

  6. 深入解析Android关机

    下图详细阐释了Android的关机顺序. 第一步: 按住电源按钮半秒钟(500ms). 第二步: 之后,PhoneWindowManager.java 将捕获长按电源按钮这一事件并调用“interce ...

  7. SQL 修改主键约束

    原文:SQL 修改主键约束 今天在学习数据库的时候遇到一个关于如何修改主键约束的问题,抄录下来以供备用. --修改主键约束用SQL --获取主键约束名字 declare @csname varchar ...

  8. storm(一)

    Storm 一个用来实时计算的流框架,具有高可用,低延迟,数据不丢失,分布式的特点 storm 处理数据的方式是基于消息的流水线处理,因此特别适合无状态的计算,也就是说计算单元依赖的数据全部在接受的消 ...

  9. RESTful API设计原则与规范

    RESTful API设计原则与规范 一.背景与基础概念 2 二.RESTful API应遵循的原则 3 1.协议(Protocol) 3 2.域名(ROOT URL) 3 3.版本(Versioni ...

  10. qt 心跳设计

    网络通信中的心跳设计是为了判断客户端和服务器通信是socket是否处于连接状态,服务端每隔一个固定的时间间隔给客户端放消息,客户端设计一个心跳类,类中有一个定时器,当socket接收到信息时,心跳类记 ...