一、形参与实参

  1、形参与实参是什么?
    形参(形式参数):指的是
      在定义函数时,括号内定义的参数,形参其实就变量名
    实参(实际参数),指的是
      在调用函数时,括号内传入的值,实参其实就变量的值

      x,y是形参
      def func(x,y): #x=10,y=11
      print(x)
      print(y)

      10,11是实参
      func(10,11)

  2、注意:
    实参值(变量的值)与形参(变量名)的绑定关系只在函数调用时才会生效/绑定
    在函数调用结束后就立刻解除绑定

二、位置参数: 

  1、位置参数
    位置即顺序,位置参参数指的就是按照从左到右的顺序依次定义的参数

  2、分两种   

    2.1 在定义函数时,按照位置定义的形参,称为位置形参
      def foo(x,y,z):
      print(x,y,z)

      注意:
      位置形参的特性是:在调用函数时必须为其传值,而且多一个不行,少一个也不行

      foo(1,2)   #TypeError: foo() missing 1 required positional argument: 'z'
      foo(1,2,3,4)   #TypeError: foo() takes 3 positional arguments but 4 were given

    2.2 在调用函数时,按照位置定义的实参,称为位置实参
      注意:位置实参会与形参一一对应
      foo(1,3,2)

三、关键字参数

  1、什么是关键字参数:
    在调用函数时,按照key=value的形式定义的实参,称为关键字参数

      def foo(x,y,z): #x=1,y=2,z=3
      print(x,y,z)

    在调用函数时,按照key=value的形式定义的实参,称为关键字参数
    注意:
    1、相当于指名道姓地为形参传值,意味着即便是不按照顺序定义,仍然能为指定的参数传值
      foo(2,1,3)
      foo(y=2,x=1,z=3)
      foo(z=2,aaaa=1)

    2、在调用函数时,位置实参与关键字实参可以混合使用,但必须
    2.1:必须遵循形参的规则
      foo(1,z=3,y=2)
      foo(1,z=3)

    2.2:不能为同一个形参重复传值
      foo(1,x=1,y=3,z=2)

    2.3 位置实参必须放到关键字实参的前面
      foo(y=3,z=2,1)

四、默认参数

  1 默认参数
    在定义阶段,已经为某个形参赋值,那么该形参就称为默认参数

    注意:
    1 定义阶段已经有值,意味着调用阶段可以不传值
      def register(name,age,sex='male'):
        print(name,age,sex)
      register('egon',18,)
      register('alex',73,'female')
      register('wxx',84,)

    2 位置形参必须在默认参数的前面
      def func(y=1,x): #错误
        pass

    3 默认参数的值只在定义阶段赋值一次,也就是说默认参数的值再定义阶段就固定死了
      m=10
      def foo(x,y=m):
        print(x,y)
      m='aaaaaaaaaaaaaaaaaa'
      foo(1)
      foo(1,11)

    4 记住:默认参数的值应该设置为不可变类型

      def register(name,hobby,l=[]): #name='wxx',hobby='play'
        l.append(hobby) #l=['play']
        print(name,l) # wxx ['play']

      register('wxx','play') # wxx ['play']
      register('alex','read') # alex ['read']
      register('egon','music') # alex ['music']

      register('wxx','play',[]) # wxx ['play']
      register('alex','read',[]) # alex ['read']
      register('egon','music',[]) # alex ['music']

      def register(name,hobby,l=None):
        f l is None:
        l=[]
        l.append(hobby) #l=['play']
        print(name,l) # wxx ['play']

      register('wxx','play') # wxx ['play']
      register('alex','read') # alex ['read']
      register('egon','music') # alex ['music']

    应用:
    对于经常需要变化的值,需要将对应的形参定义成位置形参
    对于大多数情况值都一样的情况,需要将对应的形参定义成默认形参

五、可变参数

  1 什么是可变长度参数
    可变长度指的参数的个数可以不固定,实参有按位置定义的实参和按关键字定义的实参,
    所以可变长的实参指的就是按照这两种形式定义的实参个数可以不固定,
    然而实参终究是要给形参传值的
    所以形参必须有两种对应的解决方案来分别处理以上两种形式可变长度的实参
  形参:
    *
    **

    形参里包含*与**

    *会将溢出的位置实参全部接收,然后保存成元组的形式赋值给args
      def foo(x,y,z,*args): #args=(4,5,6,7,8)
        print(x,y,z)
        print(args)
      foo(1,2,3,4,5,6,7,8,)

    **会将溢出的关键字实参全部接收,然后保存成字典的形式赋值给kwargs
      def foo(x,y,z,**kwargs): # kwargs={'c':3,'a':1,'b':2}
        print(x,y,z)
        print(kwargs)

      foo(x=1,y=2,z=3,a=1,b=2,c=3)

    实参里包含*与**

    一旦碰到实参加*,就把该实参的值打散
      def foo(x,y,z,*args): #args=([4,5,6,7,8],)
        print(x,y,z)
        print(args)
      foo(1,2,3,*[4,5,6,7,8]) #foo(1,2,3,4,5,6,7,8)
      foo(1,2,3,*(4,5,6,7,8)) #foo(1,2,3,4,5,6,7,8)
      foo(1,2,3,*'hello') #foo(1,2,3,'h','e','l','l','o')

    一旦碰到实参加**,就把该实参的值打散
      def foo(x,y,z,**kwargs):
        print(x,y,z)
          print(kwargs)
      foo(1,2,3,**{'a':1,'b':2}) #foo(1,2,3,b=2,a=1)

    组合使用
      def index(name,age,gender):
        print('welcome %s %s %s' %(name,age,gender))

      def wrapper(*args,**kwargs): #args=(1,2,3),kwargs={'x':1,'y':2,'z':3}
        print(args)
        print(kwargs)
        index(*args,**kwargs) # index(*(1,2,3),**{'x':1,'y':2,'z':3}) # index(1,2,3,z=3,y=2,x=2)

      wrapper(1,2,3,x=1,y=2,z=3)  

      wrapper(name='egon',age=18,gender='male')
      wrapper('egon',age=18,gender='male')
      wrapper('egon',18,gender='male')
      wrapper('egon',18,'male')

    函数内调用别的函数,实参要根据被调用函数的形参规则进行输入

