• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

浅谈Python中的函数(def)及参数传递操作

python 搞代码 4年前 (2022-01-07) 38次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了浅谈Python中的函数(def)及参数传递操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

如下所示:

 #抽象 (函数) # 1、callable  判断一个对象是否可以被调用 x = 1 def y(): return None callable(y)  # y可以被调用 callable(x)  # x不可以被调用 # 2、当函数没有return时   函数将默认返回None # 3、放在函数开头的字符串成为文档字符串   如下: def square(x): 'my name is hexianmin'   #这个为文档字符串   将作为函数的一部分存储起来 return x*x # 4、函数中的 '传值'  和  '传地址'       切片列表产生的是一个相等但不相同的副本(即两个列表存储地址不一样) # 传值:   调用函数时传 变量   eg: x = 1   change(x) # 传地址:   调用函数时传  列表(在这里说明:元组不可以改变  传过去也不能修改)   eg: x = list('pyhon')   change(x) # 函数参数 : 1、位置参数   2、关键字参数   # 1、位置参数 :实参与形参的对应关系为 '一一对应' 的关系  实参的前后位置决定了形参接到的值 # 2、关键字参数 :由指定关键字去给形参传值(或者传地址)  像字典一样 key-value 的对应关系 # 注意: 1、二者不可以冲突   2、关键字参数和位置参数可以混在一起用,优先关键字参数,剩下的按照位置一一对应 #  *  /  **  的妙用 :收集参数  和   分配参数   的作用 # 收集参数:   *  : 将  多余的  一般的对象(位置参数,字典也将作为位置参数)收集成元组类型       ** : 将  多余的  关键字参数  收集为字典类型 # 分配参数:   *  : 将元组类型的参数分配给形参                             ** : 将字典类型的参数分配给形参 # 收集参数: def print_params_1(x, y, z=3, *pospar, **keypar):  #注意这里的 z=3 是给z赋一个默认值  当调用函数时没有给z赋值时使用  但是一旦调用时给z赋值了  z就不用默认值了 print(x, y, z) print(pospar)   #在函数里面使用时 : 1、不带星号(*) 是 一个元组   2、带星号(*) 是 取元组中的每个值出来 print(keypar)   #在函数里面使用时 : 1、不带星号(**) 是 一个字典(但是取不了值出来)  2、带一个星号(*) 是 取字典中的每个关键字(key)出来   3、带两个星号 会报错 print_params_1(1, 2, 4, 5, 6, 7, foo=1, bar=2) # 分配参数: def foo(x, y, z, m=0, n=0): print(x, y, z) print(m) print(n) return -1 def call_foo(*args, **kwds):  #收集参数 print('calling foo!') foo(*args, kwds)   #分配参数   这里如果用foo(*args, **kwds)  **kwds会报错 x1 = 1 y1 = 2 z1 = 3 d = { 'm1': 4, 'n1': 5 } print(call_foo(x1, y1, z1, d1=1, d2=2))  #调用的时候  一个字典是作为一个位置参数的 # 作用域 :1、全局变量    2、局部变量 # 注意: 在局部函数(局部函数中默认变量都是局部变量)中使用全局变量: 1、只使用一次(且重名了)   2、声明后使用(声明后就是全局变量了) # 1、只使用一次(且重名了): para = 1 def combine(para): print(para,globals()['para'])    # globals()['para'] combine(2) # 2、声明后使用(声明后就是全局变量了): xx = 2 def change_global(): global xx     #声明后就是全局变量了 xx = xx +2 print(xx) change_global() # 3、vars(): 赋值其实是一个看不见的字典   使用后返回的就是一个字典 x11 = 1 x22 = vars() print(x22['x11']) # 4、 vars()  globals(<em style="color:transparent">来源[email protected]搞@^&代*@码)网</em>)   locals()  使用后都是返回一个字典 # 作用域嵌套 def multi(fac): def multiFac(num):   # multiFac(num)函数被称为 : 闭包 return num * fac return multiFac dou = multi(2)   #返回的 dou 现在是一个函数( multiFac(num)函数 ) dou(3)  #这样相当于调用 multiFac(3) # list(map(str,range(10)))  与  [str(i) for i in range(10)]  是等价的 # filter(lambda x: x.isalnum, seq) #from functools import reduce       reduce(lambda x,y: x+y, numbers) # map   filter   reduce  

补充:python参数传递问题(参数传出)

变量、对象与类型关系

python是动态类型语言,并不需要预先声明变量类型,变量的类型和值在赋值的那一刻完成初始化。进一步说,python中的类型是属于对象的,而不是变量。

例如:

 a=2 b=[1,2]

分别表示把一个int对象2,赋值给a;把一个list对象[1,2]赋值给b。

也就是说在将不同类型的python对象通过赋值号赋给某一个变量时,才完成该变量的初始化,而使得该变量代表某种类型的对象。

函数

不可更改参数传递

如果想进行参数传递,那么在python 中的定义函数之前,必须对参数的变量进行声明,否则会出现提示global name ‘abun1’ is not defined,当然,该变量的声明过程可以是隐式的进行。

例如a=2或者a={},在对a进行赋值的那一刻完成变量的类型初始化,也即是完成变量的声明。

但是,尤其需要注意的是,python中的int,long, bool, float,tuple() 等对象都是不能更改的,因此,在参数传递时,不能传递输出这些类型的变量。

例如:

 def tmpF(a): a=10 nint=2 tmpF(nint) print(nint) #结果仍是2

因为,变量nint代表一个整型对象2,调用函数tmpF()时,因整型对象无法改变,那么新建了一个整型对象10,使a指向它,因此nint代表的整型对象仍旧是2,没有发生改变。

可更改参数传递

如果在定义函数时,想利用参数输出某些处理过的变量,那必须使用可以更改的对象,如list,dict等。

例如:

 def tmpF(a): a.append(2) nx=[] tmpF(nx) print(nx) #nx=[2]

因为,list是可更改类型对象,因此,在调用函数tmpF()时,对该list型对象进行了修改,而nx指向的仍旧是这个对象。

所以,函数可以通过可变类型对象,将参数输出。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持gaodaima搞代码网

以上就是浅谈Python中的函数(def)及参数传递操作的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:浅谈Python中的函数(def)及参数传递操作

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址