前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3学习笔记 | 二十、Python的函数-参数

Python3学习笔记 | 二十、Python的函数-参数

作者头像
TeamsSix
发布2019-09-24 14:43:22
5360
发布2019-09-24 14:43:22
举报
文章被收录于专栏:TeamsSix的网络空间安全专栏

一、参数简介

参数: argement 或parameter,对象作为输入值传递给函数的方式。 参数传递时的简要关键点: • 参数的传递是通过自动将对象赋值给本地变量名来实现。 • 在函数内部的参数名的赋值不会影响调用着。 • 改变函数的可变对象参数的值也许会对调用者有影响。 传递参数为可变对象与不可变对象时: 不可变对象“通过值”进行传递 - 数值、字符串等 可变对象是通过“指针”进行传递 - 列表、字典等

二、参数传递

代码语言:javascript
复制
>>> def setnum(x):
...     x = 10
...
>>> def setlist(y):
...     y.append(3)
...
>>> a = 1
>>> b = [1,2]
>>> setnum(a)
>>> setlist(b)
>>> a
1
>>> b
[1, 2, 3]

避免可变参数的修改

代码语言:javascript
复制
>>> def setlist(y):
...     y.append(3)
...
>>> b = [1,2]
>>> setlist(b[:])
>>> b
[1, 2]
>>> setlist(b)
>>> b
[1, 2, 3]

在这里,b[:]方式会新生成一个列表对象,因此函数里的y与setlist(b[:]) 是两个不同的对象。

输出对象方法

代码语言:javascript
复制
>>> def sernumandlist(x,y):
...     x = 9
...     y.append(3)
...     return x,y
...
>>> a = 1
>>> b = [1,2]
>>> a,b = sernumandlist(a,b)
>>> a,b
(9, [1, 2, 3])

可以使用return来进行参数的输出。

三、特定的参数匹配模型

1、基础知识

参数传递是有特定匹配规则的: • 位置:从左到右 • 关键字参数:通过参数名进行匹配 • 默认参数:为没有传入值的参数定义参数值 • 可变参数:收集任意多基于位置或关键字的参数 - 参数以或**开头 • 可变参数解包:传递任意多的基于位置或关键字的参数 - 传递值以或**开头 • Keyword-only参数:参数必须按照名称传递(Python3.x) 注:传递参数时,请注意顺序: 非关键字参数->关键字参数->字典参数

代码语言:javascript
复制
>>> def myfunc(a,b,c):
...     print(a+b+c)
...
>>> myfunc(1,b = 3,4)
 File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
>>> myfunc(1,b = 3,c = 4)
8

2、匹配语法

func(value) - 调用着常规参数:通过位置进行匹配 func(name=value) - 调用着关键字参数:通过变量名匹配 func(sequence) - 调用着迭代传递所有元素 func(**dict) - 调用着以’键’为关键字,’值‘为相应值的方式传递字典里所有元素 def func(name) - 函数常规参数:通过位置或变量名进行匹配 def func(name=value) - 函数默认参数值:如果没有在调用中传递的话 def func(name) - 函数匹配并收集(在元祖中)所有包含位置的参数 def func(*name) - 函数匹配并收集(在字典中)所有包含关键字的参数 def func(arg, name) - 函数参数必须在调用中按照关键字传递 def func(*,name=value) - 函数参数必须在调用中按照关键字传递

3、常规参数函数

常规参数,就是最简单用法。函数:

代码语言:javascript
复制
>>> def myfunc(arg1,arg2,arg3):
...     print(arg1,arg2,arg3)
...

当我们调用常规参数函数时,可以使用常规参数调用、关键字参数调用、迭代调用与字典调用。

代码语言:javascript
复制
>>> myfunc(1,2,3)
1 2 3
>>> myfunc('1st arg',arg3 = '3rd arg',arg2 = '2nd arg2')
1st arg 2nd arg2 3rd arg
>>> myfunc(*['1st','2nd','3rd'])
1st 2nd 3rd
>>> myfunc(**{'arg2':'second','arg3':'thrid','arg1':'first'})
first second thrid

4、默认参数值函数

默认参数值,就是当我们调用函数时,没有传递相应参数值的时候,避免报错。

代码语言:javascript
复制
>>> def myfunc(arg1,arg2,arg3 = 'thrid'):
...     print(arg1,arg2,arg3)
...
>>> myfunc('first','second')
first second thrid
>>> myfunc(*['first','second'])
first second thrid

5、可变参数函数

