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


Posted in Python onMay 25, 2021

如下所示:

#抽象 (函数)
 
# 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()   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指向的仍旧是这个对象。

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python判断变量是否已经定义的方法
Aug 18 Python
Python入门篇之正则表达式
Oct 20 Python
Python md5与sha1加密算法用法分析
Jul 14 Python
python装饰器实例大详解
Oct 25 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
numpy中三维数组中加入元素后的位置详解
Nov 28 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
python中二分查找法的实现方法
Dec 06 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
如何使用Tkinter进行窗口的管理与设置
Jun 30 Python
Python竟然能剪辑视频
python中的None与NULL用法说明
May 25 #Python
判断Python中的Nonetype类型
May 25 #Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
python编写五子棋游戏
浅谈python数据类型及其操作
对Keras自带Loss Function的深入研究
May 25 #Python
You might like
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
python实现随机梯度下降法
2020/03/24 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
python 实现识别图片上的数字
2019/07/30 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
应用化学专业职业生涯规划书
2013/12/31 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
机关道德讲堂实施方案
2014/03/15 职场文书
银行内勤岗位职责
2014/04/09 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
政风行风评议心得体会
2014/10/21 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
小学生安全保证书
2015/05/09 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis