Python入门之函数的形式参数与实参/参数的具体使用方法
本篇目录:
一、 函数参数之形式参数与实参
二、 函数参数的具体使用
#1、位置参数:按照从左到右的顺序定义的参数
位置形参:必选参数
位置实参:按照位置给形参传值 #2、关键字参数:按照key=value的形式定义的实参
无需按照位置为形参传值
注意的问题:
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值 #3、默认参数:形参在定义时就已经为其赋值
可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
注意的问题:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型 #4、可变长参数:
可变长指的是实参值的个数不固定
而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs #5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
!
==========================================================================
一、函数的形式参数和实参
# x,y就是形式参数
def func(x,y):
pass
2. 实际参数:调用函数是,括号内由外部调用者传入的值,其实就是变量值,
# 10,11就是实参 func(10,11)
'''
注意点
实参值(变量的值)和形参(变量名)的绑定关系只有在函数调用时才会生效
函数调用结束后,就会失效,解除绑定,释放资源
'''
二、 函数参数的具体使用
1.位置参数
1.1 位置参数,位置即顺序,位置参数就是按照从左到右的顺序依次定义的参数
1.2 在定义函数阶段,按照位置定义的形式参数,称为位置形参
def foo(x,y,z):
print(x,y,z)
# 位置形参必须为其传值,有几个形参,必须传入几个值
1.3 在调用函数的阶段,按照位置定义的实参,被称位置实参
#1,2,3都是位置实参 foo(1,2,3)
........
2. 关键字参数(属于位置实参)
2.1 在调用函数的时候,按照key=value的形式定义的实参,称为关键字参数
a. 相当于指名道姓的为形参传值,意味着不按照顺序定义,礽可以为参数传值
foo(1,2,3)
foo(y=2,x=1,z=3)
b. 调用函数时,位置实参与关键字可以混合使用,但是必须满足传值的要求
# 必须遵循形参的规则
foo(x,y,z)
foo(1,z=3,y=2)
# 不能为同一个形惨重复传值
foo(x,y,z)
foo(1,x=1,z=3,y=2)
3. 默认参数
3.1 在函数定义阶段,已经为某个形参赋值,该形参被称为默认参数
# 注意在函数定义阶段已经有值,意味着调用阶段可以不用传值
# 如果传值,那就覆盖默认参数
def register(name, age, gender='male'):
print(name, age, gender) register('Archer, 20)
register('Bob, 22)
register('Carol‘, 27,'Female')
# 对于经常需要变化的值,需要将对应的形参定义为位置形参
# 对于大多数情况下,值都一样,可以将对应的形参定义为默认参数
3.2 位置形参必须在默认参数前面
# 错误参数放置
def func(y=1,x):
pass #正确参数放置 def func(x, y=1):
pass
3.3 默认参数的值只在定义阶段赋值一次,也就是说默认参数的值在定义阶段就被固定
# 函数定义阶段 m=10
def foo(x,y=m):
print(x,y) #函数调用阶段(即使这时候m变为11,但是函数调用后还是打印 1,10)
m=11
foo(1,m)
# 以上的打印结果
1 10 # 不会是 1 11
3.4 默认参数的值应该设置为不可变类型
def register(name, hobboy, l=[]):
l.append(hobby)
print(name, l) register('Archor', 'reading')
register('Alen','running')
register('Bob','playing')
#以上的打印结果
Archor reading
Alen reading running
Bob reading running playing # 不是很奇怪吗?我们要分别打印出姓名+爱好,但是结果来看,爱好被堆积起来传递下去了
# 这是因为默认参数的值我们定义为了一个空列表,列表是个可变类型(可以改变里面的值,列表的内存地址不变,这是可变类型的特点)
# 如果默认参数被传值的话,就会覆盖原值,可以通过每次都覆盖的方式来改进上面的程序
def register(name, hobby, l=[])
l.append(hobby)
print(name,l) # 这里我们自带了空列表来覆盖每次产生的新值
register('Archor', 'reading', [])
register('Alen', 'running', [])
register('Bob', 'playing', [])
#以上的打印结果
Archor reading
Alen running
Bob playing
# 当然我们也可以通过把默认参数直接设置为None来改进
def register(name, hobby,l=None):
if l is None:
l=[]
l.append(hobby)
print(name,l) register('Archor', 'reading')
register('Alen', 'running')
register('Bob', 'playing') register('Archor', 'reading', [])
register('Alen', 'running', [])
register('Bob', 'playing', [])
# 上面的输出结果为 Archor ['reading']
Alen ['running']
Bob ['playing']
Archor []
Alen []
Bob [] #这里请多加对比思考
4. 可变长度类型的实参(*args, **kwargs)
4.1 实参的个数可以不固定
a. 按照位置定义的实参
b. 按照关键字定义的实参
4.2 (*args)可以将溢出位置的实参全部接收,然后保存成元组的形式返回给args
def foo(x,y,z,*args):
print(x,y,z)
print(args) foo(1,2,3,4,5,6,7,8,)
# 以上的返回结果为
1 2 3
(4,5,6,7,8,)
4.3 (**kwargs)可以将溢出位置的实参全部接收,然后保存成字典的形式返回给kwargs
def foo(x,y,z,**kwargs):
print(x,y,z)
print(kwargs) foo(x=1,y=2,z=3,a=1,b=2,c=3)
#以上的返回结果为
1 2 3
{'a':1,'b':2,'c':3}
4.4 如果遇到实参带*,那么就需要拆分该实参
def foo(x,y,z,*args):
print(x,y,z)
print(args) foo(*[1,2,3])
foo(*(1,2,3))
foo(1,2,3,*{'a':1,'b':2})
foo(1,2,3,*'canshu')
# 以上的输出结果 1 2 3
() 1 2 3
() 1 2 3
('a', 'b') 1 2 3
('c', 'a', 'n', 's', 'h', 'u')
4.5 如果遇到实参带**,那么就需要拆分该实参
===========**kwargs===========
def foo(x,y,**kwargs):
print(x,y)
print(kwargs)
foo(1,y=2,a=1,b=2,c=3) def foo(x,y,**kwargs):
print(x,y)
print(kwargs)
foo(1,y=2,**{'a':1,'b':2,'c':3}) def foo(x,y,z):
print(x,y,z)
foo(**{'z':1,'x':2,'y':3}) ===========*args+**kwargs=========== def foo(x,y):
print(x,y) def wrapper(*args,**kwargs):
print('====>')
foo(*args,**kwargs)
Python入门之函数的形式参数与实参/参数的具体使用方法的更多相关文章
- Python入门篇-函数、参数及参数解构
Python入门篇-函数.参数及参数解构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数概述 1>.函数的作用即分类 函数 数学定义:y=f(x) ,y是x的函数,x ...
- Python入门之 函数
Python入门之 函数 1.初识函数 1.1 什么是函数? <1> 将某个功能封装到一个空间中就是一个函数 <2> 减少重复代码 1.2 定义函数 def -- python ...
- 使用文件描述符作为Python内置函数open的file实参调用示例
一.关于文件描述符 open()函数的file参数,除了可以接受字符串路径外,还可以接受文件描述符(file descriptor),文件描述符是个整数,对应程序中已经打开的文件. 文件描述符是操作系 ...
- Python入门day04_函数与装饰器
一.函数入门 什么是函数: # 函数:函数是一系列代码的集,用来完成特定功能的代码块,类似于工具,可以重复不但的去使用 为什么要有函数: # 优点:# 1. 避免代码的冗余 # 2. 让程序代码结构更 ...
- Python入门-初始函数
今天让我们来初步认识一个在python中非常重要的组成部分:函数 首先,让我们来幻想这样一个场景: 比如说我们现在想要通过社交软件约一个妹子,步骤都有什么? print('打开手机 ') print( ...
- python入门15 函数
函数的主要作用是实现代码复用 1 python内置函数 2 匿名函数lambda 3 自定义函数 def functionname(arg):... #coding:utf-8 #/usr/bin/p ...
- Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析
Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...
- python入门总结-函数
函数形式: def functionname(paramlist): function body 局部变量不改变实参的值,如果需要改变,声明global.比如,global x 可以给函数默认值,注意 ...
- python入门之函数
为什么要用函数 python的函数是由一个新的语句编写,即def ,def是可执行的语句--函数并不存在,知道python运行了def后才存在. 函数是通过赋值函数传递的,参数通过赋值传递给函数. d ...
随机推荐
- 云计算---openstack实例共享80、443端口
前言 因为openstack使用的是apache,所以不能共享80端口,但创建的许多云主机,虽然可以通过rinetd进行跳转,但有时需要直接访问80端口,所以这里我们选择包含了nginx的openre ...
- Keeweb-Linux的密码管理器
Keeweb-Linux的密码管理器 如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.那么,下 ...
- 用JAVA进行Json数据解析(对象数组的相互嵌套)
这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相 ...
- C++模板类与Qt信号槽混用
一.正文 目前正在做一个视频处理相关的项目.项目的技术栈是这样的,UI层采用Qt来实现基本的数据展示和交互,底层音视频采用的是一套基于FFmpeg的视频处理框架.这是一套类似Microsoft Med ...
- Linux Vim查找字符串
一.用/和?的区别:/后跟查找的字符串.vim会显示文本中第一个出现的字符串.?后跟查找的字符串.vim会显示文本中最后一个出现的字符串.二.注意事项:不管用/还是?查找到第一个字符串后,按回车,vi ...
- 读headFirst设计模式 - 工厂模式
每次写博客都不知道要怎么引入要写的主题,挺头疼的一件事.今天就直接开门见山,今天要学的就是工厂模式,工厂就是批量生产制造东西的地方.在这里,工厂就是批量生产对象的地方. 学习书上的例子 假如你现在有一 ...
- 【Python】 http客户端库requests & urllib2 以及ip地址处理IPy
requests requests是个HTTPClient库,相比于urllib,urllib2等模块比更加简洁易用 ■ get请求 作为示例,讲一下关于requests如何发起并处理一个get请求 ...
- 大数据 --> 淘宝异构数据源数据交换工具 DataX
淘宝异构数据源数据交换工具 DataX DataX是什么? DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesys ...
- 在Anacoda中管理多个版本Python
win10. 在cmd窗口中输入 conda info --envs 或者 conda env list 查看已经安装的环境,当前活动的环境前会加*号. 在cmd窗口(终端窗口)或anaconda p ...
- js浮点数运算的坑,多少同学有碰到过?
javascript中的数字都是双精度的浮点数. JavaScript中的整数并不是一个独立的数据类型,而是浮点数的一个子集. 浮点数的坑我们看下面的例子 在浏览器的console 控制台上我们分别进 ...