可变参数,可以传递任意个参数(包含0个)*args方式是把所有常规参数调用与迭代调用放进一个元组里:

代码语言:javascript
复制
>>> def myfunc(*arg):
...     result = ''.join(arg)
...     print(result)
...
>>> myfunc('first ','second ','thrid ')
first second thrid
>>> myfunc('first ','second ','thrid ','forth')
first second thrid forth
>>> myfunc('first ',*['second ','thrid ','forth'])
first second thrid forth

**args 方式是把任意个关键字参数与字典调用方式存放在变量名为args的字典里。

代码语言:javascript
复制
>>> def myfunc(**arg):
...     print(arg)
...
>>> myfunc(myname = 'Dora',myjob = 'IT')
{'myname': 'Dora', 'myjob': 'IT'}
>>> myfunc(myname = 'Dora',myjob = 'IT',**{'myage':'Thrid'})
{'myname': 'Dora', 'myjob': 'IT', 'myage': 'Thrid'}

6、必须使用关键字传递

在Python3.0 开始支持必须使用关键字传递的参数设定。函数里的参数: 常规 - 有/无默认值 args - 存放在列表 **args - 存放在字典。 在Python2.x里,参数顺序必须是 0个或多个常规参数 + 0个或1个args +0个或1个args。 在Python3.0开始,在*args与args中间可以加入一个“必须使用关键字传递的参数”。 使用方法为是 0个或多个常规参数 + 或args + “必须使用关键字传递的参数”+ 0个或1个**args。 在不使用“必须使用关键字传递的参数”时,顺序与Python2.x相同。

代码语言:javascript
复制
>>> def myfunc(*,b):
...     print(b)
...
>>> myfunc(b = 3)
3
>>> myfunc(**{'b':3})
3
>>> def myfunc(*,b,**c):
...     print(b)
...     print(c)
...
>>> myfunc(**{'b':3})
3
{}
>>> myfunc(**{'b':3,'c':4})
3
{'c': 4}
>>> myfunc(**{'b':3,'c':4,'d':5})
3
{'c': 4, 'd': 5}

四、特殊参数的传递

在Python里,因为函数也是对象,函数名也是变量名,因此函数本身也可以传递。写计算最大、最小值的函数时,一般用法:

代码语言:javascript
复制
>>> def min1(*arg):
...     reg = arg[0]
...     for i in arg[1:]:
...             if i < reg:
...                     reg = i
...     print(reg)
...
>>> def min2(*arg):
...     tmp = sorted(arg)
...     print(tmp[0])
...
>>> min1(2,1,3,-1,-5)
-5
>>> min2(2,1,3,-1,-5)
-5

之前方法要是需要计算最大值,需要再写一个函数。我们有没有特殊方法呢?

代码语言:javascript
复制
>>> def lessthan(x,y):return x < y
...
>>> def greaterthan(x,y):return x > y
...
>>> def minmax(test,*args):
...     res = args[0]
...     for i in args[1:]:
...             if test(i,res):
...                     res = i
...     print(res)
...
>>> minmax(lessthan,2,4,1,-1)
-1
>>> minmax(greaterthan,2,4,1,-1)
4

五、模拟Python3.x的print函数

我们尝试模仿Python3.x里的print函数。Python3.x的document里可以看到print函数的参数: print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False),在这里,我们忽略flush,这个与写入到文件时有用,以下是在Python2中进行Python3.x中的print函数模拟。

代码语言:javascript
复制
>>> import sys  #python2.7环境
>>> def print3(*args,**kargs):
...     sep = kargs.get('sep','')
...     end = kargs.get('end','\n')
...     file = kargs.get('file',sys.stdout)
...     output = sep.join(args)
...     output += end
...     file.write(output)
...

下面进行测试

代码语言:javascript
复制
>>> print('a','b')
('a', 'b')
>>> print3('a','b')
ab
>>> print('a',end = ' ')
 File "<stdin>", line 1
   print('a',end = ' ')
                 ^
SyntaxError: invalid syntax
>>> print3('a',end = ' '
a >>>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TeamsSix 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、参数简介
  • 二、参数传递
    • 避免可变参数的修改
      • 输出对象方法
      • 三、特定的参数匹配模型
      • 1、基础知识
      • 2、匹配语法
      • 3、常规参数函数
      • 4、默认参数值函数
      • 5、可变参数函数
      • 6、必须使用关键字传递
      • 四、特殊参数的传递
      • 五、模拟Python3.x的print函数
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档