浅谈Python 参数与变量


Posted in Python onJune 20, 2020

形参与实参以及位置参数

什么是形参和实参

  • 形参:即形式参数,函数定义时指定的可以接受的参数即为形参,比如定义函数时的max(a,b)函数中的a和b就是形参
  • 实参:即实际参数,调用函数时传递给函数参数的实际值即为实参,比如调用上面函数用 max(1, 9)函数中的1和9就是实参;

什么是位置参数

  • 我们定义函数max(a,b)后,在调用时,我们无需指定参数名,只需max(1,9),这个时候实参入参的的位置进行匹配,也就是在函数中,a=1,b=9。
  • 当然,如果我们不想基于位置顺序,也可以直接指定对应的参数名,比如max(b=9,a=1),这个时候调用后,不会按入参顺序赋值,而是直接按指定的参数名赋值。 

默认参数

编写一个计算x的n次幂的函数,要求x、n可以作为参数传入

def power(x, n):
 return x ** n

print(power(2,2))

上面的函数虽然解决了问题,但是显然不够完美,假设在大部分的调用里,基本都只是求x的2次幂,但是这个时候我在调用的时候依旧每次都得传n,这就显得有点多余。有没有什么方法可以让我调用的时候少些一个入参呢?

如果我们直接 print(power(2)),会发现这个时候行不通,有错误。

在函数入参处,使用等号赋值默认参数,

def power(x, n=2):
 return x ** n

print(power(2))

注意:必需要的参数在前,默认参数在后,否则会报错

如果有多个默认参数呢?

def test(a=1, b=2, c=3):
 print("a=%d b=%d c=%d" % (a, b, c))

test(c=2)

当有多个默认参数的时候,可以显式指定传入某个参数的值,在调用函数时,入参使用参数名=参数值的形式即可

如果默认参数是一个列表呢?

def test(L=[]):
 L.append("END")
 print(L)

test([1, 1, 1])
test([2, 2, 2])

上面的程序运行起来似乎看不出啥问题,但是,我们来看一个奇怪的现象:在调用test函数的时候不传入任何参数,此时,输出的结果变得有点诡异

def test(L=[]):
 L.append("END")
 print(L)

test()
test()

输出结果:

['END']
['END', 'END']

函数在定义的时候,默认参数的值已确定,换句话说,L指向的地址是确定,之后如果还是对其内容进行更改的话,默认参数的值也随之改变了

注意:默认参数必须指向不可变对象

可变参数

什么是可变参数?

顾名思义就是调用函数时,传递参数的个数的可变的。

如果不使用可变参数,目前有哪些方式可以实现传入不确定个数的 list、dict、set等

def sum(numbers):
 total = 0
 for i in numbers:
  total += i
 return total

print(sum([1, 2, 3]))

上面这种写法,虽然可以实现不确定个数的入参,但是调用方并不清楚入参该是哪种类型,此时调用方还得看函数的具体实现方知入参要是可迭代类型,所以对调用方不友好

可变参数的基本格式

在定义函数的时候,入参前加*号,表示可变参数,如

def sum(*numbers):
 total = 0
 for i in numbers:
  total += i
 return total

print(sum(1, 2, 3))

可变参数,其实是将入参封装成元组

def my_fun(*numbers):
 print(type(numbers))
 total = 0
 for i in numbers:
  total += i
 return total
 
print(my_fun(1, 2, 3))

输出结果:
<class 'tuple'>
6

命名关键字参数

我们先来看看之前最普通的入参方式--位置参数

def person(name, age):
 print(name,age)

person("wiggin",29)

这种方式无需指定入参的名字,只要位置相对应,就可以。

与位置参数相对的另一种方式,是每次调用的时候,都必需指定参数的名字,也就是命名关键字

什么是命名关键字参数

  • 限制调用者不能按位置传递,需要放在形参的后面,并在前面使用星号*(独占一个参数位)与普通形参分隔

为什么要有命名关键字参数

  • 为了限制后面几个参数只能按关键字传递,这往往是因为后面几个形参名具有十分明显的含义,显式写出有利于可读性;或者后面几个形参随着版本更迭很可能发生变化,强制关键字形式有利于保证跨版本兼容性
  • 与位置参数相对的另一种方式,是每次调用的时候,都必需指定参数的名字,也就是命名关键字

命名关键字用法

def person(name, age, *, pet):
 print(name,age,pet)

person("wiggin",29,pet="tomcat")

命名关键字使用*做分隔,*之前的参数,基于位置参数,*后面的参数,在调用的时候必需指定其参数名

一旦使用命名关机字之后,如果调用时,没指定参数名,会报相应的错误

def person(name, age, *, pet):
 print(name,age,pet)

person("wiggin",29,"tomcat")TypeError: person() takes 2 positional arguments but 3 were given

TypeError: person() takes 2 positional arguments but 3 were given

*后面的参数,同样也可以使用默认参数进行设置

def person(name, age, *, pet="cat"):
 print(name,age,pet)

person("wiggin",29)

注意:如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符

关键字参数

什么是关键字参数?

关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

def person(name, age, **kw):
 print('name:', name, 'age:', age, 'other:', kw)

person("wiggin",29,city="广州",pet="cat")

也可以使用下面的方式传参

def person(name, age, **kw):
 print('name:', name, 'age:', age, 'other:', kw)

other_info = {"pet": "cat"}
person("wiggin",29,city="广州",**other_info)

other_info表示把other_info这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,注意kw获得的dict是other_info的一份拷贝,对kw的改动不会影响到函数外的other_info。

混合使用参数

本章之前所学习的各种类型的参数,可以在定义函数时混合使用,但是,有一个核心注意的点:混合使用时,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

以上就是浅谈Python 参数与变量的详细内容,更多关于Python 参数与变量的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python脚本在Appium库上对移动应用实现自动化测试
Apr 17 Python
python实现class对象转换成json/字典的方法
Mar 11 Python
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
Python 利用内置set函数对字符串和列表进行去重的方法
Jun 29 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
查看端口并杀进程python脚本代码
Dec 17 Python
Python requests模块session代码实例
Apr 14 Python
Python3使用 GitLab API 进行批量合并分支
Oct 15 Python
python代码实现扫码关注公众号登录的实战
Nov 01 Python
python字符串的index和find的区别详解
Jun 20 #Python
Django Admin 上传文件到七牛云的示例代码
Jun 20 #Python
什么是python的函数体
Jun 19 #Python
浅谈Python中的生成器和迭代器
Jun 19 #Python
python中有帮助函数吗
Jun 19 #Python
python中导入 train_test_split提示错误的解决
Jun 19 #Python
python中get和post有什么区别
Jun 19 #Python
You might like
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python中获取网页状态码的两个方法
2014/11/03 Python
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
详解Python中的动态属性和特性
2018/04/07 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
python字符串Intern机制详解
2019/07/01 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
python xlsxwriter模块的使用
2020/12/24 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
大学生求职计划书
2014/04/30 职场文书
社区党支部承诺书
2015/04/29 职场文书
财务管理制度范本
2015/08/04 职场文书