Python之旅.第三章.函数3.27的更多相关文章

  1. Python之旅.第三章.函数4.01/4.02

    一.三元表达式 #普通的判断大小函数def max2(x,y): if x > y: return x else: return yres=max2(10,11)print(res)x=12y= ...

  2. Python之旅.第三章.函数3.30

    一.迭代器 1.什么是迭代?:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来2.要想了解迭代器到底是什么?必须先了解一个概念,即什么是可迭代的对象?可迭代的对象:在python中,但凡内置 ...

  3. Python之旅.第三章.函数3.28

    一.命名关键字参数: 什么是命名关键字参数?格式:在*后面参数都是命名关键字参数特点:1 必须被传值1 约束函数的调用者必须按照key=value的形式传值2 约束函数的调用者必须用我们指定的key名 ...

  4. Python之旅.第三章.函数3.29

    一.无参装饰器 1 开放封闭原则 软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提 ...

  5. Python之旅.第三章.函数3.26

    一.函数: 1.为什么要有函数?什么是函数? 1.组织结构不清晰,可读性差 2.代码冗余 3.管理维护的难度极大,扩展性 具备某一个功能的工具就是程序的中函数 事先准备工具的过程---->函数的 ...

  6. python学习心得第三章

    python学习心得第三章 1.三元运算 变量=值1 if 条件 else 值2 由图如果条件成立则赋值1给变量,如果条件不成立则赋值2给变量. 2.数据类型 集合:set() class set(o ...

  7. python学习笔记——第三章 串

    第三章 字符串学习 1.字符串不灵活, 它不能被分割符值 >>> format = "hello, %s. %s enough for ya?" >> ...

  8. 《零压力学Python》 之 第三章知识点归纳

    第三章(第一个程序)知识点归纳 编程犹如写剧本.Python函数与剧本差别不大,你可以反复调用函数,而它每次都执行预定的“脚本”(脚本也可以指整个程序). 在Python IDLE中,真正的编程是从编 ...

  9. 跟着高淇学Python——第一到第三章总结

    2019/10/26 第一章:Python介绍 Python是一种解释型,面向对象的语言.特点是: 可读性强 简洁,简洁 面向对象 免费开源 可移植性和跨平台性 丰富的库 可扩展性 应用范围:1.人工 ...

随机推荐

  1. 八年架构师大咖首次揭秘,年薪50W秘籍!

    序言 我是土生土长的老北京人,你们肯定觉得我很有钱,为啥呢? 因为觉得我是北京户口,其实你们错了,我的房子是靠我自己买的,父母基本上没帮到我什么,当然,我也不需要吧! 我只想说,作为一名程序员,我很自 ...

  2. Angular:Reactive Form的使用方法和自定义验证器

    本文将介绍Angular(Angular2+)中Reactive Form的有关内容,包括: Reactive Form创建方法 如何使用验证 自定义验证器 下面开始进入正文! Reactive Fo ...

  3. 原生jdbc操作mysql数据库详解

    首先给大家说一下使用JDBC链接数据库的步骤 1.加载链接数据库驱动 2.建立数据库链接 3.创建数据库操作对象 4.编写sql语句,执行sql语句 5.获取结果集 6.释放资源 我这边采用的是mav ...

  4. java正则匹配并提取字串

    Pattern p = Pattern.compile("\\(.*\\)"); Matcher m = p.matcher("1.2.0(23)"); if( ...

  5. 并查集(Java实现)

    (最好在电脑下浏览本篇博客...手机上看代码不方便) 当时学的时候看的一本印度的数据结构书(好像是..有点忘了..反正跟同学们看的都不一样...)...里面把本文提到的所有情况都提到了,我这里只是重复 ...

  6. Eclipse项目出现红色叹号的解决办法

    以前的项目今天打开突然出现了红色的叹号,对于强迫症的患者简直忍不了,出现红色叹号的原因都是jar包出现问题导致的,如果是代码错误早就是一个大红叉了- 打开项目就可以发现,找不到哪里出问题了,代码和js ...

  7. NodeJs的async

    async.auto最强大的一个api,它适合逻辑复杂的代码,代码中你一部分需要串行,两部分相互依赖,一部分又需要并行,代码中不需要依赖,这个时候你就可以通过auto随性所欲控制你的代码逻辑. var ...

  8. js先后对某个js对象内的两个属性排序

    需求 列表中先根据某id进行排序,然后id相同的再按某属性进行排序.最终显示效果如图所示: 实现代码 var data.items = [ {'brand_id':1,'farm_id':2}, {' ...

  9. 模拟select选中option的效果

    大致情况如下:网页上有一个表单,表单中有一个select类型的控件,我要选择option后,表单相对应的input部分会option自动填充选中数据. 我想要的是:实现一个网页上的效果,在这个页面被打 ...

  10. 【js Date】时间字符串、时间戳转换成今天,明天,本月等文字日期

    作为前端开发攻城师,难免对时间进行各种计算和格式转换,一个js的Date对象统统可以搞定.下例是将一个具体的时间转换成今天.明天.几天之内.本月等文字描述的日期的工具函数,也可以基于它扩展,多应用于网 ...