# 一. 函数参数分为两大类
# 形参:在函数定义阶段括号定义的参数(变量名),称之为形式参数
        #因为函数定义阶段只是用一个符号表示表示一个参数,并没有具体的值,所以称之为形式参数,形参
# 实参:在函数调用阶段括号内传入值(变量值),称之为实际参数
        #在函数调用阶段,给了具体的数值,而不再是一个符号化的形式,所以这个叫做实际参数实参
# 形参与实参的关系:
# 在调用函数时实参的值会绑定给形参,这种绑定关系在函数调用结束立即解除

# def func(x,y,z):####这里的xyz都是形参
#     # x=1
#     # y=2
#     # z=3
#     print(x)
#
# func(1,2,3)####这里的123都是实参

# 二: 形参与实参的细分
# 1. 位置参数:
#    位置形参:指的是在函数定义阶段按照从左到右的位置顺序依次定义的形参
#    特点: 必须被传值,多一个不行,少一个也不行

# def func(x,y,z):
#     print(x)
#     print(y)
#     print(z)

# func(1,2,3,4)####错误的调用,多给了一个位置实参
# func(1,2,)#####错误调用,少给了一个位置实参
# func(1,2,3)#####正确调用,这个参数不能多也不能少,具体的个数根据函数定义的时候的语法来
# 位置实参: 指的是在函数调用阶段按照从左到右的顺序依次传入的值
# 特点: 与形参一一对应
# func(1,2,3)
# func(2,3,1)

# 2.关键字参数(单指关键字实参): 在函数调用阶段,按照key=value形式为指定的形参赋值
# 特点: 可以完全打乱传值的顺序,但仍然能指名道姓地为指定的形参赋值
# 注意:可以混用位置实参与关键字实参,但是
#      1. 不能为同一个形参重复赋值
#      2. 位置实参必须放在关键字实参的前面
# def func(x,y,z):
#     print(x)
#     print(y)
#     print(z)
# func(1,2,3)
# func(z=3,x=1,y=2)
# func(1,x=3333,y=2,z=3)
# func(1,y=2,z=3)
# func(x=1,2,z=3)

# 3.默认参数(默认形参): 在函数定义阶段,就已经为形参赋值
#        特点: 在定义阶段就已经有值,意味着在调用阶段可以不用传值
#        注意: 可以混用位置形参与默认形参,但是
#            1. 位置形参必须放在默认形参前面
#            2. 默认形参的值只在函数定义阶段赋值一次,定义之后的任何改动都无法影响默认形参的值
#            3. 默认形参的值通常应该是不可变类型
# def func(x,z=1111,y):
#     print(x)
#     print(y)
#     print(z)

# m=1000
# def func(x,y,z=m):
#     print(x)
#     print(y)
#     print(z)
#
# m=2000
# func(1,2)

# def func(x,y,hobbies=None):
#     if hobbies is None:
#         hobbies=[]
#     hobbies.append(y)
#     print('%s 的爱好列表 %s' %(x,hobbies))
#
# func('egon','read',)
# func('alex','piao',)
# func('wxx','eat',)

# def func(x,y,z=1111):
#     print(x)
#     print(y)
#     print(z)
#
# func(1,2,z=33333)

# def register(name,age,sex='male'):
#     print(name)
#     print(age)
#     print(sex)
#
# register('大保健',18,)
# register('小保健',28,)
# register('中保健',38,)
# register('kevin',38,'female')

#4. 可变长参数: 指的是在调用函数时传入的值(实参)个数不固定,而实参无非两种,一种位置实参
# 另外一种就是关键字实参,针对这两种形式实参的个数不固定,对应着形参也应该有两种解决方案
# 来分别应对溢出位置实参(*)与关键字实参(**)

#*的用法
#一个* 如果用在定义函数阶段,用在形参里面,会把后面传递过来的多了的参数,自动存成元组的形式
#      如果用在函数的调用阶段,用在实参里面,会把后面需要传递的实参,列表,元组,字典等自动打散传递给前面的形参
#I: 在形参中出现*: *会将溢出的位置实参存成元组的形式,然后赋值紧跟其后的形参z
# def func(x,y,*z): #z=(3,4,5)
#     print(x)
#     print(y)
#     print(z)
#
# func(1,2,3,4,5)

#II: 在实参中出现*: 但凡是在实参中出现*,都将*后的值打散成位置实参,然后再进行赋值
def func(x,y,z):
    print(x)
    print(y)
    print(z)

#func(1,2,*[3,4,5,6,7])
#func(1,2,3,4,5,6,7)这种调用会报错,因为打散之后会有七个实参传递给前面的三个形参,多了四个
# func(*[3,4,5]) #func(3,4,5)#####这个调用刚刚好,因为一个列表打散之后变成三个实参刚好传递给前面的是哪个形参
#func(*{'a':1,'b':2,'c':3}) #func('a','b','c')###字典打散之后只会讲key传递给前面的实参

#**的用法
#这个是针对关键字参数
#I: 在形参中出现**: **会将溢出的关键实参存成字典的形式,然后赋值紧跟其后的形参z
# def func(x,y,**z): #z={'m':3,'a':1,'b':2}
#     print(x)
#     print(y)
#     print(z)
#
# func(1,y=2,m=3,a=1,b=2)

#II: 在实参中出现**: 但凡是在实参中出现**,都将**后的值打算成关键字实参,然后再进行赋值
#一般是字典才能打散成关键字参数
# def func(x,y,z):
#     print(x)
#     print(y)
#     print(z)

# func(1,2,**{'a':1,'b':2,'c':3}) #func(1,2,a=1,c=3,b=2)
# func(**{'y':1,'z':2,'x':3}) #func(z=2,x=3,y=1)

# 传给外层函数wrapper的参数格式如何原封不动地转嫁给wrapper内部调用的函数index???,解决方案如下
# def index(a,b,c):
#     print('from index',a,b,c)
#
# def wrapper(*args,**kwargs): #args=(1,2,3)  
kwargs={'x':1,'y':2,'z':3}
#前面的args 表示位置形参,后面传来的位置实参,不管多少,都会以元组的形式存放在这里面
#kwargs表示关键字形参吗,后面传来的关键字实参,不管多少个,都会以字典的形式存放在这里面
#特别的,args 和kwargs都只是一个代指的符号,没有特别的含义,只是我们习惯上用着两个字符串表示而已,
#用其他的字符串也可以,但是一般习惯用这个。稍微记一下就行
#index(*args,**kwargs)
# #index(*(1,2,3),**{'x':1,'y':2,'z':3})
# #index(1,2,3,x=1,y=2,z=3)
# # wrapper(1,2,3,x=1,y=2,z=3)
# wrapper(1,c=3,b=2)

# 5. 命名关键字形参: 在定义函数阶段,但凡是在*与**之间的参数称之为命名关键字形参
#    特点: 必须被传值, 并且在传值时必须按照key=value的形式传值

# def func(x,*,m=111,n,**kwargs):
#     print(x)
#     print(m)
#     print(n)
#     print(kwargs)
#
# # func(1,n=3,m=2)
# func(1,n=3)

# def func(x,y=2,*args,m,**kwargs):
#     print(x)
#     print(y)
#     print(args)
#     print(m)
#     print(kwargs)
# func(1,200,3,4,5,m=111)

