Python记录6:函数2,函数参数
# 一. 函数参数分为两大类
# 形参:在函数定义阶段括号定义的参数(变量名),称之为形式参数
#因为函数定义阶段只是用一个符号表示表示一个参数,并没有具体的值,所以称之为形式参数,形参
# 实参:在函数调用阶段括号内传入值(变量值),称之为实际参数
#在函数调用阶段,给了具体的数值,而不再是一个符号化的形式,所以这个叫做实际参数实参
# 形参与实参的关系:
# 在调用函数时实参的值会绑定给形参,这种绑定关系在函数调用结束立即解除
# 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,函数参数的更多相关文章
- 笨办法学Python记录--习题18 变量 函数 help的由来;if语句,循环和列表,冒泡排序,判断输入字符串的方法
20140414 记录 习题17 - 33 函数可以做3件事: 1. 给代码片段命名,,就跟“变量”给字符串和数字命名一样. 2. 可以接受参数,就跟你的脚本接受argv 一样. 3. 通过使用#1 ...
- python记录_day18 反射 判断函数与方法
一.三个内置函数 1.issubclass(a, b) 判断a类是否是b类的子类 class Foo: pass class Zi(Foo): pass class Sun(Zi): pass pr ...
- python记录_day14 内置函数二 迭代 二分法
一.匿名函数 形式: lambda 形参:返回值 lambda表示的是匿名函数. 不需要用def来声明, 一句话就可以声明出一个函数.匿名函数不是说一定没名字,而是他们的名字统一称为“lambda”, ...
- python记录_day13 内置函数
详细链接:https://www.processon.com/mindmap/5bdbc4bee4b0878bf42089fb
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- 百万年薪python之路 -- 函数的动态参数
1.函数的动态参数 1.1 动态接收位置参数 在参数位置用*表示接受任意参数 def eat(*args): print('我想吃',args) eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭 ...
- python通过装饰器检查函数参数的数据类型的代码
把内容过程中比较常用的一些内容记录起来,下面内容段是关于python通过装饰器检查函数参数的数据类型的内容. def check_accepts(f): assert len(types) == f. ...
- 记录我的 python 学习历程-Day13 匿名函数、内置函数 II、闭包
一.匿名函数 以后面试或者工作中经常用匿名函数 lambda,也叫一句话函数. 课上练习: # 正常函数: def func(a, b): return a + b print(func(4, 6)) ...
- Python函数中的参数(二)
当使用混合特定的参数匹配模型时,Python将会遵循以下有关顺序的法则: 1.在函数调用中,参数必须以这样的顺序出现:任何位置参数(Value).任何关键字参数(name = Value)和*sequ ...
随机推荐
- 指数级计算复杂度 调用Fibonacci函数次数
指数级计算复杂度 计算调用次数 #include <stdio.h> long fibonacciCallTimes(long n); int main(void) { long resu ...
- [daily][grub2] grub2修改内核选项
以前, 我们就直接去修改 /boot/grub/grub.cfg 文件了. 其实这并不正确. 正确的做法是: 1. 修改 /etc/default/grub 文件. [root@dpdk ~]# c ...
- 《Mysql 日志结构》
推荐一首歌 - <往后余生>王贰浪 发现自己每天就听这么几首歌 一:慢查询日志 - SQL 完成查询并完成对于锁资源的释放之后,msqld 会将符合条件的SQL写入慢日志.因此慢日志可能和 ...
- 《Redis 垃圾回收》
推荐一首歌 - <纸短情长> 花粥 很好听 一:redis的垃圾回收 - 为了可以使用更多的内存,redis有一套自己的键值淘汰机制. - 修改 maxmemory参数,限制Redis使用 ...
- VS2017上在线和离线安装Qt插件(在线安装)
版权声明:如需转载,请告知博主并声明出处 https://blog.csdn.net/CLinuxF/article/details/88816436文章目录前言在线安装离线安装(推荐)前言很多朋友喜 ...
- java之获取资源文件
背景介绍 在java程序中有时我们需要加载项目中的某些资源文件(如:config.properties之类),以便获取里面的值,这样可以避免某些需要经常修改的数据硬编码入业务程序中 实现方式 实现这种 ...
- 使用Bootstrap Popover实现一个弹框上三角形的代码记录
$(function () { var options = { trigger: 'manual', content: function ...
- ios 10 新特性
UITextField添加了textContentType枚举,指示文本输入区域所期望的语义意义. 使用此属性可以给键盘和系统信息,关于用户输入的内容的预期的语义意义. 当您提供有关您期望用户在文本输 ...
- logback logback.xml常用配置详解(二)<appender>
转自:http://aub.iteye.com/blog/1101260 logback 常用配置详解(二) <appender> <appender>: <append ...
- mysql实时增量备份
采用binlog日志的好处 掌控所有更改操作,必要时可用于恢复数据 数据库主从复制的必要条件 [root@localhost~]# vim /etc/my.cnf [mysqld] .. .. log ...