浅谈Python中的函数(def)及参数传递操作
作者:小菜鸟快飞 发布时间:2023-01-20 20:13:54
如下所示:
#抽象 (函数)
# 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指向的仍旧是这个对象。
所以,函数可以通过可变类型对象,将参数输出。
来源:https://blog.csdn.net/qq_36362028/article/details/100546557
猜你喜欢
- 本文实例为大家分享了js通过开始结束控制计时器的具体实现代码,供大家参考,具体内容如下时间戳的使用的可以取消对多次点击事件产生效果的累加,譬
- 漂亮的代码是漂亮网站的基础,优秀的 CSS 只存在与同样优秀的 HTML 之上,干净的,语义的 HTML 代码让一个网站更健壮。本文讲述了1
- 如果你经常使用python开发GUI程序的话,那么就知道,有时你需要很长时间来执行一个任务。当然,如果你使用命令行程序来做的话,你回非常惊讶
- javascript var item = document.getElementById(""); var text
- 1. 滤波器1.1 什么是滤波器滤波器是对图像做平滑处理 的一种常用工具。平滑处理即在尽可能地保留原图像信息的情况下,对像素值进行微调,使邻
- 国际象棋是当今国际上最流行的智力体育运动项目。青年人下棋可以锻炼思维、增强记忆力和培养坚强的意志;中年人下棋可以享受美学;老年下棋可以很好的
- 生成静态页的方法有很多种,我比较喜欢用xmlhttp的方法生成,因为我不用考虑很多东西,我只要把动态的asp页面编写好就行了。<% s
- 基本要点:程序中储存的所有数据都是对象(可变对象:值可以修改 不可变对象:值不可修改)每个对象都有一个身份、一个类型、一个值例: >&
- 1. 简介(Introduction)官方原文本文翻译了原文并加入了自己的理解。主要介绍多个 Go协程之间对同一个变量并发读写时需要注意的同
- 列表与元组列表用大括号[]表示,元组用圆括号()表示。列表可以修改,字符串与元组不可修改。元组的分片还是元组,列表的分片还是列表。1.列表方
- 1. mysql的md5 mysql存在系统函数md5(“xxxxx”);2. mssql的md5&nb
- Go提供几种方法检查变量的类型,在字符串格式化标识%T, 反射方式:reflect.TypeOf, reflect.ValueOf.Kind
- PyCharm 是我用过的python编辑器中,比较顺手的一个。而且可以跨平台,在macos和windows下面都可以用,这点比较好。是py
- 本文实例讲述了php基于curl实现随机ip地址抓取内容的方法。分享给大家供大家参考,具体如下:使用php curl 我们可以模仿用户行为,
- 本文为大家分享了pygame游戏之旅的第11篇,供大家参考,具体内容如下定义一个button函数,将文字,颜色等作为参数。def butto
- 在matplotlib下,一个Figure对象可以包含多个子图(Axes),可以使用subplot()快速绘制,其调用形式如下:subplo
- 前言React核心的单向数据流、一切皆数据的state、不会改变的props,以及状态提升等等经常使用便不多总结,需要的看官方文档。JSXJ
- 实验目的:用户输入网卡名称,通过函数返回对应的IPv4和IPv6地址。实验代码:步骤一: 由于window系统下网卡名称并不是真正的名字,而
- Overview这篇博客内容将包括对XML文件的解析、追加新元素后写入到XML,以及更新原XML文件中某结点的值。使用的是python的xm
- 今天闲着没事干,以前做过html+js版的数独,这次做个python版本的,界面由pygame完成,数独生成由递归算法实现,由shuffle