Python记录6:函数2,函数参数的更多相关文章

  1. 笨办法学Python记录--习题18 变量 函数 help的由来;if语句,循环和列表,冒泡排序,判断输入字符串的方法

    20140414 记录 习题17 - 33 函数可以做3件事: 1. 给代码片段命名,,就跟“变量”给字符串和数字命名一样. 2. 可以接受参数,就跟你的脚本接受argv 一样. 3. 通过使用#1 ...

  2. python记录_day18 反射 判断函数与方法

    一.三个内置函数 1.issubclass(a, b)  判断a类是否是b类的子类 class Foo: pass class Zi(Foo): pass class Sun(Zi): pass pr ...

  3. python记录_day14 内置函数二 迭代 二分法

    一.匿名函数 形式: lambda 形参:返回值 lambda表示的是匿名函数. 不需要用def来声明, 一句话就可以声明出一个函数.匿名函数不是说一定没名字,而是他们的名字统一称为“lambda”, ...

  4. python记录_day13 内置函数

    详细链接:https://www.processon.com/mindmap/5bdbc4bee4b0878bf42089fb

  5. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  6. 百万年薪python之路 -- 函数的动态参数

    1.函数的动态参数 1.1 动态接收位置参数 在参数位置用*表示接受任意参数 def eat(*args): print('我想吃',args) eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭 ...

  7. python通过装饰器检查函数参数的数据类型的代码

    把内容过程中比较常用的一些内容记录起来,下面内容段是关于python通过装饰器检查函数参数的数据类型的内容. def check_accepts(f): assert len(types) == f. ...

  8. 记录我的 python 学习历程-Day13 匿名函数、内置函数 II、闭包

    一.匿名函数 以后面试或者工作中经常用匿名函数 lambda,也叫一句话函数. 课上练习: # 正常函数: def func(a, b): return a + b print(func(4, 6)) ...

  9. Python函数中的参数(二)

    当使用混合特定的参数匹配模型时,Python将会遵循以下有关顺序的法则: 1.在函数调用中,参数必须以这样的顺序出现:任何位置参数(Value).任何关键字参数(name = Value)和*sequ ...

随机推荐

  1. screen基本用法

    当某些命令执行时间过长或者某些程序关闭shell后自动断开时,就能使用screen 1.安装yum -y install screen 2.输入screen命令进入screen控制台 3.输入scre ...

  2. iOS 限制输入字数

    关于限制输入字数以前也做过,网上也很多方法.但都不够完美,本方法可防止中文联想.粘贴等突破长途限制.可防止Emoji截为两半导致编码出问题. - (void)textFieldDidChange:(U ...

  3. 树和二叉树->其他(待完善)

    关于树和二叉树的部分,还有如下三个知识点,待以后时间更充裕的时候再回头完善. 1 树与等价问题 文字描述 关于等价关系和等价类的定义,在离散数学上的描述有点拗口, 其实在数据结构中,这部分相关的主要是 ...

  4. LeetCode 690 Employee Importance 解题报告

    题目要求 You are given a data structure of employee information, which includes the employee's unique id ...

  5. linux下tomcat启动没有日志,没有进程,没有报错,没有监听端口

    可以试试运行catalina.sh run,这个命令会让tomcat在终端打印日志.

  6. vue router拦截器的简单使用

    之前,为了实现router跳转的每个页面的url上都带上addressCode,然后用了一下router拦截器,很好用,当然也可以专门封装一个方法来实现(跳转的页面上带有addressCode),不过 ...

  7. 漫画:什么是HashMap

    漫画:什么是HashMap 参考: HashMap源码解析 美团技术团队:Java 8系列之重新认识HashMap

  8. [geos]Geometry基本的几何对象

    读取shp中的点,读取shp中的线, (1)读取shp中的多边形,修改属性字段的值. 类库版本:geos3.6.2,shapelib1.3 定义类变量: GeometryFactory::unique ...

  9. 在golang中使用 cgo,如何让被嵌入的c语言代码调用golang

    https://golang.org/misc/cgo/test/callback.go // Copyright 2011 The Go Authors. All rights reserved. ...

  10. 使用Python监控Linux系统

    一.Python编写的监控工具 一.多功能系统资源统计工具dstat 1.dstat介绍 dstat是一个用Python语言实现的多功能系统资源统计工具,用来取代Linux下的vmstat.iosta ...